]> granicus.if.org Git - llvm/commitdiff
GlobalISel: improve translation fallback for constants.
authorTim Northover <tnorthover@apple.com>
Mon, 5 Dec 2016 21:40:33 +0000 (21:40 +0000)
committerTim Northover <tnorthover@apple.com>
Mon, 5 Dec 2016 21:40:33 +0000 (21:40 +0000)
Returning 0 (NoReg) from getOrCreateVReg leads to unexpected situations later
in the translation. It's better to return a valid (if undefined) register and
let the rest of the instruction carry on as planned.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@288709 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/GlobalISel/IRTranslator.cpp
test/CodeGen/AArch64/GlobalISel/arm64-fallback.ll

index e8d1ce0586d26e457e3adc7f1c4d4cb77fd6c08b..a580e745171ac60bcae2f3d6754116b3e9dc0c3f 100644 (file)
@@ -74,7 +74,7 @@ unsigned IRTranslator::getOrCreateVReg(const Value &Val) {
         if (!TPC->isGlobalISelAbortEnabled()) {
           MIRBuilder.getMF().getProperties().set(
               MachineFunctionProperties::Property::FailedISel);
-          return 0;
+          return VReg;
         }
         reportTranslationError(Val, "unable to translate constant");
       }
index d9e8004ceb56f63ad7ca717c0132d629a5141d00..25d6c1f191cf22953225e7a54c16b9e9586e5659 100644 (file)
@@ -1,6 +1,8 @@
 ; RUN: not llc -O0 -global-isel -verify-machineinstrs %s -o - 2>&1 | FileCheck %s --check-prefix=ERROR
 ; RUN: llc -O0 -global-isel -global-isel-abort=0 -verify-machineinstrs %s -o - 2>&1 | FileCheck %s --check-prefix=FALLBACK
-; RUN: llc -O0 -global-isel -global-isel-abort=2 -verify-machineinstrs %s -o - 2>&1 | FileCheck %s --check-prefix=FALLBACK_WITH_REPORT
+; RUN: llc -O0 -global-isel -global-isel-abort=2 -verify-machineinstrs %s -o %t.out 2> %t.err
+; RUN: FileCheck %s --check-prefix=FALLBACK-WITH-REPORT-OUT < %t.out
+; RUN: FileCheck %s --check-prefix=FALLBACK-WITH-REPORT-ERR < %t.err
 ; This file checks that the fallback path to selection dag works.
 ; The test is fragile in the sense that it must be updated to expose
 ; something that fails with global-isel.
@@ -16,11 +18,22 @@ target triple = "aarch64--"
 ; FALLBACK: ldr q0,
 ; FALLBACK-NEXT: bl __fixunstfti
 ;
-; FALLBACK_WITH_REPORT: warning: Instruction selection used fallback path for ABIi128
-; FALLBACK_WITH_REPORT: ldr q0,
-; FALLBACK_WITH_REPORT-NEXT: bl __fixunstfti
+; FALLBACK-WITH-REPORT-ERR: warning: Instruction selection used fallback path for ABIi128
+; FALLBACK-WITH-REPORT-OUT-LABEL: ABIi128:
+; FALLBACK-WITH-REPORT-OUT: ldr q0,
+; FALLBACK-WITH-REPORT-OUT-NEXT: bl __fixunstfti
 define i128 @ABIi128(i128 %arg1) {
-  %farg1 =       bitcast i128 %arg1 to fp128 
+  %farg1 =       bitcast i128 %arg1 to fp128
   %res = fptoui fp128 %farg1 to i128
   ret i128 %res
 }
+
+; It happens that we don't handle ConstantArray instances yet during
+; translation. Any other constant would be fine too.
+
+; FALLBACK-WITH-REPORT-ERR: warning: Instruction selection used fallback path for constant
+; FALLBACK-WITH-REPORT-OUT-LABEL: constant:
+; FALLBACK-WITH-REPORT-OUT: fmov d0, #1.0
+define [1 x double] @constant() {
+  ret [1 x double] [double 1.0]
+}