diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp @@ -8820,14 +8820,11 @@ if (EmitEHLabels) { assert(EHPadBB && "InvokeInst must have an EHPadBB"); } - bool IsCallBr = isa(Call); - if (IsCallBr || EmitEHLabels) { - // If this is a callbr or invoke we need to flush pending exports since - // inlineasm_br and invoke are terminators. - // We need to do this before nodes are glued to the inlineasm_br node. + // If this is an invoke we need to flush pending exports since it is a + // terminator. + if (EmitEHLabels) Chain = getControlRoot(); - } MCSymbol *BeginLabel = nullptr; if (EmitEHLabels) { @@ -9197,6 +9194,7 @@ AsmNodeOperands[InlineAsm::Op_InputChain] = Chain; if (Flag.getNode()) AsmNodeOperands.push_back(Flag); + const bool IsCallBr = isa(Call); unsigned ISDOpc = IsCallBr ? ISD::INLINEASM_BR : ISD::INLINEASM; Chain = DAG.getNode(ISDOpc, getCurSDLoc(), DAG.getVTList(MVT::Other, MVT::Glue), AsmNodeOperands); diff --git a/llvm/test/CodeGen/X86/callbr-asm-bb-exports.ll b/llvm/test/CodeGen/X86/callbr-asm-bb-exports.ll --- a/llvm/test/CodeGen/X86/callbr-asm-bb-exports.ll +++ b/llvm/test/CodeGen/X86/callbr-asm-bb-exports.ll @@ -1,22 +1,27 @@ ; REQUIRES: asserts ; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -o /dev/null -debug-only=isel 2>&1 | FileCheck %s -; Make sure we emit the basic block exports and the TokenFactor before the -; inlineasm_br. Not sure how to get a MachineIR change so this reads the debug +; Make sure the TokenFactor depends on the basic block exports and the +; INLINEASM_BR. +; Not sure how to get a MachineIR change so this reads the debug ; output from SelectionDAG. -; CHECK: t0: ch,glue = EntryToken +; CHECK: Optimized legalized selection DAG: %bb.0 'test:entry' +; CHECK-NEXT: SelectionDAG has 32 nodes: +; CHECK-NEXT: t0: ch,glue = EntryToken +; CHECK-NEXT: t2: i32,ch = CopyFromReg t0, Register:i32 %2 +; CHECK-NEXT: t8: i32 = add t2, Constant:i32<4> +; CHECK-NEXT: t21: ch,glue = CopyToReg t0, Register:i32 %5, t8 ; CHECK-NEXT: t4: i32,ch = CopyFromReg t0, Register:i32 %3 ; CHECK-NEXT: t10: i32 = add t4, Constant:i32<1> ; CHECK-NEXT: t12: ch = CopyToReg t0, Register:i32 %0, t10 ; CHECK-NEXT: t6: i32,ch = CopyFromReg t0, Register:i32 %4 ; CHECK-NEXT: t13: i32 = add t6, Constant:i32<1> ; CHECK-NEXT: t15: ch = CopyToReg t0, Register:i32 %1, t13 -; CHECK-NEXT: t17: ch = TokenFactor t12, t15 -; CHECK-NEXT: t2: i32,ch = CopyFromReg t0, Register:i32 %2 -; CHECK-NEXT: t8: i32 = add t2, Constant:i32<4> -; CHECK-NEXT: t22: ch,glue = CopyToReg t17, Register:i32 %5, t8 -; CHECK-NEXT: t29: ch,glue = inlineasm_br t22, TargetExternalSymbol:i64'xorl $0, $0; jmp ${1:l}', MDNode:ch, TargetConstant:i64<0>, TargetConstant:i32<2359305>, Register:i32 %5, TargetConstant:i64<13>, BasicBlock:ch, TargetConstant:i32<12>, Register:i32 $df, TargetConstant:i32<12>, Register:i16 $fpsw, TargetConstant:i32<12>, Register:i32 $eflags, t22:1 +; CHECK-NEXT: t28: ch,glue = inlineasm_br t21, TargetExternalSymbol:i64'xorl $0, $0; jmp ${1:l}', MDNode:ch, TargetConstant:i64<0>, TargetConstant:i32<2359305>, Register:i32 %5, TargetConstant:i64<13>, BasicBlock:ch, TargetConstant:i32<12>, Register:i32 $df, TargetConstant:i32<12>, Register:i16 $fpsw, TargetConstant:i32<12>, Register:i32 $eflags, t21:1 +; CHECK-NEXT: t29: ch = TokenFactor t12, t15, t28 +; CHECK-NEXT: t31: ch = br t29, BasicBlock:ch + define i32 @test(i32 %a, i32 %b, i32 %c) { entry: