From 838b97edfaf7470941d0e89ef3b9ed8867c93fc4 Mon Sep 17 00:00:00 2001 From: Cameron Zwarich Date: Tue, 15 Mar 2011 07:41:25 +0000 Subject: Do not add PHIs with no users when creating LCSSA form. Patch by Andrew Clinton. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@127674 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Utils/LCSSA.cpp | 10 ++++++ .../LCSSA/2006-06-03-IncorrectIDFPhis.ll | 2 -- test/Transforms/LCSSA/unused-phis.ll | 38 ++++++++++++++++++++++ 3 files changed, 48 insertions(+), 2 deletions(-) create mode 100644 test/Transforms/LCSSA/unused-phis.ll diff --git a/lib/Transforms/Utils/LCSSA.cpp b/lib/Transforms/Utils/LCSSA.cpp index b2e5fa6d7e..ade4a43c6c 100644 --- a/lib/Transforms/Utils/LCSSA.cpp +++ b/lib/Transforms/Utils/LCSSA.cpp @@ -207,6 +207,8 @@ bool LCSSA::ProcessInstruction(Instruction *Inst, DomTreeNode *DomNode = DT->getNode(DomBB); + SmallVector AddedPHIs; + SSAUpdater SSAUpdate; SSAUpdate.Initialize(Inst->getType(), Inst->getName()); @@ -236,6 +238,8 @@ bool LCSSA::ProcessInstruction(Instruction *Inst, &PN->getOperandUse( PN->getOperandNumForIncomingValue(PN->getNumIncomingValues()-1))); } + + AddedPHIs.push_back(PN); // Remember that this phi makes the value alive in this block. SSAUpdate.AddAvailableValue(ExitBB, PN); @@ -262,6 +266,12 @@ bool LCSSA::ProcessInstruction(Instruction *Inst, // Otherwise, do full PHI insertion. SSAUpdate.RewriteUse(*UsesToRewrite[i]); } + + // Remove PHI nodes that did not have any uses rewritten. + for (unsigned i = 0, e = AddedPHIs.size(); i != e; ++i) { + if (!AddedPHIs[i]->hasNUsesOrMore(1)) + AddedPHIs[i]->eraseFromParent(); + } return true; } diff --git a/test/Transforms/LCSSA/2006-06-03-IncorrectIDFPhis.ll b/test/Transforms/LCSSA/2006-06-03-IncorrectIDFPhis.ll index 7a80f8052b..153458579b 100644 --- a/test/Transforms/LCSSA/2006-06-03-IncorrectIDFPhis.ll +++ b/test/Transforms/LCSSA/2006-06-03-IncorrectIDFPhis.ll @@ -1,7 +1,5 @@ ; RUN: opt < %s -loop-simplify -lcssa -S | \ ; RUN: grep {%%SJE.0.0.lcssa = phi .struct.SetJmpMapEntry} -; RUN: opt < %s -loop-simplify -lcssa -S | \ -; RUN: grep {%%SJE.0.0.lcssa1 = phi .struct.SetJmpMapEntry} %struct.SetJmpMapEntry = type { i8*, i32, %struct.SetJmpMapEntry* } diff --git a/test/Transforms/LCSSA/unused-phis.ll b/test/Transforms/LCSSA/unused-phis.ll new file mode 100644 index 0000000000..aa2ab96341 --- /dev/null +++ b/test/Transforms/LCSSA/unused-phis.ll @@ -0,0 +1,38 @@ +; RUN: opt < %s -lcssa -S | FileCheck %s +; CHECK: exit1: +; CHECK: .lcssa = +; CHECK: exit2: +; CHECK: .lcssa2 = +; CHECK: exit3: +; CHECK-NOT: .lcssa1 = + +; Test to ensure that when there are multiple exit blocks, PHI nodes are +; only inserted by LCSSA when there is a use dominated by a given exit +; block. + +declare void @printf(i32 %i) + +define i32 @unused_phis() nounwind { +entry: + br label %loop + +loop: + %i = phi i32 [0, %entry], [1, %then2] + br i1 undef, label %exit1, label %then1 + +then1: + br i1 undef, label %exit2, label %then2 + +then2: + br i1 undef, label %exit3, label %loop + +exit1: + call void @printf(i32 %i) + ret i32 %i + +exit2: + ret i32 %i + +exit3: + ret i32 0 +} -- cgit v1.2.3