xref: /llvm-project/llvm/test/Transforms/SCCP/load-store-range.ll (revision 0991da36906bdb29b8f1030d5123bafb58fee79e)
1c1c5c47eSFlorian Hahn; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
28ebb3eacSBjorn Pettersson; RUN: opt < %s -passes=ipsccp -S | FileCheck %s
3c1c5c47eSFlorian Hahn
4c1c5c47eSFlorian Hahndeclare void @use(i1)
5c1c5c47eSFlorian Hahn
6c1c5c47eSFlorian Hahn@G = internal global i32 0
7c1c5c47eSFlorian Hahn
8c1c5c47eSFlorian Hahndefine void @test1a() {
9c1c5c47eSFlorian Hahn; CHECK-LABEL: @test1a(
10*0991da36SNikita Popov; CHECK-NEXT:    [[X:%.*]] = load i32, ptr @G
117d57d22bSFlorian Hahn; CHECK-NEXT:    call void @use(i1 true)
127d57d22bSFlorian Hahn; CHECK-NEXT:    call void @use(i1 true)
137d57d22bSFlorian Hahn; CHECK-NEXT:    call void @use(i1 false)
147d57d22bSFlorian Hahn; CHECK-NEXT:    call void @use(i1 false)
15c1c5c47eSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp eq i32 [[X]], 20
16c1c5c47eSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_1]])
17c1c5c47eSFlorian Hahn; CHECK-NEXT:    ret void
18c1c5c47eSFlorian Hahn;
19*0991da36SNikita Popov  %X = load i32, ptr @G
20c1c5c47eSFlorian Hahn  %t.1 = icmp ne i32 %X, 124
21c1c5c47eSFlorian Hahn  call void @use(i1 %t.1)
22c1c5c47eSFlorian Hahn  %t.2 = icmp ult i32 %X, 124
23c1c5c47eSFlorian Hahn  call void @use(i1 %t.2)
24c1c5c47eSFlorian Hahn  %f.1 = icmp eq i32 %X, 124
25c1c5c47eSFlorian Hahn  call void @use(i1 %f.1)
26c1c5c47eSFlorian Hahn  %f.2 = icmp ugt i32 %X, 123
27c1c5c47eSFlorian Hahn  call void @use(i1 %f.2)
28c1c5c47eSFlorian Hahn  %c.1 = icmp eq i32 %X, 20
29c1c5c47eSFlorian Hahn  call void @use(i1 %c.1)
30c1c5c47eSFlorian Hahn  ret void
31c1c5c47eSFlorian Hahn}
32c1c5c47eSFlorian Hahn
33c1c5c47eSFlorian Hahndefine void @test1b(i1 %c) {
34c1c5c47eSFlorian Hahn; CHECK-LABEL: @test1b(
35c1c5c47eSFlorian Hahn; CHECK-NEXT:    br i1 [[C:%.*]], label [[T:%.*]], label [[F:%.*]]
36c1c5c47eSFlorian Hahn; CHECK:       T:
37*0991da36SNikita Popov; CHECK-NEXT:    store i32 17, ptr @G
38c1c5c47eSFlorian Hahn; CHECK-NEXT:    ret void
39c1c5c47eSFlorian Hahn; CHECK:       F:
40*0991da36SNikita Popov; CHECK-NEXT:    store i32 123, ptr @G
41c1c5c47eSFlorian Hahn; CHECK-NEXT:    ret void
42c1c5c47eSFlorian Hahn;
43c1c5c47eSFlorian Hahn  br i1 %c, label %T, label %F
44c1c5c47eSFlorian HahnT:
45*0991da36SNikita Popov  store i32 17, ptr @G
46c1c5c47eSFlorian Hahn  ret void
47c1c5c47eSFlorian HahnF:
48*0991da36SNikita Popov  store i32 123, ptr @G
49c1c5c47eSFlorian Hahn  ret void
50c1c5c47eSFlorian Hahn}
51c1c5c47eSFlorian Hahn
52c1c5c47eSFlorian Hahn
53c1c5c47eSFlorian Hahn@H = internal global i32 0
54c1c5c47eSFlorian Hahn
55c1c5c47eSFlorian Hahndefine void @test2a() {
56c1c5c47eSFlorian Hahn; CHECK-LABEL: @test2a(
57*0991da36SNikita Popov; CHECK-NEXT:    [[X:%.*]] = load i32, ptr @H
587d57d22bSFlorian Hahn; CHECK-NEXT:    call void @use(i1 true)
597d57d22bSFlorian Hahn; CHECK-NEXT:    call void @use(i1 true)
607d57d22bSFlorian Hahn; CHECK-NEXT:    call void @use(i1 false)
617d57d22bSFlorian Hahn; CHECK-NEXT:    call void @use(i1 false)
62c1c5c47eSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp eq i32 [[X]], 20
63c1c5c47eSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_1]])
64c1c5c47eSFlorian Hahn; CHECK-NEXT:    ret void
65c1c5c47eSFlorian Hahn;
66*0991da36SNikita Popov  %X = load i32, ptr @H
67c1c5c47eSFlorian Hahn  %t.1 = icmp ne i32 %X, 124
68c1c5c47eSFlorian Hahn  call void @use(i1 %t.1)
69c1c5c47eSFlorian Hahn  %t.2 = icmp ult i32 %X, 124
70c1c5c47eSFlorian Hahn  call void @use(i1 %t.2)
71c1c5c47eSFlorian Hahn  %f.1 = icmp eq i32 %X, 124
72c1c5c47eSFlorian Hahn  call void @use(i1 %f.1)
73c1c5c47eSFlorian Hahn  %f.2 = icmp ugt i32 %X, 123
74c1c5c47eSFlorian Hahn  call void @use(i1 %f.2)
75c1c5c47eSFlorian Hahn  %c.1 = icmp eq i32 %X, 20
76c1c5c47eSFlorian Hahn  call void @use(i1 %c.1)
77c1c5c47eSFlorian Hahn  ret void
78c1c5c47eSFlorian Hahn}
79c1c5c47eSFlorian Hahn
80c1c5c47eSFlorian Hahndefine void @test2b(i1 %c.1, i1 %c.2) {
81c1c5c47eSFlorian Hahn; CHECK-LABEL: @test2b(
82c1c5c47eSFlorian Hahn; CHECK-NEXT:    br i1 [[C_1:%.*]], label [[T:%.*]], label [[F:%.*]]
83c1c5c47eSFlorian Hahn; CHECK:       T:
84c1c5c47eSFlorian Hahn; CHECK-NEXT:    br i1 [[C_2:%.*]], label [[T_1:%.*]], label [[F_1:%.*]]
85c1c5c47eSFlorian Hahn; CHECK:       T.1:
86*0991da36SNikita Popov; CHECK-NEXT:    store i32 17, ptr @H
87c1c5c47eSFlorian Hahn; CHECK-NEXT:    ret void
88c1c5c47eSFlorian Hahn; CHECK:       F.1:
89*0991da36SNikita Popov; CHECK-NEXT:    store i32 20, ptr @H
90c1c5c47eSFlorian Hahn; CHECK-NEXT:    ret void
91c1c5c47eSFlorian Hahn; CHECK:       F:
92*0991da36SNikita Popov; CHECK-NEXT:    store i32 123, ptr @H
93c1c5c47eSFlorian Hahn; CHECK-NEXT:    ret void
94c1c5c47eSFlorian Hahn;
95c1c5c47eSFlorian Hahn  br i1 %c.1, label %T, label %F
96c1c5c47eSFlorian HahnT:
97c1c5c47eSFlorian Hahn  br i1 %c.2, label %T.1, label %F.1
98c1c5c47eSFlorian Hahn
99c1c5c47eSFlorian HahnT.1:
100*0991da36SNikita Popov  store i32 17, ptr @H
101c1c5c47eSFlorian Hahn  ret void
102c1c5c47eSFlorian Hahn
103c1c5c47eSFlorian HahnF.1:
104*0991da36SNikita Popov  store i32 20, ptr @H
105c1c5c47eSFlorian Hahn  ret void
106c1c5c47eSFlorian Hahn
107c1c5c47eSFlorian HahnF:
108*0991da36SNikita Popov  store i32 123, ptr @H
109c1c5c47eSFlorian Hahn  ret void
110c1c5c47eSFlorian Hahn}
111c1c5c47eSFlorian Hahn
112c1c5c47eSFlorian Hahn
113c1c5c47eSFlorian Hahn@I = internal global i32 0
114c1c5c47eSFlorian Hahn
115c1c5c47eSFlorian Hahndefine void @test3a() {
116c1c5c47eSFlorian Hahn; CHECK-LABEL: @test3a(
117*0991da36SNikita Popov; CHECK-NEXT:    [[X:%.*]] = load i32, ptr @I
1187d57d22bSFlorian Hahn; CHECK-NEXT:    call void @use(i1 true)
1197d57d22bSFlorian Hahn; CHECK-NEXT:    call void @use(i1 true)
1207d57d22bSFlorian Hahn; CHECK-NEXT:    call void @use(i1 false)
1217d57d22bSFlorian Hahn; CHECK-NEXT:    call void @use(i1 false)
122c1c5c47eSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp eq i32 [[X]], 20
123c1c5c47eSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_1]])
124c1c5c47eSFlorian Hahn; CHECK-NEXT:    ret void
125c1c5c47eSFlorian Hahn;
126*0991da36SNikita Popov  %X = load i32, ptr @I
127c1c5c47eSFlorian Hahn  %t.1 = icmp ne i32 %X, 124
128c1c5c47eSFlorian Hahn  call void @use(i1 %t.1)
129c1c5c47eSFlorian Hahn  %t.2 = icmp ult i32 %X, 124
130c1c5c47eSFlorian Hahn  call void @use(i1 %t.2)
131c1c5c47eSFlorian Hahn  %f.1 = icmp eq i32 %X, 124
132c1c5c47eSFlorian Hahn  call void @use(i1 %f.1)
133c1c5c47eSFlorian Hahn  %f.2 = icmp ugt i32 %X, 123
134c1c5c47eSFlorian Hahn  call void @use(i1 %f.2)
135c1c5c47eSFlorian Hahn  %c.1 = icmp eq i32 %X, 20
136c1c5c47eSFlorian Hahn  call void @use(i1 %c.1)
137c1c5c47eSFlorian Hahn  ret void
138c1c5c47eSFlorian Hahn}
139c1c5c47eSFlorian Hahn
140c1c5c47eSFlorian Hahndefine void @test3b(i1 %c.1, i1 %c.2) {
141c1c5c47eSFlorian Hahn; CHECK-LABEL: @test3b(
142c1c5c47eSFlorian Hahn; CHECK-NEXT:    br i1 [[C_1:%.*]], label [[T:%.*]], label [[F:%.*]]
143c1c5c47eSFlorian Hahn; CHECK:       T:
144c1c5c47eSFlorian Hahn; CHECK-NEXT:    br label [[EXIT:%.*]]
145c1c5c47eSFlorian Hahn; CHECK:       F:
146c1c5c47eSFlorian Hahn; CHECK-NEXT:    br label [[EXIT]]
147c1c5c47eSFlorian Hahn; CHECK:       exit:
148c1c5c47eSFlorian Hahn; CHECK-NEXT:    [[P:%.*]] = phi i32 [ 17, [[T]] ], [ 123, [[F]] ]
149*0991da36SNikita Popov; CHECK-NEXT:    store i32 [[P]], ptr @I
150c1c5c47eSFlorian Hahn; CHECK-NEXT:    ret void
151c1c5c47eSFlorian Hahn;
152c1c5c47eSFlorian Hahn  br i1 %c.1, label %T, label %F
153c1c5c47eSFlorian Hahn
154c1c5c47eSFlorian HahnT:
155c1c5c47eSFlorian Hahn  br label %exit
156c1c5c47eSFlorian Hahn
157c1c5c47eSFlorian HahnF:
158c1c5c47eSFlorian Hahn  br label %exit
159c1c5c47eSFlorian Hahn
160c1c5c47eSFlorian Hahnexit:
161c1c5c47eSFlorian Hahn  %p = phi i32 [ 17, %T ], [ 123, %F ]
162*0991da36SNikita Popov  store i32 %p, ptr @I
163c1c5c47eSFlorian Hahn  ret void
164c1c5c47eSFlorian Hahn
165c1c5c47eSFlorian Hahn}
166c1c5c47eSFlorian Hahn
167c1c5c47eSFlorian Hahn; Make sure stored values are correctly updated to overdefined.
168c1c5c47eSFlorian Hahn@J = internal global i32 0
169c1c5c47eSFlorian Hahn
170c1c5c47eSFlorian Hahndefine void @test4a() {
171c1c5c47eSFlorian Hahn; CHECK-LABEL: @test4a(
172*0991da36SNikita Popov; CHECK-NEXT:    [[X:%.*]] = load i32, ptr @J
173c1c5c47eSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ne i32 [[X]], 124
174c1c5c47eSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_1]])
175c1c5c47eSFlorian Hahn; CHECK-NEXT:    [[C_2:%.*]] = icmp ult i32 [[X]], 124
176c1c5c47eSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_2]])
177c1c5c47eSFlorian Hahn; CHECK-NEXT:    [[C_3:%.*]] = icmp eq i32 [[X]], 124
178c1c5c47eSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_3]])
179c1c5c47eSFlorian Hahn; CHECK-NEXT:    [[C_4:%.*]] = icmp ugt i32 [[X]], 123
180c1c5c47eSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_4]])
181c1c5c47eSFlorian Hahn; CHECK-NEXT:    [[C_5:%.*]] = icmp eq i32 [[X]], 20
182c1c5c47eSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_5]])
183c1c5c47eSFlorian Hahn; CHECK-NEXT:    ret void
184c1c5c47eSFlorian Hahn;
185*0991da36SNikita Popov  %X = load i32, ptr @J
186c1c5c47eSFlorian Hahn  %c.1 = icmp ne i32 %X, 124
187c1c5c47eSFlorian Hahn  call void @use(i1 %c.1)
188c1c5c47eSFlorian Hahn  %c.2 = icmp ult i32 %X, 124
189c1c5c47eSFlorian Hahn  call void @use(i1 %c.2)
190c1c5c47eSFlorian Hahn  %c.3 = icmp eq i32 %X, 124
191c1c5c47eSFlorian Hahn  call void @use(i1 %c.3)
192c1c5c47eSFlorian Hahn  %c.4 = icmp ugt i32 %X, 123
193c1c5c47eSFlorian Hahn  call void @use(i1 %c.4)
194c1c5c47eSFlorian Hahn  %c.5 = icmp eq i32 %X, 20
195c1c5c47eSFlorian Hahn  call void @use(i1 %c.5)
196c1c5c47eSFlorian Hahn  ret void
197c1c5c47eSFlorian Hahn}
198c1c5c47eSFlorian Hahn
199c1c5c47eSFlorian Hahndefine void @test4b(i1 %c.1, i1 %c.2, i32 %x) {
200c1c5c47eSFlorian Hahn; CHECK-LABEL: @test4b(
201c1c5c47eSFlorian Hahn; CHECK-NEXT:    br i1 [[C_1:%.*]], label [[T:%.*]], label [[F:%.*]]
202c1c5c47eSFlorian Hahn; CHECK:       T:
203c1c5c47eSFlorian Hahn; CHECK-NEXT:    br i1 [[C_2:%.*]], label [[T_1:%.*]], label [[F_1:%.*]]
204c1c5c47eSFlorian Hahn; CHECK:       T.1:
205c1c5c47eSFlorian Hahn; CHECK-NEXT:    br label [[EXIT:%.*]]
206c1c5c47eSFlorian Hahn; CHECK:       F.1:
207c1c5c47eSFlorian Hahn; CHECK-NEXT:    br label [[EXIT]]
208c1c5c47eSFlorian Hahn; CHECK:       F:
209c1c5c47eSFlorian Hahn; CHECK-NEXT:    br label [[EXIT]]
210c1c5c47eSFlorian Hahn; CHECK:       exit:
211c1c5c47eSFlorian Hahn; CHECK-NEXT:    [[P:%.*]] = phi i32 [ 17, [[T_1]] ], [ [[X:%.*]], [[F_1]] ], [ 123, [[F]] ]
212*0991da36SNikita Popov; CHECK-NEXT:    store i32 [[P]], ptr @J
213c1c5c47eSFlorian Hahn; CHECK-NEXT:    ret void
214c1c5c47eSFlorian Hahn;
215c1c5c47eSFlorian Hahn  br i1 %c.1, label %T, label %F
216c1c5c47eSFlorian HahnT:
217c1c5c47eSFlorian Hahn  br i1 %c.2, label %T.1, label %F.1
218c1c5c47eSFlorian Hahn
219c1c5c47eSFlorian HahnT.1:
220c1c5c47eSFlorian Hahn  br label %exit
221c1c5c47eSFlorian Hahn
222c1c5c47eSFlorian HahnF.1:
223c1c5c47eSFlorian Hahn  br label %exit
224c1c5c47eSFlorian Hahn
225c1c5c47eSFlorian HahnF:
226c1c5c47eSFlorian Hahn  br label %exit
227c1c5c47eSFlorian Hahn
228c1c5c47eSFlorian Hahnexit:
229c1c5c47eSFlorian Hahn  %p = phi i32 [ 17, %T.1 ], [ %x, %F.1 ], [ 123, %F ]
230*0991da36SNikita Popov  store i32 %p, ptr @J
231c1c5c47eSFlorian Hahn  ret void
232c1c5c47eSFlorian Hahn}
233c1c5c47eSFlorian Hahn
234c1c5c47eSFlorian Hahn; Same as test1, but storing 4 different values.
235c1c5c47eSFlorian Hahn
2367d57d22bSFlorian Hahn@K = internal global i32 501
237c1c5c47eSFlorian Hahn
238c1c5c47eSFlorian Hahndefine void @test5a() {
239c1c5c47eSFlorian Hahn; CHECK-LABEL: @test5a(
240*0991da36SNikita Popov; CHECK-NEXT:    [[X:%.*]] = load i32, ptr @K
2417d57d22bSFlorian Hahn; CHECK-NEXT:    call void @use(i1 true)
2427d57d22bSFlorian Hahn; CHECK-NEXT:    call void @use(i1 true)
2437d57d22bSFlorian Hahn; CHECK-NEXT:    call void @use(i1 false)
2447d57d22bSFlorian Hahn; CHECK-NEXT:    call void @use(i1 false)
245c1c5c47eSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp eq i32 [[X]], 510
246c1c5c47eSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_1]])
247c1c5c47eSFlorian Hahn; CHECK-NEXT:    ret void
248c1c5c47eSFlorian Hahn;
249*0991da36SNikita Popov  %X = load i32, ptr @K
250c1c5c47eSFlorian Hahn  %t.1 = icmp ne i32 %X, 499
251c1c5c47eSFlorian Hahn  call void @use(i1 %t.1)
252c1c5c47eSFlorian Hahn  %t.2 = icmp ult i32 %X, 600
253c1c5c47eSFlorian Hahn  call void @use(i1 %t.2)
254c1c5c47eSFlorian Hahn  %f.1 = icmp eq i32 %X, 600
255c1c5c47eSFlorian Hahn  call void @use(i1 %f.1)
256c1c5c47eSFlorian Hahn  %f.2 = icmp ugt i32 %X, 600
257c1c5c47eSFlorian Hahn  call void @use(i1 %f.2)
258c1c5c47eSFlorian Hahn  %c.1 = icmp eq i32 %X, 510
259c1c5c47eSFlorian Hahn  call void @use(i1 %c.1)
260c1c5c47eSFlorian Hahn  ret void
261c1c5c47eSFlorian Hahn}
262c1c5c47eSFlorian Hahn
263c1c5c47eSFlorian Hahndefine void @test5b(i1 %c.1, i1 %c.2) {
264c1c5c47eSFlorian Hahn; CHECK-LABEL: @test5b(
265c1c5c47eSFlorian Hahn; CHECK-NEXT:    br i1 [[C_1:%.*]], label [[T_1:%.*]], label [[F_1:%.*]]
266c1c5c47eSFlorian Hahn; CHECK:       T.1:
267c1c5c47eSFlorian Hahn; CHECK-NEXT:    br i1 [[C_2:%.*]], label [[T_2:%.*]], label [[F_2:%.*]]
268c1c5c47eSFlorian Hahn; CHECK:       T.2:
269*0991da36SNikita Popov; CHECK-NEXT:    store i32 500, ptr @K
270c1c5c47eSFlorian Hahn; CHECK-NEXT:    ret void
271c1c5c47eSFlorian Hahn; CHECK:       F.2:
272*0991da36SNikita Popov; CHECK-NEXT:    store i32 510, ptr @K
273c1c5c47eSFlorian Hahn; CHECK-NEXT:    ret void
274c1c5c47eSFlorian Hahn; CHECK:       F.1:
275c1c5c47eSFlorian Hahn; CHECK-NEXT:    br i1 [[C_2]], label [[T_3:%.*]], label [[F_3:%.*]]
276c1c5c47eSFlorian Hahn; CHECK:       T.3:
277*0991da36SNikita Popov; CHECK-NEXT:    store i32 520, ptr @K
278c1c5c47eSFlorian Hahn; CHECK-NEXT:    ret void
279c1c5c47eSFlorian Hahn; CHECK:       F.3:
280*0991da36SNikita Popov; CHECK-NEXT:    store i32 530, ptr @K
281c1c5c47eSFlorian Hahn; CHECK-NEXT:    ret void
282c1c5c47eSFlorian Hahn;
283c1c5c47eSFlorian Hahn  br i1 %c.1, label %T.1, label %F.1
284c1c5c47eSFlorian Hahn
285c1c5c47eSFlorian HahnT.1:
286c1c5c47eSFlorian Hahn  br i1 %c.2, label %T.2, label %F.2
287c1c5c47eSFlorian Hahn
288c1c5c47eSFlorian HahnT.2:
289*0991da36SNikita Popov  store i32 500, ptr @K
290c1c5c47eSFlorian Hahn  ret void
291c1c5c47eSFlorian Hahn
292c1c5c47eSFlorian HahnF.2:
293*0991da36SNikita Popov  store i32 510, ptr @K
294c1c5c47eSFlorian Hahn  ret void
295c1c5c47eSFlorian Hahn
296c1c5c47eSFlorian HahnF.1:
297c1c5c47eSFlorian Hahn  br i1 %c.2, label %T.3, label %F.3
298c1c5c47eSFlorian Hahn
299c1c5c47eSFlorian HahnT.3:
300*0991da36SNikita Popov  store i32 520, ptr @K
301c1c5c47eSFlorian Hahn  ret void
302c1c5c47eSFlorian Hahn
303c1c5c47eSFlorian HahnF.3:
304*0991da36SNikita Popov  store i32 530, ptr @K
305c1c5c47eSFlorian Hahn  ret void
306c1c5c47eSFlorian Hahn}
307