mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 03:33:20 +01:00
[SelectionDAGBuilder] Flush PendingExports before creating INLINEASM_BR node for asm goto.
Since INLINEASM_BR is a terminator we need to flush the pending exports before emitting it. If we don't do this, a TokenFactor can be inserted between it and the BR instruction emitted to finish the callbr lowering. It looks like nodes are glued to the INLINEASM_BR so I had to make sure we emit the TokenFactor before that. Differential Revision: https://reviews.llvm.org/D59981 llvm-svn: 361177
This commit is contained in:
parent
f56ceb9dfc
commit
8f3426cbca
@ -8040,10 +8040,19 @@ void SelectionDAGBuilder::visitInlineAsm(ImmutableCallSite CS) {
|
||||
ExtraInfo.update(T);
|
||||
}
|
||||
|
||||
|
||||
// We won't need to flush pending loads if this asm doesn't touch
|
||||
// memory and is nonvolatile.
|
||||
SDValue Flag, Chain = (HasSideEffect) ? getRoot() : DAG.getRoot();
|
||||
|
||||
bool IsCallBr = isa<CallBrInst>(CS.getInstruction());
|
||||
if (IsCallBr) {
|
||||
// If this is a callbr we need to flush pending exports since inlineasm_br
|
||||
// is a terminator. We need to do this before nodes are glued to
|
||||
// the inlineasm_br node.
|
||||
Chain = getControlRoot();
|
||||
}
|
||||
|
||||
// Second pass over the constraints: compute which constraint option to use.
|
||||
for (SDISelAsmOperandInfo &OpInfo : ConstraintOperands) {
|
||||
// If this is an output operand with a matching input operand, look up the
|
||||
@ -8300,8 +8309,7 @@ void SelectionDAGBuilder::visitInlineAsm(ImmutableCallSite CS) {
|
||||
AsmNodeOperands[InlineAsm::Op_InputChain] = Chain;
|
||||
if (Flag.getNode()) AsmNodeOperands.push_back(Flag);
|
||||
|
||||
unsigned ISDOpc = isa<CallBrInst>(CS.getInstruction()) ? ISD::INLINEASM_BR
|
||||
: ISD::INLINEASM;
|
||||
unsigned ISDOpc = IsCallBr ? ISD::INLINEASM_BR : ISD::INLINEASM;
|
||||
Chain = DAG.getNode(ISDOpc, getCurSDLoc(),
|
||||
DAG.getVTList(MVT::Other, MVT::Glue), AsmNodeOperands);
|
||||
Flag = Chain.getValue(1);
|
||||
@ -8410,7 +8418,7 @@ void SelectionDAGBuilder::visitInlineAsm(ImmutableCallSite CS) {
|
||||
Chain = DAG.getNode(ISD::TokenFactor, getCurSDLoc(), MVT::Other, OutChains);
|
||||
|
||||
// Only Update Root if inline assembly has a memory effect.
|
||||
if (ResultValues.empty() || HasSideEffect || !OutChains.empty())
|
||||
if (ResultValues.empty() || HasSideEffect || !OutChains.empty() || IsCallBr)
|
||||
DAG.setRoot(Chain);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user