Skip to content

Commit

Permalink
[PowerPC] Make sure that we remove dead PHI nodes after the PPCCTRLoo…
Browse files Browse the repository at this point in the history
…ps pass.

Commiting on behalf of Stefan Pintilie.
Differential Revision: https://reviews.llvm.org/D34829

llvm-svn: 307180
  • Loading branch information
Sean Fertile committed Jul 5, 2017
1 parent 45d1928 commit d44cb18
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 1 deletion.
5 changes: 4 additions & 1 deletion llvm/lib/Target/PowerPC/PPCCTRLoops.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -607,7 +607,10 @@ bool PPCCTRLoops::convertToCTRLoop(Loop *L) {
// The old condition may be dead now, and may have even created a dead PHI
// (the original induction variable).
RecursivelyDeleteTriviallyDeadInstructions(OldCond);
DeleteDeadPHIs(CountedExitBlock);
// Run through the basic blocks of the loop and see if any of them have dead
// PHIs that can be removed.
for (auto I : L->blocks())
DeleteDeadPHIs(I);

++NumCTRLoops;
return MadeChange;
Expand Down
38 changes: 38 additions & 0 deletions llvm/test/CodeGen/PowerPC/ppc-ctr-dead-code.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
; RUN: llc < %s -mtriple=powerpc64le-unknown-linux-gnu -mcpu=pwr9 -verify-machineinstrs | FileCheck %s
; RUN: llc < %s -mtriple=powerpc64-unknown-linux-gnu -mcpu=pwr9 -verify-machineinstrs | FileCheck %s
; RUN: llc < %s -mtriple=powerpc64le-unknown-linux-gnu -mcpu=pwr8 -verify-machineinstrs | FileCheck %s
; RUN: llc < %s -mtriple=powerpc64-unknown-linux-gnu -mcpu=pwr8 -verify-machineinstrs | FileCheck %s

; Function Attrs: norecurse nounwind readonly
define signext i32 @limit_loop(i32 signext %iters, i32* nocapture readonly %vec, i32 signext %limit) local_unnamed_addr {
entry:
%cmp5 = icmp sgt i32 %iters, 0
br i1 %cmp5, label %for.body.preheader, label %cleanup

for.body.preheader: ; preds = %entry
%0 = sext i32 %iters to i64
br label %for.body

for.cond: ; preds = %for.body
%cmp = icmp slt i64 %indvars.iv.next, %0
br i1 %cmp, label %for.body, label %cleanup

for.body: ; preds = %for.body.preheader, %for.cond
%indvars.iv = phi i64 [ 0, %for.body.preheader ], [ %indvars.iv.next, %for.cond ]
%arrayidx = getelementptr inbounds i32, i32* %vec, i64 %indvars.iv
%1 = load i32, i32* %arrayidx, align 4
%cmp1 = icmp slt i32 %1, %limit
%indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
br i1 %cmp1, label %for.cond, label %cleanup

cleanup: ; preds = %for.body, %for.cond, %entry
%2 = phi i32 [ 0, %entry ], [ 0, %for.cond ], [ 1, %for.body ]
ret i32 %2
; CHECK-LABEL: limit_loop
; CHECK: mtctr
; CHECK-NOT: addi {{[0-9]+}}, {{[0-9]+}}, 1
; CHECK: bdnz
; CHECK: blr
}


0 comments on commit d44cb18

Please sign in to comment.