1
+ ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
1
2
; RUN: opt -passes=gvn -S < %s | FileCheck %s
2
3
3
4
define i32 @test1 (ptr %p , ptr %q ) {
4
- ; CHECK-LABEL: @test1(ptr %p, ptr %q)
5
- ; CHECK: call i32 @foo(ptr %p)
6
- ; CHECK-NOT: tbaa
7
- ; CHECK: %c = add i32 %a, %a
5
+ ; CHECK-LABEL: define i32 @test1(
6
+ ; CHECK-SAME: ptr [[P:%.*]], ptr [[Q:%.*]]) {
7
+ ; CHECK-NEXT: [[A:%.*]] = call i32 @foo(ptr [[P]]), !tbaa [[TBAA0:![0-9]+]]
8
+ ; CHECK-NEXT: [[C:%.*]] = add i32 [[A]], [[A]]
9
+ ; CHECK-NEXT: ret i32 [[C]]
10
+ ;
8
11
%a = call i32 @foo (ptr %p ), !tbaa !0
9
12
%b = call i32 @foo (ptr %p )
10
13
%c = add i32 %a , %b
11
14
ret i32 %c
12
15
}
13
16
14
17
define i32 @test2 (ptr %p , ptr %q ) {
15
- ; CHECK-LABEL: @test2(ptr %p, ptr %q)
16
- ; CHECK: call i32 @foo(ptr %p), !tbaa [[TAGC:!.*]]
17
- ; CHECK: %c = add i32 %a, %a
18
+ ; CHECK-LABEL: define i32 @test2(
19
+ ; CHECK-SAME: ptr [[P:%.*]], ptr [[Q:%.*]]) {
20
+ ; CHECK-NEXT: [[A:%.*]] = call i32 @foo(ptr [[P]]), !tbaa [[TBAA0]]
21
+ ; CHECK-NEXT: [[C:%.*]] = add i32 [[A]], [[A]]
22
+ ; CHECK-NEXT: ret i32 [[C]]
23
+ ;
18
24
%a = call i32 @foo (ptr %p ), !tbaa !0
19
25
%b = call i32 @foo (ptr %p ), !tbaa !0
20
26
%c = add i32 %a , %b
21
27
ret i32 %c
22
28
}
23
29
24
30
define i32 @test3 (ptr %p , ptr %q ) {
25
- ; CHECK-LABEL: @test3(ptr %p, ptr %q)
26
- ; CHECK: call i32 @foo(ptr %p), !tbaa [[TAGB:!.*]]
27
- ; CHECK: %c = add i32 %a, %a
31
+ ; CHECK-LABEL: define i32 @test3(
32
+ ; CHECK-SAME: ptr [[P:%.*]], ptr [[Q:%.*]]) {
33
+ ; CHECK-NEXT: [[A:%.*]] = call i32 @foo(ptr [[P]]), !tbaa [[TBAA4:![0-9]+]]
34
+ ; CHECK-NEXT: [[C:%.*]] = add i32 [[A]], [[A]]
35
+ ; CHECK-NEXT: ret i32 [[C]]
36
+ ;
28
37
%a = call i32 @foo (ptr %p ), !tbaa !3
29
38
%b = call i32 @foo (ptr %p ), !tbaa !3
30
39
%c = add i32 %a , %b
31
40
ret i32 %c
32
41
}
33
42
34
43
define i32 @test4 (ptr %p , ptr %q ) {
35
- ; CHECK-LABEL: @test4(ptr %p, ptr %q)
36
- ; CHECK: call i32 @foo(ptr %p), !tbaa [[TAGA:!.*]]
37
- ; CHECK: %c = add i32 %a, %a
44
+ ; CHECK-LABEL: define i32 @test4(
45
+ ; CHECK-SAME: ptr [[P:%.*]], ptr [[Q:%.*]]) {
46
+ ; CHECK-NEXT: [[A:%.*]] = call i32 @foo(ptr [[P]]), !tbaa [[TBAA6:![0-9]+]]
47
+ ; CHECK-NEXT: [[C:%.*]] = add i32 [[A]], [[A]]
48
+ ; CHECK-NEXT: ret i32 [[C]]
49
+ ;
38
50
%a = call i32 @foo (ptr %p ), !tbaa !1
39
51
%b = call i32 @foo (ptr %p ), !tbaa !0
40
52
%c = add i32 %a , %b
41
53
ret i32 %c
42
54
}
43
55
44
56
define i32 @test5 (ptr %p , ptr %q ) {
45
- ; CHECK-LABEL: @test5(ptr %p, ptr %q)
46
- ; CHECK: call i32 @foo(ptr %p), !tbaa [[TAGA]]
47
- ; CHECK: %c = add i32 %a, %a
57
+ ; CHECK-LABEL: define i32 @test5(
58
+ ; CHECK-SAME: ptr [[P:%.*]], ptr [[Q:%.*]]) {
59
+ ; CHECK-NEXT: [[A:%.*]] = call i32 @foo(ptr [[P]]), !tbaa [[TBAA0]]
60
+ ; CHECK-NEXT: [[C:%.*]] = add i32 [[A]], [[A]]
61
+ ; CHECK-NEXT: ret i32 [[C]]
62
+ ;
48
63
%a = call i32 @foo (ptr %p ), !tbaa !0
49
64
%b = call i32 @foo (ptr %p ), !tbaa !1
50
65
%c = add i32 %a , %b
51
66
ret i32 %c
52
67
}
53
68
54
69
define i32 @test6 (ptr %p , ptr %q ) {
55
- ; CHECK-LABEL: @test6(ptr %p, ptr %q)
56
- ; CHECK: call i32 @foo(ptr %p), !tbaa [[TAGA]]
57
- ; CHECK: %c = add i32 %a, %a
70
+ ; CHECK-LABEL: define i32 @test6(
71
+ ; CHECK-SAME: ptr [[P:%.*]], ptr [[Q:%.*]]) {
72
+ ; CHECK-NEXT: [[A:%.*]] = call i32 @foo(ptr [[P]]), !tbaa [[TBAA0]]
73
+ ; CHECK-NEXT: [[C:%.*]] = add i32 [[A]], [[A]]
74
+ ; CHECK-NEXT: ret i32 [[C]]
75
+ ;
58
76
%a = call i32 @foo (ptr %p ), !tbaa !0
59
77
%b = call i32 @foo (ptr %p ), !tbaa !3
60
78
%c = add i32 %a , %b
61
79
ret i32 %c
62
80
}
63
81
64
82
define i32 @test7 (ptr %p , ptr %q ) {
65
- ; CHECK-LABEL: @test7(ptr %p, ptr %q)
66
- ; CHECK: call i32 @foo(ptr %p)
67
- ; CHECK-NOT: tbaa
68
- ; CHECK: %c = add i32 %a, %a
83
+ ; CHECK-LABEL: define i32 @test7(
84
+ ; CHECK-SAME: ptr [[P:%.*]], ptr [[Q:%.*]]) {
85
+ ; CHECK-NEXT: [[A:%.*]] = call i32 @foo(ptr [[P]]), !tbaa [[TBAA7:![0-9]+]]
86
+ ; CHECK-NEXT: [[C:%.*]] = add i32 [[A]], [[A]]
87
+ ; CHECK-NEXT: ret i32 [[C]]
88
+ ;
69
89
%a = call i32 @foo (ptr %p ), !tbaa !4
70
90
%b = call i32 @foo (ptr %p ), !tbaa !3
71
91
%c = add i32 %a , %b
72
92
ret i32 %c
73
93
}
74
94
75
95
define i32 @test8 (ptr %p , ptr %q ) {
76
- ; CHECK-LABEL: @test8
77
- ; CHECK-NEXT: store i32 15, ptr %p
78
- ; CHECK-NEXT: ret i32 0
96
+ ; CHECK-LABEL: define i32 @test8(
97
+ ; CHECK-SAME: ptr [[P:%.*]], ptr [[Q:%.*]]) {
98
+ ; CHECK-NEXT: store i32 15, ptr [[P]], align 4
99
+ ; CHECK-NEXT: ret i32 0
100
+ ;
79
101
; Since we know the location is invariant, we can forward the
80
102
; load across the potentially aliasing store.
81
103
@@ -87,9 +109,11 @@ define i32 @test8(ptr %p, ptr %q) {
87
109
}
88
110
89
111
define i32 @test9 (ptr %p , ptr %q ) {
90
- ; CHECK-LABEL: @test9
91
- ; CHECK-NEXT: call void @clobber()
92
- ; CHECK-NEXT: ret i32 0
112
+ ; CHECK-LABEL: define i32 @test9(
113
+ ; CHECK-SAME: ptr [[P:%.*]], ptr [[Q:%.*]]) {
114
+ ; CHECK-NEXT: call void @clobber()
115
+ ; CHECK-NEXT: ret i32 0
116
+ ;
93
117
; Since we know the location is invariant, we can forward the
94
118
; load across the potentially aliasing store (within the call).
95
119
@@ -103,9 +127,12 @@ define i32 @test9(ptr %p, ptr %q) {
103
127
define i32 @test10 (ptr %p , ptr %q ) {
104
128
; If one access encloses the other, then the merged access is the enclosed one
105
129
; and not just the common final access type.
106
- ; CHECK-LABEL: @test10
107
- ; CHECK: call i32 @foo(ptr %p), !tbaa [[TAG_X_i:!.*]]
108
- ; CHECK: %c = add i32 %a, %a
130
+ ; CHECK-LABEL: define i32 @test10(
131
+ ; CHECK-SAME: ptr [[P:%.*]], ptr [[Q:%.*]]) {
132
+ ; CHECK-NEXT: [[A:%.*]] = call i32 @foo(ptr [[P]]), !tbaa [[TBAA10:![0-9]+]]
133
+ ; CHECK-NEXT: [[C:%.*]] = add i32 [[A]], [[A]]
134
+ ; CHECK-NEXT: ret i32 [[C]]
135
+ ;
109
136
%a = call i32 @foo (ptr %p ), !tbaa !15 ; TAG_X_i
110
137
%b = call i32 @foo (ptr %p ), !tbaa !19 ; TAG_Y_x_i
111
138
%c = add i32 %a , %b
@@ -115,12 +142,6 @@ define i32 @test10(ptr %p, ptr %q) {
115
142
declare void @clobber ()
116
143
declare i32 @foo (ptr ) readonly
117
144
118
- ; CHECK-DAG: [[TAGC]] = !{[[TYPEC:!.*]], [[TYPEC]], i64 0}
119
- ; CHECK-DAG: [[TYPEC]] = !{!"C", [[TYPEA:!.*]]}
120
- ; CHECK-DAG: [[TYPEA]] = !{!"A", !{{.*}}}
121
- ; CHECK-DAG: [[TAGB]] = !{[[TYPEB:!.*]], [[TYPEB]], i64 0}
122
- ; CHECK-DAG: [[TYPEB]] = !{!"B", [[TYPEA]]}
123
- ; CHECK-DAG: [[TAGA]] = !{[[TYPEA]], [[TYPEA]], i64 0}
124
145
!0 = !{!5 , !5 , i64 0 }
125
146
!1 = !{!6 , !6 , i64 0 }
126
147
!2 = !{!"tbaa root" }
@@ -132,9 +153,6 @@ declare i32 @foo(ptr) readonly
132
153
!8 = !{!"another root" }
133
154
!11 = !{!"scalar type" , !8 }
134
155
135
- ; CHECK-DAG: [[TAG_X_i]] = !{[[TYPE_X:!.*]], [[TYPE_int:!.*]], i64 0}
136
- ; CHECK-DAG: [[TYPE_X:!.*]] = !{!"struct X", [[TYPE_int]], i64 0}
137
- ; CHECK-DAG: [[TYPE_int]] = !{!"int", {{!.*}}, i64 0}
138
156
!15 = !{!16 , !17 , i64 0 } ; TAG_X_i
139
157
!16 = !{!"struct X" , !17 , i64 0 } ; struct X { int i; };
140
158
!17 = !{!"int" , !18 , i64 0 }
@@ -146,3 +164,19 @@ declare i32 @foo(ptr) readonly
146
164
; A TBAA structure who's only point is to have a constant location.
147
165
!9 = !{!"yet another root" }
148
166
!10 = !{!"node" , !9 , i64 1 }
167
+ ;.
168
+ ; CHECK: [[TBAA0]] = !{[[META1:![0-9]+]], [[META1]], i64 0}
169
+ ; CHECK: [[META1]] = !{!"C", [[META2:![0-9]+]]}
170
+ ; CHECK: [[META2]] = !{!"A", [[META3:![0-9]+]]}
171
+ ; CHECK: [[META3]] = !{!"tbaa root"}
172
+ ; CHECK: [[TBAA4]] = !{[[META5:![0-9]+]], [[META5]], i64 0}
173
+ ; CHECK: [[META5]] = !{!"B", [[META2]]}
174
+ ; CHECK: [[TBAA6]] = !{[[META2]], [[META2]], i64 0}
175
+ ; CHECK: [[TBAA7]] = !{[[META8:![0-9]+]], [[META8]], i64 0}
176
+ ; CHECK: [[META8]] = !{!"scalar type", [[META9:![0-9]+]]}
177
+ ; CHECK: [[META9]] = !{!"another root"}
178
+ ; CHECK: [[TBAA10]] = !{[[META11:![0-9]+]], [[META12:![0-9]+]], i64 0}
179
+ ; CHECK: [[META11]] = !{!"struct X", [[META12]], i64 0}
180
+ ; CHECK: [[META12]] = !{!"int", [[META13:![0-9]+]], i64 0}
181
+ ; CHECK: [[META13]] = !{!"char", [[META3]], i64 0}
182
+ ;.
0 commit comments