xref: /llvm-project/llvm/test/Transforms/SCCP/range-attribute.ll (revision 7f59264d469d690fcd1cead0a2dfc02739d17db4)
1e7bc5372SAndreas Jonson; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
21e5f336aSNikita Popov; RUN: opt < %s -passes=ipsccp -S | FileCheck %s --check-prefixes=CHECK,IPSCCP
31e5f336aSNikita Popov; RUN: opt < %s -passes=sccp -S | FileCheck %s --check-prefixes=CHECK,SCCP
4e7bc5372SAndreas Jonson
5e7bc5372SAndreas Jonsondeclare void @use(i1)
6e7bc5372SAndreas Jonsondeclare i32 @get_i32()
7e7bc5372SAndreas Jonson
8e7bc5372SAndreas Jonsondefine void @range_attribute(i32 range(i32 0, 10) %v) {
903e0be90SNikita Popov; CHECK-LABEL: @range_attribute(
1003e0be90SNikita Popov; CHECK-NEXT:    call void @use(i1 true)
1103e0be90SNikita Popov; CHECK-NEXT:    [[C2:%.*]] = icmp ult i32 [[V:%.*]], 9
1203e0be90SNikita Popov; CHECK-NEXT:    call void @use(i1 [[C2]])
1303e0be90SNikita Popov; CHECK-NEXT:    call void @use(i1 false)
1403e0be90SNikita Popov; CHECK-NEXT:    [[C4:%.*]] = icmp ugt i32 [[V]], 8
1503e0be90SNikita Popov; CHECK-NEXT:    call void @use(i1 [[C4]])
1603e0be90SNikita Popov; CHECK-NEXT:    ret void
17e7bc5372SAndreas Jonson;
18e7bc5372SAndreas Jonson  %c1 = icmp ult i32 %v, 10
19e7bc5372SAndreas Jonson  call void @use(i1 %c1)
20e7bc5372SAndreas Jonson  %c2 = icmp ult i32 %v, 9
21e7bc5372SAndreas Jonson  call void @use(i1 %c2)
22e7bc5372SAndreas Jonson  %c3 = icmp ugt i32 %v, 9
23e7bc5372SAndreas Jonson  call void @use(i1 %c3)
24e7bc5372SAndreas Jonson  %c4 = icmp ugt i32 %v, 8
25e7bc5372SAndreas Jonson  call void @use(i1 %c4)
26e7bc5372SAndreas Jonson  ret void
27e7bc5372SAndreas Jonson}
28e7bc5372SAndreas Jonson
29e7bc5372SAndreas Jonsondefine i32 @range_attribute_single(i32 range(i32 0, 1) %v) {
301e5f336aSNikita Popov; IPSCCP-LABEL: @range_attribute_single(
311e5f336aSNikita Popov; IPSCCP-NEXT:    ret i32 0
321e5f336aSNikita Popov;
331e5f336aSNikita Popov; SCCP-LABEL: @range_attribute_single(
341e5f336aSNikita Popov; SCCP-NEXT:    ret i32 [[V:%.*]]
35e7bc5372SAndreas Jonson;
36e7bc5372SAndreas Jonson  ret i32 %v
37e7bc5372SAndreas Jonson}
38e7bc5372SAndreas Jonson
39e7bc5372SAndreas Jonsondefine void @call_range_attribute() {
40e7bc5372SAndreas Jonson; CHECK-LABEL: @call_range_attribute(
41e7bc5372SAndreas Jonson; CHECK-NEXT:    [[V:%.*]] = call range(i32 0, 10) i32 @get_i32()
42e7bc5372SAndreas Jonson; CHECK-NEXT:    call void @use(i1 true)
43e7bc5372SAndreas Jonson; CHECK-NEXT:    [[C2:%.*]] = icmp ult i32 [[V]], 9
44e7bc5372SAndreas Jonson; CHECK-NEXT:    call void @use(i1 [[C2]])
45e7bc5372SAndreas Jonson; CHECK-NEXT:    call void @use(i1 false)
46e7bc5372SAndreas Jonson; CHECK-NEXT:    [[C4:%.*]] = icmp ugt i32 [[V]], 8
47e7bc5372SAndreas Jonson; CHECK-NEXT:    call void @use(i1 [[C4]])
48e7bc5372SAndreas Jonson; CHECK-NEXT:    ret void
49e7bc5372SAndreas Jonson;
50e7bc5372SAndreas Jonson  %v = call range(i32 0, 10) i32 @get_i32()
51e7bc5372SAndreas Jonson  %c1 = icmp ult i32 %v, 10
52e7bc5372SAndreas Jonson  call void @use(i1 %c1)
53e7bc5372SAndreas Jonson  %c2 = icmp ult i32 %v, 9
54e7bc5372SAndreas Jonson  call void @use(i1 %c2)
55e7bc5372SAndreas Jonson  %c3 = icmp ugt i32 %v, 9
56e7bc5372SAndreas Jonson  call void @use(i1 %c3)
57e7bc5372SAndreas Jonson  %c4 = icmp ugt i32 %v, 8
58e7bc5372SAndreas Jonson  call void @use(i1 %c4)
59e7bc5372SAndreas Jonson  ret void
60e7bc5372SAndreas Jonson}
61e7bc5372SAndreas Jonson
62e7bc5372SAndreas Jonson
63e7bc5372SAndreas Jonsondeclare range(i32 0, 10) i32 @get_i32_in_range()
64e7bc5372SAndreas Jonson
65e7bc5372SAndreas Jonsondefine void @call_range_result() {
66e7bc5372SAndreas Jonson; CHECK-LABEL: @call_range_result(
67e7bc5372SAndreas Jonson; CHECK-NEXT:    [[V:%.*]] = call i32 @get_i32_in_range()
68e7bc5372SAndreas Jonson; CHECK-NEXT:    call void @use(i1 true)
69e7bc5372SAndreas Jonson; CHECK-NEXT:    [[C2:%.*]] = icmp ult i32 [[V]], 9
70e7bc5372SAndreas Jonson; CHECK-NEXT:    call void @use(i1 [[C2]])
71e7bc5372SAndreas Jonson; CHECK-NEXT:    call void @use(i1 false)
72e7bc5372SAndreas Jonson; CHECK-NEXT:    [[C4:%.*]] = icmp ugt i32 [[V]], 8
73e7bc5372SAndreas Jonson; CHECK-NEXT:    call void @use(i1 [[C4]])
74e7bc5372SAndreas Jonson; CHECK-NEXT:    ret void
75e7bc5372SAndreas Jonson;
76e7bc5372SAndreas Jonson  %v = call i32 @get_i32_in_range()
77e7bc5372SAndreas Jonson  %c1 = icmp ult i32 %v, 10
78e7bc5372SAndreas Jonson  call void @use(i1 %c1)
79e7bc5372SAndreas Jonson  %c2 = icmp ult i32 %v, 9
80e7bc5372SAndreas Jonson  call void @use(i1 %c2)
81e7bc5372SAndreas Jonson  %c3 = icmp ugt i32 %v, 9
82e7bc5372SAndreas Jonson  call void @use(i1 %c3)
83e7bc5372SAndreas Jonson  %c4 = icmp ugt i32 %v, 8
84e7bc5372SAndreas Jonson  call void @use(i1 %c4)
85e7bc5372SAndreas Jonson  ret void
86e7bc5372SAndreas Jonson}
87e7bc5372SAndreas Jonson
88e7bc5372SAndreas Jonsondefine internal i1 @ip_cmp_range_attribute(i32 %v) {
891e5f336aSNikita Popov; IPSCCP-LABEL: @ip_cmp_range_attribute(
901e5f336aSNikita Popov; IPSCCP-NEXT:    ret i1 poison
911e5f336aSNikita Popov;
921e5f336aSNikita Popov; SCCP-LABEL: @ip_cmp_range_attribute(
931e5f336aSNikita Popov; SCCP-NEXT:    [[C:%.*]] = icmp ult i32 [[V:%.*]], 10
941e5f336aSNikita Popov; SCCP-NEXT:    ret i1 [[C]]
95e7bc5372SAndreas Jonson;
96e7bc5372SAndreas Jonson  %c = icmp ult i32 %v, 10
97e7bc5372SAndreas Jonson  ret i1 %c
98e7bc5372SAndreas Jonson}
99e7bc5372SAndreas Jonson
100e7bc5372SAndreas Jonsondefine i1 @ip_range_attribute(i32 range(i32 0, 10) %v) {
1011e5f336aSNikita Popov; IPSCCP-LABEL: @ip_range_attribute(
1021e5f336aSNikita Popov; IPSCCP-NEXT:    [[C:%.*]] = call i1 @ip_cmp_range_attribute(i32 [[V:%.*]])
1031e5f336aSNikita Popov; IPSCCP-NEXT:    ret i1 true
1041e5f336aSNikita Popov;
1051e5f336aSNikita Popov; SCCP-LABEL: @ip_range_attribute(
1061e5f336aSNikita Popov; SCCP-NEXT:    [[C:%.*]] = call i1 @ip_cmp_range_attribute(i32 [[V:%.*]])
1071e5f336aSNikita Popov; SCCP-NEXT:    ret i1 [[C]]
108e7bc5372SAndreas Jonson;
109e7bc5372SAndreas Jonson  %c = call i1 @ip_cmp_range_attribute(i32 %v)
110e7bc5372SAndreas Jonson  ret i1 %c
111e7bc5372SAndreas Jonson}
112e7bc5372SAndreas Jonson
113e7bc5372SAndreas Jonsondefine internal i1 @ip_cmp_range_call(i32 %v) {
1141e5f336aSNikita Popov; IPSCCP-LABEL: @ip_cmp_range_call(
1151e5f336aSNikita Popov; IPSCCP-NEXT:    ret i1 poison
1161e5f336aSNikita Popov;
1171e5f336aSNikita Popov; SCCP-LABEL: @ip_cmp_range_call(
1181e5f336aSNikita Popov; SCCP-NEXT:    [[C:%.*]] = icmp ult i32 [[V:%.*]], 10
1191e5f336aSNikita Popov; SCCP-NEXT:    ret i1 [[C]]
120e7bc5372SAndreas Jonson;
121e7bc5372SAndreas Jonson  %c = icmp ult i32 %v, 10
122e7bc5372SAndreas Jonson  ret i1 %c
123e7bc5372SAndreas Jonson}
124e7bc5372SAndreas Jonson
125e7bc5372SAndreas Jonsondefine i1 @ip_range_call() {
1261e5f336aSNikita Popov; IPSCCP-LABEL: @ip_range_call(
1271e5f336aSNikita Popov; IPSCCP-NEXT:    [[V:%.*]] = call range(i32 0, 10) i32 @get_i32()
1281e5f336aSNikita Popov; IPSCCP-NEXT:    [[C:%.*]] = call i1 @ip_cmp_range_call(i32 [[V]])
1291e5f336aSNikita Popov; IPSCCP-NEXT:    ret i1 true
1301e5f336aSNikita Popov;
1311e5f336aSNikita Popov; SCCP-LABEL: @ip_range_call(
1321e5f336aSNikita Popov; SCCP-NEXT:    [[V:%.*]] = call range(i32 0, 10) i32 @get_i32()
1331e5f336aSNikita Popov; SCCP-NEXT:    [[C:%.*]] = call i1 @ip_cmp_range_call(i32 [[V]])
1341e5f336aSNikita Popov; SCCP-NEXT:    ret i1 [[C]]
135e7bc5372SAndreas Jonson;
136e7bc5372SAndreas Jonson  %v = call range(i32 0, 10) i32 @get_i32()
137e7bc5372SAndreas Jonson  %c = call i1 @ip_cmp_range_call(i32 %v)
138e7bc5372SAndreas Jonson  ret i1 %c
139e7bc5372SAndreas Jonson}
140e7bc5372SAndreas Jonson
141e7bc5372SAndreas Jonsondefine internal i1 @ip_cmp_range_result(i32 %v) {
1421e5f336aSNikita Popov; IPSCCP-LABEL: @ip_cmp_range_result(
1431e5f336aSNikita Popov; IPSCCP-NEXT:    ret i1 poison
1441e5f336aSNikita Popov;
1451e5f336aSNikita Popov; SCCP-LABEL: @ip_cmp_range_result(
1461e5f336aSNikita Popov; SCCP-NEXT:    [[C:%.*]] = icmp ult i32 [[V:%.*]], 10
1471e5f336aSNikita Popov; SCCP-NEXT:    ret i1 [[C]]
148e7bc5372SAndreas Jonson;
149e7bc5372SAndreas Jonson  %c = icmp ult i32 %v, 10
150e7bc5372SAndreas Jonson  ret i1 %c
151e7bc5372SAndreas Jonson}
152e7bc5372SAndreas Jonson
153e7bc5372SAndreas Jonsondefine i1 @ip_range_result() {
1541e5f336aSNikita Popov; IPSCCP-LABEL: @ip_range_result(
1551e5f336aSNikita Popov; IPSCCP-NEXT:    [[V:%.*]] = call range(i32 0, 10) i32 @get_i32()
1561e5f336aSNikita Popov; IPSCCP-NEXT:    [[C:%.*]] = call i1 @ip_cmp_range_result(i32 [[V]])
1571e5f336aSNikita Popov; IPSCCP-NEXT:    ret i1 true
1581e5f336aSNikita Popov;
1591e5f336aSNikita Popov; SCCP-LABEL: @ip_range_result(
1601e5f336aSNikita Popov; SCCP-NEXT:    [[V:%.*]] = call range(i32 0, 10) i32 @get_i32()
1611e5f336aSNikita Popov; SCCP-NEXT:    [[C:%.*]] = call i1 @ip_cmp_range_result(i32 [[V]])
1621e5f336aSNikita Popov; SCCP-NEXT:    ret i1 [[C]]
163e7bc5372SAndreas Jonson;
164e7bc5372SAndreas Jonson  %v = call range(i32 0, 10) i32 @get_i32()
165e7bc5372SAndreas Jonson  %c = call i1 @ip_cmp_range_result(i32 %v)
166e7bc5372SAndreas Jonson  ret i1 %c
167e7bc5372SAndreas Jonson}
168e7bc5372SAndreas Jonson
169e7bc5372SAndreas Jonsondefine internal i1 @ip_cmp_with_range_attribute(i32 range(i32 0, 10) %v) {
1701e5f336aSNikita Popov; IPSCCP-LABEL: @ip_cmp_with_range_attribute(
1711e5f336aSNikita Popov; IPSCCP-NEXT:    ret i1 poison
1721e5f336aSNikita Popov;
1731e5f336aSNikita Popov; SCCP-LABEL: @ip_cmp_with_range_attribute(
1741e5f336aSNikita Popov; SCCP-NEXT:    [[C:%.*]] = icmp eq i32 [[V:%.*]], 5
1751e5f336aSNikita Popov; SCCP-NEXT:    ret i1 [[C]]
176e7bc5372SAndreas Jonson;
177e7bc5372SAndreas Jonson  %c = icmp eq i32 %v, 5
178e7bc5372SAndreas Jonson  ret i1 %c
179e7bc5372SAndreas Jonson}
180e7bc5372SAndreas Jonson
181e7bc5372SAndreas Jonsondefine i1 @ip_range_attribute_constant() {
1821e5f336aSNikita Popov; IPSCCP-LABEL: @ip_range_attribute_constant(
1831e5f336aSNikita Popov; IPSCCP-NEXT:    [[C:%.*]] = call i1 @ip_cmp_with_range_attribute(i32 5)
1841e5f336aSNikita Popov; IPSCCP-NEXT:    ret i1 true
1851e5f336aSNikita Popov;
1861e5f336aSNikita Popov; SCCP-LABEL: @ip_range_attribute_constant(
1871e5f336aSNikita Popov; SCCP-NEXT:    [[C:%.*]] = call i1 @ip_cmp_with_range_attribute(i32 5)
1881e5f336aSNikita Popov; SCCP-NEXT:    ret i1 [[C]]
189e7bc5372SAndreas Jonson;
190e7bc5372SAndreas Jonson  %c = call i1 @ip_cmp_with_range_attribute(i32 5)
191e7bc5372SAndreas Jonson  ret i1 %c
192e7bc5372SAndreas Jonson}
193b8c0e8adSNikita Popov
194b8c0e8adSNikita Popovdefine internal i1 @ip_cmp_attribute_overdefined_callee(i32 range(i32 0, 10) %x) {
195b8c0e8adSNikita Popov; IPSCCP-LABEL: @ip_cmp_attribute_overdefined_callee(
196*7f59264dSNikita Popov; IPSCCP-NEXT:    ret i1 poison
197b8c0e8adSNikita Popov;
198b8c0e8adSNikita Popov; SCCP-LABEL: @ip_cmp_attribute_overdefined_callee(
199b8c0e8adSNikita Popov; SCCP-NEXT:    ret i1 true
200b8c0e8adSNikita Popov;
201b8c0e8adSNikita Popov  %cmp = icmp ult i32 %x, 10
202b8c0e8adSNikita Popov  ret i1 %cmp
203b8c0e8adSNikita Popov}
204b8c0e8adSNikita Popov
205b8c0e8adSNikita Popovdefine i1 @ip_cmp_attribute_overdefined_caller(i32 %x) {
206*7f59264dSNikita Popov; IPSCCP-LABEL: @ip_cmp_attribute_overdefined_caller(
207*7f59264dSNikita Popov; IPSCCP-NEXT:    [[RES:%.*]] = call i1 @ip_cmp_attribute_overdefined_callee(i32 [[X:%.*]])
208*7f59264dSNikita Popov; IPSCCP-NEXT:    ret i1 true
209*7f59264dSNikita Popov;
210*7f59264dSNikita Popov; SCCP-LABEL: @ip_cmp_attribute_overdefined_caller(
211*7f59264dSNikita Popov; SCCP-NEXT:    [[RES:%.*]] = call i1 @ip_cmp_attribute_overdefined_callee(i32 [[X:%.*]])
212*7f59264dSNikita Popov; SCCP-NEXT:    ret i1 [[RES]]
213b8c0e8adSNikita Popov;
214b8c0e8adSNikita Popov  %res = call i1 @ip_cmp_attribute_overdefined_callee(i32 %x)
215b8c0e8adSNikita Popov  ret i1 %res
216b8c0e8adSNikita Popov}
217b8c0e8adSNikita Popov
218b8c0e8adSNikita Popovdefine internal i1 @ip_cmp_attribute_intersect_callee(i32 range(i32 0, 10) %x) {
219b8c0e8adSNikita Popov; IPSCCP-LABEL: @ip_cmp_attribute_intersect_callee(
220*7f59264dSNikita Popov; IPSCCP-NEXT:    ret i1 poison
221b8c0e8adSNikita Popov;
222b8c0e8adSNikita Popov; SCCP-LABEL: @ip_cmp_attribute_intersect_callee(
223b8c0e8adSNikita Popov; SCCP-NEXT:    [[CMP2:%.*]] = icmp uge i32 [[X:%.*]], 5
224b8c0e8adSNikita Popov; SCCP-NEXT:    [[AND:%.*]] = and i1 true, [[CMP2]]
225b8c0e8adSNikita Popov; SCCP-NEXT:    ret i1 [[AND]]
226b8c0e8adSNikita Popov;
227b8c0e8adSNikita Popov  %cmp1 = icmp ult i32 %x, 10
228b8c0e8adSNikita Popov  %cmp2 = icmp uge i32 %x, 5
229b8c0e8adSNikita Popov  %and = and i1 %cmp1, %cmp2
230b8c0e8adSNikita Popov  ret i1 %and
231b8c0e8adSNikita Popov}
232b8c0e8adSNikita Popov
233b8c0e8adSNikita Popovdefine i1 @ip_cmp_attribute_intersect_caller(i32 range(i32 5, 15) %x) {
234*7f59264dSNikita Popov; IPSCCP-LABEL: @ip_cmp_attribute_intersect_caller(
235*7f59264dSNikita Popov; IPSCCP-NEXT:    [[RES:%.*]] = call i1 @ip_cmp_attribute_intersect_callee(i32 [[X:%.*]])
236*7f59264dSNikita Popov; IPSCCP-NEXT:    ret i1 true
237*7f59264dSNikita Popov;
238*7f59264dSNikita Popov; SCCP-LABEL: @ip_cmp_attribute_intersect_caller(
239*7f59264dSNikita Popov; SCCP-NEXT:    [[RES:%.*]] = call i1 @ip_cmp_attribute_intersect_callee(i32 [[X:%.*]])
240*7f59264dSNikita Popov; SCCP-NEXT:    ret i1 [[RES]]
241b8c0e8adSNikita Popov;
242b8c0e8adSNikita Popov  %res = call i1 @ip_cmp_attribute_intersect_callee(i32 %x)
243b8c0e8adSNikita Popov  ret i1 %res
244b8c0e8adSNikita Popov}
245