xref: /aosp_15_r20/external/llvm/test/Analysis/ScalarEvolution/infer-prestart-no-wrap.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; ; RUN: opt -analyze -scalar-evolution < %s | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Workerdefine void @infer.sext.0(i1* %c, i32 %start, i32* %buf) {
4*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: Classifying expressions for: @infer.sext.0
5*9880d681SAndroid Build Coastguard Worker entry:
6*9880d681SAndroid Build Coastguard Worker  br label %loop
7*9880d681SAndroid Build Coastguard Worker
8*9880d681SAndroid Build Coastguard Worker loop:
9*9880d681SAndroid Build Coastguard Worker  %counter = phi i32 [ 0, %entry ], [ %counter.inc, %loop ]
10*9880d681SAndroid Build Coastguard Worker  %idx = phi i32 [ %start, %entry ], [ %idx.inc, %loop ]
11*9880d681SAndroid Build Coastguard Worker  %idx.inc = add nsw i32 %idx, 1
12*9880d681SAndroid Build Coastguard Worker  %idx.inc.sext = sext i32 %idx.inc to i64
13*9880d681SAndroid Build Coastguard Worker; CHECK: %idx.inc.sext = sext i32 %idx.inc to i64
14*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: -->  {(1 + (sext i32 %start to i64))<nsw>,+,1}<nsw><%loop>
15*9880d681SAndroid Build Coastguard Worker
16*9880d681SAndroid Build Coastguard Worker  %buf.gep = getelementptr inbounds i32, i32* %buf, i32 %idx.inc
17*9880d681SAndroid Build Coastguard Worker  %val = load i32, i32* %buf.gep
18*9880d681SAndroid Build Coastguard Worker
19*9880d681SAndroid Build Coastguard Worker  %condition = icmp eq i32 %counter, 1
20*9880d681SAndroid Build Coastguard Worker  %counter.inc = add i32 %counter, 1
21*9880d681SAndroid Build Coastguard Worker  br i1 %condition, label %exit, label %loop
22*9880d681SAndroid Build Coastguard Worker
23*9880d681SAndroid Build Coastguard Worker exit:
24*9880d681SAndroid Build Coastguard Worker  ret void
25*9880d681SAndroid Build Coastguard Worker}
26*9880d681SAndroid Build Coastguard Worker
27*9880d681SAndroid Build Coastguard Workerdefine void @infer.zext.0(i1* %c, i32 %start, i32* %buf) {
28*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: Classifying expressions for: @infer.zext.0
29*9880d681SAndroid Build Coastguard Worker entry:
30*9880d681SAndroid Build Coastguard Worker  br label %loop
31*9880d681SAndroid Build Coastguard Worker
32*9880d681SAndroid Build Coastguard Worker loop:
33*9880d681SAndroid Build Coastguard Worker  %counter = phi i32 [ 0, %entry ], [ %counter.inc, %loop ]
34*9880d681SAndroid Build Coastguard Worker  %idx = phi i32 [ %start, %entry ], [ %idx.inc, %loop ]
35*9880d681SAndroid Build Coastguard Worker  %idx.inc = add nuw i32 %idx, 1
36*9880d681SAndroid Build Coastguard Worker  %idx.inc.sext = zext i32 %idx.inc to i64
37*9880d681SAndroid Build Coastguard Worker; CHECK: %idx.inc.sext = zext i32 %idx.inc to i64
38*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: -->  {(1 + (zext i32 %start to i64))<nuw><nsw>,+,1}<nuw><%loop>
39*9880d681SAndroid Build Coastguard Worker
40*9880d681SAndroid Build Coastguard Worker  %buf.gep = getelementptr inbounds i32, i32* %buf, i32 %idx.inc
41*9880d681SAndroid Build Coastguard Worker  %val = load i32, i32* %buf.gep
42*9880d681SAndroid Build Coastguard Worker
43*9880d681SAndroid Build Coastguard Worker  %condition = icmp eq i32 %counter, 1
44*9880d681SAndroid Build Coastguard Worker  %counter.inc = add i32 %counter, 1
45*9880d681SAndroid Build Coastguard Worker  br i1 %condition, label %exit, label %loop
46*9880d681SAndroid Build Coastguard Worker
47*9880d681SAndroid Build Coastguard Worker exit:
48*9880d681SAndroid Build Coastguard Worker  ret void
49*9880d681SAndroid Build Coastguard Worker}
50*9880d681SAndroid Build Coastguard Worker
51*9880d681SAndroid Build Coastguard Workerdefine void @infer.sext.1(i32 %start, i1* %c) {
52*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: Classifying expressions for: @infer.sext.1
53*9880d681SAndroid Build Coastguard Worker entry:
54*9880d681SAndroid Build Coastguard Worker  %start.mul = mul i32 %start, 4
55*9880d681SAndroid Build Coastguard Worker  %start.real = add i32 %start.mul, 2
56*9880d681SAndroid Build Coastguard Worker  br label %loop
57*9880d681SAndroid Build Coastguard Worker
58*9880d681SAndroid Build Coastguard Worker loop:
59*9880d681SAndroid Build Coastguard Worker  %idx = phi i32 [ %start.real, %entry ], [ %idx.inc, %loop ]
60*9880d681SAndroid Build Coastguard Worker  %idx.sext = sext i32 %idx to i64
61*9880d681SAndroid Build Coastguard Worker; CHECK: %idx.sext = sext i32 %idx to i64
62*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  -->  {(2 + (sext i32 (4 * %start) to i64))<nsw>,+,2}<nsw><%loop>
63*9880d681SAndroid Build Coastguard Worker  %idx.inc = add nsw i32 %idx, 2
64*9880d681SAndroid Build Coastguard Worker  %condition = load i1, i1* %c
65*9880d681SAndroid Build Coastguard Worker  br i1 %condition, label %exit, label %loop
66*9880d681SAndroid Build Coastguard Worker
67*9880d681SAndroid Build Coastguard Worker exit:
68*9880d681SAndroid Build Coastguard Worker  ret void
69*9880d681SAndroid Build Coastguard Worker}
70*9880d681SAndroid Build Coastguard Worker
71*9880d681SAndroid Build Coastguard Workerdefine void @infer.sext.2(i1* %c, i8 %start) {
72*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: Classifying expressions for: @infer.sext.2
73*9880d681SAndroid Build Coastguard Worker entry:
74*9880d681SAndroid Build Coastguard Worker  %start.inc = add i8 %start, 1
75*9880d681SAndroid Build Coastguard Worker  %entry.condition = icmp slt i8 %start, 127
76*9880d681SAndroid Build Coastguard Worker  br i1 %entry.condition, label %loop, label %exit
77*9880d681SAndroid Build Coastguard Worker
78*9880d681SAndroid Build Coastguard Worker loop:
79*9880d681SAndroid Build Coastguard Worker  %idx = phi i8 [ %start.inc, %entry ], [ %idx.inc, %loop ]
80*9880d681SAndroid Build Coastguard Worker  %idx.sext = sext i8 %idx to i16
81*9880d681SAndroid Build Coastguard Worker; CHECK: %idx.sext = sext i8 %idx to i16
82*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: -->  {(1 + (sext i8 %start to i16))<nsw>,+,1}<nsw><%loop>
83*9880d681SAndroid Build Coastguard Worker  %idx.inc = add nsw i8 %idx, 1
84*9880d681SAndroid Build Coastguard Worker  %condition = load volatile i1, i1* %c
85*9880d681SAndroid Build Coastguard Worker  br i1 %condition, label %exit, label %loop
86*9880d681SAndroid Build Coastguard Worker
87*9880d681SAndroid Build Coastguard Worker exit:
88*9880d681SAndroid Build Coastguard Worker  ret void
89*9880d681SAndroid Build Coastguard Worker}
90*9880d681SAndroid Build Coastguard Worker
91*9880d681SAndroid Build Coastguard Workerdefine void @infer.zext.1(i1* %c, i8 %start) {
92*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: Classifying expressions for: @infer.zext.1
93*9880d681SAndroid Build Coastguard Worker entry:
94*9880d681SAndroid Build Coastguard Worker  %start.inc = add i8 %start, 1
95*9880d681SAndroid Build Coastguard Worker  %entry.condition = icmp ult i8 %start, 255
96*9880d681SAndroid Build Coastguard Worker  br i1 %entry.condition, label %loop, label %exit
97*9880d681SAndroid Build Coastguard Worker
98*9880d681SAndroid Build Coastguard Worker loop:
99*9880d681SAndroid Build Coastguard Worker  %idx = phi i8 [ %start.inc, %entry ], [ %idx.inc, %loop ]
100*9880d681SAndroid Build Coastguard Worker  %idx.zext = zext i8 %idx to i16
101*9880d681SAndroid Build Coastguard Worker; CHECK: %idx.zext = zext i8 %idx to i16
102*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: -->  {(1 + (zext i8 %start to i16))<nuw><nsw>,+,1}<nuw><%loop>
103*9880d681SAndroid Build Coastguard Worker  %idx.inc = add nuw i8 %idx, 1
104*9880d681SAndroid Build Coastguard Worker  %condition = load volatile i1, i1* %c
105*9880d681SAndroid Build Coastguard Worker  br i1 %condition, label %exit, label %loop
106*9880d681SAndroid Build Coastguard Worker
107*9880d681SAndroid Build Coastguard Worker exit:
108*9880d681SAndroid Build Coastguard Worker  ret void
109*9880d681SAndroid Build Coastguard Worker}
110