forked from OSchip/llvm-project
[IPSCCP] Switch away from Instruction::isSafeToRemove()
In D115737 I found that I needed to teach Instruction::isSafeToRemove() about strictfp/constrained intrinsics. It was pointed out that this is probably the wrong function to use isInstructionTriviallyDead(). It doesn't make sense to have a "second, worse implementation". I also believe that the Instruction class is the wrong place for this functionality. The information about whether or not an instruction can be removed is in the transform passes and should stay there. Differential Revision: https://reviews.llvm.org/D118387
This commit is contained in:
parent
c2e3e91dde
commit
a1f1bd547b
|
@ -91,6 +91,18 @@ static bool isOverdefined(const ValueLatticeElement &LV) {
|
|||
return !LV.isUnknownOrUndef() && !isConstant(LV);
|
||||
}
|
||||
|
||||
static bool canRemoveInstruction(Instruction *I) {
|
||||
if (wouldInstructionBeTriviallyDead(I))
|
||||
return true;
|
||||
|
||||
// Some instructions can be handled but are rejected above. Catch
|
||||
// those cases by falling through to here.
|
||||
// TODO: Mark globals as being constant earlier, so
|
||||
// TODO: wouldInstructionBeTriviallyDead() knows that atomic loads
|
||||
// TODO: are safe to remove.
|
||||
return isa<LoadInst>(I);
|
||||
}
|
||||
|
||||
static bool tryToReplaceWithConstant(SCCPSolver &Solver, Value *V) {
|
||||
Constant *Const = nullptr;
|
||||
if (V->getType()->isStructTy()) {
|
||||
|
@ -121,7 +133,8 @@ static bool tryToReplaceWithConstant(SCCPSolver &Solver, Value *V) {
|
|||
// Calls with "clang.arc.attachedcall" implicitly use the return value and
|
||||
// those uses cannot be updated with a constant.
|
||||
CallBase *CB = dyn_cast<CallBase>(V);
|
||||
if (CB && ((CB->isMustTailCall() && !CB->isSafeToRemove()) ||
|
||||
if (CB && ((CB->isMustTailCall() &&
|
||||
!canRemoveInstruction(CB)) ||
|
||||
CB->getOperandBundle(LLVMContext::OB_clang_arc_attachedcall))) {
|
||||
Function *F = CB->getCalledFunction();
|
||||
|
||||
|
@ -150,7 +163,7 @@ static bool simplifyInstsInBlock(SCCPSolver &Solver, BasicBlock &BB,
|
|||
if (Inst.getType()->isVoidTy())
|
||||
continue;
|
||||
if (tryToReplaceWithConstant(Solver, &Inst)) {
|
||||
if (Inst.isSafeToRemove())
|
||||
if (canRemoveInstruction(&Inst))
|
||||
Inst.eraseFromParent();
|
||||
|
||||
MadeChanges = true;
|
||||
|
|
Loading…
Reference in New Issue