5
5
6
6
@global = internal global %struct.widget zeroinitializer
7
7
8
+
8
9
;.
9
10
; CHECK: @[[GLOBAL:[a-zA-Z0-9_$"\\.-]+]] = internal unnamed_addr global [[STRUCT_WIDGET:%.*]] zeroinitializer
11
+ ; CHECK: @[[GLOBAL_ARRAY_IN_STRUCT:[a-zA-Z0-9_$"\\.-]+]] = internal unnamed_addr global [[STRUCT_WITH_ARRAY:%.*]] zeroinitializer
12
+ ; CHECK: @[[GLOBAL_ARRAY:[a-zA-Z0-9_$"\\.-]+]] = internal unnamed_addr global [100 x i64] zeroinitializer
10
13
;.
11
- define internal i32 @fn1 () {
12
- ; CHECK-LABEL: @fn1(
13
- ; CHECK-NEXT: ret i32 0
14
- ;
15
- ret i32 0
16
- }
17
-
18
- define internal void @fn2 () {
19
- ; CHECK-LABEL: @fn2(
14
+ define internal void @read_struct () {
15
+ ; CHECK-LABEL: @read_struct(
20
16
; CHECK-NEXT: [[TMP:%.*]] = load ptr, ptr getelementptr inbounds ([[STRUCT_WIDGET:%.*]], ptr @global, i64 0, i32 16), align 8
21
17
; CHECK-NEXT: ret void
22
18
;
23
19
%tmp = load ptr , ptr getelementptr inbounds (%struct.widget , ptr @global , i64 0 , i32 16 ), align 8
24
20
ret void
25
21
}
26
22
27
- define internal void @write () {
28
- ; CHECK-LABEL: @write (
23
+ define void @write_struct () {
24
+ ; CHECK-LABEL: @write_struct (
29
25
; CHECK-NEXT: store ptr null, ptr @global, align 8
30
26
; CHECK-NEXT: store ptr null, ptr getelementptr inbounds ([[STRUCT_WIDGET:%.*]], ptr @global, i64 0, i32 1), align 8
31
27
; CHECK-NEXT: store ptr null, ptr getelementptr inbounds ([[STRUCT_WIDGET]], ptr @global, i64 0, i32 2), align 8
32
28
; CHECK-NEXT: store ptr null, ptr getelementptr inbounds ([[STRUCT_WIDGET]], ptr @global, i64 0, i32 3), align 8
33
- ; CHECK-NEXT: store ptr @fn1 , ptr getelementptr inbounds ([[STRUCT_WIDGET]], ptr @global, i64 0, i32 4), align 8
29
+ ; CHECK-NEXT: store ptr null , ptr getelementptr inbounds ([[STRUCT_WIDGET]], ptr @global, i64 0, i32 4), align 8
34
30
; CHECK-NEXT: store ptr null, ptr getelementptr inbounds ([[STRUCT_WIDGET]], ptr @global, i64 0, i32 5), align 8
35
31
; CHECK-NEXT: store ptr null, ptr getelementptr inbounds ([[STRUCT_WIDGET]], ptr @global, i64 0, i32 6), align 8
36
32
; CHECK-NEXT: store ptr null, ptr getelementptr inbounds ([[STRUCT_WIDGET]], ptr @global, i64 0, i32 7), align 8
@@ -42,14 +38,14 @@ define internal void @write() {
42
38
; CHECK-NEXT: store ptr null, ptr getelementptr inbounds ([[STRUCT_WIDGET]], ptr @global, i64 0, i32 13), align 8
43
39
; CHECK-NEXT: store ptr null, ptr getelementptr inbounds ([[STRUCT_WIDGET]], ptr @global, i64 0, i32 14), align 8
44
40
; CHECK-NEXT: store ptr null, ptr getelementptr inbounds ([[STRUCT_WIDGET]], ptr @global, i64 0, i32 15), align 8
45
- ; CHECK-NEXT: tail call fastcc void @fn2 ()
41
+ ; CHECK-NEXT: tail call fastcc void @read_struct ()
46
42
; CHECK-NEXT: ret void
47
43
;
48
44
store ptr null , ptr getelementptr inbounds (%struct.widget , ptr @global , i64 0 , i32 0 ), align 8
49
45
store ptr null , ptr getelementptr inbounds (%struct.widget , ptr @global , i64 0 , i32 1 ), align 8
50
46
store ptr null , ptr getelementptr inbounds (%struct.widget , ptr @global , i64 0 , i32 2 ), align 8
51
47
store ptr null , ptr getelementptr inbounds (%struct.widget , ptr @global , i64 0 , i32 3 ), align 8
52
- store ptr @fn1 , ptr getelementptr inbounds (%struct.widget , ptr @global , i64 0 , i32 4 ), align 8
48
+ store ptr null , ptr getelementptr inbounds (%struct.widget , ptr @global , i64 0 , i32 4 ), align 8
53
49
store ptr null , ptr getelementptr inbounds (%struct.widget , ptr @global , i64 0 , i32 5 ), align 8
54
50
store ptr null , ptr getelementptr inbounds (%struct.widget , ptr @global , i64 0 , i32 6 ), align 8
55
51
store ptr null , ptr getelementptr inbounds (%struct.widget , ptr @global , i64 0 , i32 7 ), align 8
@@ -61,15 +57,113 @@ define internal void @write() {
61
57
store ptr null , ptr getelementptr inbounds (%struct.widget , ptr @global , i64 0 , i32 13 ), align 8
62
58
store ptr null , ptr getelementptr inbounds (%struct.widget , ptr @global , i64 0 , i32 14 ), align 8
63
59
store ptr null , ptr getelementptr inbounds (%struct.widget , ptr @global , i64 0 , i32 15 ), align 8
64
- tail call void @fn2 ()
60
+ tail call void @read_struct ()
65
61
ret void
66
62
}
67
63
68
- define i32 @main () {
69
- ; CHECK-LABEL: @main(
70
- ; CHECK-NEXT: [[TMP:%.*]] = tail call i32 @write(ptr null)
71
- ; CHECK-NEXT: ret i32 [[TMP]]
64
+
65
+ %struct.with.array = type { [100 x i64 ], i64 }
66
+
67
+ @global.array_in_struct = internal global %struct.with.array zeroinitializer
68
+
69
+ define internal void @read_non_array_field () {
70
+ ; CHECK-LABEL: @read_non_array_field(
71
+ ; CHECK-NEXT: [[TMP:%.*]] = load i64, ptr getelementptr inbounds ([[STRUCT_WITH_ARRAY:%.*]], ptr @global.array_in_struct, i64 0, i32 1), align 8
72
+ ; CHECK-NEXT: ret void
73
+ ;
74
+ %tmp = load i64 , ptr getelementptr inbounds (%struct.with.array , ptr @global.array_in_struct , i64 0 , i32 1 ), align 8
75
+ ret void
76
+ }
77
+
78
+ define void @store_to_struct_array () {
79
+ ; CHECK-LABEL: @store_to_struct_array(
80
+ ; CHECK-NEXT: store i64 0, ptr @global.array_in_struct, align 8
81
+ ; CHECK-NEXT: store i64 0, ptr getelementptr inbounds ([[STRUCT_WITH_ARRAY:%.*]], ptr @global.array_in_struct, i64 0, i32 0, i32 1), align 8
82
+ ; CHECK-NEXT: store i64 0, ptr getelementptr inbounds ([[STRUCT_WITH_ARRAY]], ptr @global.array_in_struct, i64 0, i32 0, i32 2), align 8
83
+ ; CHECK-NEXT: store i64 0, ptr getelementptr inbounds ([[STRUCT_WITH_ARRAY]], ptr @global.array_in_struct, i64 0, i32 0, i32 3), align 8
84
+ ; CHECK-NEXT: store i64 0, ptr getelementptr inbounds ([[STRUCT_WITH_ARRAY]], ptr @global.array_in_struct, i64 0, i32 0, i32 4), align 8
85
+ ; CHECK-NEXT: store i64 0, ptr getelementptr inbounds ([[STRUCT_WITH_ARRAY]], ptr @global.array_in_struct, i64 0, i32 0, i32 5), align 8
86
+ ; CHECK-NEXT: store i64 0, ptr getelementptr inbounds ([[STRUCT_WITH_ARRAY]], ptr @global.array_in_struct, i64 0, i32 0, i32 6), align 8
87
+ ; CHECK-NEXT: store i64 0, ptr getelementptr inbounds ([[STRUCT_WITH_ARRAY]], ptr @global.array_in_struct, i64 0, i32 0, i32 7), align 8
88
+ ; CHECK-NEXT: store i64 0, ptr getelementptr inbounds ([[STRUCT_WITH_ARRAY]], ptr @global.array_in_struct, i64 0, i32 0, i32 8), align 8
89
+ ; CHECK-NEXT: store i64 0, ptr getelementptr inbounds ([[STRUCT_WITH_ARRAY]], ptr @global.array_in_struct, i64 0, i32 0, i32 9), align 8
90
+ ; CHECK-NEXT: store i64 0, ptr getelementptr inbounds ([[STRUCT_WITH_ARRAY]], ptr @global.array_in_struct, i64 0, i32 0, i32 10), align 8
91
+ ; CHECK-NEXT: store i64 0, ptr getelementptr inbounds ([[STRUCT_WITH_ARRAY]], ptr @global.array_in_struct, i64 0, i32 0, i32 11), align 8
92
+ ; CHECK-NEXT: store i64 0, ptr getelementptr inbounds ([[STRUCT_WITH_ARRAY]], ptr @global.array_in_struct, i64 0, i32 0, i32 12), align 8
93
+ ; CHECK-NEXT: store i64 0, ptr getelementptr inbounds ([[STRUCT_WITH_ARRAY]], ptr @global.array_in_struct, i64 0, i32 0, i32 13), align 8
94
+ ; CHECK-NEXT: store i64 0, ptr getelementptr inbounds ([[STRUCT_WITH_ARRAY]], ptr @global.array_in_struct, i64 0, i32 0, i32 14), align 8
95
+ ; CHECK-NEXT: store i64 0, ptr getelementptr inbounds ([[STRUCT_WITH_ARRAY]], ptr @global.array_in_struct, i64 0, i32 0, i32 15), align 8
96
+ ; CHECK-NEXT: tail call fastcc void @read_non_array_field()
97
+ ; CHECK-NEXT: ret void
72
98
;
73
- %tmp = tail call i32 @write (ptr null )
74
- ret i32 %tmp
99
+ store i64 0 , ptr getelementptr inbounds (%struct.with.array , ptr @global.array_in_struct , i64 0 , i32 0 , i32 0 ), align 8
100
+ store i64 0 , ptr getelementptr inbounds (%struct.with.array , ptr @global.array_in_struct , i64 0 , i32 0 , i32 1 ), align 8
101
+ store i64 0 , ptr getelementptr inbounds (%struct.with.array , ptr @global.array_in_struct , i64 0 , i32 0 , i32 2 ), align 8
102
+ store i64 0 , ptr getelementptr inbounds (%struct.with.array , ptr @global.array_in_struct , i64 0 , i32 0 , i32 3 ), align 8
103
+ store i64 0 , ptr getelementptr inbounds (%struct.with.array , ptr @global.array_in_struct , i64 0 , i32 0 , i32 4 ), align 8
104
+ store i64 0 , ptr getelementptr inbounds (%struct.with.array , ptr @global.array_in_struct , i64 0 , i32 0 , i32 5 ), align 8
105
+ store i64 0 , ptr getelementptr inbounds (%struct.with.array , ptr @global.array_in_struct , i64 0 , i32 0 , i32 6 ), align 8
106
+ store i64 0 , ptr getelementptr inbounds (%struct.with.array , ptr @global.array_in_struct , i64 0 , i32 0 , i32 7 ), align 8
107
+ store i64 0 , ptr getelementptr inbounds (%struct.with.array , ptr @global.array_in_struct , i64 0 , i32 0 , i32 8 ), align 8
108
+ store i64 0 , ptr getelementptr inbounds (%struct.with.array , ptr @global.array_in_struct , i64 0 , i32 0 , i32 9 ), align 8
109
+ store i64 0 , ptr getelementptr inbounds (%struct.with.array , ptr @global.array_in_struct , i64 0 , i32 0 , i32 10 ), align 8
110
+ store i64 0 , ptr getelementptr inbounds (%struct.with.array , ptr @global.array_in_struct , i64 0 , i32 0 , i32 11 ), align 8
111
+ store i64 0 , ptr getelementptr inbounds (%struct.with.array , ptr @global.array_in_struct , i64 0 , i32 0 , i32 12 ), align 8
112
+ store i64 0 , ptr getelementptr inbounds (%struct.with.array , ptr @global.array_in_struct , i64 0 , i32 0 , i32 13 ), align 8
113
+ store i64 0 , ptr getelementptr inbounds (%struct.with.array , ptr @global.array_in_struct , i64 0 , i32 0 , i32 14 ), align 8
114
+ store i64 0 , ptr getelementptr inbounds (%struct.with.array , ptr @global.array_in_struct , i64 0 , i32 0 , i32 15 ), align 8
115
+ tail call void @read_non_array_field ()
116
+ ret void
117
+ }
118
+
119
+ @global.array = internal global [100 x i64 ] zeroinitializer
120
+
121
+ define internal void @read_array () {
122
+ ; CHECK-LABEL: @read_array(
123
+ ; CHECK-NEXT: [[TMP:%.*]] = load i64, ptr getelementptr inbounds ([100 x i64], ptr @global.array, i64 0, i32 99), align 8
124
+ ; CHECK-NEXT: ret void
125
+ ;
126
+ %tmp = load i64 , ptr getelementptr inbounds ([100 x i64 ], ptr @global.array , i64 0 , i32 99 ), align 8
127
+ ret void
128
+ }
129
+
130
+ define void @store_to_array () {
131
+ ; CHECK-LABEL: @store_to_array(
132
+ ; CHECK-NEXT: store i64 0, ptr @global.array, align 8
133
+ ; CHECK-NEXT: store i64 0, ptr getelementptr inbounds ([100 x i64], ptr @global.array, i64 0, i32 1), align 8
134
+ ; CHECK-NEXT: store i64 0, ptr getelementptr inbounds ([100 x i64], ptr @global.array, i64 0, i32 2), align 8
135
+ ; CHECK-NEXT: store i64 0, ptr getelementptr inbounds ([100 x i64], ptr @global.array, i64 0, i32 3), align 8
136
+ ; CHECK-NEXT: store i64 0, ptr getelementptr inbounds ([100 x i64], ptr @global.array, i64 0, i32 4), align 8
137
+ ; CHECK-NEXT: store i64 0, ptr getelementptr inbounds ([100 x i64], ptr @global.array, i64 0, i32 5), align 8
138
+ ; CHECK-NEXT: store i64 0, ptr getelementptr inbounds ([100 x i64], ptr @global.array, i64 0, i32 6), align 8
139
+ ; CHECK-NEXT: store i64 0, ptr getelementptr inbounds ([100 x i64], ptr @global.array, i64 0, i32 7), align 8
140
+ ; CHECK-NEXT: store i64 0, ptr getelementptr inbounds ([100 x i64], ptr @global.array, i64 0, i32 8), align 8
141
+ ; CHECK-NEXT: store i64 0, ptr getelementptr inbounds ([100 x i64], ptr @global.array, i64 0, i32 9), align 8
142
+ ; CHECK-NEXT: store i64 0, ptr getelementptr inbounds ([100 x i64], ptr @global.array, i64 0, i32 10), align 8
143
+ ; CHECK-NEXT: store i64 0, ptr getelementptr inbounds ([100 x i64], ptr @global.array, i64 0, i32 11), align 8
144
+ ; CHECK-NEXT: store i64 0, ptr getelementptr inbounds ([100 x i64], ptr @global.array, i64 0, i32 12), align 8
145
+ ; CHECK-NEXT: store i64 0, ptr getelementptr inbounds ([100 x i64], ptr @global.array, i64 0, i32 13), align 8
146
+ ; CHECK-NEXT: store i64 0, ptr getelementptr inbounds ([100 x i64], ptr @global.array, i64 0, i32 14), align 8
147
+ ; CHECK-NEXT: store i64 0, ptr getelementptr inbounds ([100 x i64], ptr @global.array, i64 0, i32 15), align 8
148
+ ; CHECK-NEXT: tail call fastcc void @read_array()
149
+ ; CHECK-NEXT: ret void
150
+ ;
151
+ store i64 0 , ptr getelementptr inbounds ([100 x i64 ], ptr @global.array , i64 0 , i32 0 ), align 8
152
+ store i64 0 , ptr getelementptr inbounds ([100 x i64 ], ptr @global.array , i64 0 , i32 1 ), align 8
153
+ store i64 0 , ptr getelementptr inbounds ([100 x i64 ], ptr @global.array , i64 0 , i32 2 ), align 8
154
+ store i64 0 , ptr getelementptr inbounds ([100 x i64 ], ptr @global.array , i64 0 , i32 3 ), align 8
155
+ store i64 0 , ptr getelementptr inbounds ([100 x i64 ], ptr @global.array , i64 0 , i32 4 ), align 8
156
+ store i64 0 , ptr getelementptr inbounds ([100 x i64 ], ptr @global.array , i64 0 , i32 5 ), align 8
157
+ store i64 0 , ptr getelementptr inbounds ([100 x i64 ], ptr @global.array , i64 0 , i32 6 ), align 8
158
+ store i64 0 , ptr getelementptr inbounds ([100 x i64 ], ptr @global.array , i64 0 , i32 7 ), align 8
159
+ store i64 0 , ptr getelementptr inbounds ([100 x i64 ], ptr @global.array , i64 0 , i32 8 ), align 8
160
+ store i64 0 , ptr getelementptr inbounds ([100 x i64 ], ptr @global.array , i64 0 , i32 9 ), align 8
161
+ store i64 0 , ptr getelementptr inbounds ([100 x i64 ], ptr @global.array , i64 0 , i32 10 ), align 8
162
+ store i64 0 , ptr getelementptr inbounds ([100 x i64 ], ptr @global.array , i64 0 , i32 11 ), align 8
163
+ store i64 0 , ptr getelementptr inbounds ([100 x i64 ], ptr @global.array , i64 0 , i32 12 ), align 8
164
+ store i64 0 , ptr getelementptr inbounds ([100 x i64 ], ptr @global.array , i64 0 , i32 13 ), align 8
165
+ store i64 0 , ptr getelementptr inbounds ([100 x i64 ], ptr @global.array , i64 0 , i32 14 ), align 8
166
+ store i64 0 , ptr getelementptr inbounds ([100 x i64 ], ptr @global.array , i64 0 , i32 15 ), align 8
167
+ tail call void @read_array ()
168
+ ret void
75
169
}
0 commit comments