Skip to content

Commit b16a5e4

Browse files
committed
[ConstraintElim] Add pre-commit tests. NFC.
1 parent 00d8ea3 commit b16a5e4

File tree

1 file changed

+189
-0
lines changed
  • llvm/test/Transforms/ConstraintElimination

1 file changed

+189
-0
lines changed
Lines changed: 189 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,189 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
2+
; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s
3+
4+
define i1 @test_icmp_ult_zext_icmp_trunc_nuw(i16 %x, i32 %y) {
5+
; CHECK-LABEL: define i1 @test_icmp_ult_zext_icmp_trunc_nuw(
6+
; CHECK-SAME: i16 [[X:%.*]], i32 [[Y:%.*]]) {
7+
; CHECK-NEXT: [[EXT:%.*]] = zext i16 [[X]] to i32
8+
; CHECK-NEXT: [[COND:%.*]] = icmp ult i32 [[Y]], [[EXT]]
9+
; CHECK-NEXT: br i1 [[COND]], label %[[IF_THEN:.*]], label %[[IF_ELSE:.*]]
10+
; CHECK: [[IF_THEN]]:
11+
; CHECK-NEXT: [[CONV:%.*]] = trunc nuw i32 [[Y]] to i16
12+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i16 [[X]], [[CONV]]
13+
; CHECK-NEXT: ret i1 [[CMP]]
14+
; CHECK: [[IF_ELSE]]:
15+
; CHECK-NEXT: ret i1 false
16+
;
17+
%ext = zext i16 %x to i32
18+
%cond = icmp ult i32 %y, %ext
19+
br i1 %cond, label %if.then, label %if.else
20+
21+
if.then:
22+
%conv = trunc nuw i32 %y to i16
23+
%cmp = icmp eq i16 %x, %conv
24+
ret i1 %cmp
25+
26+
if.else:
27+
ret i1 false
28+
}
29+
30+
define i1 @test_icmp_slt_sext_icmp_trunc_nsw(i16 %x, i32 %y) {
31+
; CHECK-LABEL: define i1 @test_icmp_slt_sext_icmp_trunc_nsw(
32+
; CHECK-SAME: i16 [[X:%.*]], i32 [[Y:%.*]]) {
33+
; CHECK-NEXT: [[EXT:%.*]] = sext i16 [[X]] to i32
34+
; CHECK-NEXT: [[COND:%.*]] = icmp slt i32 [[Y]], [[EXT]]
35+
; CHECK-NEXT: br i1 [[COND]], label %[[IF_THEN:.*]], label %[[IF_ELSE:.*]]
36+
; CHECK: [[IF_THEN]]:
37+
; CHECK-NEXT: [[CONV:%.*]] = trunc nsw i32 [[Y]] to i16
38+
; CHECK-NEXT: [[CMP:%.*]] = icmp slt i16 [[X]], [[CONV]]
39+
; CHECK-NEXT: ret i1 [[CMP]]
40+
; CHECK: [[IF_ELSE]]:
41+
; CHECK-NEXT: ret i1 false
42+
;
43+
%ext = sext i16 %x to i32
44+
%cond = icmp slt i32 %y, %ext
45+
br i1 %cond, label %if.then, label %if.else
46+
47+
if.then:
48+
%conv = trunc nsw i32 %y to i16
49+
%cmp = icmp slt i16 %x, %conv
50+
ret i1 %cmp
51+
52+
if.else:
53+
ret i1 false
54+
}
55+
56+
define i1 @test_icmp_ult_trunc_nsw_nneg_icmp_trunc_nuw(i64 %x, i32 %y) {
57+
; CHECK-LABEL: define i1 @test_icmp_ult_trunc_nsw_nneg_icmp_trunc_nuw(
58+
; CHECK-SAME: i64 [[X:%.*]], i32 [[Y:%.*]]) {
59+
; CHECK-NEXT: [[EXT:%.*]] = trunc nsw i64 [[X]] to i32
60+
; CHECK-NEXT: [[NNEG:%.*]] = icmp sgt i64 [[X]], -1
61+
; CHECK-NEXT: [[COND:%.*]] = icmp ult i32 [[Y]], [[EXT]]
62+
; CHECK-NEXT: [[AND:%.*]] = and i1 [[NNEG]], [[COND]]
63+
; CHECK-NEXT: br i1 [[AND]], label %[[IF_THEN:.*]], label %[[IF_ELSE:.*]]
64+
; CHECK: [[IF_THEN]]:
65+
; CHECK-NEXT: [[CONV:%.*]] = zext i32 [[Y]] to i64
66+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 [[X]], [[CONV]]
67+
; CHECK-NEXT: ret i1 [[CMP]]
68+
; CHECK: [[IF_ELSE]]:
69+
; CHECK-NEXT: ret i1 false
70+
;
71+
%ext = trunc nsw i64 %x to i32
72+
%nneg = icmp sgt i64 %x, -1
73+
%cond = icmp ult i32 %y, %ext
74+
%and = and i1 %nneg, %cond
75+
br i1 %and, label %if.then, label %if.else
76+
77+
if.then:
78+
%conv = zext i32 %y to i64
79+
%cmp = icmp eq i64 %x, %conv
80+
ret i1 %cmp
81+
82+
if.else:
83+
ret i1 false
84+
}
85+
86+
define i1 @test2(i32 %n) {
87+
; CHECK-LABEL: define i1 @test2(
88+
; CHECK-SAME: i32 [[N:%.*]]) {
89+
; CHECK-NEXT: [[COND:%.*]] = icmp sgt i32 [[N]], 0
90+
; CHECK-NEXT: br i1 [[COND]], label %[[IF_THEN:.*]], label %[[IF_ELSE:.*]]
91+
; CHECK: [[IF_THEN]]:
92+
; CHECK-NEXT: [[EXT:%.*]] = zext nneg i32 [[N]] to i64
93+
; CHECK-NEXT: [[END:%.*]] = add nsw i64 [[EXT]], -1
94+
; CHECK-NEXT: br label %[[FOR_BODY:.*]]
95+
; CHECK: [[FOR_BODY]]:
96+
; CHECK-NEXT: [[INDVAR:%.*]] = phi i64 [ 0, %[[IF_THEN]] ], [ [[INDVAR_NEXT:%.*]], %[[FOR_NEXT:.*]] ]
97+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 [[INDVAR]], [[END]]
98+
; CHECK-NEXT: br i1 [[CMP]], label %[[IF_ELSE]], label %[[FOR_NEXT]]
99+
; CHECK: [[FOR_NEXT]]:
100+
; CHECK-NEXT: [[INDVAR_NEXT]] = add nuw nsw i64 [[INDVAR]], 1
101+
; CHECK-NEXT: [[COND2:%.*]] = call i1 @cond()
102+
; CHECK-NEXT: br i1 [[COND2]], label %[[FOR_BODY]], label %[[FOR_END:.*]]
103+
; CHECK: [[FOR_END]]:
104+
; CHECK-NEXT: [[TRUNC:%.*]] = trunc nsw i64 [[INDVAR_NEXT]] to i32
105+
; CHECK-NEXT: [[RES:%.*]] = icmp sgt i32 [[N]], [[TRUNC]]
106+
; CHECK-NEXT: ret i1 [[RES]]
107+
; CHECK: [[IF_ELSE]]:
108+
; CHECK-NEXT: ret i1 false
109+
;
110+
%cond = icmp sgt i32 %n, 0
111+
br i1 %cond, label %if.then, label %if.else
112+
113+
if.then:
114+
%ext = zext nneg i32 %n to i64
115+
%end = add nsw i64 %ext, -1
116+
br label %for.body
117+
118+
for.body:
119+
%indvar = phi i64 [ 0, %if.then ], [ %indvar.next, %for.next ]
120+
%cmp = icmp eq i64 %indvar, %end
121+
br i1 %cmp, label %if.else, label %for.next
122+
123+
for.next:
124+
%indvar.next = add nuw nsw i64 %indvar, 1
125+
%cond2 = call i1 @cond()
126+
br i1 %cond2, label %for.body, label %for.end
127+
128+
for.end:
129+
%trunc = trunc nsw i64 %indvar.next to i32
130+
%res = icmp sgt i32 %n, %trunc
131+
ret i1 %res
132+
133+
if.else:
134+
ret i1 false
135+
}
136+
137+
define i1 @test_icmp_ult_zext_icmp_trunc(i16 %x, i32 %y) {
138+
; CHECK-LABEL: define i1 @test_icmp_ult_zext_icmp_trunc(
139+
; CHECK-SAME: i16 [[X:%.*]], i32 [[Y:%.*]]) {
140+
; CHECK-NEXT: [[EXT:%.*]] = zext i16 [[X]] to i32
141+
; CHECK-NEXT: [[COND:%.*]] = icmp ult i32 [[Y]], [[EXT]]
142+
; CHECK-NEXT: br i1 [[COND]], label %[[IF_THEN:.*]], label %[[IF_ELSE:.*]]
143+
; CHECK: [[IF_THEN]]:
144+
; CHECK-NEXT: [[CONV:%.*]] = trunc i32 [[Y]] to i16
145+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i16 [[X]], [[CONV]]
146+
; CHECK-NEXT: ret i1 [[CMP]]
147+
; CHECK: [[IF_ELSE]]:
148+
; CHECK-NEXT: ret i1 false
149+
;
150+
%ext = zext i16 %x to i32
151+
%cond = icmp ult i32 %y, %ext
152+
br i1 %cond, label %if.then, label %if.else
153+
154+
if.then:
155+
%conv = trunc i32 %y to i16
156+
%cmp = icmp eq i16 %x, %conv
157+
ret i1 %cmp
158+
159+
if.else:
160+
ret i1 false
161+
}
162+
163+
define i1 @test_icmp_ult_zext_icmp_trunc_nuw_i128(i16 %x, i128 %y) {
164+
; CHECK-LABEL: define i1 @test_icmp_ult_zext_icmp_trunc_nuw_i128(
165+
; CHECK-SAME: i16 [[X:%.*]], i128 [[Y:%.*]]) {
166+
; CHECK-NEXT: [[EXT:%.*]] = zext i16 [[X]] to i128
167+
; CHECK-NEXT: [[COND:%.*]] = icmp ult i128 [[Y]], [[EXT]]
168+
; CHECK-NEXT: br i1 [[COND]], label %[[IF_THEN:.*]], label %[[IF_ELSE:.*]]
169+
; CHECK: [[IF_THEN]]:
170+
; CHECK-NEXT: [[CONV:%.*]] = trunc nuw i128 [[Y]] to i16
171+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i16 [[X]], [[CONV]]
172+
; CHECK-NEXT: ret i1 [[CMP]]
173+
; CHECK: [[IF_ELSE]]:
174+
; CHECK-NEXT: ret i1 false
175+
;
176+
%ext = zext i16 %x to i128
177+
%cond = icmp ult i128 %y, %ext
178+
br i1 %cond, label %if.then, label %if.else
179+
180+
if.then:
181+
%conv = trunc nuw i128 %y to i16
182+
%cmp = icmp eq i16 %x, %conv
183+
ret i1 %cmp
184+
185+
if.else:
186+
ret i1 false
187+
}
188+
189+
declare void @cond()

0 commit comments

Comments
 (0)