21
21
define void @dont_fold_unsized_type() { ret void }
22
22
define void @dont_fold_thread_local() { ret void }
23
23
...
24
+ # We should fold the offset 1 into the G_GLOBAL_VALUE.
24
25
---
25
26
name : one_ptr_add
26
27
alignment : 4
@@ -30,20 +31,21 @@ body: |
30
31
bb.0:
31
32
liveins: $x0
32
33
33
- ; We should fold the offset 1 into the G_GLOBAL_VALUE.
34
-
35
34
; CHECK-LABEL: name: one_ptr_add
36
35
; CHECK: liveins: $x0
37
- ; CHECK: [[GV:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @g + 1
38
- ; CHECK: $x0 = COPY [[GV]](p0)
39
- ; CHECK: RET_ReallyLR implicit $x0
36
+ ; CHECK-NEXT: {{ $}}
37
+ ; CHECK-NEXT: [[GV:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @g + 1
38
+ ; CHECK-NEXT: $x0 = COPY [[GV]](p0)
39
+ ; CHECK-NEXT: RET_ReallyLR implicit $x0
40
40
%global:_(p0) = G_GLOBAL_VALUE @g
41
41
%offset:_(s64) = G_CONSTANT i64 1
42
42
%ptr_add:_(p0) = G_PTR_ADD %global, %offset(s64)
43
43
$x0 = COPY %ptr_add
44
44
RET_ReallyLR implicit $x0
45
45
46
46
...
47
+ # We should fold the offset 1 into the G_GLOBAL_VALUE, resulting in a
48
+ # final offset of 4.
47
49
---
48
50
name : add_to_offset
49
51
alignment : 4
@@ -53,21 +55,21 @@ body: |
53
55
bb.0:
54
56
liveins: $x0
55
57
56
- ; We should fold the offset 1 into the G_GLOBAL_VALUE, resulting in a
57
- ; final offset of 4.
58
-
59
58
; CHECK-LABEL: name: add_to_offset
60
59
; CHECK: liveins: $x0
61
- ; CHECK: [[GV:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @g + 4
62
- ; CHECK: $x0 = COPY [[GV]](p0)
63
- ; CHECK: RET_ReallyLR implicit $x0
60
+ ; CHECK-NEXT: {{ $}}
61
+ ; CHECK-NEXT: [[GV:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @g + 4
62
+ ; CHECK-NEXT: $x0 = COPY [[GV]](p0)
63
+ ; CHECK-NEXT: RET_ReallyLR implicit $x0
64
64
%global:_(p0) = G_GLOBAL_VALUE @g + 3
65
65
%offset:_(s64) = G_CONSTANT i64 1
66
66
%ptr_add:_(p0) = G_PTR_ADD %global, %offset(s64)
67
67
$x0 = COPY %ptr_add
68
68
RET_ReallyLR implicit $x0
69
69
70
70
...
71
+ # We're allowed to have more than one G_PTR_ADD use. We should fold 1 into
72
+ # the G_GLOBAL_VALUE's offset.
71
73
---
72
74
name : two_ptr_adds_same_offset
73
75
alignment : 4
@@ -77,17 +79,15 @@ body: |
77
79
bb.0:
78
80
liveins: $x0, $x1
79
81
80
- ; We're allowed to have more than one G_PTR_ADD use. We should fold 1 into
81
- ; the G_GLOBAL_VALUE's offset.
82
-
83
82
; CHECK-LABEL: name: two_ptr_adds_same_offset
84
83
; CHECK: liveins: $x0, $x1
85
- ; CHECK: %val1:_(s64) = COPY $x0
86
- ; CHECK: %val2:_(s64) = COPY $x1
87
- ; CHECK: [[GV:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @g + 1
88
- ; CHECK: G_STORE %val1(s64), [[GV]](p0) :: (store (s64))
89
- ; CHECK: G_STORE %val2(s64), [[GV]](p0) :: (store (s64))
90
- ; CHECK: RET_ReallyLR implicit $x0
84
+ ; CHECK-NEXT: {{ $}}
85
+ ; CHECK-NEXT: %val1:_(s64) = COPY $x0
86
+ ; CHECK-NEXT: %val2:_(s64) = COPY $x1
87
+ ; CHECK-NEXT: [[GV:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @g + 1
88
+ ; CHECK-NEXT: G_STORE %val1(s64), [[GV]](p0) :: (store (s64))
89
+ ; CHECK-NEXT: G_STORE %val2(s64), [[GV]](p0) :: (store (s64))
90
+ ; CHECK-NEXT: RET_ReallyLR implicit $x0
91
91
%val1:_(s64) = COPY $x0
92
92
%val2:_(s64) = COPY $x1
93
93
%global:_(p0) = G_GLOBAL_VALUE @g
@@ -99,6 +99,9 @@ body: |
99
99
RET_ReallyLR implicit $x0
100
100
101
101
...
102
+ # The lowest offset G_PTR_ADD (2) should be folded into the G_GLOBAL_VALUE.
103
+ #
104
+ # The other G_PTR_ADD should have its offset decremented by 2.
102
105
---
103
106
name : two_ptr_adds_different_offset
104
107
alignment : 4
@@ -107,20 +110,18 @@ machineFunctionInfo: {}
107
110
body : |
108
111
bb.0:
109
112
liveins: $x0, $x1
110
- ; The lowest offset G_PTR_ADD (2) should be folded into the G_GLOBAL_VALUE.
111
- ;
112
- ; The other G_PTR_ADD should have its offset decremented by 2.
113
113
114
114
; CHECK-LABEL: name: two_ptr_adds_different_offset
115
115
; CHECK: liveins: $x0, $x1
116
- ; CHECK: %val1:_(s64) = COPY $x0
117
- ; CHECK: %val2:_(s64) = COPY $x1
118
- ; CHECK: [[GV:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @g + 2
119
- ; CHECK: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 8
120
- ; CHECK: %ptr_add2:_(p0) = G_PTR_ADD [[GV]], [[C]](s64)
121
- ; CHECK: G_STORE %val1(s64), [[GV]](p0) :: (store (s64))
122
- ; CHECK: G_STORE %val2(s64), %ptr_add2(p0) :: (store (s64))
123
- ; CHECK: RET_ReallyLR implicit $x0
116
+ ; CHECK-NEXT: {{ $}}
117
+ ; CHECK-NEXT: %val1:_(s64) = COPY $x0
118
+ ; CHECK-NEXT: %val2:_(s64) = COPY $x1
119
+ ; CHECK-NEXT: [[GV:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @g + 2
120
+ ; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 8
121
+ ; CHECK-NEXT: %ptr_add2:_(p0) = G_PTR_ADD [[GV]], [[C]](s64)
122
+ ; CHECK-NEXT: G_STORE %val1(s64), [[GV]](p0) :: (store (s64))
123
+ ; CHECK-NEXT: G_STORE %val2(s64), %ptr_add2(p0) :: (store (s64))
124
+ ; CHECK-NEXT: RET_ReallyLR implicit $x0
124
125
%val1:_(s64) = COPY $x0
125
126
%val2:_(s64) = COPY $x1
126
127
%global:_(p0) = G_GLOBAL_VALUE @g
@@ -133,6 +134,11 @@ body: |
133
134
RET_ReallyLR implicit $x0
134
135
135
136
...
137
+ # We should be able to fold all of the G_PTR_ADDs, except for the last one
138
+ # into the G_GLOBAL_VALUE.
139
+ #
140
+ # (TypeAllocSize = 4, so the offset on the G_GLOBAL_VALUE can't go above
141
+ # that.)
136
142
---
137
143
name : ptr_add_chain
138
144
alignment : 4
@@ -141,19 +147,15 @@ machineFunctionInfo: {}
141
147
body : |
142
148
bb.0:
143
149
liveins: $x0
144
- ; We should be able to fold all of the G_PTR_ADDs, except for the last one
145
- ; into the G_GLOBAL_VALUE.
146
- ;
147
- ; (TypeAllocSize = 4, so the offset on the G_GLOBAL_VALUE can't go above
148
- ; that.)
149
150
150
151
; CHECK-LABEL: name: ptr_add_chain
151
152
; CHECK: liveins: $x0
152
- ; CHECK: [[GV:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @g + 1
153
- ; CHECK: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 4
154
- ; CHECK: %dont_fold_me:_(p0) = G_PTR_ADD [[GV]], [[C]](s64)
155
- ; CHECK: $x0 = COPY %dont_fold_me(p0)
156
- ; CHECK: RET_ReallyLR implicit $x0
153
+ ; CHECK-NEXT: {{ $}}
154
+ ; CHECK-NEXT: [[GV:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @g + 1
155
+ ; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 4
156
+ ; CHECK-NEXT: %dont_fold_me:_(p0) = G_PTR_ADD [[GV]], [[C]](s64)
157
+ ; CHECK-NEXT: $x0 = COPY %dont_fold_me(p0)
158
+ ; CHECK-NEXT: RET_ReallyLR implicit $x0
157
159
%global:_(p0) = G_GLOBAL_VALUE @g
158
160
%offset:_(s64) = G_CONSTANT i64 1
159
161
%ptr_add1:_(p0) = G_PTR_ADD %global, %offset(s64)
@@ -165,6 +167,7 @@ body: |
165
167
RET_ReallyLR implicit $x0
166
168
167
169
...
170
+ # Do not add negative offsets to G_GLOBAL_VALUE.
168
171
---
169
172
name : dont_fold_negative_offset
170
173
alignment : 4
@@ -174,22 +177,22 @@ body: |
174
177
bb.0:
175
178
liveins: $x0
176
179
177
- ; Do not add negative offsets to G_GLOBAL_VALUE.
178
-
179
180
; CHECK-LABEL: name: dont_fold_negative_offset
180
181
; CHECK: liveins: $x0
181
- ; CHECK: %global:_(p0) = G_GLOBAL_VALUE @g
182
- ; CHECK: %offset:_(s64) = G_CONSTANT i64 -1
183
- ; CHECK: %ptr_add:_(p0) = G_PTR_ADD %global, %offset(s64)
184
- ; CHECK: $x0 = COPY %ptr_add(p0)
185
- ; CHECK: RET_ReallyLR implicit $x0
182
+ ; CHECK-NEXT: {{ $}}
183
+ ; CHECK-NEXT: %global:_(p0) = G_GLOBAL_VALUE @g
184
+ ; CHECK-NEXT: %offset:_(s64) = G_CONSTANT i64 -1
185
+ ; CHECK-NEXT: %ptr_add:_(p0) = G_PTR_ADD %global, %offset(s64)
186
+ ; CHECK-NEXT: $x0 = COPY %ptr_add(p0)
187
+ ; CHECK-NEXT: RET_ReallyLR implicit $x0
186
188
%global:_(p0) = G_GLOBAL_VALUE @g
187
189
%offset:_(s64) = G_CONSTANT i64 -1
188
190
%ptr_add:_(p0) = G_PTR_ADD %global, %offset(s64)
189
191
$x0 = COPY %ptr_add
190
192
RET_ReallyLR implicit $x0
191
193
192
194
...
195
+ # Do not create smaller offsets. Ensures combine termination.
193
196
---
194
197
name : dont_min_offset_less_than_curr_offset
195
198
alignment : 4
@@ -199,22 +202,23 @@ body: |
199
202
bb.0:
200
203
liveins: $x0
201
204
202
- ; Do not create smaller offsets. Ensures combine termination.
203
-
204
205
; CHECK-LABEL: name: dont_min_offset_less_than_curr_offset
205
206
; CHECK: liveins: $x0
206
- ; CHECK: %global:_(p0) = G_GLOBAL_VALUE @g + 3
207
- ; CHECK: %offset:_(s64) = G_CONSTANT i64 -1
208
- ; CHECK: %ptr_add:_(p0) = G_PTR_ADD %global, %offset(s64)
209
- ; CHECK: $x0 = COPY %ptr_add(p0)
210
- ; CHECK: RET_ReallyLR implicit $x0
207
+ ; CHECK-NEXT: {{ $}}
208
+ ; CHECK-NEXT: %global:_(p0) = G_GLOBAL_VALUE @g + 3
209
+ ; CHECK-NEXT: %offset:_(s64) = G_CONSTANT i64 -1
210
+ ; CHECK-NEXT: %ptr_add:_(p0) = G_PTR_ADD %global, %offset(s64)
211
+ ; CHECK-NEXT: $x0 = COPY %ptr_add(p0)
212
+ ; CHECK-NEXT: RET_ReallyLR implicit $x0
211
213
%global:_(p0) = G_GLOBAL_VALUE @g + 3
212
214
%offset:_(s64) = G_CONSTANT i64 -1
213
215
%ptr_add:_(p0) = G_PTR_ADD %global, %offset(s64)
214
216
$x0 = COPY %ptr_add
215
217
RET_ReallyLR implicit $x0
216
218
217
219
...
220
+ # 1 << 21 is the largest offset expressible in all object formats.
221
+ # Don't fold it.
218
222
---
219
223
name : dont_fold_max_offset
220
224
alignment : 4
@@ -224,23 +228,22 @@ body: |
224
228
bb.0:
225
229
liveins: $x0
226
230
227
- ; 1 << 21 is the largest offset expressible in all object formats.
228
- ; Don't fold it.
229
-
230
231
; CHECK-LABEL: name: dont_fold_max_offset
231
232
; CHECK: liveins: $x0
232
- ; CHECK: %global:_(p0) = G_GLOBAL_VALUE @g
233
- ; CHECK: %offset:_(s64) = G_CONSTANT i64 4292870144
234
- ; CHECK: %ptr_add:_(p0) = G_PTR_ADD %global, %offset(s64)
235
- ; CHECK: $x0 = COPY %ptr_add(p0)
236
- ; CHECK: RET_ReallyLR implicit $x0
233
+ ; CHECK-NEXT: {{ $}}
234
+ ; CHECK-NEXT: %global:_(p0) = G_GLOBAL_VALUE @g
235
+ ; CHECK-NEXT: %offset:_(s64) = G_CONSTANT i64 4292870144
236
+ ; CHECK-NEXT: %ptr_add:_(p0) = G_PTR_ADD %global, %offset(s64)
237
+ ; CHECK-NEXT: $x0 = COPY %ptr_add(p0)
238
+ ; CHECK-NEXT: RET_ReallyLR implicit $x0
237
239
%global:_(p0) = G_GLOBAL_VALUE @g
238
240
%offset:_(s64) = G_CONSTANT i64 4292870144 ; 1 << 21
239
241
%ptr_add:_(p0) = G_PTR_ADD %global, %offset(s64)
240
242
$x0 = COPY %ptr_add
241
243
RET_ReallyLR implicit $x0
242
244
243
245
...
246
+ # Type alloc size = 4, offset = 16. Don't fold.
244
247
---
245
248
name : dont_fold_offset_larger_than_type_alloc
246
249
alignment : 4
@@ -249,58 +252,56 @@ machineFunctionInfo: {}
249
252
body : |
250
253
bb.0:
251
254
252
- ; Type alloc size = 4, offset = 16. Don't fold.
253
-
254
255
; CHECK-LABEL: name: dont_fold_offset_larger_than_type_alloc
255
256
; CHECK: %global:_(p0) = G_GLOBAL_VALUE @g
256
- ; CHECK: %offset:_(s64) = G_CONSTANT i64 16
257
- ; CHECK: %ptr_add:_(p0) = G_PTR_ADD %global, %offset(s64)
258
- ; CHECK: $x0 = COPY %ptr_add(p0)
259
- ; CHECK: RET_ReallyLR implicit $x0
257
+ ; CHECK-NEXT : %offset:_(s64) = G_CONSTANT i64 16
258
+ ; CHECK-NEXT : %ptr_add:_(p0) = G_PTR_ADD %global, %offset(s64)
259
+ ; CHECK-NEXT : $x0 = COPY %ptr_add(p0)
260
+ ; CHECK-NEXT : RET_ReallyLR implicit $x0
260
261
%global:_(p0) = G_GLOBAL_VALUE @g
261
262
%offset:_(s64) = G_CONSTANT i64 16
262
263
%ptr_add:_(p0) = G_PTR_ADD %global, %offset(s64)
263
264
$x0 = COPY %ptr_add(p0)
264
265
RET_ReallyLR implicit $x0
265
266
266
267
...
268
+ # Check that we don't touch unsized globals.
267
269
---
268
270
name : dont_fold_unsized_type
269
271
alignment : 4
270
272
tracksRegLiveness : true
271
273
machineFunctionInfo : {}
272
274
body : |
273
275
bb.0:
274
- ; Check that we don't touch unsized globals.
275
276
276
277
; CHECK-LABEL: name: dont_fold_unsized_type
277
278
; CHECK: %global:_(p0) = G_GLOBAL_VALUE @unsized
278
- ; CHECK: %offset:_(s64) = G_CONSTANT i64 16
279
- ; CHECK: %ptr_add:_(p0) = G_PTR_ADD %global, %offset(s64)
280
- ; CHECK: $x0 = COPY %ptr_add(p0)
281
- ; CHECK: RET_ReallyLR implicit $x0
279
+ ; CHECK-NEXT : %offset:_(s64) = G_CONSTANT i64 16
280
+ ; CHECK-NEXT : %ptr_add:_(p0) = G_PTR_ADD %global, %offset(s64)
281
+ ; CHECK-NEXT : $x0 = COPY %ptr_add(p0)
282
+ ; CHECK-NEXT : RET_ReallyLR implicit $x0
282
283
%global:_(p0) = G_GLOBAL_VALUE @unsized
283
284
%offset:_(s64) = G_CONSTANT i64 16
284
285
%ptr_add:_(p0) = G_PTR_ADD %global, %offset(s64)
285
286
$x0 = COPY %ptr_add(p0)
286
287
RET_ReallyLR implicit $x0
287
288
288
289
...
290
+ # Check that we don't touch thread-local globals.
289
291
---
290
292
name : dont_fold_thread_local
291
293
alignment : 4
292
294
tracksRegLiveness : true
293
295
machineFunctionInfo : {}
294
296
body : |
295
297
bb.0:
296
- ; Check that we don't touch thread-local globals.
297
298
298
299
; CHECK-LABEL: name: dont_fold_thread_local
299
300
; CHECK: %global:_(p0) = G_GLOBAL_VALUE @thread_local
300
- ; CHECK: %offset:_(s64) = G_CONSTANT i64 16
301
- ; CHECK: %ptr_add:_(p0) = G_PTR_ADD %global, %offset(s64)
302
- ; CHECK: $x0 = COPY %ptr_add(p0)
303
- ; CHECK: RET_ReallyLR implicit $x0
301
+ ; CHECK-NEXT : %offset:_(s64) = G_CONSTANT i64 16
302
+ ; CHECK-NEXT : %ptr_add:_(p0) = G_PTR_ADD %global, %offset(s64)
303
+ ; CHECK-NEXT : $x0 = COPY %ptr_add(p0)
304
+ ; CHECK-NEXT : RET_ReallyLR implicit $x0
304
305
%global:_(p0) = G_GLOBAL_VALUE @thread_local
305
306
%offset:_(s64) = G_CONSTANT i64 16
306
307
%ptr_add:_(p0) = G_PTR_ADD %global, %offset(s64)
0 commit comments