Skip to content

Commit 8ca351d

Browse files
authored
[ConstraintElim] Add pre-commit tests for PR82271. NFC. (#82357)
This patch adds some tests for #82344.
1 parent 9eb399b commit 8ca351d

File tree

2 files changed

+338
-0
lines changed

2 files changed

+338
-0
lines changed

llvm/test/Transforms/ConstraintElimination/minmax.ll

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -601,6 +601,126 @@ else:
601601
ret i32 -1
602602
}
603603

604+
define i64 @pr82271(i32 %a, i32 %b){
605+
; CHECK-LABEL: define i64 @pr82271
606+
; CHECK-SAME: (i32 [[A:%.*]], i32 [[B:%.*]]) {
607+
; CHECK-NEXT: entry:
608+
; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[A]], [[B]]
609+
; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]
610+
; CHECK: then:
611+
; CHECK-NEXT: [[SA:%.*]] = sext i32 [[A]] to i64
612+
; CHECK-NEXT: [[SB:%.*]] = sext i32 [[B]] to i64
613+
; CHECK-NEXT: [[ADD:%.*]] = add nsw i64 [[SA]], 1
614+
; CHECK-NEXT: [[SMAX:%.*]] = call i64 @llvm.smax.i64(i64 [[SB]], i64 [[ADD]])
615+
; CHECK-NEXT: ret i64 [[SMAX]]
616+
; CHECK: else:
617+
; CHECK-NEXT: ret i64 0
618+
;
619+
entry:
620+
%cmp = icmp slt i32 %a, %b
621+
br i1 %cmp, label %then, label %else
622+
623+
then:
624+
%sa = sext i32 %a to i64
625+
%sb = sext i32 %b to i64
626+
%add = add nsw i64 %sa, 1
627+
%smax = call i64 @llvm.smax.i64(i64 %sb, i64 %add)
628+
ret i64 %smax
629+
630+
else:
631+
ret i64 0
632+
}
633+
634+
define i64 @pr82271_sext_zext_nneg(i32 %a, i32 %b){
635+
; CHECK-LABEL: define i64 @pr82271_sext_zext_nneg
636+
; CHECK-SAME: (i32 [[A:%.*]], i32 [[B:%.*]]) {
637+
; CHECK-NEXT: entry:
638+
; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[A]], [[B]]
639+
; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]
640+
; CHECK: then:
641+
; CHECK-NEXT: [[SA:%.*]] = sext i32 [[A]] to i64
642+
; CHECK-NEXT: [[SB:%.*]] = zext nneg i32 [[B]] to i64
643+
; CHECK-NEXT: [[ADD:%.*]] = add nsw i64 [[SA]], 1
644+
; CHECK-NEXT: [[SMAX:%.*]] = call i64 @llvm.smax.i64(i64 [[SB]], i64 [[ADD]])
645+
; CHECK-NEXT: ret i64 [[SMAX]]
646+
; CHECK: else:
647+
; CHECK-NEXT: ret i64 0
648+
;
649+
entry:
650+
%cmp = icmp slt i32 %a, %b
651+
br i1 %cmp, label %then, label %else
652+
653+
then:
654+
%sa = sext i32 %a to i64
655+
%sb = zext nneg i32 %b to i64
656+
%add = add nsw i64 %sa, 1
657+
%smax = call i64 @llvm.smax.i64(i64 %sb, i64 %add)
658+
ret i64 %smax
659+
660+
else:
661+
ret i64 0
662+
}
663+
664+
define i64 @pr82271_zext_nneg(i32 %a, i32 %b){
665+
; CHECK-LABEL: define i64 @pr82271_zext_nneg
666+
; CHECK-SAME: (i32 [[A:%.*]], i32 [[B:%.*]]) {
667+
; CHECK-NEXT: entry:
668+
; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[A]], [[B]]
669+
; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]
670+
; CHECK: then:
671+
; CHECK-NEXT: [[SA:%.*]] = zext nneg i32 [[A]] to i64
672+
; CHECK-NEXT: [[SB:%.*]] = zext nneg i32 [[B]] to i64
673+
; CHECK-NEXT: [[ADD:%.*]] = add nsw i64 [[SA]], 1
674+
; CHECK-NEXT: [[SMAX:%.*]] = call i64 @llvm.smax.i64(i64 [[SB]], i64 [[ADD]])
675+
; CHECK-NEXT: ret i64 [[SMAX]]
676+
; CHECK: else:
677+
; CHECK-NEXT: ret i64 0
678+
;
679+
entry:
680+
%cmp = icmp slt i32 %a, %b
681+
br i1 %cmp, label %then, label %else
682+
683+
then:
684+
%sa = zext nneg i32 %a to i64
685+
%sb = zext nneg i32 %b to i64
686+
%add = add nsw i64 %sa, 1
687+
%smax = call i64 @llvm.smax.i64(i64 %sb, i64 %add)
688+
ret i64 %smax
689+
690+
else:
691+
ret i64 0
692+
}
693+
694+
define i64 @pr82271_zext(i32 %a, i32 %b){
695+
; CHECK-LABEL: define i64 @pr82271_zext
696+
; CHECK-SAME: (i32 [[A:%.*]], i32 [[B:%.*]]) {
697+
; CHECK-NEXT: entry:
698+
; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[A]], [[B]]
699+
; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]
700+
; CHECK: then:
701+
; CHECK-NEXT: [[SA:%.*]] = zext i32 [[A]] to i64
702+
; CHECK-NEXT: [[SB:%.*]] = zext i32 [[B]] to i64
703+
; CHECK-NEXT: [[ADD:%.*]] = add nsw i64 [[SA]], 1
704+
; CHECK-NEXT: [[SMAX:%.*]] = call i64 @llvm.smax.i64(i64 [[SB]], i64 [[ADD]])
705+
; CHECK-NEXT: ret i64 [[SMAX]]
706+
; CHECK: else:
707+
; CHECK-NEXT: ret i64 0
708+
;
709+
entry:
710+
%cmp = icmp slt i32 %a, %b
711+
br i1 %cmp, label %then, label %else
712+
713+
then:
714+
%sa = zext i32 %a to i64
715+
%sb = zext i32 %b to i64
716+
%add = add nsw i64 %sa, 1
717+
%smax = call i64 @llvm.smax.i64(i64 %sb, i64 %add)
718+
ret i64 %smax
719+
720+
else:
721+
ret i64 0
722+
}
723+
604724
declare i32 @llvm.smin.i32(i32, i32)
605725
declare i32 @llvm.smax.i32(i32, i32)
606726
declare i32 @llvm.umin.i32(i32, i32)
Lines changed: 218 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,218 @@
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+
define i1 @cmp_sext(i32 %a, i32 %b){
5+
; CHECK-LABEL: define i1 @cmp_sext(
6+
; CHECK-SAME: i32 [[A:%.*]], i32 [[B:%.*]]) {
7+
; CHECK-NEXT: entry:
8+
; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[A]], [[B]]
9+
; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]
10+
; CHECK: then:
11+
; CHECK-NEXT: [[SA:%.*]] = sext i32 [[A]] to i64
12+
; CHECK-NEXT: [[SB:%.*]] = sext i32 [[B]] to i64
13+
; CHECK-NEXT: [[ADD:%.*]] = add nsw i64 [[SA]], 1
14+
; CHECK-NEXT: [[CMP2:%.*]] = icmp sge i64 [[SB]], [[ADD]]
15+
; CHECK-NEXT: ret i1 [[CMP2]]
16+
; CHECK: else:
17+
; CHECK-NEXT: ret i1 false
18+
;
19+
entry:
20+
%cmp = icmp slt i32 %a, %b
21+
br i1 %cmp, label %then, label %else
22+
23+
then:
24+
%sa = sext i32 %a to i64
25+
%sb = sext i32 %b to i64
26+
%add = add nsw i64 %sa, 1
27+
%cmp2 = icmp sge i64 %sb, %add
28+
ret i1 %cmp2
29+
30+
else:
31+
ret i1 false
32+
}
33+
34+
define i1 @cmp_sext_positive_increment(i32 %a, i32 %b, i64 %c){
35+
; CHECK-LABEL: define i1 @cmp_sext_positive_increment(
36+
; CHECK-SAME: i32 [[A:%.*]], i32 [[B:%.*]], i64 [[C:%.*]]) {
37+
; CHECK-NEXT: entry:
38+
; CHECK-NEXT: [[POS:%.*]] = icmp sgt i64 [[C]], 0
39+
; CHECK-NEXT: call void @llvm.assume(i1 [[POS]])
40+
; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[A]], [[B]]
41+
; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]
42+
; CHECK: then:
43+
; CHECK-NEXT: [[SA:%.*]] = sext i32 [[A]] to i64
44+
; CHECK-NEXT: [[SB:%.*]] = sext i32 [[B]] to i64
45+
; CHECK-NEXT: [[ADD:%.*]] = add nsw i64 [[SA]], [[C]]
46+
; CHECK-NEXT: [[CMP2:%.*]] = icmp sge i64 [[SB]], [[ADD]]
47+
; CHECK-NEXT: ret i1 [[CMP2]]
48+
; CHECK: else:
49+
; CHECK-NEXT: ret i1 false
50+
;
51+
entry:
52+
%pos = icmp sgt i64 %c, 0
53+
call void @llvm.assume(i1 %pos)
54+
%cmp = icmp slt i32 %a, %b
55+
br i1 %cmp, label %then, label %else
56+
57+
then:
58+
%sa = sext i32 %a to i64
59+
%sb = sext i32 %b to i64
60+
%add = add nsw i64 %sa, %c
61+
%cmp2 = icmp sge i64 %sb, %add
62+
ret i1 %cmp2
63+
64+
else:
65+
ret i1 false
66+
}
67+
68+
define i1 @cmp_sext_sgt(i32 %a, i32 %b){
69+
; CHECK-LABEL: define i1 @cmp_sext_sgt(
70+
; CHECK-SAME: i32 [[A:%.*]], i32 [[B:%.*]]) {
71+
; CHECK-NEXT: entry:
72+
; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[A]], [[B]]
73+
; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]
74+
; CHECK: then:
75+
; CHECK-NEXT: [[SA:%.*]] = sext i32 [[A]] to i64
76+
; CHECK-NEXT: [[SB:%.*]] = sext i32 [[B]] to i64
77+
; CHECK-NEXT: [[ADD:%.*]] = add nsw i64 [[SA]], 1
78+
; CHECK-NEXT: [[CMP2:%.*]] = icmp sgt i64 [[SB]], [[ADD]]
79+
; CHECK-NEXT: ret i1 [[CMP2]]
80+
; CHECK: else:
81+
; CHECK-NEXT: ret i1 false
82+
;
83+
entry:
84+
%cmp = icmp slt i32 %a, %b
85+
br i1 %cmp, label %then, label %else
86+
87+
then:
88+
%sa = sext i32 %a to i64
89+
%sb = sext i32 %b to i64
90+
%add = add nsw i64 %sa, 1
91+
%cmp2 = icmp sgt i64 %sb, %add
92+
ret i1 %cmp2
93+
94+
else:
95+
ret i1 false
96+
}
97+
98+
define i1 @cmp_zext_nneg(i32 %a, i32 %b){
99+
; CHECK-LABEL: define i1 @cmp_zext_nneg(
100+
; CHECK-SAME: i32 [[A:%.*]], i32 [[B:%.*]]) {
101+
; CHECK-NEXT: entry:
102+
; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[A]], [[B]]
103+
; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]
104+
; CHECK: then:
105+
; CHECK-NEXT: [[SA:%.*]] = zext nneg i32 [[A]] to i64
106+
; CHECK-NEXT: [[SB:%.*]] = zext nneg i32 [[B]] to i64
107+
; CHECK-NEXT: [[ADD:%.*]] = add nsw i64 [[SA]], 1
108+
; CHECK-NEXT: [[CMP2:%.*]] = icmp sge i64 [[SB]], [[ADD]]
109+
; CHECK-NEXT: ret i1 [[CMP2]]
110+
; CHECK: else:
111+
; CHECK-NEXT: ret i1 false
112+
;
113+
entry:
114+
%cmp = icmp slt i32 %a, %b
115+
br i1 %cmp, label %then, label %else
116+
117+
then:
118+
%sa = zext nneg i32 %a to i64
119+
%sb = zext nneg i32 %b to i64
120+
%add = add nsw i64 %sa, 1
121+
%cmp2 = icmp sge i64 %sb, %add
122+
ret i1 %cmp2
123+
124+
else:
125+
ret i1 false
126+
}
127+
128+
; Negative tests
129+
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+
160+
define i1 @cmp_zext(i32 %a, i32 %b){
161+
; CHECK-LABEL: define i1 @cmp_zext(
162+
; CHECK-SAME: i32 [[A:%.*]], i32 [[B:%.*]]) {
163+
; CHECK-NEXT: entry:
164+
; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[A]], [[B]]
165+
; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]
166+
; CHECK: then:
167+
; CHECK-NEXT: [[SA:%.*]] = zext i32 [[A]] to i64
168+
; CHECK-NEXT: [[SB:%.*]] = zext i32 [[B]] to i64
169+
; CHECK-NEXT: [[ADD:%.*]] = add nsw i64 [[SA]], 1
170+
; CHECK-NEXT: [[CMP2:%.*]] = icmp sge i64 [[SB]], [[ADD]]
171+
; CHECK-NEXT: ret i1 [[CMP2]]
172+
; CHECK: else:
173+
; CHECK-NEXT: ret i1 false
174+
;
175+
entry:
176+
%cmp = icmp slt i32 %a, %b
177+
br i1 %cmp, label %then, label %else
178+
179+
then:
180+
%sa = zext i32 %a to i64
181+
%sb = zext i32 %b to i64
182+
%add = add nsw i64 %sa, 1
183+
%cmp2 = icmp sge i64 %sb, %add
184+
ret i1 %cmp2
185+
186+
else:
187+
ret i1 false
188+
}
189+
190+
define i1 @cmp_sext_unknown_increment(i32 %a, i32 %b, i64 %c){
191+
; CHECK-LABEL: define i1 @cmp_sext_unknown_increment(
192+
; CHECK-SAME: i32 [[A:%.*]], i32 [[B:%.*]], i64 [[C:%.*]]) {
193+
; CHECK-NEXT: entry:
194+
; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[A]], [[B]]
195+
; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]
196+
; CHECK: then:
197+
; CHECK-NEXT: [[SA:%.*]] = sext i32 [[A]] to i64
198+
; CHECK-NEXT: [[SB:%.*]] = sext i32 [[B]] to i64
199+
; CHECK-NEXT: [[ADD:%.*]] = add nsw i64 [[SA]], [[C]]
200+
; CHECK-NEXT: [[CMP2:%.*]] = icmp sge i64 [[SB]], [[ADD]]
201+
; CHECK-NEXT: ret i1 [[CMP2]]
202+
; CHECK: else:
203+
; CHECK-NEXT: ret i1 false
204+
;
205+
entry:
206+
%cmp = icmp slt i32 %a, %b
207+
br i1 %cmp, label %then, label %else
208+
209+
then:
210+
%sa = sext i32 %a to i64
211+
%sb = sext i32 %b to i64
212+
%add = add nsw i64 %sa, %c
213+
%cmp2 = icmp sge i64 %sb, %add
214+
ret i1 %cmp2
215+
216+
else:
217+
ret i1 false
218+
}

0 commit comments

Comments
 (0)