PR10077: fix fast-isel of extractvalue of aggregate constants.
authorEli Friedman <eli.friedman@gmail.com>
Mon, 6 Jun 2011 05:46:34 +0000 (05:46 +0000)
committerEli Friedman <eli.friedman@gmail.com>
Mon, 6 Jun 2011 05:46:34 +0000 (05:46 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@132676 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/SelectionDAG/FastISel.cpp
test/CodeGen/X86/fast-isel-agg-constant.ll [new file with mode: 0644]

index 098fb6896f99468d3e7aba7a0baa0c5dd7d95ff2..797f174448502a16008db4c1832dae28129563f1 100644 (file)
@@ -841,8 +841,10 @@ FastISel::SelectExtractValue(const User *U) {
   DenseMap<const Value *, unsigned>::iterator I = FuncInfo.ValueMap.find(Op0);
   if (I != FuncInfo.ValueMap.end())
     ResultReg = I->second;
-  else
+  else if (isa<Instruction>(Op0))
     ResultReg = FuncInfo.InitializeRegForValue(Op0);
+  else
+    return false; // fast-isel can't handle aggregate constants at the moment
 
   // Get the actual result register, which is an offset from the base register.
   unsigned VTIndex = ComputeLinearIndex(AggTy, EVI->idx_begin(), EVI->idx_end());
diff --git a/test/CodeGen/X86/fast-isel-agg-constant.ll b/test/CodeGen/X86/fast-isel-agg-constant.ll
new file mode 100644 (file)
index 0000000..ce0dff7
--- /dev/null
@@ -0,0 +1,11 @@
+; RUN: llc < %s -march=x86-64 -O0 | FileCheck %s
+; Make sure fast-isel doesn't screw up aggregate constants.
+; (Failing out is okay, as long as we don't miscompile.)
+
+%bar = type { i32 }
+
+define i32 @foo()  {
+  %tmp = extractvalue %bar { i32 3 }, 0
+  ret i32 %tmp
+; CHECK: movl $3, %eax
+}