[llvm] r331741 - [LCSSA] Do not remove used PHI nodes in formLCSSAForInstructions
Bjorn Pettersson via llvm-commits
llvm-commits at lists.llvm.org
Mon May 7 23:59:47 PDT 2018
Author: bjope
Date: Mon May 7 23:59:47 2018
New Revision: 331741
URL: http://llvm.org/viewvc/llvm-project?rev=331741&view=rev
Log:
[LCSSA] Do not remove used PHI nodes in formLCSSAForInstructions
Summary:
In formLCSSAForInstructions we speculatively add new PHI
nodes, that sometimes ends up without having any uses. It
has been discovered that sometimes an added PHI node can
appear as being unused in one iteration of the Worklist,
although it can end up being used by a PHI node added in
a later iteration. We now check, a second time, that the
PHI node still is unused before we remove it. This avoids
an assert about "Trying to remove a phi with uses." for the
added test case.
Reviewers: davide, mzolotukhin, mattd, dberlin
Reviewed By: mzolotukhin, dberlin
Subscribers: dberlin, mzolotukhin, davide, bjope, uabelho, llvm-commits
Differential Revision: https://reviews.llvm.org/D46422
Added:
llvm/trunk/test/Transforms/LCSSA/remove-phis.ll
Modified:
llvm/trunk/lib/Transforms/Utils/LCSSA.cpp
Modified: llvm/trunk/lib/Transforms/Utils/LCSSA.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/LCSSA.cpp?rev=331741&r1=331740&r2=331741&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Utils/LCSSA.cpp (original)
+++ llvm/trunk/lib/Transforms/Utils/LCSSA.cpp Mon May 7 23:59:47 2018
@@ -226,11 +226,16 @@ bool llvm::formLCSSAForInstructions(Smal
insertDebugValuesForPHIs(InstBB, NeedDbgValues);
Changed = true;
}
- // Remove PHI nodes that did not have any uses rewritten.
- for (PHINode *PN : PHIsToRemove) {
- assert (PN->use_empty() && "Trying to remove a phi with uses.");
- PN->eraseFromParent();
- }
+ // Remove PHI nodes that did not have any uses rewritten. We need to redo the
+ // use_empty() check here, because even if the PHI node wasn't used when added
+ // to PHIsToRemove, later added PHI nodes can be using it. This cleanup is
+ // not guaranteed to handle trees/cycles of PHI nodes that only are used by
+ // each other. Such situations has only been noticed when the input IR
+ // contains unreachable code, and leaving some extra redundant PHI nodes in
+ // such situations is considered a minor problem.
+ for (PHINode *PN : PHIsToRemove)
+ if (PN->use_empty())
+ PN->eraseFromParent();
return Changed;
}
Added: llvm/trunk/test/Transforms/LCSSA/remove-phis.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/LCSSA/remove-phis.ll?rev=331741&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/LCSSA/remove-phis.ll (added)
+++ llvm/trunk/test/Transforms/LCSSA/remove-phis.ll Mon May 7 23:59:47 2018
@@ -0,0 +1,56 @@
+; RUN: opt < %s -lcssa -verify -S -o /dev/null
+
+; This bugpoint reduced test case used to assert when removing unused PHI nodes.
+; Just verify that we do not assert/crash.
+
+define void @test() {
+entry:
+ br label %gazank
+
+gazank:
+ %value = phi i16 [ 0, %entry ], [ undef, %gazonk ]
+ br i1 undef, label %gazink, label %qqq
+
+gazink:
+ br i1 undef, label %gazonk, label %infinite.loop.pred
+
+gazonk:
+ br i1 undef, label %exit1, label %gazank
+
+qqq:
+ br i1 undef, label %www, label %exit2
+
+www:
+ br i1 undef, label %qqq, label %foo.pred
+
+foo.pred:
+ br label %foo
+
+foo:
+ br i1 undef, label %bar, label %exit1.pred
+
+bar:
+ br i1 undef, label %foo, label %exit2.pred
+
+unreachable1:
+ br i1 undef, label %foo, label %exit2.pred
+
+exit1.pred:
+ br label %exit1
+
+exit1:
+ ret void
+
+exit2.pred:
+ br label %exit2
+
+exit2:
+ ret void
+
+infinite.loop.pred:
+ br label %infinite.loop
+
+infinite.loop:
+ %dead = phi i16 [ %value, %infinite.loop.pred ], [ 0, %infinite.loop ]
+ br label %infinite.loop
+}
More information about the llvm-commits
mailing list