xref: /aosp_15_r20/external/llvm/test/Transforms/InstCombine/range-check.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -instcombine -S | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Worker; Check simplification of
4*9880d681SAndroid Build Coastguard Worker; (icmp sgt x, -1) & (icmp sgt/sge n, x) --> icmp ugt/uge n, x
5*9880d681SAndroid Build Coastguard Worker
6*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define i1 @test_and1
7*9880d681SAndroid Build Coastguard Worker; CHECK: [[R:%[0-9]+]] = icmp ugt i32 %nn, %x
8*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 [[R]]
9*9880d681SAndroid Build Coastguard Workerdefine i1 @test_and1(i32 %x, i32 %n) {
10*9880d681SAndroid Build Coastguard Worker  %nn = and i32 %n, 2147483647
11*9880d681SAndroid Build Coastguard Worker  %a = icmp sge i32 %x, 0
12*9880d681SAndroid Build Coastguard Worker  %b = icmp slt i32 %x, %nn
13*9880d681SAndroid Build Coastguard Worker  %c = and i1 %a, %b
14*9880d681SAndroid Build Coastguard Worker  ret i1 %c
15*9880d681SAndroid Build Coastguard Worker}
16*9880d681SAndroid Build Coastguard Worker
17*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define i1 @test_and2
18*9880d681SAndroid Build Coastguard Worker; CHECK: [[R:%[0-9]+]] = icmp uge i32 %nn, %x
19*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 [[R]]
20*9880d681SAndroid Build Coastguard Workerdefine i1 @test_and2(i32 %x, i32 %n) {
21*9880d681SAndroid Build Coastguard Worker  %nn = and i32 %n, 2147483647
22*9880d681SAndroid Build Coastguard Worker  %a = icmp sgt i32 %x, -1
23*9880d681SAndroid Build Coastguard Worker  %b = icmp sle i32 %x, %nn
24*9880d681SAndroid Build Coastguard Worker  %c = and i1 %a, %b
25*9880d681SAndroid Build Coastguard Worker  ret i1 %c
26*9880d681SAndroid Build Coastguard Worker}
27*9880d681SAndroid Build Coastguard Worker
28*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define i1 @test_and3
29*9880d681SAndroid Build Coastguard Worker; CHECK: [[R:%[0-9]+]] = icmp ugt i32 %nn, %x
30*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 [[R]]
31*9880d681SAndroid Build Coastguard Workerdefine i1 @test_and3(i32 %x, i32 %n) {
32*9880d681SAndroid Build Coastguard Worker  %nn = and i32 %n, 2147483647
33*9880d681SAndroid Build Coastguard Worker  %a = icmp sgt i32 %nn, %x
34*9880d681SAndroid Build Coastguard Worker  %b = icmp sge i32 %x, 0
35*9880d681SAndroid Build Coastguard Worker  %c = and i1 %a, %b
36*9880d681SAndroid Build Coastguard Worker  ret i1 %c
37*9880d681SAndroid Build Coastguard Worker}
38*9880d681SAndroid Build Coastguard Worker
39*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define i1 @test_and4
40*9880d681SAndroid Build Coastguard Worker; CHECK: [[R:%[0-9]+]] = icmp uge i32 %nn, %x
41*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 [[R]]
42*9880d681SAndroid Build Coastguard Workerdefine i1 @test_and4(i32 %x, i32 %n) {
43*9880d681SAndroid Build Coastguard Worker  %nn = and i32 %n, 2147483647
44*9880d681SAndroid Build Coastguard Worker  %a = icmp sge i32 %nn, %x
45*9880d681SAndroid Build Coastguard Worker  %b = icmp sge i32 %x, 0
46*9880d681SAndroid Build Coastguard Worker  %c = and i1 %a, %b
47*9880d681SAndroid Build Coastguard Worker  ret i1 %c
48*9880d681SAndroid Build Coastguard Worker}
49*9880d681SAndroid Build Coastguard Worker
50*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define i1 @test_or1
51*9880d681SAndroid Build Coastguard Worker; CHECK: [[R:%[0-9]+]] = icmp ule i32 %nn, %x
52*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 [[R]]
53*9880d681SAndroid Build Coastguard Workerdefine i1 @test_or1(i32 %x, i32 %n) {
54*9880d681SAndroid Build Coastguard Worker  %nn = and i32 %n, 2147483647
55*9880d681SAndroid Build Coastguard Worker  %a = icmp slt i32 %x, 0
56*9880d681SAndroid Build Coastguard Worker  %b = icmp sge i32 %x, %nn
57*9880d681SAndroid Build Coastguard Worker  %c = or i1 %a, %b
58*9880d681SAndroid Build Coastguard Worker  ret i1 %c
59*9880d681SAndroid Build Coastguard Worker}
60*9880d681SAndroid Build Coastguard Worker
61*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define i1 @test_or2
62*9880d681SAndroid Build Coastguard Worker; CHECK: [[R:%[0-9]+]] = icmp ult i32 %nn, %x
63*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 [[R]]
64*9880d681SAndroid Build Coastguard Workerdefine i1 @test_or2(i32 %x, i32 %n) {
65*9880d681SAndroid Build Coastguard Worker  %nn = and i32 %n, 2147483647
66*9880d681SAndroid Build Coastguard Worker  %a = icmp sle i32 %x, -1
67*9880d681SAndroid Build Coastguard Worker  %b = icmp sgt i32 %x, %nn
68*9880d681SAndroid Build Coastguard Worker  %c = or i1 %a, %b
69*9880d681SAndroid Build Coastguard Worker  ret i1 %c
70*9880d681SAndroid Build Coastguard Worker}
71*9880d681SAndroid Build Coastguard Worker
72*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define i1 @test_or3
73*9880d681SAndroid Build Coastguard Worker; CHECK: [[R:%[0-9]+]] = icmp ule i32 %nn, %x
74*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 [[R]]
75*9880d681SAndroid Build Coastguard Workerdefine i1 @test_or3(i32 %x, i32 %n) {
76*9880d681SAndroid Build Coastguard Worker  %nn = and i32 %n, 2147483647
77*9880d681SAndroid Build Coastguard Worker  %a = icmp sle i32 %nn, %x
78*9880d681SAndroid Build Coastguard Worker  %b = icmp slt i32 %x, 0
79*9880d681SAndroid Build Coastguard Worker  %c = or i1 %a, %b
80*9880d681SAndroid Build Coastguard Worker  ret i1 %c
81*9880d681SAndroid Build Coastguard Worker}
82*9880d681SAndroid Build Coastguard Worker
83*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define i1 @test_or4
84*9880d681SAndroid Build Coastguard Worker; CHECK: [[R:%[0-9]+]] = icmp ult i32 %nn, %x
85*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 [[R]]
86*9880d681SAndroid Build Coastguard Workerdefine i1 @test_or4(i32 %x, i32 %n) {
87*9880d681SAndroid Build Coastguard Worker  %nn = and i32 %n, 2147483647
88*9880d681SAndroid Build Coastguard Worker  %a = icmp slt i32 %nn, %x
89*9880d681SAndroid Build Coastguard Worker  %b = icmp slt i32 %x, 0
90*9880d681SAndroid Build Coastguard Worker  %c = or i1 %a, %b
91*9880d681SAndroid Build Coastguard Worker  ret i1 %c
92*9880d681SAndroid Build Coastguard Worker}
93*9880d681SAndroid Build Coastguard Worker
94*9880d681SAndroid Build Coastguard Worker; Negative tests
95*9880d681SAndroid Build Coastguard Worker
96*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define i1 @negative1
97*9880d681SAndroid Build Coastguard Worker; CHECK: %a = icmp
98*9880d681SAndroid Build Coastguard Worker; CHECK: %b = icmp
99*9880d681SAndroid Build Coastguard Worker; CHECK: %c = and i1 %a, %b
100*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 %c
101*9880d681SAndroid Build Coastguard Workerdefine i1 @negative1(i32 %x, i32 %n) {
102*9880d681SAndroid Build Coastguard Worker  %nn = and i32 %n, 2147483647
103*9880d681SAndroid Build Coastguard Worker  %a = icmp slt i32 %x, %nn
104*9880d681SAndroid Build Coastguard Worker  %b = icmp sgt i32 %x, 0      ; should be: icmp sge
105*9880d681SAndroid Build Coastguard Worker  %c = and i1 %a, %b
106*9880d681SAndroid Build Coastguard Worker  ret i1 %c
107*9880d681SAndroid Build Coastguard Worker}
108*9880d681SAndroid Build Coastguard Worker
109*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define i1 @negative2
110*9880d681SAndroid Build Coastguard Worker; CHECK: %a = icmp
111*9880d681SAndroid Build Coastguard Worker; CHECK: %b = icmp
112*9880d681SAndroid Build Coastguard Worker; CHECK: %c = and i1 %a, %b
113*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 %c
114*9880d681SAndroid Build Coastguard Workerdefine i1 @negative2(i32 %x, i32 %n) {
115*9880d681SAndroid Build Coastguard Worker  %a = icmp slt i32 %x, %n     ; n can be negative
116*9880d681SAndroid Build Coastguard Worker  %b = icmp sge i32 %x, 0
117*9880d681SAndroid Build Coastguard Worker  %c = and i1 %a, %b
118*9880d681SAndroid Build Coastguard Worker  ret i1 %c
119*9880d681SAndroid Build Coastguard Worker}
120*9880d681SAndroid Build Coastguard Worker
121*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define i1 @negative3
122*9880d681SAndroid Build Coastguard Worker; CHECK: %a = icmp
123*9880d681SAndroid Build Coastguard Worker; CHECK: %b = icmp
124*9880d681SAndroid Build Coastguard Worker; CHECK: %c = and i1 %a, %b
125*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 %c
126*9880d681SAndroid Build Coastguard Workerdefine i1 @negative3(i32 %x, i32 %y, i32 %n) {
127*9880d681SAndroid Build Coastguard Worker  %nn = and i32 %n, 2147483647
128*9880d681SAndroid Build Coastguard Worker  %a = icmp slt i32 %x, %nn
129*9880d681SAndroid Build Coastguard Worker  %b = icmp sge i32 %y, 0      ; should compare %x and not %y
130*9880d681SAndroid Build Coastguard Worker  %c = and i1 %a, %b
131*9880d681SAndroid Build Coastguard Worker  ret i1 %c
132*9880d681SAndroid Build Coastguard Worker}
133*9880d681SAndroid Build Coastguard Worker
134*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define i1 @negative4
135*9880d681SAndroid Build Coastguard Worker; CHECK: %a = icmp
136*9880d681SAndroid Build Coastguard Worker; CHECK: %b = icmp
137*9880d681SAndroid Build Coastguard Worker; CHECK: %c = and i1 %a, %b
138*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 %c
139*9880d681SAndroid Build Coastguard Workerdefine i1 @negative4(i32 %x, i32 %n) {
140*9880d681SAndroid Build Coastguard Worker  %nn = and i32 %n, 2147483647
141*9880d681SAndroid Build Coastguard Worker  %a = icmp ne i32 %x, %nn     ; should be: icmp slt/sle
142*9880d681SAndroid Build Coastguard Worker  %b = icmp sge i32 %x, 0
143*9880d681SAndroid Build Coastguard Worker  %c = and i1 %a, %b
144*9880d681SAndroid Build Coastguard Worker  ret i1 %c
145*9880d681SAndroid Build Coastguard Worker}
146*9880d681SAndroid Build Coastguard Worker
147*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define i1 @negative5
148*9880d681SAndroid Build Coastguard Worker; CHECK: %a = icmp
149*9880d681SAndroid Build Coastguard Worker; CHECK: %b = icmp
150*9880d681SAndroid Build Coastguard Worker; CHECK: %c = or i1 %a, %b
151*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 %c
152*9880d681SAndroid Build Coastguard Workerdefine i1 @negative5(i32 %x, i32 %n) {
153*9880d681SAndroid Build Coastguard Worker  %nn = and i32 %n, 2147483647
154*9880d681SAndroid Build Coastguard Worker  %a = icmp slt i32 %x, %nn
155*9880d681SAndroid Build Coastguard Worker  %b = icmp sge i32 %x, 0
156*9880d681SAndroid Build Coastguard Worker  %c = or i1 %a, %b            ; should be: and
157*9880d681SAndroid Build Coastguard Worker  ret i1 %c
158*9880d681SAndroid Build Coastguard Worker}
159*9880d681SAndroid Build Coastguard Worker
160