indvars: insert truncate at loop boundary to avoid redundant IVs.

When widening an IV to remove s/zext, we generally try to eliminate
the original narrow IV. However, LCSSA phi nodes outside the loop were
still using the original IV. Clean this up more aggressively to avoid
redundancy in generated code.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@198338 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Andrew Trick
2014-01-02 19:29:38 +00:00
parent d573aba8e1
commit fcbe3d9501
2 changed files with 51 additions and 5 deletions

View File

@@ -0,0 +1,39 @@
; RUN: opt < %s -indvars -S | FileCheck %s
target triple = "x86_64-apple-darwin"
; CHECK-LABEL: @sloop
; CHECK-LABEL: B18:
; Only one phi now.
; CHECK: phi
; CHECK-NOT: phi
; We now get 2 trunc, one for the gep and one for the lcssa phi.
; CHECK: trunc i64 %indvars.iv to i32
; CHECK: trunc i64 %indvars.iv to i32
; CHECK-LABEL: B24:
define void @sloop(i32* %a) {
Prologue:
br i1 undef, label %B18, label %B6
B18: ; preds = %B24, %Prologue
%.02 = phi i32 [ 0, %Prologue ], [ %tmp33, %B24 ]
%tmp23 = zext i32 %.02 to i64
%tmp33 = add i32 %.02, 1
%o = getelementptr i32* %a, i32 %.02
%v = load i32* %o
%t = icmp eq i32 %v, 0
br i1 %t, label %exit24, label %B24
B24: ; preds = %B18
%t2 = icmp eq i32 %tmp33, 20
br i1 %t2, label %B6, label %B18
B6: ; preds = %Prologue
ret void
exit24: ; preds = %B18
call void @dummy(i32 %.02)
unreachable
}
declare void @dummy(i32)