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/MachineSink.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/MachineSink.cpp')
-rw-r--r-- | llvm/lib/CodeGen/MachineSink.cpp | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/llvm/lib/CodeGen/MachineSink.cpp b/llvm/lib/CodeGen/MachineSink.cpp index 415e38d5..1d253a6 100644 --- a/llvm/lib/CodeGen/MachineSink.cpp +++ b/llvm/lib/CodeGen/MachineSink.cpp @@ -734,6 +734,13 @@ MachineSinking::FindSuccToSinkTo(MachineInstr &MI, MachineBasicBlock *MBB, if (SuccToSinkTo && SuccToSinkTo->isEHPad()) return nullptr; + // It ought to be okay to sink instructions into an INLINEASM_BR target, but + // only if we make sure that MI occurs _before_ an INLINEASM_BR instruction in + // the source block (which this code does not yet do). So for now, forbid + // doing so. + if (SuccToSinkTo && SuccToSinkTo->isInlineAsmBrIndirectTarget()) + return nullptr; + return SuccToSinkTo; } |