Skip to content

Commit 8f21459

Browse files
committed
[SimplifyCFG] Add additional store speculation tests (NFC)
1 parent 00ab44e commit 8f21459

File tree

1 file changed

+159
-0
lines changed

1 file changed

+159
-0
lines changed

llvm/test/Transforms/SimplifyCFG/speculate-store.ll

Lines changed: 159 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,165 @@ if.end:
194194
ret i32 %add
195195
}
196196

197+
define i64 @load_before_store_noescape_byval(ptr byval([2 x i32]) %a, i64 %i, i32 %b) {
198+
; CHECK-LABEL: @load_before_store_noescape_byval(
199+
; CHECK-NEXT: entry:
200+
; CHECK-NEXT: store i64 -1, ptr [[A:%.*]], align 8
201+
; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [2 x i32], ptr [[A]], i64 0, i64 [[I:%.*]]
202+
; CHECK-NEXT: [[V:%.*]] = load i32, ptr [[ARRAYIDX]], align 4
203+
; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[V]], [[B:%.*]]
204+
; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
205+
; CHECK: if.then:
206+
; CHECK-NEXT: store i32 [[B]], ptr [[ARRAYIDX]], align 4
207+
; CHECK-NEXT: br label [[IF_END]]
208+
; CHECK: if.end:
209+
; CHECK-NEXT: [[V2:%.*]] = load i64, ptr [[A]], align 8
210+
; CHECK-NEXT: ret i64 [[V2]]
211+
;
212+
entry:
213+
store i64 -1, ptr %a, align 8
214+
%arrayidx = getelementptr inbounds [2 x i32], ptr %a, i64 0, i64 %i
215+
%v = load i32, ptr %arrayidx, align 4
216+
%cmp = icmp slt i32 %v, %b
217+
br i1 %cmp, label %if.then, label %if.end
218+
219+
if.then:
220+
store i32 %b, ptr %arrayidx, align 4
221+
br label %if.end
222+
223+
if.end:
224+
%v2 = load i64, ptr %a, align 8
225+
ret i64 %v2
226+
}
227+
228+
declare noalias ptr @malloc(i64 %size)
229+
230+
define i64 @load_before_store_noescape_malloc(i64 %i, i32 %b) {
231+
; CHECK-LABEL: @load_before_store_noescape_malloc(
232+
; CHECK-NEXT: entry:
233+
; CHECK-NEXT: [[A:%.*]] = call ptr @malloc(i64 8)
234+
; CHECK-NEXT: store i64 -1, ptr [[A]], align 8
235+
; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [2 x i32], ptr [[A]], i64 0, i64 [[I:%.*]]
236+
; CHECK-NEXT: [[V:%.*]] = load i32, ptr [[ARRAYIDX]], align 4
237+
; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[V]], [[B:%.*]]
238+
; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
239+
; CHECK: if.then:
240+
; CHECK-NEXT: store i32 [[B]], ptr [[ARRAYIDX]], align 4
241+
; CHECK-NEXT: br label [[IF_END]]
242+
; CHECK: if.end:
243+
; CHECK-NEXT: [[V2:%.*]] = load i64, ptr [[A]], align 8
244+
; CHECK-NEXT: ret i64 [[V2]]
245+
;
246+
entry:
247+
%a = call ptr @malloc(i64 8)
248+
store i64 -1, ptr %a, align 8
249+
%arrayidx = getelementptr inbounds [2 x i32], ptr %a, i64 0, i64 %i
250+
%v = load i32, ptr %arrayidx, align 4
251+
%cmp = icmp slt i32 %v, %b
252+
br i1 %cmp, label %if.then, label %if.end
253+
254+
if.then:
255+
store i32 %b, ptr %arrayidx, align 4
256+
br label %if.end
257+
258+
if.end:
259+
%v2 = load i64, ptr %a, align 8
260+
ret i64 %v2
261+
}
262+
263+
define i64 @load_before_store_noescape_writable(ptr noalias writable dereferenceable(8) %a, i64 %i, i32 %b) {
264+
; CHECK-LABEL: @load_before_store_noescape_writable(
265+
; CHECK-NEXT: entry:
266+
; CHECK-NEXT: store i64 -1, ptr [[A:%.*]], align 8
267+
; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [2 x i32], ptr [[A]], i64 0, i64 1
268+
; CHECK-NEXT: [[V:%.*]] = load i32, ptr [[ARRAYIDX]], align 4
269+
; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[V]], [[B:%.*]]
270+
; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
271+
; CHECK: if.then:
272+
; CHECK-NEXT: store i32 [[B]], ptr [[ARRAYIDX]], align 4
273+
; CHECK-NEXT: br label [[IF_END]]
274+
; CHECK: if.end:
275+
; CHECK-NEXT: [[V2:%.*]] = load i64, ptr [[A]], align 8
276+
; CHECK-NEXT: ret i64 [[V2]]
277+
;
278+
entry:
279+
store i64 -1, ptr %a, align 8
280+
%arrayidx = getelementptr inbounds [2 x i32], ptr %a, i64 0, i64 1
281+
%v = load i32, ptr %arrayidx, align 4
282+
%cmp = icmp slt i32 %v, %b
283+
br i1 %cmp, label %if.then, label %if.end
284+
285+
if.then:
286+
store i32 %b, ptr %arrayidx, align 4
287+
br label %if.end
288+
289+
if.end:
290+
%v2 = load i64, ptr %a, align 8
291+
ret i64 %v2
292+
}
293+
294+
define i64 @load_before_store_noescape_writable_missing_noalias(ptr writable dereferenceable(8) %a, i64 %i, i32 %b) {
295+
; CHECK-LABEL: @load_before_store_noescape_writable_missing_noalias(
296+
; CHECK-NEXT: entry:
297+
; CHECK-NEXT: store i64 -1, ptr [[A:%.*]], align 8
298+
; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [2 x i32], ptr [[A]], i64 0, i64 1
299+
; CHECK-NEXT: [[V:%.*]] = load i32, ptr [[ARRAYIDX]], align 4
300+
; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[V]], [[B:%.*]]
301+
; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
302+
; CHECK: if.then:
303+
; CHECK-NEXT: store i32 [[B]], ptr [[ARRAYIDX]], align 4
304+
; CHECK-NEXT: br label [[IF_END]]
305+
; CHECK: if.end:
306+
; CHECK-NEXT: [[V2:%.*]] = load i64, ptr [[A]], align 8
307+
; CHECK-NEXT: ret i64 [[V2]]
308+
;
309+
entry:
310+
store i64 -1, ptr %a, align 8
311+
%arrayidx = getelementptr inbounds [2 x i32], ptr %a, i64 0, i64 1
312+
%v = load i32, ptr %arrayidx, align 4
313+
%cmp = icmp slt i32 %v, %b
314+
br i1 %cmp, label %if.then, label %if.end
315+
316+
if.then:
317+
store i32 %b, ptr %arrayidx, align 4
318+
br label %if.end
319+
320+
if.end:
321+
%v2 = load i64, ptr %a, align 8
322+
ret i64 %v2
323+
}
324+
325+
define i64 @load_before_store_noescape_writable_missing_derefable(ptr noalias writable %a, i64 %i, i32 %b) {
326+
; CHECK-LABEL: @load_before_store_noescape_writable_missing_derefable(
327+
; CHECK-NEXT: entry:
328+
; CHECK-NEXT: store i64 -1, ptr [[A:%.*]], align 8
329+
; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [2 x i32], ptr [[A]], i64 0, i64 1
330+
; CHECK-NEXT: [[V:%.*]] = load i32, ptr [[ARRAYIDX]], align 4
331+
; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[V]], [[B:%.*]]
332+
; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
333+
; CHECK: if.then:
334+
; CHECK-NEXT: store i32 [[B]], ptr [[ARRAYIDX]], align 4
335+
; CHECK-NEXT: br label [[IF_END]]
336+
; CHECK: if.end:
337+
; CHECK-NEXT: [[V2:%.*]] = load i64, ptr [[A]], align 8
338+
; CHECK-NEXT: ret i64 [[V2]]
339+
;
340+
entry:
341+
store i64 -1, ptr %a, align 8
342+
%arrayidx = getelementptr inbounds [2 x i32], ptr %a, i64 0, i64 1
343+
%v = load i32, ptr %arrayidx, align 4
344+
%cmp = icmp slt i32 %v, %b
345+
br i1 %cmp, label %if.then, label %if.end
346+
347+
if.then:
348+
store i32 %b, ptr %arrayidx, align 4
349+
br label %if.end
350+
351+
if.end:
352+
%v2 = load i64, ptr %a, align 8
353+
ret i64 %v2
354+
}
355+
197356
declare void @fork_some_threads(ptr);
198357
declare void @join_some_threads();
199358

0 commit comments

Comments
 (0)