Skip to content

Commit

Permalink
Remove dead instructions before Redoing
Browse files Browse the repository at this point in the history
Before reevaluating instructions, iterate over all instructions
to be reevaluated and remove trivially dead instructions and if
any of it's operands become trivially dead, mark it for deletion
until all trivially dead instructions have been removed

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@256773 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
Aditya Nandakumar committed Jan 4, 2016
1 parent 8c5b0b1 commit 3c91dc3
Show file tree
Hide file tree
Showing 3 changed files with 68 additions and 2 deletions.
34 changes: 33 additions & 1 deletion lib/Transforms/Scalar/Reassociate.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -183,6 +183,8 @@ namespace {
Value *OptimizeMul(BinaryOperator *I, SmallVectorImpl<ValueEntry> &Ops);
Value *RemoveFactorFromExpression(Value *V, Value *Factor);
void EraseInst(Instruction *I);
void RecursivelyEraseDeadInsts(Instruction *I,
SetVector<AssertingVH<Instruction>> &Insts);
void OptimizeInst(Instruction *I);
Instruction *canonicalizeNegConstExpr(Instruction *I);
};
Expand Down Expand Up @@ -1926,6 +1928,22 @@ Value *Reassociate::OptimizeExpression(BinaryOperator *I,
return nullptr;
}

// Remove dead instructions and if any operands are trivially dead add them to
// Insts so they will be removed as well.
void Reassociate::RecursivelyEraseDeadInsts(
Instruction *I, SetVector<AssertingVH<Instruction>> &Insts) {
assert(isInstructionTriviallyDead(I) && "Trivially dead instructions only!");
SmallVector<Value *, 4> Ops(I->op_begin(), I->op_end());
ValueRankMap.erase(I);
Insts.remove(I);
RedoInsts.remove(I);
I->eraseFromParent();
for (auto Op : Ops)
if (Instruction *OpInst = dyn_cast<Instruction>(Op))
if (OpInst->use_empty())
Insts.insert(OpInst);
}

/// Zap the given instruction, adding interesting operands to the work list.
void Reassociate::EraseInst(Instruction *I) {
assert(isInstructionTriviallyDead(I) && "Trivially dead instructions only!");
Expand Down Expand Up @@ -2255,7 +2273,21 @@ bool Reassociate::runOnFunction(Function &F) {
++II;
}

// If this produced extra instructions to optimize, handle them now.
// Make a copy of all the instructions to be redone so we can remove dead
// instructions.
SetVector<AssertingVH<Instruction>> ToRedo(RedoInsts);
// Iterate over all instructions to be reevaluated and remove trivially dead
// instructions. If any operand of the trivially dead instruction becomes
// dead mark it for deletion as well. Continue this process until all
// trivially dead instructions have been removed.
while (!ToRedo.empty()) {
Instruction *I = ToRedo.pop_back_val();
if (isInstructionTriviallyDead(I))
RecursivelyEraseDeadInsts(I, ToRedo);
}

// Now that we have removed dead instructions, we can reoptimize the
// remaining instructions.
while (!RedoInsts.empty()) {
Instruction *I = RedoInsts.pop_back_val();
if (isInstructionTriviallyDead(I))
Expand Down
34 changes: 34 additions & 0 deletions test/Transforms/Reassociate/factorize-again.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
; RUN: opt -S -reassociate < %s | FileCheck %s

; CHECK-LABEL: main
; CHECK: %2 = fsub
; CHECK: %3 = fsub
; CHECK: fadd fast float %3, %2
define void @main(float, float) {
wrapper_entry:
%2 = fsub float undef, %0
%3 = fsub float undef, %1
%4 = call float @llvm.rsqrt.f32(float undef)
%5 = fmul fast float undef, %4
%6 = fmul fast float %2, %4
%7 = fmul fast float %3, %4
%8 = fmul fast float %5, undef
%9 = fmul fast float %6, undef
%10 = fmul fast float %7, undef
%11 = fadd fast float %8, %9
%12 = fadd fast float %11, %10
%13 = call float @foo2(float %12, float 0.000000e+00)
%mul36 = fmul fast float %13, 1.500000e+00
call void @foo1(i32 4, float %mul36)
ret void
}

declare void @foo1(i32, float)

declare float @foo2(float, float) #1

declare float @llvm.rsqrt.f32(float) #1

attributes #0 = { argmemonly nounwind }
attributes #1 = { nounwind readnone }

2 changes: 1 addition & 1 deletion test/Transforms/Reassociate/secondary.ll
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

; CHECK: define
; CHECK-NOT: undef
; CHECK: %factor = mul i32 %tmp3.neg, 2
; CHECK: %factor = mul i32 %tmp3, -2
; CHECK-NOT: undef
; CHECK: }

Expand Down

0 comments on commit 3c91dc3

Please sign in to comment.