summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp13
-rw-r--r--llvm/test/CodeGen/X86/pr37359.ll17
2 files changed, 28 insertions, 2 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
index b6f691dacc0..740147fd79e 100644
--- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
@@ -7741,8 +7741,17 @@ void SelectionDAGBuilder::emitInlineAsmError(ImmutableCallSite CS,
// Make sure we leave the DAG in a valid state
const TargetLowering &TLI = DAG.getTargetLoweringInfo();
- auto VT = TLI.getValueType(DAG.getDataLayout(), CS.getType());
- setValue(CS.getInstruction(), DAG.getUNDEF(VT));
+ SmallVector<EVT, 1> ValueVTs;
+ ComputeValueVTs(TLI, DAG.getDataLayout(), CS->getType(), ValueVTs);
+
+ if (ValueVTs.empty())
+ return;
+
+ SmallVector<SDValue, 1> Ops;
+ for (unsigned i = 0, e = ValueVTs.size(); i != e; ++i)
+ Ops.push_back(DAG.getUNDEF(ValueVTs[i]));
+
+ setValue(CS.getInstruction(), DAG.getMergeValues(Ops, getCurSDLoc()));
}
void SelectionDAGBuilder::visitVAStart(const CallInst &I) {
diff --git a/llvm/test/CodeGen/X86/pr37359.ll b/llvm/test/CodeGen/X86/pr37359.ll
new file mode 100644
index 00000000000..40cddb21016
--- /dev/null
+++ b/llvm/test/CodeGen/X86/pr37359.ll
@@ -0,0 +1,17 @@
+; RUN: not llc -o /dev/null %s 2>&1 | FileCheck %s
+target triple = "x86_64--"
+
+@a = global i32 0, align 4
+
+; CHECK: error: couldn't allocate input reg for constraint 'x'
+define i32 @main() {
+entry:
+ %0 = load i32, i32* @a, align 4
+ %cmp = icmp ne i32 %0, 0
+ %1 = call { i32, i32 } asm "", "={ax},={dx},x,~{dirflag},~{fpsr},~{flags}"(i1 %cmp)
+ %asmresult = extractvalue { i32, i32 } %1, 0
+ %asmresult1 = extractvalue { i32, i32 } %1, 1
+ store i32 %asmresult, i32* @a, align 4
+ store i32 %asmresult1, i32* @a, align 4
+ ret i32 0
+}
OpenPOWER on IntegriCloud