Skip to content

Commit 800c061

Browse files
committed
accessed_storage.sil tests
1 parent b2d1ac1 commit 800c061

File tree

1 file changed

+316
-2
lines changed

1 file changed

+316
-2
lines changed

test/SILOptimizer/accessed_storage.sil

Lines changed: 316 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
// 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
25

36
sil_stage canonical
47

@@ -14,6 +17,9 @@ struct MyStruct {
1417
// CHECK-LABEL: @testStructPhiCommon
1518
// CHECK: store
1619
// 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)
1723
sil hidden @testStructPhiCommon : $@convention(thin) (@inout MyStruct) -> () {
1824
bb0(%0 : $*MyStruct):
1925
%2 = struct_element_addr %0 : $*MyStruct, #MyStruct.i
@@ -42,6 +48,7 @@ bb3(%6 : $Builtin.RawPointer) :
4248
// CHECK-LABEL: @testStructPhiDivergent
4349
// CHECK: store
4450
// CHECK: INVALID
51+
// CHECK: INVALID
4552
sil hidden @testStructPhiDivergent : $@convention(thin) (@inout MyStruct) -> () {
4653
bb0(%0 : $*MyStruct):
4754
cond_br undef, bb1, bb2
@@ -75,6 +82,7 @@ bb3(%6 : $Builtin.RawPointer) :
7582
// CHECK-LABEL: @testStructPhiChained
7683
// CHECK: store
7784
// CHECK: INVALID
85+
// CHECK: INVALID
7886
sil hidden @testStructPhiChained : $@convention(thin) (@inout MyStruct, @inout Int64) -> () {
7987
bb0(%0 : $*MyStruct, %1 : $*Int64):
8088
cond_br undef, bb1, bb5
@@ -123,9 +131,15 @@ struct MyArray<T> {
123131

124132
// CHECK-LABEL: @arrayValue
125133
// 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)
127138
// 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)
129143
sil [ossa] @arrayValue : $@convention(thin) (@guaranteed MyArray<Int64>) -> Int64 {
130144
bb0(%0 : @guaranteed $MyArray<Int64>):
131145
%1 = integer_literal $Builtin.Word, 3
@@ -149,3 +163,303 @@ bb0(%0 : @guaranteed $MyArray<Int64>):
149163
%19 = struct $Int64 (%16 : $Builtin.Int64)
150164
return %19 : $Int64
151165
}
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

Comments
 (0)