Skip to content

Commit 8eb51dd

Browse files
committed
[SROA] Escaping readonly nocapture tests. NFC
1 parent c2a3ed2 commit 8eb51dd

File tree

2 files changed

+208
-4
lines changed

2 files changed

+208
-4
lines changed

llvm/test/Transforms/SROA/non-capturing-call-readonly.ll

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -364,12 +364,12 @@ define i32 @alloca_used_in_maybe_throwing_call(ptr %data, i64 %n) personality pt
364364
; CHECK-NEXT: br i1 [[EXITCOND]], label [[LOOP]], label [[EXIT:%.*]]
365365
; CHECK: exit:
366366
; CHECK-NEXT: [[I0:%.*]] = invoke i32 @user_of_alloca(ptr [[RETVAL]])
367-
; CHECK-NEXT: to label [[CONT:%.*]] unwind label [[UW:%.*]]
367+
; CHECK-NEXT: to label [[CONT:%.*]] unwind label [[UW:%.*]]
368368
; CHECK: cont:
369369
; CHECK-NEXT: br label [[END:%.*]]
370370
; CHECK: uw:
371371
; CHECK-NEXT: [[I1:%.*]] = landingpad { ptr, i32 }
372-
; CHECK-NEXT: catch ptr null
372+
; CHECK-NEXT: catch ptr null
373373
; CHECK-NEXT: br label [[END]]
374374
; CHECK: end:
375375
; CHECK-NEXT: [[I2:%.*]] = load i32, ptr [[RETVAL]], align 4
@@ -424,10 +424,10 @@ define i32 @alloca_used_in_maybe_throwing_call_with_same_dests(ptr %data, i64 %n
424424
; CHECK-NEXT: br i1 [[EXITCOND]], label [[LOOP]], label [[EXIT:%.*]]
425425
; CHECK: exit:
426426
; CHECK-NEXT: [[I0:%.*]] = invoke i32 @user_of_alloca(ptr [[RETVAL]])
427-
; CHECK-NEXT: to label [[END:%.*]] unwind label [[UW:%.*]]
427+
; CHECK-NEXT: to label [[END:%.*]] unwind label [[UW:%.*]]
428428
; CHECK: uw:
429429
; CHECK-NEXT: [[I1:%.*]] = landingpad { ptr, i32 }
430-
; CHECK-NEXT: catch ptr null
430+
; CHECK-NEXT: catch ptr null
431431
; CHECK-NEXT: br label [[END]]
432432
; CHECK: end:
433433
; CHECK-NEXT: [[I2:%.*]] = load i32, ptr [[RETVAL]], align 4
Lines changed: 204 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,204 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2+
; RUN: opt < %s -passes=sroa -S | FileCheck %s
3+
4+
declare void @callee(ptr nocapture readonly %p)
5+
6+
define i32 @simple() {
7+
; CHECK-LABEL: @simple(
8+
; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4
9+
; CHECK-NEXT: store i32 0, ptr [[A]], align 4
10+
; CHECK-NEXT: call void @callee(ptr [[A]])
11+
; CHECK-NEXT: [[L1:%.*]] = load i32, ptr [[A]], align 4
12+
; CHECK-NEXT: ret i32 [[L1]]
13+
;
14+
%a = alloca i32
15+
store i32 0, ptr %a
16+
call void @callee(ptr %a)
17+
%l1 = load i32, ptr %a
18+
ret i32 %l1
19+
}
20+
21+
define i32 @twoalloc() {
22+
; CHECK-LABEL: @twoalloc(
23+
; CHECK-NEXT: [[A:%.*]] = alloca { i32, i32 }, align 8
24+
; CHECK-NEXT: store i32 0, ptr [[A]], align 4
25+
; CHECK-NEXT: [[B:%.*]] = getelementptr i32, ptr [[A]], i32 1
26+
; CHECK-NEXT: store i32 1, ptr [[B]], align 4
27+
; CHECK-NEXT: call void @callee(ptr [[A]])
28+
; CHECK-NEXT: [[L1:%.*]] = load i32, ptr [[A]], align 4
29+
; CHECK-NEXT: [[L2:%.*]] = load i32, ptr [[B]], align 4
30+
; CHECK-NEXT: ret i32 [[L2]]
31+
;
32+
%a = alloca {i32, i32}
33+
store i32 0, ptr %a
34+
%b = getelementptr i32, ptr %a, i32 1
35+
store i32 1, ptr %b
36+
call void @callee(ptr %a)
37+
%l1 = load i32, ptr %a
38+
%l2 = load i32, ptr %b
39+
ret i32 %l2
40+
}
41+
42+
define i32 @twostore() {
43+
; CHECK-LABEL: @twostore(
44+
; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4
45+
; CHECK-NEXT: store i32 1, ptr [[A]], align 4
46+
; CHECK-NEXT: call void @callee(ptr [[A]])
47+
; CHECK-NEXT: store i32 2, ptr [[A]], align 4
48+
; CHECK-NEXT: [[L:%.*]] = load i32, ptr [[A]], align 4
49+
; CHECK-NEXT: ret i32 [[L]]
50+
;
51+
%a = alloca i32
52+
store i32 1, ptr %a
53+
call void @callee(ptr %a)
54+
store i32 2, ptr %a
55+
%l = load i32, ptr %a
56+
ret i32 %l
57+
}
58+
59+
define i32 @twoalloc_store64(i64 %x) {
60+
; CHECK-LABEL: @twoalloc_store64(
61+
; CHECK-NEXT: [[A:%.*]] = alloca i64, align 8
62+
; CHECK-NEXT: store i64 [[X:%.*]], ptr [[A]], align 4
63+
; CHECK-NEXT: call void @callee(ptr [[A]])
64+
; CHECK-NEXT: [[L1:%.*]] = load i32, ptr [[A]], align 4
65+
; CHECK-NEXT: [[B:%.*]] = getelementptr i32, ptr [[A]], i32 1
66+
; CHECK-NEXT: [[L2:%.*]] = load i32, ptr [[B]], align 4
67+
; CHECK-NEXT: ret i32 [[L2]]
68+
;
69+
%a = alloca i64
70+
store i64 %x, ptr %a
71+
call void @callee(ptr %a)
72+
%l1 = load i32, ptr %a
73+
%b = getelementptr i32, ptr %a, i32 1
74+
%l2 = load i32, ptr %b
75+
ret i32 %l2
76+
}
77+
78+
define i32 @twocalls() {
79+
; CHECK-LABEL: @twocalls(
80+
; CHECK-NEXT: [[A:%.*]] = alloca { i32, i32 }, align 8
81+
; CHECK-NEXT: store i32 0, ptr [[A]], align 4
82+
; CHECK-NEXT: [[B:%.*]] = getelementptr i32, ptr [[A]], i32 1
83+
; CHECK-NEXT: store i32 1, ptr [[B]], align 4
84+
; CHECK-NEXT: call void @callee(ptr [[A]])
85+
; CHECK-NEXT: [[L1:%.*]] = load i32, ptr [[A]], align 4
86+
; CHECK-NEXT: call void @callee(ptr [[A]])
87+
; CHECK-NEXT: [[L2:%.*]] = load i32, ptr [[B]], align 4
88+
; CHECK-NEXT: ret i32 [[L2]]
89+
;
90+
%a = alloca {i32, i32}
91+
store i32 0, ptr %a
92+
%b = getelementptr i32, ptr %a, i32 1
93+
store i32 1, ptr %b
94+
call void @callee(ptr %a)
95+
%l1 = load i32, ptr %a
96+
call void @callee(ptr %a)
97+
%l2 = load i32, ptr %b
98+
ret i32 %l2
99+
}
100+
101+
define i32 @volatile() {
102+
; CHECK-LABEL: @volatile(
103+
; CHECK-NEXT: [[A:%.*]] = alloca { i32, i32 }, align 8
104+
; CHECK-NEXT: store i32 0, ptr [[A]], align 4
105+
; CHECK-NEXT: [[B:%.*]] = getelementptr i32, ptr [[A]], i32 1
106+
; CHECK-NEXT: store i32 1, ptr [[B]], align 4
107+
; CHECK-NEXT: call void @callee(ptr [[A]])
108+
; CHECK-NEXT: [[L1:%.*]] = load volatile i32, ptr [[A]], align 4
109+
; CHECK-NEXT: [[L2:%.*]] = load volatile i32, ptr [[B]], align 4
110+
; CHECK-NEXT: ret i32 [[L2]]
111+
;
112+
%a = alloca {i32, i32}
113+
store i32 0, ptr %a
114+
%b = getelementptr i32, ptr %a, i32 1
115+
store i32 1, ptr %b
116+
call void @callee(ptr %a)
117+
%l1 = load volatile i32, ptr %a
118+
%l2 = load volatile i32, ptr %b
119+
ret i32 %l2
120+
}
121+
122+
define i32 @notdominating() {
123+
; CHECK-LABEL: @notdominating(
124+
; CHECK-NEXT: [[A:%.*]] = alloca { i32, i32 }, align 8
125+
; CHECK-NEXT: [[B:%.*]] = getelementptr i32, ptr [[A]], i32 1
126+
; CHECK-NEXT: [[L1:%.*]] = load volatile i32, ptr [[A]], align 4
127+
; CHECK-NEXT: [[L2:%.*]] = load volatile i32, ptr [[B]], align 4
128+
; CHECK-NEXT: store i32 0, ptr [[A]], align 4
129+
; CHECK-NEXT: store i32 1, ptr [[B]], align 4
130+
; CHECK-NEXT: call void @callee(ptr [[A]])
131+
; CHECK-NEXT: ret i32 [[L2]]
132+
;
133+
%a = alloca {i32, i32}
134+
%b = getelementptr i32, ptr %a, i32 1
135+
%l1 = load volatile i32, ptr %a
136+
%l2 = load volatile i32, ptr %b
137+
store i32 0, ptr %a
138+
store i32 1, ptr %b
139+
call void @callee(ptr %a)
140+
ret i32 %l2
141+
}
142+
143+
declare void @callee_notreadonly(ptr %p)
144+
define i32 @notreadonly() {
145+
; CHECK-LABEL: @notreadonly(
146+
; CHECK-NEXT: [[A:%.*]] = alloca { i32, i32 }, align 8
147+
; CHECK-NEXT: store i32 0, ptr [[A]], align 4
148+
; CHECK-NEXT: [[B:%.*]] = getelementptr i32, ptr [[A]], i32 1
149+
; CHECK-NEXT: store i32 1, ptr [[B]], align 4
150+
; CHECK-NEXT: call void @callee_notreadonly(ptr [[A]])
151+
; CHECK-NEXT: [[L1:%.*]] = load i32, ptr [[A]], align 4
152+
; CHECK-NEXT: [[L2:%.*]] = load i32, ptr [[B]], align 4
153+
; CHECK-NEXT: ret i32 [[L2]]
154+
;
155+
%a = alloca {i32, i32}
156+
store i32 0, ptr %a
157+
%b = getelementptr i32, ptr %a, i32 1
158+
store i32 1, ptr %b
159+
call void @callee_notreadonly(ptr %a)
160+
%l1 = load i32, ptr %a
161+
%l2 = load i32, ptr %b
162+
ret i32 %l2
163+
}
164+
165+
declare void @callee_multiuse(ptr nocapture readonly %p, ptr nocapture readonly %q)
166+
define i32 @multiuse() {
167+
; CHECK-LABEL: @multiuse(
168+
; CHECK-NEXT: [[A:%.*]] = alloca { i32, i32 }, align 8
169+
; CHECK-NEXT: store i32 0, ptr [[A]], align 4
170+
; CHECK-NEXT: [[B:%.*]] = getelementptr i32, ptr [[A]], i32 1
171+
; CHECK-NEXT: store i32 1, ptr [[B]], align 4
172+
; CHECK-NEXT: call void @callee_multiuse(ptr [[A]], ptr [[A]])
173+
; CHECK-NEXT: [[L1:%.*]] = load i32, ptr [[A]], align 4
174+
; CHECK-NEXT: [[L2:%.*]] = load i32, ptr [[B]], align 4
175+
; CHECK-NEXT: ret i32 [[L2]]
176+
;
177+
%a = alloca {i32, i32}
178+
store i32 0, ptr %a
179+
%b = getelementptr i32, ptr %a, i32 1
180+
store i32 1, ptr %b
181+
call void @callee_multiuse(ptr %a, ptr %a)
182+
%l1 = load i32, ptr %a
183+
%l2 = load i32, ptr %b
184+
ret i32 %l2
185+
}
186+
187+
define i32 @memcpyed(ptr %src) {
188+
; CHECK-LABEL: @memcpyed(
189+
; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4
190+
; CHECK-NEXT: store i32 0, ptr [[A]], align 4
191+
; CHECK-NEXT: call void @callee(ptr [[A]])
192+
; CHECK-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr [[A]], ptr [[SRC:%.*]], i64 4, i1 false)
193+
; CHECK-NEXT: [[L1:%.*]] = load i32, ptr [[A]], align 4
194+
; CHECK-NEXT: ret i32 [[L1]]
195+
;
196+
%a = alloca i32
197+
store i32 0, ptr %a
198+
call void @callee(ptr %a)
199+
call void @llvm.memcpy.p0.p0.i64(ptr %a, ptr %src, i64 4, i1 false)
200+
%l1 = load i32, ptr %a
201+
ret i32 %l1
202+
}
203+
204+
declare void @llvm.memcpy.p0.p0.i64(ptr, ptr, i64, i1)

0 commit comments

Comments
 (0)