Skip to content

Commit c4238e6

Browse files
committed
[ValueTracking] Add pre-commit tests from PR68799 and PR69038. NFC.
1 parent 7bc6c4a commit c4238e6

File tree

1 file changed

+239
-0
lines changed

1 file changed

+239
-0
lines changed
Lines changed: 239 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,239 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 3
2+
; RUN: opt -passes=instcombine -S < %s | FileCheck %s
3+
4+
; Tests from PR68799
5+
6+
define i1 @f_and(i32 %x, i32 %y) {
7+
; CHECK-LABEL: define i1 @f_and(
8+
; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) {
9+
; CHECK-NEXT: entry:
10+
; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[X]], 0
11+
; CHECK-NEXT: [[TMP0:%.*]] = or i32 [[X]], [[Y]]
12+
; CHECK-NEXT: [[AND14:%.*]] = icmp eq i32 [[TMP0]], 0
13+
; CHECK-NEXT: [[AND1115:%.*]] = and i1 [[CMP]], [[AND14]]
14+
; CHECK-NEXT: ret i1 [[AND1115]]
15+
;
16+
entry:
17+
%cmp = icmp ne i32 %x, 0
18+
%0 = or i32 %x, %y
19+
%and14 = icmp eq i32 %0, 0
20+
%and1115 = and i1 %cmp, %and14
21+
ret i1 %and1115
22+
}
23+
24+
define i1 @f_or(i32 %x, i32 %y) {
25+
; CHECK-LABEL: define i1 @f_or(
26+
; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) {
27+
; CHECK-NEXT: entry:
28+
; CHECK-NEXT: [[CMP_NOT:%.*]] = icmp eq i32 [[X]], 0
29+
; CHECK-NEXT: [[TMP0:%.*]] = or i32 [[X]], [[Y]]
30+
; CHECK-NEXT: [[OR14:%.*]] = icmp ne i32 [[TMP0]], 0
31+
; CHECK-NEXT: [[OR1115:%.*]] = or i1 [[CMP_NOT]], [[OR14]]
32+
; CHECK-NEXT: ret i1 [[OR1115]]
33+
;
34+
entry:
35+
%cmp.not = icmp eq i32 %x, 0
36+
%0 = or i32 %x, %y
37+
%or14 = icmp ne i32 %0, 0
38+
%or1115 = or i1 %cmp.not, %or14
39+
ret i1 %or1115
40+
}
41+
42+
; Tests for more binops
43+
44+
define i1 @f_add(i32 %x, i32 %y) {
45+
; CHECK-LABEL: define i1 @f_add(
46+
; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) {
47+
; CHECK-NEXT: entry:
48+
; CHECK-NEXT: [[YR:%.*]] = and i32 [[Y]], 7
49+
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[X]], 8
50+
; CHECK-NEXT: [[TMP0:%.*]] = add i32 [[YR]], [[X]]
51+
; CHECK-NEXT: [[CMP2:%.*]] = icmp ugt i32 [[TMP0]], 16
52+
; CHECK-NEXT: [[AND:%.*]] = and i1 [[CMP]], [[CMP2]]
53+
; CHECK-NEXT: ret i1 [[AND]]
54+
;
55+
entry:
56+
%yr = and i32 %y, 7
57+
%cmp = icmp ult i32 %x, 8
58+
%0 = add i32 %yr, %x
59+
%cmp2 = icmp ugt i32 %0, 16
60+
%and = and i1 %cmp, %cmp2
61+
ret i1 %and
62+
}
63+
64+
define i1 @f_add_nsw(i32 %x, i32 %y) {
65+
; CHECK-LABEL: define i1 @f_add_nsw(
66+
; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) {
67+
; CHECK-NEXT: entry:
68+
; CHECK-NEXT: [[YR:%.*]] = and i32 [[Y]], 2147483647
69+
; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[X]], 5
70+
; CHECK-NEXT: [[TMP0:%.*]] = add nsw i32 [[YR]], [[X]]
71+
; CHECK-NEXT: [[CMP2:%.*]] = icmp slt i32 [[TMP0]], 5
72+
; CHECK-NEXT: [[AND:%.*]] = and i1 [[CMP]], [[CMP2]]
73+
; CHECK-NEXT: ret i1 [[AND]]
74+
;
75+
entry:
76+
%yr = and i32 %y, 2147483647
77+
%cmp = icmp sgt i32 %x, 5
78+
%0 = add nsw i32 %yr, %x
79+
%cmp2 = icmp slt i32 %0, 5
80+
%and = and i1 %cmp, %cmp2
81+
ret i1 %and
82+
}
83+
84+
define i1 @f_add_nuw(i32 %x, i32 %y) {
85+
; CHECK-LABEL: define i1 @f_add_nuw(
86+
; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) {
87+
; CHECK-NEXT: entry:
88+
; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i32 [[X]], 1
89+
; CHECK-NEXT: [[TMP0:%.*]] = add nuw i32 [[X]], [[Y]]
90+
; CHECK-NEXT: [[CMP2:%.*]] = icmp eq i32 [[TMP0]], 1
91+
; CHECK-NEXT: [[AND:%.*]] = and i1 [[CMP]], [[CMP2]]
92+
; CHECK-NEXT: ret i1 [[AND]]
93+
;
94+
entry:
95+
%cmp = icmp ugt i32 %x, 1
96+
%0 = add nuw i32 %x, %y
97+
%cmp2 = icmp eq i32 %0, 1
98+
%and = and i1 %cmp, %cmp2
99+
ret i1 %and
100+
}
101+
102+
define i1 @f_sub_nsw(i32 %x, i32 %y) {
103+
; CHECK-LABEL: define i1 @f_sub_nsw(
104+
; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) {
105+
; CHECK-NEXT: entry:
106+
; CHECK-NEXT: [[YR:%.*]] = and i32 [[Y]], 2147483647
107+
; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[X]], 5
108+
; CHECK-NEXT: [[TMP0:%.*]] = sub nsw i32 [[X]], [[YR]]
109+
; CHECK-NEXT: [[CMP2:%.*]] = icmp slt i32 [[TMP0]], 5
110+
; CHECK-NEXT: [[AND:%.*]] = and i1 [[CMP]], [[CMP2]]
111+
; CHECK-NEXT: ret i1 [[AND]]
112+
;
113+
entry:
114+
%yr = and i32 %y, 2147483647
115+
%cmp = icmp slt i32 %x, 5
116+
%0 = sub nsw i32 %x, %yr
117+
%cmp2 = icmp slt i32 %0, 5
118+
%and = and i1 %cmp, %cmp2
119+
ret i1 %and
120+
}
121+
122+
define i1 @f_sub_nuw(i32 %x, i32 %y) {
123+
; CHECK-LABEL: define i1 @f_sub_nuw(
124+
; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) {
125+
; CHECK-NEXT: entry:
126+
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[X]], 5
127+
; CHECK-NEXT: [[TMP0:%.*]] = sub nuw i32 [[X]], [[Y]]
128+
; CHECK-NEXT: [[CMP2:%.*]] = icmp eq i32 [[TMP0]], 6
129+
; CHECK-NEXT: [[AND:%.*]] = and i1 [[CMP]], [[CMP2]]
130+
; CHECK-NEXT: ret i1 [[AND]]
131+
;
132+
entry:
133+
%cmp = icmp ult i32 %x, 5
134+
%0 = sub nuw i32 %x, %y
135+
%cmp2 = icmp eq i32 %0, 6
136+
%and = and i1 %cmp, %cmp2
137+
ret i1 %and
138+
}
139+
140+
; Negative tests
141+
142+
; non-constant range
143+
define i1 @f_add_nofold1(i32 %x, i32 %y, i32 %z) {
144+
; CHECK-LABEL: define i1 @f_add_nofold1(
145+
; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]], i32 [[Z:%.*]]) {
146+
; CHECK-NEXT: entry:
147+
; CHECK-NEXT: [[YR:%.*]] = and i32 [[Y]], 7
148+
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[X]], [[Z]]
149+
; CHECK-NEXT: [[TMP0:%.*]] = add i32 [[YR]], [[X]]
150+
; CHECK-NEXT: [[CMP2:%.*]] = icmp ugt i32 [[TMP0]], 16
151+
; CHECK-NEXT: [[AND:%.*]] = and i1 [[CMP]], [[CMP2]]
152+
; CHECK-NEXT: ret i1 [[AND]]
153+
;
154+
entry:
155+
%yr = and i32 %y, 7
156+
%cmp = icmp ult i32 %x, %z
157+
%0 = add i32 %yr, %x
158+
%cmp2 = icmp ugt i32 %0, 16
159+
%and = and i1 %cmp, %cmp2
160+
ret i1 %and
161+
}
162+
163+
define i1 @f_add_nofold2(i32 %x, i32 %y, i32 %z) {
164+
; CHECK-LABEL: define i1 @f_add_nofold2(
165+
; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]], i32 [[Z:%.*]]) {
166+
; CHECK-NEXT: entry:
167+
; CHECK-NEXT: [[YR:%.*]] = and i32 [[Y]], 7
168+
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[X]], 8
169+
; CHECK-NEXT: [[TMP0:%.*]] = add i32 [[YR]], [[X]]
170+
; CHECK-NEXT: [[CMP2:%.*]] = icmp ugt i32 [[TMP0]], [[Z]]
171+
; CHECK-NEXT: [[AND:%.*]] = and i1 [[CMP]], [[CMP2]]
172+
; CHECK-NEXT: ret i1 [[AND]]
173+
;
174+
entry:
175+
%yr = and i32 %y, 7
176+
%cmp = icmp ult i32 %x, 8
177+
%0 = add i32 %yr, %x
178+
%cmp2 = icmp ugt i32 %0, %z
179+
%and = and i1 %cmp, %cmp2
180+
ret i1 %and
181+
}
182+
183+
; narrower range
184+
define i1 @f_add_nofold3(i32 %x, i32 %y) {
185+
; CHECK-LABEL: define i1 @f_add_nofold3(
186+
; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) {
187+
; CHECK-NEXT: entry:
188+
; CHECK-NEXT: [[YR:%.*]] = and i32 [[Y]], 7
189+
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[X]], 8
190+
; CHECK-NEXT: [[TMP0:%.*]] = add i32 [[YR]], [[X]]
191+
; CHECK-NEXT: [[CMP2:%.*]] = icmp ugt i32 [[TMP0]], 10
192+
; CHECK-NEXT: [[AND:%.*]] = and i1 [[CMP]], [[CMP2]]
193+
; CHECK-NEXT: ret i1 [[AND]]
194+
;
195+
entry:
196+
%yr = and i32 %y, 7
197+
%cmp = icmp ult i32 %x, 8
198+
%0 = add i32 %yr, %x
199+
%cmp2 = icmp ugt i32 %0, 10
200+
%and = and i1 %cmp, %cmp2
201+
ret i1 %and
202+
}
203+
204+
; sub is not commutative
205+
define i1 @f_sub_nsw_nofold(i32 %x, i32 %y) {
206+
; CHECK-LABEL: define i1 @f_sub_nsw_nofold(
207+
; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) {
208+
; CHECK-NEXT: entry:
209+
; CHECK-NEXT: [[YR:%.*]] = and i32 [[Y]], 2147483647
210+
; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[X]], 5
211+
; CHECK-NEXT: [[TMP0:%.*]] = sub nsw i32 [[YR]], [[X]]
212+
; CHECK-NEXT: [[CMP2:%.*]] = icmp slt i32 [[TMP0]], 5
213+
; CHECK-NEXT: [[AND:%.*]] = and i1 [[CMP]], [[CMP2]]
214+
; CHECK-NEXT: ret i1 [[AND]]
215+
;
216+
entry:
217+
%yr = and i32 %y, 2147483647
218+
%cmp = icmp slt i32 %x, 5
219+
%0 = sub nsw i32 %yr, %x
220+
%cmp2 = icmp slt i32 %0, 5
221+
%and = and i1 %cmp, %cmp2
222+
ret i1 %and
223+
}
224+
225+
define i1 @pr69038(i32 %a, i32 %b) {
226+
; CHECK-LABEL: define i1 @pr69038(
227+
; CHECK-SAME: i32 [[A:%.*]], i32 [[B:%.*]]) {
228+
; CHECK-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[A]], 0
229+
; CHECK-NEXT: [[OR:%.*]] = or i32 [[A]], [[B]]
230+
; CHECK-NEXT: [[TOBOOL1:%.*]] = icmp ne i32 [[OR]], 0
231+
; CHECK-NEXT: [[AND:%.*]] = and i1 [[TOBOOL]], [[TOBOOL1]]
232+
; CHECK-NEXT: ret i1 [[AND]]
233+
;
234+
%tobool = icmp ne i32 %a, 0
235+
%or = or i32 %a, %b
236+
%tobool1 = icmp ne i32 %or, 0
237+
%and = and i1 %tobool, %tobool1
238+
ret i1 %and
239+
}

0 commit comments

Comments
 (0)