[llvm] r248983 - [NaryReassociate] SeenExprs records WeakVH
Jingyue Wu via llvm-commits
llvm-commits at lists.llvm.org
Wed Sep 30 20:51:45 PDT 2015
Author: jingyue
Date: Wed Sep 30 22:51:44 2015
New Revision: 248983
URL: http://llvm.org/viewvc/llvm-project?rev=248983&view=rev
Log:
[NaryReassociate] SeenExprs records WeakVH
Summary:
The instructions SeenExprs records may be deleted during rewriting.
FindClosestMatchingDominator should ignore these deleted instructions.
Fixes PR24301.
Reviewers: grosser
Subscribers: grosser, llvm-commits
Differential Revision: http://reviews.llvm.org/D13315
Added:
llvm/trunk/test/Transforms/NaryReassociate/pr24301.ll
Modified:
llvm/trunk/lib/Transforms/Scalar/NaryReassociate.cpp
Modified: llvm/trunk/lib/Transforms/Scalar/NaryReassociate.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/NaryReassociate.cpp?rev=248983&r1=248982&r2=248983&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Scalar/NaryReassociate.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/NaryReassociate.cpp Wed Sep 30 22:51:44 2015
@@ -188,7 +188,7 @@ private:
// foo(a + b);
// if (p2)
// bar(a + b);
- DenseMap<const SCEV *, SmallVector<Instruction *, 2>> SeenExprs;
+ DenseMap<const SCEV *, SmallVector<WeakVH, 2>> SeenExprs;
};
} // anonymous namespace
@@ -252,13 +252,15 @@ bool NaryReassociate::doOneIteration(Fun
Changed = true;
SE->forgetValue(I);
I->replaceAllUsesWith(NewI);
+ // If SeenExprs constains I's WeakVH, that entry will be replaced with
+ // nullptr.
RecursivelyDeleteTriviallyDeadInstructions(I, TLI);
I = NewI;
}
// Add the rewritten instruction to SeenExprs; the original instruction
// is deleted.
const SCEV *NewSCEV = SE->getSCEV(I);
- SeenExprs[NewSCEV].push_back(I);
+ SeenExprs[NewSCEV].push_back(WeakVH(I));
// Ideally, NewSCEV should equal OldSCEV because tryReassociate(I)
// is equivalent to I. However, ScalarEvolution::getSCEV may
// weaken nsw causing NewSCEV not to equal OldSCEV. For example, suppose
@@ -278,7 +280,7 @@ bool NaryReassociate::doOneIteration(Fun
//
// This improvement is exercised in @reassociate_gep_nsw in nary-gep.ll.
if (NewSCEV != OldSCEV)
- SeenExprs[OldSCEV].push_back(I);
+ SeenExprs[OldSCEV].push_back(WeakVH(I));
}
}
}
@@ -562,9 +564,13 @@ NaryReassociate::findClosestMatchingDomi
// future instruction either. Therefore, we pop it out of the stack. This
// optimization makes the algorithm O(n).
while (!Candidates.empty()) {
- Instruction *Candidate = Candidates.back();
- if (DT->dominates(Candidate, Dominatee))
- return Candidate;
+ // Candidates stores WeakVHs, so a candidate can be nullptr if it's removed
+ // during rewriting.
+ if (Value *Candidate = Candidates.back()) {
+ Instruction *CandidateInstruction = cast<Instruction>(Candidate);
+ if (DT->dominates(CandidateInstruction, Dominatee))
+ return CandidateInstruction;
+ }
Candidates.pop_back();
}
return nullptr;
Added: llvm/trunk/test/Transforms/NaryReassociate/pr24301.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/NaryReassociate/pr24301.ll?rev=248983&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/NaryReassociate/pr24301.ll (added)
+++ llvm/trunk/test/Transforms/NaryReassociate/pr24301.ll Wed Sep 30 22:51:44 2015
@@ -0,0 +1,14 @@
+; RUN: opt < %s -nary-reassociate -S | FileCheck %s
+
+define i32 @foo(i32 %tmp4) {
+; CHECK-LABEL: @foo(
+entry:
+ %tmp5 = add i32 %tmp4, 8
+ %tmp13 = add i32 %tmp4, -128 ; deleted
+ %tmp14 = add i32 %tmp13, 8 ; => %tmp5 + -128
+ %tmp21 = add i32 119, %tmp4
+ ; do not rewrite %tmp23 against %tmp13 because %tmp13 is already deleted
+ %tmp23 = add i32 %tmp21, -128
+; CHECK: %tmp23 = add i32 %tmp21, -128
+ ret i32 %tmp23
+}
More information about the llvm-commits
mailing list