xref: /aosp_15_r20/external/llvm/test/Transforms/IndVarSimplify/iv-widen.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -indvars -S | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker; RUN: opt -lcssa -loop-simplify -S < %s | opt -S -passes='require<targetir>,require<scalar-evolution>,require<domtree>,loop(indvars)'
3*9880d681SAndroid Build Coastguard Worker
4*9880d681SAndroid Build Coastguard Worker; Provide legal integer types.
5*9880d681SAndroid Build Coastguard Workertarget datalayout = "n8:16:32:64"
6*9880d681SAndroid Build Coastguard Worker
7*9880d681SAndroid Build Coastguard Worker
8*9880d681SAndroid Build Coastguard Workertarget triple = "x86_64-apple-darwin"
9*9880d681SAndroid Build Coastguard Worker
10*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @loop_0
11*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: B18:
12*9880d681SAndroid Build Coastguard Worker; Only one phi now.
13*9880d681SAndroid Build Coastguard Worker; CHECK: phi
14*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: phi
15*9880d681SAndroid Build Coastguard Worker; One trunc for the gep.
16*9880d681SAndroid Build Coastguard Worker; CHECK: trunc i64 %indvars.iv to i32
17*9880d681SAndroid Build Coastguard Worker; One trunc for the dummy() call.
18*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: exit24:
19*9880d681SAndroid Build Coastguard Worker; CHECK: trunc i64 {{.*}}lcssa.wide to i32
20*9880d681SAndroid Build Coastguard Workerdefine void @loop_0(i32* %a) {
21*9880d681SAndroid Build Coastguard WorkerPrologue:
22*9880d681SAndroid Build Coastguard Worker  br i1 undef, label %B18, label %B6
23*9880d681SAndroid Build Coastguard Worker
24*9880d681SAndroid Build Coastguard WorkerB18:                                        ; preds = %B24, %Prologue
25*9880d681SAndroid Build Coastguard Worker  %.02 = phi i32 [ 0, %Prologue ], [ %tmp33, %B24 ]
26*9880d681SAndroid Build Coastguard Worker  %tmp23 = zext i32 %.02 to i64
27*9880d681SAndroid Build Coastguard Worker  %tmp33 = add i32 %.02, 1
28*9880d681SAndroid Build Coastguard Worker  %o = getelementptr i32, i32* %a, i32 %.02
29*9880d681SAndroid Build Coastguard Worker  %v = load i32, i32* %o
30*9880d681SAndroid Build Coastguard Worker  %t = icmp eq i32 %v, 0
31*9880d681SAndroid Build Coastguard Worker  br i1 %t, label %exit24, label %B24
32*9880d681SAndroid Build Coastguard Worker
33*9880d681SAndroid Build Coastguard WorkerB24:                                        ; preds = %B18
34*9880d681SAndroid Build Coastguard Worker  %t2 = icmp eq i32 %tmp33, 20
35*9880d681SAndroid Build Coastguard Worker  br i1 %t2, label %B6, label %B18
36*9880d681SAndroid Build Coastguard Worker
37*9880d681SAndroid Build Coastguard WorkerB6:                                       ; preds = %Prologue
38*9880d681SAndroid Build Coastguard Worker  ret void
39*9880d681SAndroid Build Coastguard Worker
40*9880d681SAndroid Build Coastguard Workerexit24:                      ; preds = %B18
41*9880d681SAndroid Build Coastguard Worker  call void @dummy(i32 %.02)
42*9880d681SAndroid Build Coastguard Worker  unreachable
43*9880d681SAndroid Build Coastguard Worker}
44*9880d681SAndroid Build Coastguard Worker
45*9880d681SAndroid Build Coastguard Workerdefine void @loop_1(i32 %lim) {
46*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @loop_1(
47*9880d681SAndroid Build Coastguard Worker entry:
48*9880d681SAndroid Build Coastguard Worker  %entry.cond = icmp ne i32 %lim, 0
49*9880d681SAndroid Build Coastguard Worker  br i1 %entry.cond, label %loop, label %leave
50*9880d681SAndroid Build Coastguard Worker
51*9880d681SAndroid Build Coastguard Worker loop:
52*9880d681SAndroid Build Coastguard Worker; CHECK: loop:
53*9880d681SAndroid Build Coastguard Worker; CHECK:  %indvars.iv = phi i64 [ 1, %loop.preheader ], [ %indvars.iv.next, %loop ]
54*9880d681SAndroid Build Coastguard Worker; CHECK:  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
55*9880d681SAndroid Build Coastguard Worker; CHECK:  [[IV_INC:%[^ ]+]] = add nsw i64 %indvars.iv, -1
56*9880d681SAndroid Build Coastguard Worker; CHECK:  call void @dummy.i64(i64 [[IV_INC]])
57*9880d681SAndroid Build Coastguard Worker
58*9880d681SAndroid Build Coastguard Worker  %iv = phi i32 [ 1, %entry ], [ %iv.inc, %loop ]
59*9880d681SAndroid Build Coastguard Worker  %iv.inc = add i32 %iv, 1
60*9880d681SAndroid Build Coastguard Worker  %iv.inc.sub = add i32 %iv, -1
61*9880d681SAndroid Build Coastguard Worker  %iv.inc.sub.zext = zext i32 %iv.inc.sub to i64
62*9880d681SAndroid Build Coastguard Worker  call void @dummy.i64(i64 %iv.inc.sub.zext)
63*9880d681SAndroid Build Coastguard Worker  %be.cond = icmp ult i32 %iv.inc, %lim
64*9880d681SAndroid Build Coastguard Worker  br i1 %be.cond, label %loop, label %leave
65*9880d681SAndroid Build Coastguard Worker
66*9880d681SAndroid Build Coastguard Worker leave:
67*9880d681SAndroid Build Coastguard Worker  ret void
68*9880d681SAndroid Build Coastguard Worker}
69*9880d681SAndroid Build Coastguard Worker
70*9880d681SAndroid Build Coastguard Workerdeclare void @dummy(i32)
71*9880d681SAndroid Build Coastguard Workerdeclare void @dummy.i64(i64)
72