From eff5e69c82096812acec0c5c6f135c755a1632d2 Mon Sep 17 00:00:00 2001 From: Nick Lewycky Date: Sun, 20 Feb 2011 18:05:56 +0000 Subject: [PATCH] Make RecursivelyDeleteDeadPHINode delete a phi node that has no users and add a test for that. With this change, test/CodeGen/X86/codegen-dce.ll no longer finds any instructions to DCE, so delete the test. Also renamed J and JP to I and IP in RecursivelyDeleteDeadPHINode. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@126088 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Utils/Local.cpp | 19 +++++++----- test/CodeGen/X86/codegen-dce.ll | 43 ---------------------------- unittests/Transforms/Utils/Local.cpp | 5 ++++ 3 files changed, 17 insertions(+), 50 deletions(-) delete mode 100644 test/CodeGen/X86/codegen-dce.ll diff --git a/lib/Transforms/Utils/Local.cpp b/lib/Transforms/Utils/Local.cpp index 063c76e9522..20d798948e2 100644 --- a/lib/Transforms/Utils/Local.cpp +++ b/lib/Transforms/Utils/Local.cpp @@ -283,6 +283,11 @@ static bool areAllUsesEqual(Instruction *I) { /// delete it. If that makes any of its operands trivially dead, delete them /// too, recursively. Return true if the PHI node is actually deleted. bool llvm::RecursivelyDeleteDeadPHINode(PHINode *PN) { + if (PN->use_empty()) { + PN->eraseFromParent(); + return true; + } + // We can remove a PHI if it is on a cycle in the def-use graph // where each node in the cycle has degree one, i.e. only one use, // and is an instruction with no side effects. @@ -292,16 +297,16 @@ bool llvm::RecursivelyDeleteDeadPHINode(PHINode *PN) { bool Changed = false; SmallPtrSet PHIs; PHIs.insert(PN); - for (Instruction *J = cast(*PN->use_begin()); - areAllUsesEqual(J) && !J->mayHaveSideEffects(); - J = cast(*J->use_begin())) + for (Instruction *I = cast(*PN->use_begin()); + areAllUsesEqual(I) && !I->mayHaveSideEffects(); + I = cast(*I->use_begin())) // If we find a PHI more than once, we're on a cycle that // won't prove fruitful. - if (PHINode *JP = dyn_cast(J)) - if (!PHIs.insert(JP)) { + if (PHINode *IP = dyn_cast(I)) + if (!PHIs.insert(IP)) { // Break the cycle and delete the PHI and its operands. - JP->replaceAllUsesWith(UndefValue::get(JP->getType())); - (void)RecursivelyDeleteTriviallyDeadInstructions(JP); + IP->replaceAllUsesWith(UndefValue::get(IP->getType())); + (void)RecursivelyDeleteTriviallyDeadInstructions(IP); Changed = true; break; } diff --git a/test/CodeGen/X86/codegen-dce.ll b/test/CodeGen/X86/codegen-dce.ll deleted file mode 100644 index d83efaf5776..00000000000 --- a/test/CodeGen/X86/codegen-dce.ll +++ /dev/null @@ -1,43 +0,0 @@ -; RUN: llc < %s -march=x86 -stats |& grep {codegen-dce} | grep {Number of dead instructions deleted} - - %struct.anon = type { [3 x double], double, %struct.node*, [64 x %struct.bnode*], [64 x %struct.bnode*] } - %struct.bnode = type { i16, double, [3 x double], i32, i32, [3 x double], [3 x double], [3 x double], double, %struct.bnode*, %struct.bnode* } - %struct.node = type { i16, double, [3 x double], i32, i32 } - -define i32 @main(i32 %argc, i8** nocapture %argv) nounwind { -entry: - %0 = malloc %struct.anon ; <%struct.anon*> [#uses=2] - %1 = getelementptr %struct.anon* %0, i32 0, i32 2 ; <%struct.node**> [#uses=1] - br label %bb14.i - -bb14.i: ; preds = %bb14.i, %entry - %i8.0.reg2mem.0.i = phi i32 [ 0, %entry ], [ %2, %bb14.i ] ; [#uses=1] - %2 = add i32 %i8.0.reg2mem.0.i, 1 ; [#uses=2] - %exitcond74.i = icmp eq i32 %2, 32 ; [#uses=1] - br i1 %exitcond74.i, label %bb32.i, label %bb14.i - -bb32.i: ; preds = %bb32.i, %bb14.i - %tmp.0.reg2mem.0.i = phi i32 [ %indvar.next63.i, %bb32.i ], [ 0, %bb14.i ] ; [#uses=1] - %indvar.next63.i = add i32 %tmp.0.reg2mem.0.i, 1 ; [#uses=2] - %exitcond64.i = icmp eq i32 %indvar.next63.i, 64 ; [#uses=1] - br i1 %exitcond64.i, label %bb47.loopexit.i, label %bb32.i - -bb.i.i: ; preds = %bb47.loopexit.i - unreachable - -stepsystem.exit.i: ; preds = %bb47.loopexit.i - store %struct.node* null, %struct.node** %1, align 4 - br label %bb.i6.i - -bb.i6.i: ; preds = %bb.i6.i, %stepsystem.exit.i - br i1 false, label %bb107.i.i, label %bb.i6.i - -bb107.i.i: ; preds = %bb107.i.i, %bb.i6.i - %q_addr.0.i.i.in = phi %struct.bnode** [ null, %bb107.i.i ], [ %3, %bb.i6.i ] ; <%struct.bnode**> [#uses=0] - br label %bb107.i.i - -bb47.loopexit.i: ; preds = %bb32.i - %3 = getelementptr %struct.anon* %0, i32 0, i32 4, i32 0 ; <%struct.bnode**> [#uses=1] - %4 = icmp eq %struct.node* null, null ; [#uses=1] - br i1 %4, label %stepsystem.exit.i, label %bb.i.i -} diff --git a/unittests/Transforms/Utils/Local.cpp b/unittests/Transforms/Utils/Local.cpp index e969e958a74..2de09ada27a 100644 --- a/unittests/Transforms/Utils/Local.cpp +++ b/unittests/Transforms/Utils/Local.cpp @@ -42,6 +42,11 @@ TEST(Local, RecursivelyDeleteDeadPHINodes) { EXPECT_EQ(&bb0->front(), br0); EXPECT_EQ(&bb1->front(), br1); + builder.SetInsertPoint(bb0); + phi = builder.CreatePHI(Type::getInt32Ty(C)); + + EXPECT_TRUE(RecursivelyDeleteDeadPHINode(phi)); + bb0->dropAllReferences(); bb1->dropAllReferences(); delete bb0;