Skip to content

Commit a2eb55d

Browse files
committed
[InstSimplify] add tests for logic+icmp folds for nullptr; NFC
See discussion in D78430.
1 parent 720015e commit a2eb55d

File tree

1 file changed

+303
-0
lines changed

1 file changed

+303
-0
lines changed
Lines changed: 303 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,303 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2+
; RUN: opt < %s -instsimplify -S | FileCheck %s
3+
4+
; This is a specialization of generic folds for min/max values targeted to the
5+
; 'null' ptr constant.
6+
; Related tests for non-pointer types should be included in another file.
7+
8+
; There are 6 basic patterns (or 3 with DeMorganized equivalent) with
9+
; 2 (commute logic op) *
10+
; 2 (swap compare operands) *
11+
; variations for a total of 24 tests.
12+
13+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
14+
;
15+
; (X == null) && (X > Y) --> false
16+
;
17+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
18+
19+
define i1 @ugt_and_min(i8* %x, i8* %y) {
20+
; CHECK-LABEL: @ugt_and_min(
21+
; CHECK-NEXT: ret i1 false
22+
;
23+
%cmp = icmp ugt i8* %x, %y
24+
%cmpeq = icmp eq i8* %x, null
25+
%r = and i1 %cmp, %cmpeq
26+
ret i1 %r
27+
}
28+
29+
define i1 @ugt_and_min_commute(<2 x i8>* %x, <2 x i8>* %y) {
30+
; CHECK-LABEL: @ugt_and_min_commute(
31+
; CHECK-NEXT: ret i1 false
32+
;
33+
%cmp = icmp ugt <2 x i8>* %x, %y
34+
%cmpeq = icmp eq <2 x i8>* %x, null
35+
%r = and i1 %cmpeq, %cmp
36+
ret i1 %r
37+
}
38+
39+
define i1 @ugt_swap_and_min(i8* %x, i8* %y) {
40+
; CHECK-LABEL: @ugt_swap_and_min(
41+
; CHECK-NEXT: ret i1 false
42+
;
43+
%cmp = icmp ult i8* %y, %x
44+
%cmpeq = icmp eq i8* %x, null
45+
%r = and i1 %cmp, %cmpeq
46+
ret i1 %r
47+
}
48+
49+
define i1 @ugt_swap_and_min_commute(i8* %x, i8* %y) {
50+
; CHECK-LABEL: @ugt_swap_and_min_commute(
51+
; CHECK-NEXT: ret i1 false
52+
;
53+
%cmp = icmp ult i8* %y, %x
54+
%cmpeq = icmp eq i8* %x, null
55+
%r = and i1 %cmpeq, %cmp
56+
ret i1 %r
57+
}
58+
59+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
60+
;
61+
; (X != null) || (X <= Y) --> true
62+
;
63+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
64+
65+
define i1 @ule_or_not_min(i427* %x, i427* %y) {
66+
; CHECK-LABEL: @ule_or_not_min(
67+
; CHECK-NEXT: ret i1 true
68+
;
69+
%cmp = icmp ule i427* %x, %y
70+
%cmpeq = icmp ne i427* %x, null
71+
%r = or i1 %cmp, %cmpeq
72+
ret i1 %r
73+
}
74+
75+
define i1 @ule_or_not_min_commute(<3 x i9>* %x, <3 x i9>* %y) {
76+
; CHECK-LABEL: @ule_or_not_min_commute(
77+
; CHECK-NEXT: ret i1 true
78+
;
79+
%cmp = icmp ule <3 x i9>* %x, %y
80+
%cmpeq = icmp ne <3 x i9>* %x, null
81+
%r = or i1 %cmpeq, %cmp
82+
ret i1 %r
83+
}
84+
85+
define i1 @ule_swap_or_not_min(i8* %x, i8* %y) {
86+
; CHECK-LABEL: @ule_swap_or_not_min(
87+
; CHECK-NEXT: ret i1 true
88+
;
89+
%cmp = icmp uge i8* %y, %x
90+
%cmpeq = icmp ne i8* %x, null
91+
%r = or i1 %cmp, %cmpeq
92+
ret i1 %r
93+
}
94+
95+
define i1 @ule_swap_or_not_min_commute(i8* %x, i8* %y) {
96+
; CHECK-LABEL: @ule_swap_or_not_min_commute(
97+
; CHECK-NEXT: ret i1 true
98+
;
99+
%cmp = icmp uge i8* %y, %x
100+
%cmpeq = icmp ne i8* %x, null
101+
%r = or i1 %cmpeq, %cmp
102+
ret i1 %r
103+
}
104+
105+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
106+
;
107+
; (X == null) && (X <= Y) --> X == null
108+
;
109+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
110+
111+
define i1 @ule_and_min(i8* %x, i8* %y) {
112+
; CHECK-LABEL: @ule_and_min(
113+
; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8* [[X:%.*]], null
114+
; CHECK-NEXT: ret i1 [[CMPEQ]]
115+
;
116+
%cmp = icmp ule i8* %x, %y
117+
%cmpeq = icmp eq i8* %x, null
118+
%r = and i1 %cmp, %cmpeq
119+
ret i1 %r
120+
}
121+
122+
define i1 @ule_and_min_commute(i8* %x, i8* %y) {
123+
; CHECK-LABEL: @ule_and_min_commute(
124+
; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8* [[X:%.*]], null
125+
; CHECK-NEXT: ret i1 [[CMPEQ]]
126+
;
127+
%cmp = icmp ule i8* %x, %y
128+
%cmpeq = icmp eq i8* %x, null
129+
%r = and i1 %cmpeq, %cmp
130+
ret i1 %r
131+
}
132+
133+
define i1 @ule_swap_and_min(i8* %x, i8* %y) {
134+
; CHECK-LABEL: @ule_swap_and_min(
135+
; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8* [[X:%.*]], null
136+
; CHECK-NEXT: ret i1 [[CMPEQ]]
137+
;
138+
%cmp = icmp uge i8* %y, %x
139+
%cmpeq = icmp eq i8* %x, null
140+
%r = and i1 %cmp, %cmpeq
141+
ret i1 %r
142+
}
143+
144+
define i1 @ule_swap_and_min_commute(i8* %x, i8* %y) {
145+
; CHECK-LABEL: @ule_swap_and_min_commute(
146+
; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8* [[X:%.*]], null
147+
; CHECK-NEXT: ret i1 [[CMPEQ]]
148+
;
149+
%cmp = icmp uge i8* %y, %x
150+
%cmpeq = icmp eq i8* %x, null
151+
%r = and i1 %cmpeq, %cmp
152+
ret i1 %r
153+
}
154+
155+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
156+
;
157+
; (X == null) || (X <= Y) --> X <= Y
158+
;
159+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
160+
161+
define i1 @ule_or_min(i8* %x, i8* %y) {
162+
; CHECK-LABEL: @ule_or_min(
163+
; CHECK-NEXT: [[CMP:%.*]] = icmp ule i8* [[X:%.*]], [[Y:%.*]]
164+
; CHECK-NEXT: ret i1 [[CMP]]
165+
;
166+
%cmp = icmp ule i8* %x, %y
167+
%cmpeq = icmp eq i8* %x, null
168+
%r = or i1 %cmp, %cmpeq
169+
ret i1 %r
170+
}
171+
172+
define i1 @ule_or_min_commute(i8* %x, i8* %y) {
173+
; CHECK-LABEL: @ule_or_min_commute(
174+
; CHECK-NEXT: [[CMP:%.*]] = icmp ule i8* [[X:%.*]], [[Y:%.*]]
175+
; CHECK-NEXT: ret i1 [[CMP]]
176+
;
177+
%cmp = icmp ule i8* %x, %y
178+
%cmpeq = icmp eq i8* %x, null
179+
%r = or i1 %cmpeq, %cmp
180+
ret i1 %r
181+
}
182+
183+
define i1 @ule_swap_or_min(i8* %x, i8* %y) {
184+
; CHECK-LABEL: @ule_swap_or_min(
185+
; CHECK-NEXT: [[CMP:%.*]] = icmp uge i8* [[Y:%.*]], [[X:%.*]]
186+
; CHECK-NEXT: ret i1 [[CMP]]
187+
;
188+
%cmp = icmp uge i8* %y, %x
189+
%cmpeq = icmp eq i8* %x, null
190+
%r = or i1 %cmp, %cmpeq
191+
ret i1 %r
192+
}
193+
194+
define i1 @ule_swap_or_min_commute(i8* %x, i8* %y) {
195+
; CHECK-LABEL: @ule_swap_or_min_commute(
196+
; CHECK-NEXT: [[CMP:%.*]] = icmp uge i8* [[Y:%.*]], [[X:%.*]]
197+
; CHECK-NEXT: ret i1 [[CMP]]
198+
;
199+
%cmp = icmp uge i8* %y, %x
200+
%cmpeq = icmp eq i8* %x, null
201+
%r = or i1 %cmpeq, %cmp
202+
ret i1 %r
203+
}
204+
205+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
206+
;
207+
; (X != null) && (X > Y) --> X > Y
208+
;
209+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
210+
211+
define i1 @ugt_and_not_min(i8* %x, i8* %y) {
212+
; CHECK-LABEL: @ugt_and_not_min(
213+
; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8* [[X:%.*]], [[Y:%.*]]
214+
; CHECK-NEXT: ret i1 [[CMP]]
215+
;
216+
%cmp = icmp ugt i8* %x, %y
217+
%cmpeq = icmp ne i8* %x, null
218+
%r = and i1 %cmp, %cmpeq
219+
ret i1 %r
220+
}
221+
222+
define i1 @ugt_and_not_min_commute(i8* %x, i8* %y) {
223+
; CHECK-LABEL: @ugt_and_not_min_commute(
224+
; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8* [[X:%.*]], [[Y:%.*]]
225+
; CHECK-NEXT: ret i1 [[CMP]]
226+
;
227+
%cmp = icmp ugt i8* %x, %y
228+
%cmpeq = icmp ne i8* %x, null
229+
%r = and i1 %cmpeq, %cmp
230+
ret i1 %r
231+
}
232+
233+
define i1 @ugt_swap_and_not_min(i8* %x, i8* %y) {
234+
; CHECK-LABEL: @ugt_swap_and_not_min(
235+
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8* [[Y:%.*]], [[X:%.*]]
236+
; CHECK-NEXT: ret i1 [[CMP]]
237+
;
238+
%cmp = icmp ult i8* %y, %x
239+
%cmpeq = icmp ne i8* %x, null
240+
%r = and i1 %cmp, %cmpeq
241+
ret i1 %r
242+
}
243+
244+
define i1 @ugt_swap_and_not_min_commute(i8* %x, i8* %y) {
245+
; CHECK-LABEL: @ugt_swap_and_not_min_commute(
246+
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8* [[Y:%.*]], [[X:%.*]]
247+
; CHECK-NEXT: ret i1 [[CMP]]
248+
;
249+
%cmp = icmp ult i8* %y, %x
250+
%cmpeq = icmp ne i8* %x, null
251+
%r = and i1 %cmpeq, %cmp
252+
ret i1 %r
253+
}
254+
255+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
256+
;
257+
; (X != null) || (X > Y) --> X != null
258+
;
259+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
260+
261+
define i1 @ugt_or_not_min(i8* %x, i8* %y) {
262+
; CHECK-LABEL: @ugt_or_not_min(
263+
; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8* [[X:%.*]], null
264+
; CHECK-NEXT: ret i1 [[CMPEQ]]
265+
;
266+
%cmp = icmp ugt i8* %x, %y
267+
%cmpeq = icmp ne i8* %x, null
268+
%r = or i1 %cmp, %cmpeq
269+
ret i1 %r
270+
}
271+
272+
define i1 @ugt_or_not_min_commute(i8* %x, i8* %y) {
273+
; CHECK-LABEL: @ugt_or_not_min_commute(
274+
; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8* [[X:%.*]], null
275+
; CHECK-NEXT: ret i1 [[CMPEQ]]
276+
;
277+
%cmp = icmp ugt i8* %x, %y
278+
%cmpeq = icmp ne i8* %x, null
279+
%r = or i1 %cmpeq, %cmp
280+
ret i1 %r
281+
}
282+
283+
define i1 @ugt_swap_or_not_min(i8* %x, i8* %y) {
284+
; CHECK-LABEL: @ugt_swap_or_not_min(
285+
; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8* [[X:%.*]], null
286+
; CHECK-NEXT: ret i1 [[CMPEQ]]
287+
;
288+
%cmp = icmp ult i8* %y, %x
289+
%cmpeq = icmp ne i8* %x, null
290+
%r = or i1 %cmp, %cmpeq
291+
ret i1 %r
292+
}
293+
294+
define i1 @ugt_swap_or_not_min_commute(i823* %x, i823* %y) {
295+
; CHECK-LABEL: @ugt_swap_or_not_min_commute(
296+
; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i823* [[X:%.*]], null
297+
; CHECK-NEXT: ret i1 [[CMPEQ]]
298+
;
299+
%cmp = icmp ult i823* %y, %x
300+
%cmpeq = icmp ne i823* %x, null
301+
%r = or i1 %cmpeq, %cmp
302+
ret i1 %r
303+
}

0 commit comments

Comments
 (0)