| // RUN: %target-sil-opt %s -aa-kind=all -aa-dump -o /dev/null | %FileCheck %s |
| |
| // General black-box alias analysis tests. White-box unit tests are |
| // specific to the aa-kind, such as basic-aa.sil and typed-access-tb-aa.sil. |
| |
| // REQUIRES: asserts |
| |
| sil_stage canonical |
| |
| import Swift |
| import SwiftShims |
| import Builtin |
| |
| struct MyStruct { |
| @_hasStorage @_hasInitialValue var i: Int64 { get set } |
| @_hasStorage @_hasInitialValue var j: Int64 { get set } |
| } |
| |
| struct OuterStruct { |
| @_hasStorage @_hasInitialValue var s: MyStruct { get set } |
| } |
| |
| // Test overlaping access on a different path; the user has misused an index offset |
| // CHECK-LABEL: @testOffsetBehindProjection |
| // CHECK: PAIR #28. |
| // CHECK: %4 = load %3 : $*Int64 |
| // CHECK: %6 = load %5 : $*Int64 |
| // CHECK: MayAlias |
| sil shared @testOffsetBehindProjection : $@convention(thin) (@inout MyStruct) -> () { |
| bb0(%0 : $*MyStruct): |
| %1 = struct_element_addr %0 : $*MyStruct, #MyStruct.i |
| %2 = integer_literal $Builtin.Word, 1 |
| %3 = index_addr %1 : $*Int64, %2 : $Builtin.Word |
| %4 = load %3 : $*Int64 |
| // load from a different subobject overlaps |
| %5 = struct_element_addr %0 : $*MyStruct, #MyStruct.j |
| %6 = load %5 : $*Int64 |
| %99 = tuple () |
| return %99 : $() |
| } |
| |
| // CHECK-LABEL: @testOffsetsBehindProjectionOverlap |
| // CHECK: PAIR #28. |
| // CHECK: %3 = load %2 : $*Int64 |
| // CHECK: %7 = load %6 : $*Int64 |
| // CHECK: MayAlias |
| sil shared @testOffsetsBehindProjectionOverlap : $@convention(thin) (@inout OuterStruct) -> () { |
| bb0(%0 : $*OuterStruct): |
| %1 = struct_element_addr %0 : $*OuterStruct, #OuterStruct.s |
| %2 = struct_element_addr %1 : $*MyStruct, #MyStruct.i |
| %3 = load %2 : $*Int64 |
| // Loading from a different index within the same subobject still appears to overlap. |
| // Indexing from a subobject is always considered an unknown index. |
| %4 = integer_literal $Builtin.Word, 1 |
| %5 = index_addr %1 : $*MyStruct, %4 : $Builtin.Word |
| %6 = struct_element_addr %5 : $*MyStruct, #MyStruct.i |
| %7 = load %6 : $*Int64 |
| %99 = tuple () |
| return %99 : $() |
| } |