1
1
// RUN: %target-sil-opt %s -accessed-storage-dump -enable-sil-verify-all -o /dev/null | %FileCheck %s
2
+ // RUN: %target-sil-opt %s -access-path-verification -o /dev/null
3
+
4
+ // REQUIRES: PTRSIZE=64
2
5
3
6
sil_stage canonical
4
7
@@ -14,6 +17,9 @@ struct MyStruct {
14
17
// CHECK-LABEL: @testStructPhiCommon
15
18
// CHECK: store
16
19
// CHECK: Argument %0 = argument of bb0 : $*MyStruct
20
+ // CHECK: Base: %0 = argument of bb0 : $*MyStruct
21
+ // CHECK: Storage: Argument %0 = argument of bb0 : $*MyStruct
22
+ // CHECK: Path: (#0)
17
23
sil hidden @testStructPhiCommon : $@convention(thin) (@inout MyStruct) -> () {
18
24
bb0(%0 : $*MyStruct):
19
25
%2 = struct_element_addr %0 : $*MyStruct, #MyStruct.i
@@ -42,6 +48,7 @@ bb3(%6 : $Builtin.RawPointer) :
42
48
// CHECK-LABEL: @testStructPhiDivergent
43
49
// CHECK: store
44
50
// CHECK: INVALID
51
+ // CHECK: INVALID
45
52
sil hidden @testStructPhiDivergent : $@convention(thin) (@inout MyStruct) -> () {
46
53
bb0(%0 : $*MyStruct):
47
54
cond_br undef, bb1, bb2
@@ -75,6 +82,7 @@ bb3(%6 : $Builtin.RawPointer) :
75
82
// CHECK-LABEL: @testStructPhiChained
76
83
// CHECK: store
77
84
// CHECK: INVALID
85
+ // CHECK: INVALID
78
86
sil hidden @testStructPhiChained : $@convention(thin) (@inout MyStruct, @inout Int64) -> () {
79
87
bb0(%0 : $*MyStruct, %1 : $*Int64):
80
88
cond_br undef, bb1, bb5
@@ -123,9 +131,15 @@ struct MyArray<T> {
123
131
124
132
// CHECK-LABEL: @arrayValue
125
133
// CHECK: load [trivial] %{{.*}} : $*Builtin.Int64
126
- // CHECK: Tail %{{.*}} = unchecked_ref_cast [[REF:%[0-9]+]] : $Builtin.BridgeObject to $__ContiguousArrayStorageBase
134
+ // CHECK: Tail %{{.*}} = unchecked_ref_cast %{{.*}} : $Builtin.BridgeObject to $__ContiguousArrayStorageBase
135
+ // CHECK: Base: %{{.*}} = ref_tail_addr [immutable] %{{.*}} : $__ContiguousArrayStorageBase, $Int64
136
+ // CHECK: Storage: Tail %{{.*}} = unchecked_ref_cast %{{.*}} : $Builtin.BridgeObject to $__ContiguousArrayStorageBase
137
+ // CHECK: Path: (@3,#0)
127
138
// CHECK: load [trivial] %{{.*}} : $*Builtin.Int64
128
- // CHECK: Tail %{{.*}} = unchecked_ref_cast [[REF:%[0-9]+]] : $Builtin.BridgeObject to $__ContiguousArrayStorageBase
139
+ // CHECK: Tail %{{.*}} = unchecked_ref_cast %{{.*}} : $Builtin.BridgeObject to $__ContiguousArrayStorageBase
140
+ // CHECK: Base: %{{.*}} = ref_tail_addr [immutable] %{{.*}} : $__ContiguousArrayStorageBase, $Int64
141
+ // CHECK: Storage: Tail %{{.*}} = unchecked_ref_cast %{{.*}} : $Builtin.BridgeObject to $__ContiguousArrayStorageBase
142
+ // CHECK: Path: (@4,#0)
129
143
sil [ossa] @arrayValue : $@convention(thin) (@guaranteed MyArray<Int64>) -> Int64 {
130
144
bb0(%0 : @guaranteed $MyArray<Int64>):
131
145
%1 = integer_literal $Builtin.Word, 3
@@ -149,3 +163,303 @@ bb0(%0 : @guaranteed $MyArray<Int64>):
149
163
%19 = struct $Int64 (%16 : $Builtin.Int64)
150
164
return %19 : $Int64
151
165
}
166
+
167
+ // CHECK-LABEL: @staticIndexAddrChain
168
+ // CHECK: %{{.*}} = load [trivial] %{{.*}} : $*Int64
169
+ // CHECK: Argument %0 = argument of bb0 : $Builtin.RawPointer
170
+ // CHECK: Base: %0 = argument of bb0 : $Builtin.RawPointer
171
+ // CHECK: Storage: Argument %0 = argument of bb0 : $Builtin.RawPointer
172
+ // CHECK: Path: (@1,#0)
173
+ // CHECK: %{{.*}} = load [trivial] %{{.*}} : $*Int64
174
+ // CHECK: Argument %{{.*}} = argument of bb0 : $Builtin.RawPointer
175
+ // CHECK: Base: %0 = argument of bb0 : $Builtin.RawPointer
176
+ // CHECK: Storage: Argument %0 = argument of bb0 : $Builtin.RawPointer
177
+ // CHECK: Path: (@2,#0)
178
+ sil [ossa] @staticIndexAddrChain : $@convention(thin) (Builtin.RawPointer) -> () {
179
+ bb0(%0 : $Builtin.RawPointer):
180
+ %1 = pointer_to_address %0 : $Builtin.RawPointer to $*MyStruct
181
+ %2 = integer_literal $Builtin.Word, 1
182
+ %3 = index_addr %1 : $*MyStruct, %2 : $Builtin.Word
183
+ %4 = struct_element_addr %3 : $*MyStruct, #MyStruct.i
184
+ %5 = load [trivial] %4 : $*Int64
185
+ %6 = index_addr %3 : $*MyStruct, %2 : $Builtin.Word
186
+ %7 = struct_element_addr %6 : $*MyStruct, #MyStruct.i
187
+ %8 = load [trivial] %7 : $*Int64
188
+ %99 = tuple ()
189
+ return %99 : $()
190
+ }
191
+
192
+ // CHECK-LABEL: @staticIndexAddrSubobject
193
+ // CHECK: ###For MemOp: %5 = load [trivial] %4 : $*Int64
194
+ // CHECK: Argument %0 = argument of bb0 : $Builtin.RawPointer // user: %1
195
+ // CHECK: INVALID
196
+ sil [ossa] @staticIndexAddrSubobject : $@convention(thin) (Builtin.RawPointer) -> () {
197
+ bb0(%0 : $Builtin.RawPointer):
198
+ %1 = pointer_to_address %0 : $Builtin.RawPointer to $*MyStruct
199
+ %2 = struct_element_addr %1 : $*MyStruct, #MyStruct.i
200
+ %3 = integer_literal $Builtin.Word, 1
201
+ %4 = index_addr %2 : $*Int64, %3 : $Builtin.Word
202
+ %5 = load [trivial] %4 : $*Int64
203
+ %99 = tuple ()
204
+ return %99 : $()
205
+ }
206
+
207
+ // CHECK-LABEL: @dynamicIndexAddrChain
208
+ // CHECK: %{{.*}} = load [trivial] %{{.*}} : $*Int64
209
+ // CHECK: Argument %0 = argument of bb0 : $Builtin.RawPointer
210
+ // CHECK: Base: %0 = argument of bb0 : $Builtin.RawPointer
211
+ // CHECK: Storage: Argument %0 = argument of bb0 : $Builtin.RawPointer
212
+ // CHECK: Path: (@Unknown,#0)
213
+ // CHECK: %{{.*}} = load [trivial] %{{.*}} : $*Int64
214
+ // CHECK: Argument %0 = argument of bb0 : $Builtin.RawPointer
215
+ // CHECK: Base: %0 = argument of bb0 : $Builtin.RawPointer
216
+ // CHECK: Storage: Argument %0 = argument of bb0 : $Builtin.RawPointer
217
+ // CHECK: Path: (@Unknown,#0)
218
+ sil [ossa] @dynamicIndexAddrChain : $@convention(thin) (Builtin.RawPointer, Builtin.Word) -> () {
219
+ bb0(%0 : $Builtin.RawPointer, %1 : $Builtin.Word):
220
+ %2 = pointer_to_address %0 : $Builtin.RawPointer to $*MyStruct
221
+ %3 = index_addr %2 : $*MyStruct, %1 : $Builtin.Word
222
+ %4 = struct_element_addr %3 : $*MyStruct, #MyStruct.i
223
+ %5 = load [trivial] %4 : $*Int64
224
+ %6 = integer_literal $Builtin.Word, 1
225
+ %7 = index_addr %3 : $*MyStruct, %6 : $Builtin.Word
226
+ %8 = struct_element_addr %7 : $*MyStruct, #MyStruct.i
227
+ %9 = load [trivial] %8 : $*Int64
228
+ %99 = tuple ()
229
+ return %99 : $()
230
+ }
231
+
232
+ // CHECK-LABEL: @staticIndexAddrCancel
233
+ // CHECK: %{{.*}} = load [trivial] %{{.*}} : $*Int64
234
+ // CHECK: Argument %0 = argument of bb0 : $Builtin.RawPointer
235
+ // CHECK: Base: %0 = argument of bb0 : $Builtin.RawPointer
236
+ // CHECK: Storage: Argument %0 = argument of bb0 : $Builtin.RawPointer
237
+ // CHECK: Path: (@1,#0)
238
+ // CHECK: %{{.*}} = load [trivial] %{{.*}} : $*Int64
239
+ // CHECK: Argument %0 = argument of bb0 : $Builtin.RawPointer
240
+ // CHECK: Base: %0 = argument of bb0 : $Builtin.RawPointer
241
+ // CHECK: Storage: Argument %0 = argument of bb0 : $Builtin.RawPointer
242
+ // CHECK: Path: (@2,#0)
243
+ sil [ossa] @staticIndexAddrCancel : $@convention(thin) (Builtin.RawPointer) -> () {
244
+ bb0(%0 : $Builtin.RawPointer):
245
+ %1 = pointer_to_address %0 : $Builtin.RawPointer to $*MyStruct
246
+ %2 = integer_literal $Builtin.Word, 1
247
+ %3 = index_addr %1 : $*MyStruct, %2 : $Builtin.Word
248
+ %4 = struct_element_addr %3 : $*MyStruct, #MyStruct.i
249
+ %5 = load [trivial] %4 : $*Int64
250
+ %6 = integer_literal $Builtin.Word, -1
251
+ %7 = index_addr %3 : $*MyStruct, %2 : $Builtin.Word
252
+ %8 = struct_element_addr %7 : $*MyStruct, #MyStruct.i
253
+ %9 = load [trivial] %8 : $*Int64
254
+ %99 = tuple ()
255
+ return %99 : $()
256
+ }
257
+
258
+ class A {
259
+ var prop0: Int64
260
+ }
261
+ class B : A {
262
+ var prop1: Int64
263
+ }
264
+
265
+ // CHECK-LABEL: @testNonUniquePropertyIndex
266
+ // CHECK: store %0 to %{{.*}} : $*Int64
267
+ // CHECK: Class %{{.*}} = alloc_ref $B
268
+ // CHECK: Field: var prop1: Int64 Index: 1
269
+ // CHECK: Base: %{{.*}} = ref_element_addr %{{.*}} : $B, #B.prop1
270
+ // CHECK: Storage: Class %{{.*}} = alloc_ref $B
271
+ // CHECK: Field: var prop1: Int64 Index: 1
272
+ // CHECK: Path: ()
273
+ // CHECK: store %0 to %{{.*}} : $*Int64
274
+ // CHECK: Class %{{.*}} = upcast %{{.*}} : $B to $A
275
+ // CHECK: Field: var prop0: Int64 Index: 0
276
+ // CHECK: Base: %{{.*}} = ref_element_addr %{{.*}} : $A, #A.prop0
277
+ // CHECK: Storage: Class %{{.*}} = upcast %{{.*}} : $B to $A
278
+ // CHECK: Field: var prop0: Int64 Index: 0
279
+ // CHECK: Path: ()
280
+ sil @testNonUniquePropertyIndex : $@convention(thin) (Int64) -> () {
281
+ bb0(%0 : $Int64):
282
+ %1 = alloc_ref $B
283
+ %2 = ref_element_addr %1 : $B, #B.prop1
284
+ store %0 to %2 : $*Int64
285
+ %4 = upcast %1 : $B to $A
286
+ %5 = ref_element_addr %4 : $A, #A.prop0
287
+ store %0 to %5 : $*Int64
288
+ %99 = tuple ()
289
+ return %99 : $()
290
+ }
291
+
292
+ // CHECK-LABEL: @testRefTailAndStruct0
293
+ // CHECK: %{{.*}} = load %{{.*}} : $*Builtin.Int64
294
+ // CHECK: Class %{{.*}} = unchecked_ref_cast %{{.*}} : $Builtin.BridgeObject to $__ContiguousArrayStorageBase
295
+ // CHECK: Field: @usableFromInline final var countAndCapacity: _ArrayBody Index: 0
296
+ // CHECK: Base: %{{.*}} = ref_element_addr [immutable] %{{.*}} : $__ContiguousArrayStorageBase, #__ContiguousArrayStorageBase.countAndCapacity
297
+ // CHECK: Storage: Class %{{.*}} = unchecked_ref_cast %{{.*}} : $Builtin.BridgeObject to $__ContiguousArrayStorageBase
298
+ // CHECK: Field: @usableFromInline final var countAndCapacity: _ArrayBody Index: 0
299
+ // CHECK: Path: (#0,#0,#0)
300
+ // CHECK: %{{.*}} = load %{{.*}} : $*_StringGuts
301
+ // CHECK: Tail %{{.*}} = unchecked_ref_cast %{{.*}} : $Builtin.BridgeObject to $__ContiguousArrayStorageBase
302
+ // CHECK: Base: %{{.*}} = ref_tail_addr [immutable] %{{.*}} : $__ContiguousArrayStorageBase, $String
303
+ // CHECK: Storage: Tail %{{.*}} = unchecked_ref_cast %{{.*}} : $Builtin.BridgeObject to $__ContiguousArrayStorageBase
304
+ // CHECK: Path: (#0)
305
+ // CHECK: %{{.*}} = load %{{.*}} : $*String
306
+ // CHECK: Tail %{{.*}} = unchecked_ref_cast %{{.*}} : $Builtin.BridgeObject to $__ContiguousArrayStorageBase
307
+ // CHECK: Base: %{{.*}} = ref_tail_addr [immutable] %{{.*}} : $__ContiguousArrayStorageBase, $String
308
+ // CHECK: Storage: Tail %{{.*}} = unchecked_ref_cast %{{.*}} : $Builtin.BridgeObject to $__ContiguousArrayStorageBase
309
+ // CHECK: Path: ()
310
+ sil hidden [noinline] @testRefTailAndStruct0 : $@convention(thin) (@owned MyArray<String>) -> () {
311
+ bb0(%0 : $MyArray<String>):
312
+ %1 = struct_extract %0 : $MyArray<String>, #MyArray._buffer
313
+ %2 = struct_extract %1 : $_MyArrayBuffer<String>, #_MyArrayBuffer._storage
314
+ %3 = struct_extract %2 : $_MyBridgeStorage, #_MyBridgeStorage.rawValue
315
+ %4 = unchecked_ref_cast %3 : $Builtin.BridgeObject to $__ContiguousArrayStorageBase
316
+ %5 = ref_element_addr [immutable] %4 : $__ContiguousArrayStorageBase, #__ContiguousArrayStorageBase.countAndCapacity
317
+ %6 = struct_element_addr %5 : $*_ArrayBody, #_ArrayBody._storage
318
+ %7 = struct_element_addr %6 : $*_SwiftArrayBodyStorage, #_SwiftArrayBodyStorage.count
319
+ %8 = struct_element_addr %7 : $*Int, #Int._value
320
+ %9 = load %8 : $*Builtin.Int64
321
+ %10 = ref_tail_addr [immutable] %4 : $__ContiguousArrayStorageBase, $String
322
+ %11 = struct_element_addr %10 : $*String, #String._guts
323
+ %12 = load %11 : $*_StringGuts
324
+ %13 = load %10 : $*String
325
+ %14 = tuple ()
326
+ return %14 : $()
327
+ }
328
+
329
+ // CHECK-LABEL: @testPointerDynamicIndex
330
+ // CHECK: ###For MemOp: %{{.*}} = load [trivial] %{{.*}} : $*MyStruct
331
+ // CHECK: Base: %0 = argument of bb0 : $Builtin.RawPointer
332
+ // CHECK: Storage: Argument %0 = argument of bb0 : $Builtin.RawPointer
333
+ // CHECK: Path: (@Unknown)
334
+ sil [serialized] [ossa] @testPointerDynamicIndex : $@convention(thin) (Builtin.RawPointer, Builtin.Word) -> () {
335
+ bb0(%0 : $Builtin.RawPointer, %1 : $Builtin.Word):
336
+ %2 = pointer_to_address %0 : $Builtin.RawPointer to [strict] $*MyStruct
337
+ %3 = index_addr %2 : $*MyStruct, %1 : $Builtin.Word
338
+ %4 = address_to_pointer %3 : $*MyStruct to $Builtin.RawPointer
339
+ %5 = pointer_to_address %4 : $Builtin.RawPointer to [strict] $*MyStruct
340
+ %6 = load [trivial] %5 : $*MyStruct
341
+ %7 = tuple ()
342
+ return %7 : $()
343
+ }
344
+
345
+ // CHECK-LABEL: @testAddressToPointer
346
+ // CHECK: ###For MemOp: %3 = load [trivial] %{{.*}} : $*MyStruct
347
+ // CHECK: Base: %0 = argument of bb0 : $*MyStruct
348
+ // CHECK: Storage: Argument %0 = argument of bb0 : $*MyStruct
349
+ // CHECK: Path: ()
350
+ // CHECK: ###For MemOp: %5 = load [trivial] %4 : $*Int64
351
+ // CHECK: Base: %0 = argument of bb0 : $*MyStruct
352
+ // CHECK: Storage: Argument %0 = argument of bb0 : $*MyStruct
353
+ // CHECK: Path: (#0)
354
+ sil [serialized] [ossa] @testAddressToPointer : $@convention(thin) (@in MyStruct) -> () {
355
+ bb18(%0 : $*MyStruct):
356
+ %1 = address_to_pointer %0 : $*MyStruct to $Builtin.RawPointer
357
+ %2 = pointer_to_address %1 : $Builtin.RawPointer to [strict] $*MyStruct
358
+ %3 = load [trivial] %2 : $*MyStruct
359
+ %4 = struct_element_addr %0 : $*MyStruct, #MyStruct.i
360
+ %5 = load [trivial] %4 : $*Int64
361
+ %6 = tuple ()
362
+ return %6 : $()
363
+ }
364
+
365
+ // CHECK-LABEL: @testIndexLoop
366
+ // CHECK: ###For MemOp: %3 = load %2 : $*AnyObject
367
+ // CHECK: Base: %1 = struct_extract %0 : $UnsafeMutablePointer<AnyObject>, #UnsafeMutablePointer._rawValue
368
+ // CHECK: Storage: Unidentified %1 = struct_extract %0 : $UnsafeMutablePointer<AnyObject>, #UnsafeMutablePointer._rawValue
369
+ // CHECK: Path: ()
370
+ // CHECK: ###For MemOp: %7 = load %6 : $*AnyObject
371
+ // CHECK: Base: %1 = struct_extract %0 : $UnsafeMutablePointer<AnyObject>, #UnsafeMutablePointer._rawValue
372
+ // CHECK: Storage: Unidentified %1 = struct_extract %0 : $UnsafeMutablePointer<AnyObject>, #UnsafeMutablePointer._rawValue
373
+ // CHECK: Path: (@Unknown)
374
+ // CHECK: ###For MemOp: store %7 to %6 : $*AnyObject // id: %8
375
+ // CHECK: Base: %1 = struct_extract %0 : $UnsafeMutablePointer<AnyObject>, #UnsafeMutablePointer._rawValue
376
+ // CHECK: Storage: Unidentified %1 = struct_extract %0 : $UnsafeMutablePointer<AnyObject>, #UnsafeMutablePointer._rawValue
377
+ // CHECK: Path: (@Unknown)
378
+ sil shared @testIndexLoop : $@convention(thin) (UnsafeMutablePointer<AnyObject>) -> UnsafeMutablePointer<AnyObject> {
379
+ bb0(%0 : $UnsafeMutablePointer<AnyObject>):
380
+ %1 = struct_extract %0 : $UnsafeMutablePointer<AnyObject>, #UnsafeMutablePointer._rawValue
381
+ %2 = pointer_to_address %1 : $Builtin.RawPointer to [strict] $*AnyObject
382
+ %3 = load %2 : $*AnyObject
383
+ br bb1(%1 : $Builtin.RawPointer)
384
+
385
+ bb1(%5 : $Builtin.RawPointer):
386
+ %6 = pointer_to_address %5 : $Builtin.RawPointer to [strict] $*AnyObject
387
+ %7 = load %6 : $*AnyObject
388
+ store %7 to %6 : $*AnyObject
389
+ %9 = integer_literal $Builtin.Word, 1
390
+ %10 = index_addr %6 : $*AnyObject, %9 : $Builtin.Word
391
+ %11 = address_to_pointer %10 : $*AnyObject to $Builtin.RawPointer
392
+ cond_br undef, bb2, bb3(%11 : $Builtin.RawPointer)
393
+
394
+ bb2:
395
+ br bb1(%11 : $Builtin.RawPointer)
396
+
397
+ bb3(%14 : $Builtin.RawPointer):
398
+ %15 = struct $UnsafeMutablePointer<AnyObject> (%14 : $Builtin.RawPointer)
399
+ return %15 : $UnsafeMutablePointer<AnyObject>
400
+ }
401
+
402
+ // Handle index_addr boundary conditions
403
+ // Most will end up as "unknown" offset, but we shouldn't crash.
404
+ // CHECK-LABEL: @indexAddrBoundaries
405
+ // CHECK: ###For MemOp: %4 = load %3 : $*Int
406
+ // CHECK: Path: (@Unknown)
407
+ // CHECK: ###For MemOp: %7 = load %6 : $*Int
408
+ // CHECK: Path: (@Unknown)
409
+ // CHECK: ###For MemOp: %10 = load %9 : $*Int
410
+ // CHECK: Path: (@Unknown)
411
+ // CHECK: ###For MemOp: %13 = load %12 : $*Int
412
+ // CHECK: Path: (@Unknown)
413
+ // CHECK: ###For MemOp: %16 = load %15 : $*Int
414
+ // CHECK: Path: (@1073741823)
415
+ // CHECK: ###For MemOp: %19 = load %18 : $*Int
416
+ // CHECK: Path: (@Unknown)
417
+ // CHECK: ###For MemOp: %22 = load %21 : $*Int
418
+ // CHECK: Path: (@Unknown)
419
+ // CHECK: ###For MemOp: %25 = load %24 : $*Int
420
+ // CHECK: Path: (@-1073741823)
421
+ // CHECK: ###For MemOp: %28 = load %27 : $*Int
422
+ // CHECK: Path: (@-1)
423
+ sil @indexAddrBoundaries : $@convention(thin) (Builtin.RawPointer) -> () {
424
+ bb0(%0 : $Builtin.RawPointer):
425
+ %1 = pointer_to_address %0 : $Builtin.RawPointer to [strict] $*Int
426
+ // INT_MIN (IndexTrie root)
427
+ %2 = integer_literal $Builtin.Word, 2147483648 // '0x80000000'
428
+ %3 = index_addr %1 : $*Int, %2 : $Builtin.Word
429
+ %4 = load %3 : $*Int
430
+ // INT_MIN (IndexTrie root)
431
+ %5 = integer_literal $Builtin.Word, -2147483648 // '0x80000000'
432
+ %6 = index_addr %1 : $*Int, %5 : $Builtin.Word
433
+ %7 = load %6 : $*Int
434
+ // INT_MAX (TailIndex)
435
+ %8 = integer_literal $Builtin.Word, 2147483647 // '0x7fffffff'
436
+ %9 = index_addr %1 : $*Int, %8 : $Builtin.Word
437
+ %10 = load %9 : $*Int
438
+ // Largest unsigned offset + 1
439
+ %11 = integer_literal $Builtin.Word, 1073741824 // '0x40000000'
440
+ %12 = index_addr %1 : $*Int, %11 : $Builtin.Word
441
+ %13 = load %12 : $*Int
442
+ // Largest unsigned offset
443
+ %14 = integer_literal $Builtin.Word, 1073741823 // '0x3fffffff'
444
+ %15 = index_addr %1 : $*Int, %14 : $Builtin.Word
445
+ %16 = load %15 : $*Int
446
+ // Smallest signed offset - 1
447
+ %17 = integer_literal $Builtin.Word, -1073741825 // '0xbfffffff'
448
+ %18 = index_addr %1 : $*Int, %17 : $Builtin.Word
449
+ %19 = load %18 : $*Int
450
+ // Smallest signed offset (Unknown offset)
451
+ %20 = integer_literal $Builtin.Word, -1073741824 // '0xc0000000'
452
+ %21 = index_addr %1 : $*Int, %20 : $Builtin.Word
453
+ %22 = load %21 : $*Int
454
+ // Smallest signed offset + 1 (concrete offset)
455
+ %23 = integer_literal $Builtin.Word, -1073741823 // '0xc0000001'
456
+ %24 = index_addr %1 : $*Int, %23 : $Builtin.Word
457
+ %25 = load %24 : $*Int
458
+ // Largest Negative
459
+ %26 = integer_literal $Builtin.Word, -1 // '0xffffffff'
460
+ %27 = index_addr %1 : $*Int, %26 : $Builtin.Word
461
+ %28 = load %27 : $*Int
462
+ //
463
+ %99 = tuple ()
464
+ return %99 : $()
465
+ }
0 commit comments