diff options
author | Shoaib Meenai <smeenai@fb.com> | 2018-05-16 04:52:18 +0000 |
---|---|---|
committer | Shoaib Meenai <smeenai@fb.com> | 2018-05-16 04:52:18 +0000 |
commit | 074728a2a901cf2e7fa54443ba37b72d8f43d7f5 (patch) | |
tree | 42472bf9aeed9ff898d8f8f2d6a5fad9d10707b6 /llvm/lib/Transforms/ObjCARC | |
parent | b8931c1cf4075d9d79ad2ae44dadc3d3d1d29568 (diff) | |
download | bcm5719-llvm-074728a2a901cf2e7fa54443ba37b72d8f43d7f5.tar.gz bcm5719-llvm-074728a2a901cf2e7fa54443ba37b72d8f43d7f5.zip |
[ObjCARC] Prevent code motion into a catchswitch
A catchswitch must be the only non-phi instruction in its basic block;
attempting to move a retain or release into a catchswitch basic block
will result in invalid IR. Explicitly mark a CFG hazard in this case to
prevent the code motion.
Differential Revision: https://reviews.llvm.org/D46482
llvm-svn: 332430
Diffstat (limited to 'llvm/lib/Transforms/ObjCARC')
-rw-r--r-- | llvm/lib/Transforms/ObjCARC/ObjCARCOpts.cpp | 1 | ||||
-rw-r--r-- | llvm/lib/Transforms/ObjCARC/PtrState.cpp | 5 |
2 files changed, 6 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/ObjCARC/ObjCARCOpts.cpp b/llvm/lib/Transforms/ObjCARC/ObjCARCOpts.cpp index db09cc3487a..8d657f8b258 100644 --- a/llvm/lib/Transforms/ObjCARC/ObjCARCOpts.cpp +++ b/llvm/lib/Transforms/ObjCARC/ObjCARCOpts.cpp @@ -1592,6 +1592,7 @@ bool ObjCARCOpt::PairUpRetainsAndReleases( assert(It != Retains.end()); const RRInfo &NewRetainRRI = It->second; KnownSafeTD &= NewRetainRRI.KnownSafe; + CFGHazardAfflicted |= NewRetainRRI.CFGHazardAfflicted; for (Instruction *NewRetainRelease : NewRetainRRI.Calls) { auto Jt = Releases.find(NewRetainRelease); if (Jt == Releases.end()) diff --git a/llvm/lib/Transforms/ObjCARC/PtrState.cpp b/llvm/lib/Transforms/ObjCARC/PtrState.cpp index b6c48529de4..8a7b6a74fae 100644 --- a/llvm/lib/Transforms/ObjCARC/PtrState.cpp +++ b/llvm/lib/Transforms/ObjCARC/PtrState.cpp @@ -268,6 +268,11 @@ void BottomUpPtrState::HandlePotentialUse(BasicBlock *BB, Instruction *Inst, if (isa<InvokeInst>(Inst)) { const auto IP = BB->getFirstInsertionPt(); InsertAfter = IP == BB->end() ? std::prev(BB->end()) : IP; + if (isa<CatchSwitchInst>(InsertAfter)) + // A catchswitch must be the only non-phi instruction in its basic + // block, so attempting to insert an instruction into such a block would + // produce invalid IR. + SetCFGHazardAfflicted(true); } else { InsertAfter = std::next(Inst->getIterator()); } |