| // RUN: %target-swift-frontend -emit-ir %s | %FileCheck %s |
| |
| // REQUIRES: rdar60068448 |
| // FIXME Reenable the !invariant.load metadata after debugging miscompiles... |
| // <rdar://60068448> Teach IRGen to emit !invariant metadata for 'let' variables |
| |
| sil_stage lowered |
| |
| import Builtin |
| |
| struct X { |
| var y: Builtin.Int32 |
| var z: Builtin.Int32 |
| } |
| |
| class C { |
| @_hasStorage @_hasInitialValue final let prop: Builtin.Int32 { get } |
| } |
| |
| // CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @invariant_load |
| sil [ossa] @invariant_load : $@convention(thin) (Builtin.RawPointer) -> () { |
| entry(%p : $Builtin.RawPointer): |
| %a = pointer_to_address %p : $Builtin.RawPointer to [invariant] $*X |
| // CHECK: load i32, {{.*}} !invariant.load |
| // CHECK: load i32, {{.*}} !invariant.load |
| %x = load [trivial] %a : $*X |
| %yp = struct_element_addr %a : $*X, #X.y |
| // CHECK: load i32, {{.*}} !invariant.load |
| %y = load [trivial] %yp : $*Builtin.Int32 |
| %zp = struct_element_addr %a : $*X, #X.z |
| // CHECK: load i32, {{.*}} !invariant.load |
| %z = load [trivial] %zp : $*Builtin.Int32 |
| return undef : $() |
| } |
| |
| // CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc i32 @testLetProp |
| sil @testLetProp : $@convention(thin) (@guaranteed C) -> Builtin.Int32 { |
| bb0(%0 : $C): |
| %propAdr = ref_element_addr %0 : $C, #C.prop |
| // CHECK: load i32, {{.*}} !invariant.load |
| %val = load %propAdr : $*Builtin.Int32 |
| return %val : $Builtin.Int32 |
| } |
| |