Skip to content

Commit 97e06a0

Browse files
committed
[GVN] Add tests for captured-before analysis (NFC)
1 parent 3bfd1f0 commit 97e06a0

File tree

1 file changed

+80
-0
lines changed

1 file changed

+80
-0
lines changed
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 3
2+
; RUN: opt -S -passes=gvn < %s | FileCheck %s
3+
4+
declare void @capture(ptr)
5+
declare void @some_call()
6+
7+
define i32 @test_call_before_capture(ptr %p) {
8+
; CHECK-LABEL: define i32 @test_call_before_capture(
9+
; CHECK-SAME: ptr [[P:%.*]]) {
10+
; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4
11+
; CHECK-NEXT: store i32 123, ptr [[A]], align 4
12+
; CHECK-NEXT: call void @some_call()
13+
; CHECK-NEXT: call void @capture(ptr [[A]])
14+
; CHECK-NEXT: ret i32 123
15+
;
16+
%a = alloca i32
17+
store i32 123, ptr %a
18+
call void @some_call()
19+
%v = load i32, ptr %a
20+
call void @capture(ptr %a)
21+
ret i32 %v
22+
}
23+
24+
define i32 @test_call_after_capture(ptr %p) {
25+
; CHECK-LABEL: define i32 @test_call_after_capture(
26+
; CHECK-SAME: ptr [[P:%.*]]) {
27+
; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4
28+
; CHECK-NEXT: store i32 123, ptr [[A]], align 4
29+
; CHECK-NEXT: call void @capture(ptr [[A]])
30+
; CHECK-NEXT: call void @some_call()
31+
; CHECK-NEXT: [[V:%.*]] = load i32, ptr [[A]], align 4
32+
; CHECK-NEXT: ret i32 [[V]]
33+
;
34+
%a = alloca i32
35+
store i32 123, ptr %a
36+
call void @capture(ptr %a)
37+
call void @some_call()
38+
%v = load i32, ptr %a
39+
ret i32 %v
40+
}
41+
42+
define i32 @test_store_before_capture(ptr %p) {
43+
; CHECK-LABEL: define i32 @test_store_before_capture(
44+
; CHECK-SAME: ptr [[P:%.*]]) {
45+
; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4
46+
; CHECK-NEXT: store i32 123, ptr [[A]], align 4
47+
; CHECK-NEXT: [[P2:%.*]] = load ptr, ptr [[P]], align 8
48+
; CHECK-NEXT: store i32 42, ptr [[P2]], align 4
49+
; CHECK-NEXT: [[V:%.*]] = load i32, ptr [[A]], align 4
50+
; CHECK-NEXT: call void @capture(ptr [[A]])
51+
; CHECK-NEXT: ret i32 [[V]]
52+
;
53+
%a = alloca i32
54+
store i32 123, ptr %a
55+
%p2 = load ptr, ptr %p
56+
store i32 42, ptr %p2
57+
%v = load i32, ptr %a
58+
call void @capture(ptr %a)
59+
ret i32 %v
60+
}
61+
62+
define i32 @test_store_after_capture(ptr %p) {
63+
; CHECK-LABEL: define i32 @test_store_after_capture(
64+
; CHECK-SAME: ptr [[P:%.*]]) {
65+
; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4
66+
; CHECK-NEXT: store i32 123, ptr [[A]], align 4
67+
; CHECK-NEXT: call void @capture(ptr [[A]])
68+
; CHECK-NEXT: [[P2:%.*]] = load ptr, ptr [[P]], align 8
69+
; CHECK-NEXT: store i32 42, ptr [[P2]], align 4
70+
; CHECK-NEXT: [[V:%.*]] = load i32, ptr [[A]], align 4
71+
; CHECK-NEXT: ret i32 [[V]]
72+
;
73+
%a = alloca i32
74+
store i32 123, ptr %a
75+
call void @capture(ptr %a)
76+
%p2 = load ptr, ptr %p
77+
store i32 42, ptr %p2
78+
%v = load i32, ptr %a
79+
ret i32 %v
80+
}

0 commit comments

Comments
 (0)