xref: /aosp_15_r20/external/llvm/test/Analysis/ScalarEvolution/no-wrap-add-exprs.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: opt -S -analyze -scalar-evolution < %s | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Worker!0 = !{i8 0, i8 127}
4*9880d681SAndroid Build Coastguard Worker
5*9880d681SAndroid Build Coastguard Workerdefine void @f0(i8* %len_addr) {
6*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: Classifying expressions for: @f0
7*9880d681SAndroid Build Coastguard Worker entry:
8*9880d681SAndroid Build Coastguard Worker  %len = load i8, i8* %len_addr, !range !0
9*9880d681SAndroid Build Coastguard Worker  %len_norange = load i8, i8* %len_addr
10*9880d681SAndroid Build Coastguard Worker; CHECK:  %len = load i8, i8* %len_addr, !range !0
11*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  -->  %len U: [0,127) S: [0,127)
12*9880d681SAndroid Build Coastguard Worker; CHECK:  %len_norange = load i8, i8* %len_addr
13*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  -->  %len_norange U: full-set S: full-set
14*9880d681SAndroid Build Coastguard Worker
15*9880d681SAndroid Build Coastguard Worker  %t0 = add i8 %len, 1
16*9880d681SAndroid Build Coastguard Worker  %t1 = add i8 %len, 2
17*9880d681SAndroid Build Coastguard Worker; CHECK:  %t0 = add i8 %len, 1
18*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  -->  (1 + %len)<nuw><nsw> U: [1,-128) S: [1,-128)
19*9880d681SAndroid Build Coastguard Worker; CHECK:  %t1 = add i8 %len, 2
20*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  -->  (2 + %len)<nuw> U: [2,-127) S: [2,-127)
21*9880d681SAndroid Build Coastguard Worker
22*9880d681SAndroid Build Coastguard Worker  %t2 = sub i8 %len, 1
23*9880d681SAndroid Build Coastguard Worker  %t3 = sub i8 %len, 2
24*9880d681SAndroid Build Coastguard Worker; CHECK:  %t2 = sub i8 %len, 1
25*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  -->  (-1 + %len)<nsw> U: [-1,126) S: [-1,126)
26*9880d681SAndroid Build Coastguard Worker; CHECK:  %t3 = sub i8 %len, 2
27*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  -->  (-2 + %len)<nsw> U: [-2,125) S: [-2,125)
28*9880d681SAndroid Build Coastguard Worker
29*9880d681SAndroid Build Coastguard Worker  %q0 = add i8 %len_norange, 1
30*9880d681SAndroid Build Coastguard Worker  %q1 = add i8 %len_norange, 2
31*9880d681SAndroid Build Coastguard Worker; CHECK:  %q0 = add i8 %len_norange, 1
32*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  -->  (1 + %len_norange) U: full-set S: full-set
33*9880d681SAndroid Build Coastguard Worker; CHECK:  %q1 = add i8 %len_norange, 2
34*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  -->  (2 + %len_norange) U: full-set S: full-set
35*9880d681SAndroid Build Coastguard Worker
36*9880d681SAndroid Build Coastguard Worker  %q2 = sub i8 %len_norange, 1
37*9880d681SAndroid Build Coastguard Worker  %q3 = sub i8 %len_norange, 2
38*9880d681SAndroid Build Coastguard Worker; CHECK:  %q2 = sub i8 %len_norange, 1
39*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  -->  (-1 + %len_norange) U: full-set S: full-set
40*9880d681SAndroid Build Coastguard Worker; CHECK:  %q3 = sub i8 %len_norange, 2
41*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  -->  (-2 + %len_norange) U: full-set S: full-set
42*9880d681SAndroid Build Coastguard Worker
43*9880d681SAndroid Build Coastguard Worker  ret void
44*9880d681SAndroid Build Coastguard Worker}
45*9880d681SAndroid Build Coastguard Worker
46*9880d681SAndroid Build Coastguard Workerdefine void @f1(i8* %len_addr) {
47*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: Classifying expressions for: @f1
48*9880d681SAndroid Build Coastguard Worker entry:
49*9880d681SAndroid Build Coastguard Worker  %len = load i8, i8* %len_addr, !range !0
50*9880d681SAndroid Build Coastguard Worker  %len_norange = load i8, i8* %len_addr
51*9880d681SAndroid Build Coastguard Worker; CHECK:  %len = load i8, i8* %len_addr, !range !0
52*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  -->  %len U: [0,127) S: [0,127)
53*9880d681SAndroid Build Coastguard Worker; CHECK:  %len_norange = load i8, i8* %len_addr
54*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  -->  %len_norange U: full-set S: full-set
55*9880d681SAndroid Build Coastguard Worker
56*9880d681SAndroid Build Coastguard Worker  %t0 = add i8 %len, -1
57*9880d681SAndroid Build Coastguard Worker  %t1 = add i8 %len, -2
58*9880d681SAndroid Build Coastguard Worker; CHECK:  %t0 = add i8 %len, -1
59*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  -->  (-1 + %len)<nsw> U: [-1,126) S: [-1,126)
60*9880d681SAndroid Build Coastguard Worker; CHECK:  %t1 = add i8 %len, -2
61*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  -->  (-2 + %len)<nsw> U: [-2,125) S: [-2,125)
62*9880d681SAndroid Build Coastguard Worker
63*9880d681SAndroid Build Coastguard Worker  %t0.sext = sext i8 %t0 to i16
64*9880d681SAndroid Build Coastguard Worker  %t1.sext = sext i8 %t1 to i16
65*9880d681SAndroid Build Coastguard Worker; CHECK:  %t0.sext = sext i8 %t0 to i16
66*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  -->  (-1 + (zext i8 %len to i16))<nsw> U: [-1,126) S: [-1,126)
67*9880d681SAndroid Build Coastguard Worker; CHECK:  %t1.sext = sext i8 %t1 to i16
68*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  -->  (-2 + (zext i8 %len to i16))<nsw> U: [-2,125) S: [-2,125)
69*9880d681SAndroid Build Coastguard Worker
70*9880d681SAndroid Build Coastguard Worker  %q0 = add i8 %len_norange, 1
71*9880d681SAndroid Build Coastguard Worker  %q1 = add i8 %len_norange, 2
72*9880d681SAndroid Build Coastguard Worker; CHECK:  %q0 = add i8 %len_norange, 1
73*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  -->  (1 + %len_norange) U: full-set S: full-set
74*9880d681SAndroid Build Coastguard Worker; CHECK:  %q1 = add i8 %len_norange, 2
75*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  -->  (2 + %len_norange) U: full-set S: full-set
76*9880d681SAndroid Build Coastguard Worker
77*9880d681SAndroid Build Coastguard Worker  %q0.sext = sext i8 %q0 to i16
78*9880d681SAndroid Build Coastguard Worker  %q1.sext = sext i8 %q1 to i16
79*9880d681SAndroid Build Coastguard Worker; CHECK:  %q0.sext = sext i8 %q0 to i16
80*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  -->  (sext i8 (1 + %len_norange) to i16) U: [-128,128) S: [-128,128)
81*9880d681SAndroid Build Coastguard Worker; CHECK:  %q1.sext = sext i8 %q1 to i16
82*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  -->  (sext i8 (2 + %len_norange) to i16) U: [-128,128) S: [-128,128)
83*9880d681SAndroid Build Coastguard Worker
84*9880d681SAndroid Build Coastguard Worker  ret void
85*9880d681SAndroid Build Coastguard Worker}
86*9880d681SAndroid Build Coastguard Worker
87*9880d681SAndroid Build Coastguard Workerdefine void @f2(i8* %len_addr) {
88*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: Classifying expressions for: @f2
89*9880d681SAndroid Build Coastguard Worker entry:
90*9880d681SAndroid Build Coastguard Worker  %len = load i8, i8* %len_addr, !range !0
91*9880d681SAndroid Build Coastguard Worker  %len_norange = load i8, i8* %len_addr
92*9880d681SAndroid Build Coastguard Worker; CHECK:  %len = load i8, i8* %len_addr, !range !0
93*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  -->  %len U: [0,127) S: [0,127)
94*9880d681SAndroid Build Coastguard Worker; CHECK:  %len_norange = load i8, i8* %len_addr
95*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  -->  %len_norange U: full-set S: full-set
96*9880d681SAndroid Build Coastguard Worker
97*9880d681SAndroid Build Coastguard Worker  %t0 = add i8 %len, 1
98*9880d681SAndroid Build Coastguard Worker  %t1 = add i8 %len, 2
99*9880d681SAndroid Build Coastguard Worker; CHECK:  %t0 = add i8 %len, 1
100*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  -->  (1 + %len)<nuw><nsw>
101*9880d681SAndroid Build Coastguard Worker; CHECK:  %t1 = add i8 %len, 2
102*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  -->  (2 + %len)<nuw>
103*9880d681SAndroid Build Coastguard Worker
104*9880d681SAndroid Build Coastguard Worker  %t0.zext = zext i8 %t0 to i16
105*9880d681SAndroid Build Coastguard Worker  %t1.zext = zext i8 %t1 to i16
106*9880d681SAndroid Build Coastguard Worker; CHECK:  %t0.zext = zext i8 %t0 to i16
107*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: -->  (1 + (zext i8 %len to i16))<nuw><nsw> U: [1,128) S: [1,128)
108*9880d681SAndroid Build Coastguard Worker; CHECK:  %t1.zext = zext i8 %t1 to i16
109*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  -->  (2 + (zext i8 %len to i16))<nuw><nsw> U: [2,129) S: [2,129)
110*9880d681SAndroid Build Coastguard Worker
111*9880d681SAndroid Build Coastguard Worker  %q0 = add i8 %len_norange, 1
112*9880d681SAndroid Build Coastguard Worker  %q1 = add i8 %len_norange, 2
113*9880d681SAndroid Build Coastguard Worker  %q0.zext = zext i8 %q0 to i16
114*9880d681SAndroid Build Coastguard Worker  %q1.zext = zext i8 %q1 to i16
115*9880d681SAndroid Build Coastguard Worker
116*9880d681SAndroid Build Coastguard Worker; CHECK:  %q0.zext = zext i8 %q0 to i16
117*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  -->  (zext i8 (1 + %len_norange) to i16) U: [0,256) S: [0,256)
118*9880d681SAndroid Build Coastguard Worker; CHECK:  %q1.zext = zext i8 %q1 to i16
119*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  -->  (zext i8 (2 + %len_norange) to i16) U: [0,256) S: [0,256)
120*9880d681SAndroid Build Coastguard Worker
121*9880d681SAndroid Build Coastguard Worker  ret void
122*9880d681SAndroid Build Coastguard Worker}
123