diff options
author | James Y Knight <jyknight@google.com> | 2020-05-15 23:43:30 -0400 |
---|---|---|
committer | James Y Knight <jyknight@google.com> | 2020-07-01 12:51:50 -0400 |
commit | 4b0aa5724feaa89a9538dcab97e018110b0e4bc3 (patch) | |
tree | f6523c3c1909c3189112569059189e639d9ea720 /llvm/lib/CodeGen/SplitKit.cpp | |
parent | 78c69a00a4cff786e0ef13c895d0db309d6b3f42 (diff) | |
download | llvm-4b0aa5724feaa89a9538dcab97e018110b0e4bc3.zip llvm-4b0aa5724feaa89a9538dcab97e018110b0e4bc3.tar.gz llvm-4b0aa5724feaa89a9538dcab97e018110b0e4bc3.tar.bz2 |
Change the INLINEASM_BR MachineInstr to be a non-terminating instruction.
Before this instruction supported output values, it fit fairly
naturally as a terminator. However, being a terminator while also
supporting outputs causes some trouble, as the physreg->vreg COPY
operations cannot be in the same block.
Modeling it as a non-terminator allows it to be handled the same way
as invoke is handled already.
Most of the changes here were created by auditing all the existing
users of MachineBasicBlock::isEHPad() and
MachineBasicBlock::hasEHPadSuccessor(), and adding calls to
isInlineAsmBrIndirectTarget or mayHaveInlineAsmBr, as appropriate.
Reviewed By: nickdesaulniers, void
Differential Revision: https://reviews.llvm.org/D79794
Diffstat (limited to 'llvm/lib/CodeGen/SplitKit.cpp')
-rw-r--r-- | llvm/lib/CodeGen/SplitKit.cpp | 33 |
1 files changed, 20 insertions, 13 deletions
diff --git a/llvm/lib/CodeGen/SplitKit.cpp b/llvm/lib/CodeGen/SplitKit.cpp index 5a80908..8dec620 100644 --- a/llvm/lib/CodeGen/SplitKit.cpp +++ b/llvm/lib/CodeGen/SplitKit.cpp @@ -80,10 +80,15 @@ InsertPointAnalysis::computeLastInsertPoint(const LiveInterval &CurLI, std::pair<SlotIndex, SlotIndex> &LIP = LastInsertPoint[Num]; SlotIndex MBBEnd = LIS.getMBBEndIdx(&MBB); - SmallVector<const MachineBasicBlock *, 1> EHPadSuccessors; - for (const MachineBasicBlock *SMBB : MBB.successors()) - if (SMBB->isEHPad()) - EHPadSuccessors.push_back(SMBB); + SmallVector<const MachineBasicBlock *, 1> ExceptionalSuccessors; + bool EHPadSuccessor = false; + for (const MachineBasicBlock *SMBB : MBB.successors()) { + if (SMBB->isEHPad()) { + ExceptionalSuccessors.push_back(SMBB); + EHPadSuccessor = true; + } else if (SMBB->isInlineAsmBrIndirectTarget()) + ExceptionalSuccessors.push_back(SMBB); + } // Compute insert points on the first call. The pair is independent of the // current live interval. @@ -94,15 +99,17 @@ InsertPointAnalysis::computeLastInsertPoint(const LiveInterval &CurLI, else LIP.first = LIS.getInstructionIndex(*FirstTerm); - // If there is a landing pad successor, also find the call instruction. - if (EHPadSuccessors.empty()) + // If there is a landing pad or inlineasm_br successor, also find the + // instruction. If there is no such instruction, we don't need to do + // anything special. We assume there cannot be multiple instructions that + // are Calls with EHPad successors or INLINEASM_BR in a block. Further, we + // assume that if there are any, they will be after any other call + // instructions in the block. + if (ExceptionalSuccessors.empty()) return LIP.first; - // There may not be a call instruction (?) in which case we ignore LPad. - LIP.second = LIP.first; - for (MachineBasicBlock::const_iterator I = MBB.end(), E = MBB.begin(); - I != E;) { - --I; - if (I->isCall()) { + for (auto I = MBB.rbegin(), E = MBB.rend(); I != E; ++I) { + if ((EHPadSuccessor && I->isCall()) || + I->getOpcode() == TargetOpcode::INLINEASM_BR) { LIP.second = LIS.getInstructionIndex(*I); break; } @@ -114,7 +121,7 @@ InsertPointAnalysis::computeLastInsertPoint(const LiveInterval &CurLI, if (!LIP.second) return LIP.first; - if (none_of(EHPadSuccessors, [&](const MachineBasicBlock *EHPad) { + if (none_of(ExceptionalSuccessors, [&](const MachineBasicBlock *EHPad) { return LIS.isLiveInToMBB(CurLI, EHPad); })) return LIP.first; |