xref: /llvm-project/llvm/test/Transforms/GlobalOpt/sra-many-stores.ll (revision 2d69827c5c754f0eca98e497ecf0e52ed54b4fd3)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals
2; RUN: opt -passes=globalopt -S %s | FileCheck %s
3
4%struct.widget = type { ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr }
5
6@global = internal global %struct.widget zeroinitializer
7
8;.
9; CHECK: @[[A:[a-zA-Z0-9_$"\\.-]+]] = global i8 0, align 4
10;.
11define internal void @read_struct() {
12; CHECK-LABEL: @read_struct(
13; CHECK-NEXT:    ret void
14;
15  %tmp = load ptr, ptr getelementptr inbounds (%struct.widget, ptr @global, i64 0, i32 16), align 8
16  ret void
17}
18
19define void @write_struct() {
20; CHECK-LABEL: @write_struct(
21; CHECK-NEXT:    tail call fastcc void @read_struct()
22; CHECK-NEXT:    ret void
23;
24  store ptr null, ptr @global, align 8
25  store ptr null, ptr getelementptr inbounds (%struct.widget, ptr @global, i64 0, i32 1), align 8
26  store ptr null, ptr getelementptr inbounds (%struct.widget, ptr @global, i64 0, i32 2), align 8
27  store ptr null, ptr getelementptr inbounds (%struct.widget, ptr @global, i64 0, i32 3), align 8
28  store ptr null, ptr getelementptr inbounds (%struct.widget, ptr @global, i64 0, i32 4), align 8
29  store ptr null, ptr getelementptr inbounds (%struct.widget, ptr @global, i64 0, i32 5), align 8
30  store ptr null, ptr getelementptr inbounds (%struct.widget, ptr @global, i64 0, i32 6), align 8
31  store ptr null, ptr getelementptr inbounds (%struct.widget, ptr @global, i64 0, i32 7), align 8
32  store ptr null, ptr getelementptr inbounds (%struct.widget, ptr @global, i64 0, i32 8), align 8
33  store ptr null, ptr getelementptr inbounds (%struct.widget, ptr @global, i64 0, i32 9), align 8
34  store ptr null, ptr getelementptr inbounds (%struct.widget, ptr @global, i64 0, i32 10), align 8
35  store ptr null, ptr getelementptr inbounds (%struct.widget, ptr @global, i64 0, i32 11), align 8
36  store ptr null, ptr getelementptr inbounds (%struct.widget, ptr @global, i64 0, i32 12), align 8
37  store ptr null, ptr getelementptr inbounds (%struct.widget, ptr @global, i64 0, i32 13), align 8
38  store ptr null, ptr getelementptr inbounds (%struct.widget, ptr @global, i64 0, i32 14), align 8
39  store ptr null, ptr getelementptr inbounds (%struct.widget, ptr @global, i64 0, i32 15), align 8
40  tail call void @read_struct()
41  ret void
42}
43
44
45%struct.with.array = type { [100 x i64], i64 }
46
47@global.array_in_struct = internal global %struct.with.array zeroinitializer
48
49define internal void @read_non_array_field() {
50; CHECK-LABEL: @read_non_array_field(
51; CHECK-NEXT:    ret void
52;
53  %tmp = load i64, ptr getelementptr inbounds (%struct.with.array, ptr @global.array_in_struct, i64 0, i32 1), align 8
54  ret void
55}
56
57define void @store_to_struct_array() {
58; CHECK-LABEL: @store_to_struct_array(
59; CHECK-NEXT:    tail call fastcc void @read_non_array_field()
60; CHECK-NEXT:    ret void
61;
62  store i64 0, ptr @global.array_in_struct, align 8
63  store i64 0, ptr getelementptr inbounds (%struct.with.array, ptr @global.array_in_struct, i64 0, i32 0, i32 1), align 8
64  store i64 0, ptr getelementptr inbounds (%struct.with.array, ptr @global.array_in_struct, i64 0, i32 0, i32 2), align 8
65  store i64 0, ptr getelementptr inbounds (%struct.with.array, ptr @global.array_in_struct, i64 0, i32 0, i32 3), align 8
66  store i64 0, ptr getelementptr inbounds (%struct.with.array, ptr @global.array_in_struct, i64 0, i32 0, i32 4), align 8
67  store i64 0, ptr getelementptr inbounds (%struct.with.array, ptr @global.array_in_struct, i64 0, i32 0, i32 5), align 8
68  store i64 0, ptr getelementptr inbounds (%struct.with.array, ptr @global.array_in_struct, i64 0, i32 0, i32 6), align 8
69  store i64 0, ptr getelementptr inbounds (%struct.with.array, ptr @global.array_in_struct, i64 0, i32 0, i32 7), align 8
70  store i64 0, ptr getelementptr inbounds (%struct.with.array, ptr @global.array_in_struct, i64 0, i32 0, i32 8), align 8
71  store i64 0, ptr getelementptr inbounds (%struct.with.array, ptr @global.array_in_struct, i64 0, i32 0, i32 9), align 8
72  store i64 0, ptr getelementptr inbounds (%struct.with.array, ptr @global.array_in_struct, i64 0, i32 0, i32 10), align 8
73  store i64 0, ptr getelementptr inbounds (%struct.with.array, ptr @global.array_in_struct, i64 0, i32 0, i32 11), align 8
74  store i64 0, ptr getelementptr inbounds (%struct.with.array, ptr @global.array_in_struct, i64 0, i32 0, i32 12), align 8
75  store i64 0, ptr getelementptr inbounds (%struct.with.array, ptr @global.array_in_struct, i64 0, i32 0, i32 13), align 8
76  store i64 0, ptr getelementptr inbounds (%struct.with.array, ptr @global.array_in_struct, i64 0, i32 0, i32 14), align 8
77  store i64 0, ptr getelementptr inbounds (%struct.with.array, ptr @global.array_in_struct, i64 0, i32 0, i32 15), align 8
78  tail call void @read_non_array_field()
79  ret void
80}
81
82@global.array = internal global [100 x i64] zeroinitializer
83
84define internal void @read_array() {
85; CHECK-LABEL: @read_array(
86; CHECK-NEXT:    ret void
87;
88  %tmp = load i64, ptr getelementptr inbounds ([100 x i64], ptr @global.array, i64 0, i32 99), align 8
89  ret void
90}
91
92define void @store_to_array() {
93; CHECK-LABEL: @store_to_array(
94; CHECK-NEXT:    tail call fastcc void @read_array()
95; CHECK-NEXT:    ret void
96;
97  store i64 0, ptr @global.array, align 8
98  store i64 0, ptr getelementptr inbounds ([100 x i64], ptr @global.array, i64 0, i32 1), align 8
99  store i64 0, ptr getelementptr inbounds ([100 x i64], ptr @global.array, i64 0, i32 2), align 8
100  store i64 0, ptr getelementptr inbounds ([100 x i64], ptr @global.array, i64 0, i32 3), align 8
101  store i64 0, ptr getelementptr inbounds ([100 x i64], ptr @global.array, i64 0, i32 4), align 8
102  store i64 0, ptr getelementptr inbounds ([100 x i64], ptr @global.array, i64 0, i32 5), align 8
103  store i64 0, ptr getelementptr inbounds ([100 x i64], ptr @global.array, i64 0, i32 6), align 8
104  store i64 0, ptr getelementptr inbounds ([100 x i64], ptr @global.array, i64 0, i32 7), align 8
105  store i64 0, ptr getelementptr inbounds ([100 x i64], ptr @global.array, i64 0, i32 8), align 8
106  store i64 0, ptr getelementptr inbounds ([100 x i64], ptr @global.array, i64 0, i32 9), align 8
107  store i64 0, ptr getelementptr inbounds ([100 x i64], ptr @global.array, i64 0, i32 10), align 8
108  store i64 0, ptr getelementptr inbounds ([100 x i64], ptr @global.array, i64 0, i32 11), align 8
109  store i64 0, ptr getelementptr inbounds ([100 x i64], ptr @global.array, i64 0, i32 12), align 8
110  store i64 0, ptr getelementptr inbounds ([100 x i64], ptr @global.array, i64 0, i32 13), align 8
111  store i64 0, ptr getelementptr inbounds ([100 x i64], ptr @global.array, i64 0, i32 14), align 8
112  store i64 0, ptr getelementptr inbounds ([100 x i64], ptr @global.array, i64 0, i32 15), align 8
113  tail call void @read_array()
114  ret void
115}
116
117
118%struct.20i8 = type { i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8 }
119@a = global i8 0, align 4
120@b = internal global  %struct.20i8 { i8 4, i8 4, i8 4, i8 5, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 5, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4 }
121
122define void @test_single_write_to_global_b() {
123; CHECK-LABEL: @test_single_write_to_global_b(
124; CHECK-NEXT:    store volatile i8 4, ptr @a, align 4
125; CHECK-NEXT:    store volatile i8 4, ptr @a, align 4
126; CHECK-NEXT:    store volatile i8 5, ptr @a, align 4
127; CHECK-NEXT:    store volatile i8 4, ptr @a, align 4
128; CHECK-NEXT:    store volatile i8 4, ptr @a, align 4
129; CHECK-NEXT:    store volatile i8 4, ptr @a, align 4
130; CHECK-NEXT:    store volatile i8 4, ptr @a, align 4
131; CHECK-NEXT:    store volatile i8 4, ptr @a, align 4
132; CHECK-NEXT:    store volatile i8 5, ptr @a, align 4
133; CHECK-NEXT:    store volatile i8 4, ptr @a, align 4
134; CHECK-NEXT:    store volatile i8 4, ptr @a, align 4
135; CHECK-NEXT:    store volatile i8 4, ptr @a, align 4
136; CHECK-NEXT:    store volatile i8 4, ptr @a, align 4
137; CHECK-NEXT:    store volatile i8 4, ptr @a, align 4
138; CHECK-NEXT:    store volatile i8 4, ptr @a, align 4
139; CHECK-NEXT:    store volatile i8 4, ptr @a, align 4
140; CHECK-NEXT:    store volatile i8 4, ptr @a, align 4
141; CHECK-NEXT:    ret void
142;
143  store i8 0, ptr getelementptr inbounds (%struct.20i8, ptr @b, i64 0, i32 1), align 1
144  %i3 = load i8, ptr @b, align 16
145  store volatile i8 %i3, ptr @a, align 4
146  %i4 = load i8, ptr getelementptr inbounds (%struct.20i8, ptr @b, i64 0, i32 2), align 2
147  store volatile i8 %i4, ptr @a, align 4
148  %i5 = load i8, ptr getelementptr inbounds (%struct.20i8, ptr @b, i64 0, i32 3), align 1
149  store volatile i8 %i5, ptr @a, align 4
150  %i6 = load i8, ptr getelementptr inbounds (%struct.20i8, ptr @b, i64 0, i32 4), align 4
151  store volatile i8 %i6, ptr @a, align 4
152  %i7 = load i8, ptr getelementptr inbounds (%struct.20i8, ptr @b, i64 0, i32 5), align 1
153  store volatile i8 %i7, ptr @a, align 4
154  %i8 = load i8, ptr getelementptr inbounds (%struct.20i8, ptr @b, i64 0, i32 7), align 1
155  store volatile i8 %i8, ptr @a, align 4
156  %i9 = load i8, ptr getelementptr inbounds (%struct.20i8, ptr @b, i64 0, i32 8), align 8
157  store volatile i8 %i9, ptr @a, align 4
158  %i10 = load i8, ptr getelementptr inbounds (%struct.20i8, ptr @b, i64 0, i32 9), align 1
159  store volatile i8 %i10, ptr @a, align 4
160  %i11 = load i8, ptr getelementptr inbounds (%struct.20i8, ptr @b, i64 0, i32 10), align 2
161  store volatile i8 %i11, ptr @a, align 4
162  %i12 = load i8, ptr getelementptr inbounds (%struct.20i8, ptr @b, i64 0, i32 11), align 1
163  store volatile i8 %i12, ptr @a, align 4
164  %i13 = load i8, ptr getelementptr inbounds (%struct.20i8, ptr @b, i64 0, i32 12), align 4
165  store volatile i8 %i13, ptr @a, align 4
166  %i14 = load i8, ptr getelementptr inbounds (%struct.20i8, ptr @b, i64 0, i32 13), align 1
167  store volatile i8 %i14, ptr @a, align 4
168  %i15 = load i8, ptr getelementptr inbounds (%struct.20i8, ptr @b, i64 0, i32 14), align 2
169  store volatile i8 %i15, ptr @a, align 4
170  %i16 = load i8, ptr getelementptr inbounds (%struct.20i8, ptr @b, i64 0, i32 15), align 1
171  store volatile i8 %i16, ptr @a, align 4
172  %i17 = load i8, ptr getelementptr inbounds (%struct.20i8, ptr @b, i64 0, i32 16), align 16
173  store volatile i8 %i17, ptr @a, align 4
174  %i18 = load i8, ptr getelementptr inbounds (%struct.20i8, ptr @b, i64 0, i32 17), align 1
175  store volatile i8 %i18, ptr @a, align 4
176  %i19 = load i8, ptr getelementptr inbounds (%struct.20i8, ptr @b, i64 0, i32 18), align 2
177  store volatile i8 %i19, ptr @a, align 4
178  ret void
179}
180