diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.h b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.h --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.h +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.h @@ -783,7 +783,8 @@ void processIntegerCallValue(const Instruction &I, SDValue Value, bool IsSigned); - void HandlePHINodesInSuccessorBlocks(const BasicBlock *LLVMBB); + void HandlePHINodesInSuccessorBlocks(const BasicBlock *LLVMBB, + bool FirstIter); void emitInlineAsmError(const CallBase &Call, const Twine &Message); 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 @@ -1101,6 +1101,7 @@ CopyToExportRegsIfNeeded(&I); CurInst = nullptr; + ConstantsOut.clear(); } void SelectionDAGBuilder::visitPHI(const PHINode &) { @@ -9994,8 +9995,8 @@ /// directly add them, because expansion might result in multiple MBB's for one /// BB. As such, the start of the BB might correspond to a different MBB than /// the end. -void -SelectionDAGBuilder::HandlePHINodesInSuccessorBlocks(const BasicBlock *LLVMBB) { +void SelectionDAGBuilder::HandlePHINodesInSuccessorBlocks( + const BasicBlock *LLVMBB, bool FirstIter) { const Instruction *TI = LLVMBB->getTerminator(); SmallPtrSet SuccsHandled; @@ -10005,6 +10006,21 @@ for (unsigned succ = 0, e = TI->getNumSuccessors(); succ != e; ++succ) { const BasicBlock *SuccBB = TI->getSuccessor(succ); if (!isa(SuccBB->begin())) continue; + + if (CI) { + if (FirstIter) { + // Don't push PHI node values back before an INLINEASM_BR instruction on + // the default branch. + if (SuccBB == CI->getDefaultDest()) + continue; + } else { + // Don't push PHI node values back after an INLINEASM_BR instruction on + // the indirect branch. + if (SuccBB != CI->getDefaultDest()) + continue; + } + } + MachineBasicBlock *SuccMBB = FuncInfo.MBBMap[SuccBB]; // If this terminator has multiple identical successors (common for @@ -10065,8 +10081,6 @@ } } } - - ConstantsOut.clear(); } /// Add a successor MBB to ParentMBB< creating a new MachineBB for BB if SuccMBB