Skip to content

Commit 9f2fb2a

Browse files
committed
[IPSCCP] add test for range attribute handling. NFC.
1 parent b798c2a commit 9f2fb2a

File tree

1 file changed

+163
-0
lines changed

1 file changed

+163
-0
lines changed
Lines changed: 163 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,163 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2+
; RUN: opt < %s -passes=ipsccp -S | FileCheck %s
3+
4+
declare void @use(i1)
5+
declare i32 @get_i32()
6+
7+
define void @range_attribute(i32 range(i32 0, 10) %v) {
8+
; CHECK-LABEL: @range_attribute(
9+
; CHECK-NEXT: [[C1:%.*]] = icmp ult i32 [[V:%.*]], 10
10+
; CHECK-NEXT: call void @use(i1 [[C1]])
11+
; CHECK-NEXT: [[C2:%.*]] = icmp ult i32 [[V]], 9
12+
; CHECK-NEXT: call void @use(i1 [[C2]])
13+
; CHECK-NEXT: [[C3:%.*]] = icmp ugt i32 [[V]], 9
14+
; CHECK-NEXT: call void @use(i1 [[C3]])
15+
; CHECK-NEXT: [[C4:%.*]] = icmp ugt i32 [[V]], 8
16+
; CHECK-NEXT: call void @use(i1 [[C4]])
17+
; CHECK-NEXT: ret void
18+
;
19+
%c1 = icmp ult i32 %v, 10
20+
call void @use(i1 %c1)
21+
%c2 = icmp ult i32 %v, 9
22+
call void @use(i1 %c2)
23+
%c3 = icmp ugt i32 %v, 9
24+
call void @use(i1 %c3)
25+
%c4 = icmp ugt i32 %v, 8
26+
call void @use(i1 %c4)
27+
ret void
28+
}
29+
30+
define i32 @range_attribute_single(i32 range(i32 0, 1) %v) {
31+
; CHECK-LABEL: @range_attribute_single(
32+
; CHECK-NEXT: ret i32 [[V:%.*]]
33+
;
34+
ret i32 %v
35+
}
36+
37+
define void @call_range_attribute() {
38+
; CHECK-LABEL: @call_range_attribute(
39+
; CHECK-NEXT: [[V:%.*]] = call range(i32 0, 10) i32 @get_i32()
40+
; CHECK-NEXT: [[C1:%.*]] = icmp ult i32 [[V]], 10
41+
; CHECK-NEXT: call void @use(i1 [[C1]])
42+
; CHECK-NEXT: [[C2:%.*]] = icmp ult i32 [[V]], 9
43+
; CHECK-NEXT: call void @use(i1 [[C2]])
44+
; CHECK-NEXT: [[C3:%.*]] = icmp ugt i32 [[V]], 9
45+
; CHECK-NEXT: call void @use(i1 [[C3]])
46+
; CHECK-NEXT: [[C4:%.*]] = icmp ugt i32 [[V]], 8
47+
; CHECK-NEXT: call void @use(i1 [[C4]])
48+
; CHECK-NEXT: ret void
49+
;
50+
%v = call range(i32 0, 10) i32 @get_i32()
51+
%c1 = icmp ult i32 %v, 10
52+
call void @use(i1 %c1)
53+
%c2 = icmp ult i32 %v, 9
54+
call void @use(i1 %c2)
55+
%c3 = icmp ugt i32 %v, 9
56+
call void @use(i1 %c3)
57+
%c4 = icmp ugt i32 %v, 8
58+
call void @use(i1 %c4)
59+
ret void
60+
}
61+
62+
63+
declare range(i32 0, 10) i32 @get_i32_in_range()
64+
65+
define void @call_range_result() {
66+
; CHECK-LABEL: @call_range_result(
67+
; CHECK-NEXT: [[V:%.*]] = call i32 @get_i32_in_range()
68+
; CHECK-NEXT: [[C1:%.*]] = icmp ult i32 [[V]], 10
69+
; CHECK-NEXT: call void @use(i1 [[C1]])
70+
; CHECK-NEXT: [[C2:%.*]] = icmp ult i32 [[V]], 9
71+
; CHECK-NEXT: call void @use(i1 [[C2]])
72+
; CHECK-NEXT: [[C3:%.*]] = icmp ugt i32 [[V]], 9
73+
; CHECK-NEXT: call void @use(i1 [[C3]])
74+
; CHECK-NEXT: [[C4:%.*]] = icmp ugt i32 [[V]], 8
75+
; CHECK-NEXT: call void @use(i1 [[C4]])
76+
; CHECK-NEXT: ret void
77+
;
78+
%v = call i32 @get_i32_in_range()
79+
%c1 = icmp ult i32 %v, 10
80+
call void @use(i1 %c1)
81+
%c2 = icmp ult i32 %v, 9
82+
call void @use(i1 %c2)
83+
%c3 = icmp ugt i32 %v, 9
84+
call void @use(i1 %c3)
85+
%c4 = icmp ugt i32 %v, 8
86+
call void @use(i1 %c4)
87+
ret void
88+
}
89+
90+
define internal i1 @ip_cmp_range_attribute(i32 %v) {
91+
; CHECK-LABEL: @ip_cmp_range_attribute(
92+
; CHECK-NEXT: [[C:%.*]] = icmp ult i32 [[V:%.*]], 10
93+
; CHECK-NEXT: ret i1 [[C]]
94+
;
95+
%c = icmp ult i32 %v, 10
96+
ret i1 %c
97+
}
98+
99+
define i1 @ip_range_attribute(i32 range(i32 0, 10) %v) {
100+
; CHECK-LABEL: @ip_range_attribute(
101+
; CHECK-NEXT: [[C:%.*]] = call i1 @ip_cmp_range_attribute(i32 [[V:%.*]])
102+
; CHECK-NEXT: ret i1 [[C]]
103+
;
104+
%c = call i1 @ip_cmp_range_attribute(i32 %v)
105+
ret i1 %c
106+
}
107+
108+
define internal i1 @ip_cmp_range_call(i32 %v) {
109+
; CHECK-LABEL: @ip_cmp_range_call(
110+
; CHECK-NEXT: [[C:%.*]] = icmp ult i32 [[V:%.*]], 10
111+
; CHECK-NEXT: ret i1 [[C]]
112+
;
113+
%c = icmp ult i32 %v, 10
114+
ret i1 %c
115+
}
116+
117+
define i1 @ip_range_call() {
118+
; CHECK-LABEL: @ip_range_call(
119+
; CHECK-NEXT: [[V:%.*]] = call range(i32 0, 10) i32 @get_i32()
120+
; CHECK-NEXT: [[C:%.*]] = call i1 @ip_cmp_range_call(i32 [[V]])
121+
; CHECK-NEXT: ret i1 [[C]]
122+
;
123+
%v = call range(i32 0, 10) i32 @get_i32()
124+
%c = call i1 @ip_cmp_range_call(i32 %v)
125+
ret i1 %c
126+
}
127+
128+
define internal i1 @ip_cmp_range_result(i32 %v) {
129+
; CHECK-LABEL: @ip_cmp_range_result(
130+
; CHECK-NEXT: [[C:%.*]] = icmp ult i32 [[V:%.*]], 10
131+
; CHECK-NEXT: ret i1 [[C]]
132+
;
133+
%c = icmp ult i32 %v, 10
134+
ret i1 %c
135+
}
136+
137+
define i1 @ip_range_result() {
138+
; CHECK-LABEL: @ip_range_result(
139+
; CHECK-NEXT: [[V:%.*]] = call range(i32 0, 10) i32 @get_i32()
140+
; CHECK-NEXT: [[C:%.*]] = call i1 @ip_cmp_range_result(i32 [[V]])
141+
; CHECK-NEXT: ret i1 [[C]]
142+
;
143+
%v = call range(i32 0, 10) i32 @get_i32()
144+
%c = call i1 @ip_cmp_range_result(i32 %v)
145+
ret i1 %c
146+
}
147+
148+
define internal i1 @ip_cmp_with_range_attribute(i32 range(i32 0, 10) %v) {
149+
; CHECK-LABEL: @ip_cmp_with_range_attribute(
150+
; CHECK-NEXT: ret i1 undef
151+
;
152+
%c = icmp eq i32 %v, 5
153+
ret i1 %c
154+
}
155+
156+
define i1 @ip_range_attribute_constant() {
157+
; CHECK-LABEL: @ip_range_attribute_constant(
158+
; CHECK-NEXT: [[C:%.*]] = call i1 @ip_cmp_with_range_attribute(i32 5)
159+
; CHECK-NEXT: ret i1 true
160+
;
161+
%c = call i1 @ip_cmp_with_range_attribute(i32 5)
162+
ret i1 %c
163+
}

0 commit comments

Comments
 (0)