Index: llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp =================================================================== --- llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp +++ llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp @@ -7741,8 +7741,17 @@ // 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 ValueVTs; + ComputeValueVTs(TLI, DAG.getDataLayout(), CS->getType(), ValueVTs); + + if (ValueVTs.empty()) + return; + + SmallVector 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) { Index: llvm/trunk/test/CodeGen/X86/pr37359.ll =================================================================== --- llvm/trunk/test/CodeGen/X86/pr37359.ll +++ llvm/trunk/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 +}