summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEli Friedman <eli.friedman@gmail.com>2011-06-06 05:46:34 +0000
committerEli Friedman <eli.friedman@gmail.com>2011-06-06 05:46:34 +0000
commitbd375f1a3f2d978c77d573329ad77e37f29c1c41 (patch)
tree7356d011e469a285a5fc4c825bcbc785be48a098
parent7df6805d760a41554cad4105bff0ccd5ae469596 (diff)
downloadbcm5719-llvm-bd375f1a3f2d978c77d573329ad77e37f29c1c41.tar.gz
bcm5719-llvm-bd375f1a3f2d978c77d573329ad77e37f29c1c41.zip
PR10077: fix fast-isel of extractvalue of aggregate constants.
llvm-svn: 132676
-rw-r--r--llvm/lib/CodeGen/SelectionDAG/FastISel.cpp4
-rw-r--r--llvm/test/CodeGen/X86/fast-isel-agg-constant.ll11
2 files changed, 14 insertions, 1 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/FastISel.cpp b/llvm/lib/CodeGen/SelectionDAG/FastISel.cpp
index 098fb6896f9..797f1744485 100644
--- a/llvm/lib/CodeGen/SelectionDAG/FastISel.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/FastISel.cpp
@@ -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/llvm/test/CodeGen/X86/fast-isel-agg-constant.ll b/llvm/test/CodeGen/X86/fast-isel-agg-constant.ll
new file mode 100644
index 00000000000..ce0dff75cf0
--- /dev/null
+++ b/llvm/test/CodeGen/X86/fast-isel-agg-constant.ll
@@ -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
+}
OpenPOWER on IntegriCloud