xref: /aosp_15_r20/external/llvm/test/Transforms/InstCombine/exact.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -instcombine -S | FileCheck %s
3*9880d681SAndroid Build Coastguard Worker
4*9880d681SAndroid Build Coastguard Workerdefine i32 @sdiv1(i32 %x) {
5*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @sdiv1(
6*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[Y:%.*]] = sdiv i32 %x, 8
7*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 [[Y]]
8*9880d681SAndroid Build Coastguard Worker;
9*9880d681SAndroid Build Coastguard Worker  %y = sdiv i32 %x, 8
10*9880d681SAndroid Build Coastguard Worker  ret i32 %y
11*9880d681SAndroid Build Coastguard Worker}
12*9880d681SAndroid Build Coastguard Worker
13*9880d681SAndroid Build Coastguard Workerdefine i32 @sdiv2(i32 %x) {
14*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @sdiv2(
15*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[Y:%.*]] = ashr exact i32 %x, 3
16*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 [[Y]]
17*9880d681SAndroid Build Coastguard Worker;
18*9880d681SAndroid Build Coastguard Worker  %y = sdiv exact i32 %x, 8
19*9880d681SAndroid Build Coastguard Worker  ret i32 %y
20*9880d681SAndroid Build Coastguard Worker}
21*9880d681SAndroid Build Coastguard Worker
22*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @sdiv2_vec(<2 x i32> %x) {
23*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @sdiv2_vec(
24*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[Y:%.*]] = ashr exact <2 x i32> %x, <i32 7, i32 7>
25*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <2 x i32> [[Y]]
26*9880d681SAndroid Build Coastguard Worker;
27*9880d681SAndroid Build Coastguard Worker  %y = sdiv exact <2 x i32> %x, <i32 128, i32 128>
28*9880d681SAndroid Build Coastguard Worker  ret <2 x i32> %y
29*9880d681SAndroid Build Coastguard Worker}
30*9880d681SAndroid Build Coastguard Worker
31*9880d681SAndroid Build Coastguard Workerdefine i32 @sdiv3(i32 %x) {
32*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @sdiv3(
33*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[Y:%.*]] = srem i32 %x, 3
34*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[Z:%.*]] = sub i32 %x, [[Y]]
35*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 [[Z]]
36*9880d681SAndroid Build Coastguard Worker;
37*9880d681SAndroid Build Coastguard Worker  %y = sdiv i32 %x, 3
38*9880d681SAndroid Build Coastguard Worker  %z = mul i32 %y, 3
39*9880d681SAndroid Build Coastguard Worker  ret i32 %z
40*9880d681SAndroid Build Coastguard Worker}
41*9880d681SAndroid Build Coastguard Worker
42*9880d681SAndroid Build Coastguard Workerdefine i32 @sdiv4(i32 %x) {
43*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @sdiv4(
44*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 %x
45*9880d681SAndroid Build Coastguard Worker;
46*9880d681SAndroid Build Coastguard Worker  %y = sdiv exact i32 %x, 3
47*9880d681SAndroid Build Coastguard Worker  %z = mul i32 %y, 3
48*9880d681SAndroid Build Coastguard Worker  ret i32 %z
49*9880d681SAndroid Build Coastguard Worker}
50*9880d681SAndroid Build Coastguard Worker
51*9880d681SAndroid Build Coastguard Workerdefine i32 @sdiv5(i32 %x) {
52*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @sdiv5(
53*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[Y:%.*]] = srem i32 %x, 3
54*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[Z:%.*]] = sub i32 [[Y]], %x
55*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 [[Z]]
56*9880d681SAndroid Build Coastguard Worker;
57*9880d681SAndroid Build Coastguard Worker  %y = sdiv i32 %x, 3
58*9880d681SAndroid Build Coastguard Worker  %z = mul i32 %y, -3
59*9880d681SAndroid Build Coastguard Worker  ret i32 %z
60*9880d681SAndroid Build Coastguard Worker}
61*9880d681SAndroid Build Coastguard Worker
62*9880d681SAndroid Build Coastguard Workerdefine i32 @sdiv6(i32 %x) {
63*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @sdiv6(
64*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[Z:%.*]] = sub i32 0, %x
65*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 [[Z]]
66*9880d681SAndroid Build Coastguard Worker;
67*9880d681SAndroid Build Coastguard Worker  %y = sdiv exact i32 %x, 3
68*9880d681SAndroid Build Coastguard Worker  %z = mul i32 %y, -3
69*9880d681SAndroid Build Coastguard Worker  ret i32 %z
70*9880d681SAndroid Build Coastguard Worker}
71*9880d681SAndroid Build Coastguard Worker
72*9880d681SAndroid Build Coastguard Workerdefine i32 @udiv1(i32 %x, i32 %w) {
73*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @udiv1(
74*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 %x
75*9880d681SAndroid Build Coastguard Worker;
76*9880d681SAndroid Build Coastguard Worker  %y = udiv exact i32 %x, %w
77*9880d681SAndroid Build Coastguard Worker  %z = mul i32 %y, %w
78*9880d681SAndroid Build Coastguard Worker  ret i32 %z
79*9880d681SAndroid Build Coastguard Worker}
80*9880d681SAndroid Build Coastguard Worker
81*9880d681SAndroid Build Coastguard Workerdefine i32 @udiv2(i32 %x, i32 %w) {
82*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @udiv2(
83*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[Z:%.*]] = lshr exact i32 %x, %w
84*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 [[Z]]
85*9880d681SAndroid Build Coastguard Worker;
86*9880d681SAndroid Build Coastguard Worker  %y = shl i32 1, %w
87*9880d681SAndroid Build Coastguard Worker  %z = udiv exact i32 %x, %y
88*9880d681SAndroid Build Coastguard Worker  ret i32 %z
89*9880d681SAndroid Build Coastguard Worker}
90*9880d681SAndroid Build Coastguard Worker
91*9880d681SAndroid Build Coastguard Workerdefine i64 @ashr1(i64 %X) nounwind {
92*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @ashr1(
93*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[A:%.*]] = shl i64 %X, 8
94*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[B:%.*]] = ashr exact i64 [[A]], 2
95*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i64 [[B]]
96*9880d681SAndroid Build Coastguard Worker;
97*9880d681SAndroid Build Coastguard Worker  %A = shl i64 %X, 8
98*9880d681SAndroid Build Coastguard Worker  %B = ashr i64 %A, 2   ; X/4
99*9880d681SAndroid Build Coastguard Worker  ret i64 %B
100*9880d681SAndroid Build Coastguard Worker}
101*9880d681SAndroid Build Coastguard Worker
102*9880d681SAndroid Build Coastguard Worker; PR9120
103*9880d681SAndroid Build Coastguard Workerdefine i1 @ashr_icmp1(i64 %X) nounwind {
104*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @ashr_icmp1(
105*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[B:%.*]] = icmp eq i64 %X, 0
106*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[B]]
107*9880d681SAndroid Build Coastguard Worker;
108*9880d681SAndroid Build Coastguard Worker  %A = ashr exact i64 %X, 2   ; X/4
109*9880d681SAndroid Build Coastguard Worker  %B = icmp eq i64 %A, 0
110*9880d681SAndroid Build Coastguard Worker  ret i1 %B
111*9880d681SAndroid Build Coastguard Worker}
112*9880d681SAndroid Build Coastguard Worker
113*9880d681SAndroid Build Coastguard Workerdefine i1 @ashr_icmp2(i64 %X) nounwind {
114*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @ashr_icmp2(
115*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[Z:%.*]] = icmp slt i64 %X, 16
116*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[Z]]
117*9880d681SAndroid Build Coastguard Worker;
118*9880d681SAndroid Build Coastguard Worker  %Y = ashr exact i64 %X, 2  ; x / 4
119*9880d681SAndroid Build Coastguard Worker  %Z = icmp slt i64 %Y, 4    ; x < 16
120*9880d681SAndroid Build Coastguard Worker  ret i1 %Z
121*9880d681SAndroid Build Coastguard Worker}
122*9880d681SAndroid Build Coastguard Worker
123*9880d681SAndroid Build Coastguard Worker; PR9998
124*9880d681SAndroid Build Coastguard Worker; Make sure we don't transform the ashr here into an sdiv
125*9880d681SAndroid Build Coastguard Workerdefine i1 @pr9998(i32 %V) nounwind {
126*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @pr9998(
127*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[W_MASK:%.*]] = and i32 %V, 1
128*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[Z:%.*]] = icmp ne i32 [[W_MASK]], 0
129*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[Z]]
130*9880d681SAndroid Build Coastguard Worker;
131*9880d681SAndroid Build Coastguard Worker  %W = shl i32 %V, 31
132*9880d681SAndroid Build Coastguard Worker  %X = ashr exact i32 %W, 31
133*9880d681SAndroid Build Coastguard Worker  %Y = sext i32 %X to i64
134*9880d681SAndroid Build Coastguard Worker  %Z = icmp ugt i64 %Y, 7297771788697658747
135*9880d681SAndroid Build Coastguard Worker  ret i1 %Z
136*9880d681SAndroid Build Coastguard Worker}
137*9880d681SAndroid Build Coastguard Worker
138*9880d681SAndroid Build Coastguard Workerdefine i1 @udiv_icmp1(i64 %X) {
139*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @udiv_icmp1(
140*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = icmp ne i64 %X, 0
141*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[TMP1]]
142*9880d681SAndroid Build Coastguard Worker;
143*9880d681SAndroid Build Coastguard Worker  %A = udiv exact i64 %X, 5   ; X/5
144*9880d681SAndroid Build Coastguard Worker  %B = icmp ne i64 %A, 0
145*9880d681SAndroid Build Coastguard Worker  ret i1 %B
146*9880d681SAndroid Build Coastguard Worker}
147*9880d681SAndroid Build Coastguard Worker
148*9880d681SAndroid Build Coastguard Workerdefine i1 @udiv_icmp2(i64 %X) {
149*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @udiv_icmp2(
150*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = icmp eq i64 %X, 0
151*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[TMP1]]
152*9880d681SAndroid Build Coastguard Worker;
153*9880d681SAndroid Build Coastguard Worker  %A = udiv exact i64 %X, 5   ; X/5 == 0 --> x == 0
154*9880d681SAndroid Build Coastguard Worker  %B = icmp eq i64 %A, 0
155*9880d681SAndroid Build Coastguard Worker  ret i1 %B
156*9880d681SAndroid Build Coastguard Worker}
157*9880d681SAndroid Build Coastguard Worker
158*9880d681SAndroid Build Coastguard Workerdefine i1 @sdiv_icmp1(i64 %X) {
159*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @sdiv_icmp1(
160*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = icmp eq i64 %X, 0
161*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[TMP1]]
162*9880d681SAndroid Build Coastguard Worker;
163*9880d681SAndroid Build Coastguard Worker  %A = sdiv exact i64 %X, 5   ; X/5 == 0 --> x == 0
164*9880d681SAndroid Build Coastguard Worker  %B = icmp eq i64 %A, 0
165*9880d681SAndroid Build Coastguard Worker  ret i1 %B
166*9880d681SAndroid Build Coastguard Worker}
167*9880d681SAndroid Build Coastguard Worker
168*9880d681SAndroid Build Coastguard Workerdefine i1 @sdiv_icmp2(i64 %X) {
169*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @sdiv_icmp2(
170*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = icmp eq i64 %X, 5
171*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[TMP1]]
172*9880d681SAndroid Build Coastguard Worker;
173*9880d681SAndroid Build Coastguard Worker  %A = sdiv exact i64 %X, 5   ; X/5 == 1 --> x == 5
174*9880d681SAndroid Build Coastguard Worker  %B = icmp eq i64 %A, 1
175*9880d681SAndroid Build Coastguard Worker  ret i1 %B
176*9880d681SAndroid Build Coastguard Worker}
177*9880d681SAndroid Build Coastguard Worker
178*9880d681SAndroid Build Coastguard Workerdefine i1 @sdiv_icmp3(i64 %X) {
179*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @sdiv_icmp3(
180*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = icmp eq i64 %X, -5
181*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[TMP1]]
182*9880d681SAndroid Build Coastguard Worker;
183*9880d681SAndroid Build Coastguard Worker  %A = sdiv exact i64 %X, 5   ; X/5 == -1 --> x == -5
184*9880d681SAndroid Build Coastguard Worker  %B = icmp eq i64 %A, -1
185*9880d681SAndroid Build Coastguard Worker  ret i1 %B
186*9880d681SAndroid Build Coastguard Worker}
187*9880d681SAndroid Build Coastguard Worker
188*9880d681SAndroid Build Coastguard Workerdefine i1 @sdiv_icmp4(i64 %X) {
189*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @sdiv_icmp4(
190*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = icmp eq i64 %X, 0
191*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[TMP1]]
192*9880d681SAndroid Build Coastguard Worker;
193*9880d681SAndroid Build Coastguard Worker  %A = sdiv exact i64 %X, -5   ; X/-5 == 0 --> x == 0
194*9880d681SAndroid Build Coastguard Worker  %B = icmp eq i64 %A, 0
195*9880d681SAndroid Build Coastguard Worker  ret i1 %B
196*9880d681SAndroid Build Coastguard Worker}
197*9880d681SAndroid Build Coastguard Worker
198*9880d681SAndroid Build Coastguard Workerdefine i1 @sdiv_icmp5(i64 %X) {
199*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @sdiv_icmp5(
200*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = icmp eq i64 %X, -5
201*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[TMP1]]
202*9880d681SAndroid Build Coastguard Worker;
203*9880d681SAndroid Build Coastguard Worker  %A = sdiv exact i64 %X, -5   ; X/-5 == 1 --> x == -5
204*9880d681SAndroid Build Coastguard Worker  %B = icmp eq i64 %A, 1
205*9880d681SAndroid Build Coastguard Worker  ret i1 %B
206*9880d681SAndroid Build Coastguard Worker}
207*9880d681SAndroid Build Coastguard Worker
208*9880d681SAndroid Build Coastguard Workerdefine i1 @sdiv_icmp6(i64 %X) {
209*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @sdiv_icmp6(
210*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = icmp eq i64 %X, 5
211*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[TMP1]]
212*9880d681SAndroid Build Coastguard Worker;
213*9880d681SAndroid Build Coastguard Worker  %A = sdiv exact i64 %X, -5   ; X/-5 == 1 --> x == 5
214*9880d681SAndroid Build Coastguard Worker  %B = icmp eq i64 %A, -1
215*9880d681SAndroid Build Coastguard Worker  ret i1 %B
216*9880d681SAndroid Build Coastguard Worker}
217*9880d681SAndroid Build Coastguard Worker
218