diff options
Diffstat (limited to 'contrib/llvm-project/llvm/lib/Transforms/Utils/Local.cpp')
-rw-r--r-- | contrib/llvm-project/llvm/lib/Transforms/Utils/Local.cpp | 77 |
1 files changed, 47 insertions, 30 deletions
diff --git a/contrib/llvm-project/llvm/lib/Transforms/Utils/Local.cpp b/contrib/llvm-project/llvm/lib/Transforms/Utils/Local.cpp index 1c350a2585d0..b203259db1c6 100644 --- a/contrib/llvm-project/llvm/lib/Transforms/Utils/Local.cpp +++ b/contrib/llvm-project/llvm/lib/Transforms/Utils/Local.cpp @@ -29,7 +29,6 @@ #include "llvm/Analysis/DomTreeUpdater.h" #include "llvm/Analysis/EHPersonalities.h" #include "llvm/Analysis/InstructionSimplify.h" -#include "llvm/Analysis/LazyValueInfo.h" #include "llvm/Analysis/MemoryBuiltins.h" #include "llvm/Analysis/MemorySSAUpdater.h" #include "llvm/Analysis/TargetLibraryInfo.h" @@ -63,9 +62,7 @@ #include "llvm/IR/MDBuilder.h" #include "llvm/IR/Metadata.h" #include "llvm/IR/Module.h" -#include "llvm/IR/Operator.h" #include "llvm/IR/PatternMatch.h" -#include "llvm/IR/PseudoProbe.h" #include "llvm/IR/Type.h" #include "llvm/IR/Use.h" #include "llvm/IR/User.h" @@ -80,7 +77,6 @@ #include "llvm/Transforms/Utils/ValueMapper.h" #include <algorithm> #include <cassert> -#include <climits> #include <cstdint> #include <iterator> #include <map> @@ -489,7 +485,7 @@ bool llvm::wouldInstructionBeTriviallyDead(Instruction *I, if (auto *FPI = dyn_cast<ConstrainedFPIntrinsic>(I)) { Optional<fp::ExceptionBehavior> ExBehavior = FPI->getExceptionBehavior(); - return ExBehavior.getValue() != fp::ebStrict; + return *ExBehavior != fp::ebStrict; } } @@ -504,15 +500,12 @@ bool llvm::wouldInstructionBeTriviallyDead(Instruction *I, if (isMathLibCallNoop(Call, TLI)) return true; - // To express possible interaction with floating point environment constrained - // intrinsics are described as if they access memory. So they look like having - // side effect but actually do not have it unless they raise floating point - // exception. If FP exceptions are ignored, the intrinsic may be deleted. - if (auto *CI = dyn_cast<ConstrainedFPIntrinsic>(I)) { - Optional<fp::ExceptionBehavior> EB = CI->getExceptionBehavior(); - if (!EB || *EB == fp::ExceptionBehavior::ebIgnore) - return true; - } + // Non-volatile atomic loads from constants can be removed. + if (auto *LI = dyn_cast<LoadInst>(I)) + if (auto *GV = dyn_cast<GlobalVariable>( + LI->getPointerOperand()->stripPointerCasts())) + if (!LI->isVolatile() && GV->isConstant()) + return true; return false; } @@ -682,7 +675,7 @@ simplifyAndDCEInstruction(Instruction *I, return true; } - if (Value *SimpleV = SimplifyInstruction(I, DL)) { + if (Value *SimpleV = simplifyInstruction(I, DL)) { // Add the users to the worklist. CAREFUL: an instruction can use itself, // in the case of a phi node. for (User *U : I->users()) { @@ -1133,7 +1126,7 @@ bool llvm::TryToSimplifyUncondBranchFromEmptyBlock(BasicBlock *BB, // If there is more than one pred of succ, and there are PHI nodes in // the successor, then we need to add incoming edges for the PHI nodes // - const PredBlockVector BBPreds(pred_begin(BB), pred_end(BB)); + const PredBlockVector BBPreds(predecessors(BB)); // Loop over all of the PHI nodes in the successor of BB. for (BasicBlock::iterator I = Succ->begin(); isa<PHINode>(I); ++I) { @@ -1393,7 +1386,7 @@ Align llvm::getOrEnforceKnownAlignment(Value *V, MaybeAlign PrefAlign, static bool PhiHasDebugValue(DILocalVariable *DIVar, DIExpression *DIExpr, PHINode *APN) { - // Since we can't guarantee that the original dbg.declare instrinsic + // Since we can't guarantee that the original dbg.declare intrinsic // is removed by LowerDbgDeclare(), we need to make sure that we are // not inserting the same dbg.value intrinsic over and over. SmallVector<DbgValueInst *, 1> DbgValues; @@ -1472,7 +1465,7 @@ void llvm::ConvertDebugDeclareToDebugValue(DbgVariableIntrinsic *DII, LLVM_DEBUG(dbgs() << "Failed to convert dbg.declare to dbg.value: " << *DII << '\n'); // For now, when there is a store to parts of the variable (but we do not - // know which part) we insert an dbg.value instrinsic to indicate that we + // know which part) we insert an dbg.value intrinsic to indicate that we // know nothing about the variable's content. DV = UndefValue::get(DV->getType()); Builder.insertDbgValueIntrinsic(DV, DIVar, DIExpr, NewLoc, SI); @@ -2240,6 +2233,7 @@ BasicBlock *llvm::changeToInvokeAndSplitBasicBlock(CallInst *CI, II->setDebugLoc(CI->getDebugLoc()); II->setCallingConv(CI->getCallingConv()); II->setAttributes(CI->getAttributes()); + II->setMetadata(LLVMContext::MD_prof, CI->getMetadata(LLVMContext::MD_prof)); if (DTU) DTU->applyUpdates({{DominatorTree::Insert, BB, UnwindEdge}}); @@ -2349,19 +2343,42 @@ static bool markAliveBlocks(Function &F, isa<UndefValue>(Callee)) { changeToUnreachable(II, false, DTU); Changed = true; - } else if (II->doesNotThrow() && canSimplifyInvokeNoUnwind(&F)) { - if (II->use_empty() && !II->mayHaveSideEffects()) { - // jump to the normal destination branch. - BasicBlock *NormalDestBB = II->getNormalDest(); - BasicBlock *UnwindDestBB = II->getUnwindDest(); - BranchInst::Create(NormalDestBB, II); - UnwindDestBB->removePredecessor(II->getParent()); - II->eraseFromParent(); + } else { + if (II->doesNotReturn() && + !isa<UnreachableInst>(II->getNormalDest()->front())) { + // If we found an invoke of a no-return function, + // create a new empty basic block with an `unreachable` terminator, + // and set it as the normal destination for the invoke, + // unless that is already the case. + // Note that the original normal destination could have other uses. + BasicBlock *OrigNormalDest = II->getNormalDest(); + OrigNormalDest->removePredecessor(II->getParent()); + LLVMContext &Ctx = II->getContext(); + BasicBlock *UnreachableNormalDest = BasicBlock::Create( + Ctx, OrigNormalDest->getName() + ".unreachable", + II->getFunction(), OrigNormalDest); + new UnreachableInst(Ctx, UnreachableNormalDest); + II->setNormalDest(UnreachableNormalDest); if (DTU) - DTU->applyUpdates({{DominatorTree::Delete, BB, UnwindDestBB}}); - } else - changeToCall(II, DTU); - Changed = true; + DTU->applyUpdates( + {{DominatorTree::Delete, BB, OrigNormalDest}, + {DominatorTree::Insert, BB, UnreachableNormalDest}}); + Changed = true; + } + if (II->doesNotThrow() && canSimplifyInvokeNoUnwind(&F)) { + if (II->use_empty() && !II->mayHaveSideEffects()) { + // jump to the normal destination branch. + BasicBlock *NormalDestBB = II->getNormalDest(); + BasicBlock *UnwindDestBB = II->getUnwindDest(); + BranchInst::Create(NormalDestBB, II); + UnwindDestBB->removePredecessor(II->getParent()); + II->eraseFromParent(); + if (DTU) + DTU->applyUpdates({{DominatorTree::Delete, BB, UnwindDestBB}}); + } else + changeToCall(II, DTU); + Changed = true; + } } } else if (auto *CatchSwitch = dyn_cast<CatchSwitchInst>(Terminator)) { // Remove catchpads which cannot be reached. |