1+ ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
12; RUN: opt -passes=gvn -S < %s | FileCheck %s
23
34define 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+ ;
811 %a = call i32 @foo (ptr %p ), !tbaa !0
912 %b = call i32 @foo (ptr %p )
1013 %c = add i32 %a , %b
1114 ret i32 %c
1215}
1316
1417define 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+ ;
1824 %a = call i32 @foo (ptr %p ), !tbaa !0
1925 %b = call i32 @foo (ptr %p ), !tbaa !0
2026 %c = add i32 %a , %b
2127 ret i32 %c
2228}
2329
2430define 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+ ;
2837 %a = call i32 @foo (ptr %p ), !tbaa !3
2938 %b = call i32 @foo (ptr %p ), !tbaa !3
3039 %c = add i32 %a , %b
3140 ret i32 %c
3241}
3342
3443define 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+ ;
3850 %a = call i32 @foo (ptr %p ), !tbaa !1
3951 %b = call i32 @foo (ptr %p ), !tbaa !0
4052 %c = add i32 %a , %b
4153 ret i32 %c
4254}
4355
4456define 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+ ;
4863 %a = call i32 @foo (ptr %p ), !tbaa !0
4964 %b = call i32 @foo (ptr %p ), !tbaa !1
5065 %c = add i32 %a , %b
5166 ret i32 %c
5267}
5368
5469define 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+ ;
5876 %a = call i32 @foo (ptr %p ), !tbaa !0
5977 %b = call i32 @foo (ptr %p ), !tbaa !3
6078 %c = add i32 %a , %b
6179 ret i32 %c
6280}
6381
6482define 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+ ;
6989 %a = call i32 @foo (ptr %p ), !tbaa !4
7090 %b = call i32 @foo (ptr %p ), !tbaa !3
7191 %c = add i32 %a , %b
7292 ret i32 %c
7393}
7494
7595define 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+ ;
79101; Since we know the location is invariant, we can forward the
80102; load across the potentially aliasing store.
81103
@@ -87,9 +109,11 @@ define i32 @test8(ptr %p, ptr %q) {
87109}
88110
89111define 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+ ;
93117; Since we know the location is invariant, we can forward the
94118; load across the potentially aliasing store (within the call).
95119
@@ -103,9 +127,12 @@ define i32 @test9(ptr %p, ptr %q) {
103127define i32 @test10 (ptr %p , ptr %q ) {
104128; If one access encloses the other, then the merged access is the enclosed one
105129; 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+ ;
109136 %a = call i32 @foo (ptr %p ), !tbaa !15 ; TAG_X_i
110137 %b = call i32 @foo (ptr %p ), !tbaa !19 ; TAG_Y_x_i
111138 %c = add i32 %a , %b
@@ -115,12 +142,6 @@ define i32 @test10(ptr %p, ptr %q) {
115142declare void @clobber ()
116143declare i32 @foo (ptr ) readonly
117144
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}
124145!0 = !{!5 , !5 , i64 0 }
125146!1 = !{!6 , !6 , i64 0 }
126147!2 = !{!"tbaa root" }
@@ -132,9 +153,6 @@ declare i32 @foo(ptr) readonly
132153!8 = !{!"another root" }
133154!11 = !{!"scalar type" , !8 }
134155
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}
138156!15 = !{!16 , !17 , i64 0 } ; TAG_X_i
139157!16 = !{!"struct X" , !17 , i64 0 } ; struct X { int i; };
140158!17 = !{!"int" , !18 , i64 0 }
@@ -146,3 +164,19 @@ declare i32 @foo(ptr) readonly
146164; A TBAA structure who's only point is to have a constant location.
147165!9 = !{!"yet another root" }
148166!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