Skip to content

Commit 4e9fe86

Browse files
committed
[ConstraintElim] Add additional sext tests with unsigned predicates.
1 parent aaec22f commit 4e9fe86

File tree

2 files changed

+188
-30
lines changed

2 files changed

+188
-30
lines changed

llvm/test/Transforms/ConstraintElimination/sext.ll renamed to llvm/test/Transforms/ConstraintElimination/sext-signed-predicates.ll

Lines changed: 52 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -127,36 +127,6 @@ else:
127127

128128
; Negative tests
129129

130-
define i1 @cmp_sext_unsigned(i32 %a, i32 %b){
131-
; CHECK-LABEL: define i1 @cmp_sext_unsigned(
132-
; CHECK-SAME: i32 [[A:%.*]], i32 [[B:%.*]]) {
133-
; CHECK-NEXT: entry:
134-
; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[A]], [[B]]
135-
; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]
136-
; CHECK: then:
137-
; CHECK-NEXT: [[SA:%.*]] = sext i32 [[A]] to i64
138-
; CHECK-NEXT: [[SB:%.*]] = sext i32 [[B]] to i64
139-
; CHECK-NEXT: [[ADD:%.*]] = add nsw i64 [[SA]], 1
140-
; CHECK-NEXT: [[CMP2:%.*]] = icmp uge i64 [[SB]], [[ADD]]
141-
; CHECK-NEXT: ret i1 [[CMP2]]
142-
; CHECK: else:
143-
; CHECK-NEXT: ret i1 false
144-
;
145-
entry:
146-
%cmp = icmp slt i32 %a, %b
147-
br i1 %cmp, label %then, label %else
148-
149-
then:
150-
%sa = sext i32 %a to i64
151-
%sb = sext i32 %b to i64
152-
%add = add nsw i64 %sa, 1
153-
%cmp2 = icmp uge i64 %sb, %add
154-
ret i1 %cmp2
155-
156-
else:
157-
ret i1 false
158-
}
159-
160130
define i1 @cmp_zext(i32 %a, i32 %b){
161131
; CHECK-LABEL: define i1 @cmp_zext(
162132
; CHECK-SAME: i32 [[A:%.*]], i32 [[B:%.*]]) {
@@ -246,3 +216,55 @@ then:
246216
else:
247217
ret i1 false
248218
}
219+
220+
declare void @use(i1)
221+
222+
define void @sge_sext(i16 %x, i32 %y) {
223+
; CHECK-LABEL: define void @sge_sext(
224+
; CHECK-SAME: i16 [[X:%.*]], i32 [[Y:%.*]]) {
225+
; CHECK-NEXT: entry:
226+
; CHECK-NEXT: [[X_EXT:%.*]] = sext i16 [[X]] to i32
227+
; CHECK-NEXT: [[C_1:%.*]] = icmp sge i32 [[X_EXT]], [[Y]]
228+
; CHECK-NEXT: [[C_2:%.*]] = icmp sge i32 [[Y]], -10
229+
; CHECK-NEXT: [[AND:%.*]] = and i1 [[C_1]], [[C_2]]
230+
; CHECK-NEXT: br i1 [[AND]], label [[BB1:%.*]], label [[BB2:%.*]]
231+
; CHECK: bb1:
232+
; CHECK-NEXT: call void @use(i1 true)
233+
; CHECK-NEXT: call void @use(i1 true)
234+
; CHECK-NEXT: [[T_3:%.*]] = icmp sge i32 [[X_EXT]], -9
235+
; CHECK-NEXT: call void @use(i1 [[T_3]])
236+
; CHECK-NEXT: [[C_3:%.*]] = icmp sge i32 [[X_EXT]], -9
237+
; CHECK-NEXT: call void @use(i1 [[C_3]])
238+
; CHECK-NEXT: [[C_4:%.*]] = icmp sge i32 [[Y]], [[X_EXT]]
239+
; CHECK-NEXT: call void @use(i1 [[C_4]])
240+
; CHECK-NEXT: [[C_5:%.*]] = icmp sge i16 [[X]], -9
241+
; CHECK-NEXT: call void @use(i1 [[C_5]])
242+
; CHECK-NEXT: ret void
243+
; CHECK: bb2:
244+
; CHECK-NEXT: ret void
245+
;
246+
entry:
247+
%x.ext = sext i16 %x to i32
248+
%c.1 = icmp sge i32 %x.ext, %y
249+
%c.2 = icmp sge i32 %y, -10
250+
%and = and i1 %c.1, %c.2
251+
br i1 %and, label %bb1, label %bb2
252+
253+
bb1:
254+
%t.1 = icmp sge i32 %x.ext, %y
255+
call void @use(i1 %t.1)
256+
%t.2 = icmp sge i16 %x, -10
257+
call void @use(i1 %t.2)
258+
%t.3 = icmp sge i32 %x.ext, -9
259+
call void @use(i1 %t.3)
260+
%c.3 = icmp sge i32 %x.ext, -9
261+
call void @use(i1 %c.3)
262+
%c.4 = icmp sge i32 %y, %x.ext
263+
call void @use(i1 %c.4)
264+
%c.5 = icmp sge i16 %x, -9
265+
call void @use(i1 %c.5)
266+
ret void
267+
268+
bb2:
269+
ret void
270+
}
Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
2+
; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s
3+
4+
declare void @use(i1)
5+
6+
define void @uge_sext(i16 %x, i32 %y) {
7+
; CHECK-LABEL: define void @uge_sext(
8+
; CHECK-SAME: i16 [[X:%.*]], i32 [[Y:%.*]]) {
9+
; CHECK-NEXT: entry:
10+
; CHECK-NEXT: [[X_EXT:%.*]] = sext i16 [[X]] to i32
11+
; CHECK-NEXT: [[C_1:%.*]] = icmp uge i32 [[X_EXT]], [[Y]]
12+
; CHECK-NEXT: [[C_2:%.*]] = icmp uge i32 [[Y]], -10
13+
; CHECK-NEXT: [[AND:%.*]] = and i1 [[C_1]], [[C_2]]
14+
; CHECK-NEXT: br i1 [[AND]], label [[BB1:%.*]], label [[BB2:%.*]]
15+
; CHECK: bb1:
16+
; CHECK-NEXT: call void @use(i1 true)
17+
; CHECK-NEXT: [[C_3:%.*]] = icmp uge i16 [[X]], -10
18+
; CHECK-NEXT: call void @use(i1 [[C_3]])
19+
; CHECK-NEXT: [[C_4:%.*]] = icmp uge i32 [[X_EXT]], -9
20+
; CHECK-NEXT: call void @use(i1 [[C_4]])
21+
; CHECK-NEXT: [[C_5:%.*]] = icmp uge i32 [[X_EXT]], -9
22+
; CHECK-NEXT: call void @use(i1 [[C_5]])
23+
; CHECK-NEXT: [[C_6:%.*]] = icmp uge i32 [[Y]], [[X_EXT]]
24+
; CHECK-NEXT: call void @use(i1 [[C_6]])
25+
; CHECK-NEXT: [[C_7:%.*]] = icmp uge i16 [[X]], -9
26+
; CHECK-NEXT: call void @use(i1 [[C_7]])
27+
; CHECK-NEXT: ret void
28+
; CHECK: bb2:
29+
; CHECK-NEXT: ret void
30+
;
31+
entry:
32+
%x.ext = sext i16 %x to i32
33+
%c.1 = icmp uge i32 %x.ext, %y
34+
%c.2 = icmp uge i32 %y, -10
35+
%and = and i1 %c.1, %c.2
36+
br i1 %and, label %bb1, label %bb2
37+
38+
bb1:
39+
%t.1 = icmp uge i32 %x.ext, %y
40+
call void @use(i1 %t.1)
41+
%c.3 = icmp uge i16 %x, -10
42+
call void @use(i1 %c.3)
43+
%c.4 = icmp uge i32 %x.ext, -9
44+
call void @use(i1 %c.4)
45+
%c.5 = icmp uge i32 %x.ext, -9
46+
call void @use(i1 %c.5)
47+
%c.6 = icmp uge i32 %y, %x.ext
48+
call void @use(i1 %c.6)
49+
%c.7 = icmp uge i16 %x, -9
50+
call void @use(i1 %c.7)
51+
ret void
52+
53+
bb2:
54+
ret void
55+
}
56+
57+
define void @uge_sext_known_positive(i16 %x, i32 %y) {
58+
; CHECK-LABEL: define void @uge_sext_known_positive(
59+
; CHECK-SAME: i16 [[X:%.*]], i32 [[Y:%.*]]) {
60+
; CHECK-NEXT: entry:
61+
; CHECK-NEXT: [[X_EXT:%.*]] = sext i16 [[X]] to i32
62+
; CHECK-NEXT: [[C_2:%.*]] = icmp sge i16 [[X]], 0
63+
; CHECK-NEXT: [[C_1:%.*]] = icmp uge i32 [[X_EXT]], 10
64+
; CHECK-NEXT: [[AND:%.*]] = and i1 [[C_2]], [[C_1]]
65+
; CHECK-NEXT: br i1 [[AND]], label [[BB1:%.*]], label [[BB2:%.*]]
66+
; CHECK: bb1:
67+
; CHECK-NEXT: call void @use(i1 true)
68+
; CHECK-NEXT: [[T_2:%.*]] = icmp uge i16 [[X]], 10
69+
; CHECK-NEXT: call void @use(i1 [[T_2]])
70+
; CHECK-NEXT: [[C_3:%.*]] = icmp uge i32 [[X_EXT]], 11
71+
; CHECK-NEXT: call void @use(i1 [[C_3]])
72+
; CHECK-NEXT: [[C_4:%.*]] = icmp uge i32 [[X_EXT]], 11
73+
; CHECK-NEXT: call void @use(i1 [[C_4]])
74+
; CHECK-NEXT: [[C_5:%.*]] = icmp uge i32 [[Y]], [[X_EXT]]
75+
; CHECK-NEXT: call void @use(i1 [[C_5]])
76+
; CHECK-NEXT: [[C_6:%.*]] = icmp uge i16 [[X]], 11
77+
; CHECK-NEXT: call void @use(i1 [[C_6]])
78+
; CHECK-NEXT: ret void
79+
; CHECK: bb2:
80+
; CHECK-NEXT: ret void
81+
;
82+
entry:
83+
%x.ext = sext i16 %x to i32
84+
%c.2 = icmp sge i16 %x, 0
85+
%c.1 = icmp uge i32 %x.ext, 10
86+
%and = and i1 %c.2, %c.1
87+
br i1 %and, label %bb1, label %bb2
88+
89+
bb1:
90+
%t.1 = icmp uge i32 %x.ext, 10
91+
call void @use(i1 %t.1)
92+
%t.2 = icmp uge i16 %x, 10
93+
call void @use(i1 %t.2)
94+
%c.3 = icmp uge i32 %x.ext, 11
95+
call void @use(i1 %c.3)
96+
%c.4 = icmp uge i32 %x.ext, 11
97+
call void @use(i1 %c.4)
98+
%c.5 = icmp uge i32 %y, %x.ext
99+
call void @use(i1 %c.5)
100+
%c.6 = icmp uge i16 %x, 11
101+
call void @use(i1 %c.6)
102+
ret void
103+
104+
bb2:
105+
ret void
106+
}
107+
108+
define i1 @cmp_sext_unsigned(i32 %a, i32 %b){
109+
; CHECK-LABEL: define i1 @cmp_sext_unsigned(
110+
; CHECK-SAME: i32 [[A:%.*]], i32 [[B:%.*]]) {
111+
; CHECK-NEXT: entry:
112+
; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[A]], [[B]]
113+
; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]
114+
; CHECK: then:
115+
; CHECK-NEXT: [[SA:%.*]] = sext i32 [[A]] to i64
116+
; CHECK-NEXT: [[SB:%.*]] = sext i32 [[B]] to i64
117+
; CHECK-NEXT: [[ADD:%.*]] = add nsw i64 [[SA]], 1
118+
; CHECK-NEXT: [[CMP2:%.*]] = icmp uge i64 [[SB]], [[ADD]]
119+
; CHECK-NEXT: ret i1 [[CMP2]]
120+
; CHECK: else:
121+
; CHECK-NEXT: ret i1 false
122+
;
123+
entry:
124+
%cmp = icmp slt i32 %a, %b
125+
br i1 %cmp, label %then, label %else
126+
127+
then:
128+
%sa = sext i32 %a to i64
129+
%sb = sext i32 %b to i64
130+
%add = add nsw i64 %sa, 1
131+
%cmp2 = icmp uge i64 %sb, %add
132+
ret i1 %cmp2
133+
134+
else:
135+
ret i1 false
136+
}

0 commit comments

Comments
 (0)