@@ -88,20 +88,42 @@ func test_no_hoisting(_ c: Myclass, _ b: Bool) -> Int {
8888 return v
8989}
9090
91+ // This test is disabled, because for structs, it does not work yet.
92+ // CSE is too conservative to handle indirect getter arguments currently.
93+
9194// CHECK-LABEL: sil {{.*}} @$s4test0A7_structySiAA8MystructVF
95+ // CHECK-DISABLED: [[GETTER:%[0-9]+]] = function_ref @$s4test8MystructV4lvarSivg
96+ // CHECK-DISABLED: [[V1:%[0-9]+]] = apply [[GETTER]]({{.*}})
97+ // CHECK-DISABLED: [[V2OPT:%[0-9]+]] = load
98+ // CHECK-DISABLED: [[V2:%[0-9]+]] = unchecked_enum_data [[V2OPT]]
99+ // CHECK-DISABLED: [[V1VAL:%[0-9]+]] = struct_extract [[V1]]
100+ // CHECK-DISABLED: [[V2VAL:%[0-9]+]] = struct_extract [[V2]]
101+ // CHECK-DISABLED: builtin "sadd{{.*}}"([[V1VAL]] {{.*}}, [[V2VAL]]
102+ // CHECK-DISABLED: } // end sil function '$s4test0A7_structySiAA8MystructVF'
103+ @inline ( never)
104+ func test_struct( _ s: Mystruct ) -> Int {
105+ var sm = s
106+ g = 42
107+ let v1 = sm. lvar
108+ let v2 = sm. lvar
109+ return v1 &+ v2
110+ }
111+
112+ // CHECK-LABEL: sil {{.*}} @$s4test0A19_overwritten_structySiAA8MystructVF
92113// CHECK: [[GETTER:%[0-9]+]] = function_ref @$s4test8MystructV4lvarSivg
93114// CHECK: [[V1:%[0-9]+]] = apply [[GETTER]]({{.*}})
94- // CHECK: [[V2OPT:%[0-9]+]] = load
95- // CHECK: [[V2:%[0-9]+]] = unchecked_enum_data [[V2OPT]]
115+ // CHECK: [[V2:%[0-9]+]] = apply [[GETTER]]({{.*}})
96116// CHECK: [[V1VAL:%[0-9]+]] = struct_extract [[V1]]
97117// CHECK: [[V2VAL:%[0-9]+]] = struct_extract [[V2]]
98118// CHECK: builtin "sadd{{.*}}"([[V1VAL]] {{.*}}, [[V2VAL]]
99- // CHECK: } // end sil function '$s4test0A7_structySiAA8MystructVF '
119+ // CHECK: } // end sil function '$s4test0A19_overwritten_structySiAA8MystructVF '
100120@inline ( never)
101- func test_struct ( _ s: Mystruct ) -> Int {
121+ func test_overwritten_struct ( _ s: Mystruct ) -> Int {
102122 var sm = s
103123 g = 42
104124 let v1 = sm. lvar
125+ sm = s
126+ g = 43
105127 let v2 = sm. lvar
106128 return v1 &+ v2
107129}
@@ -133,6 +155,13 @@ func calltests() {
133155 // CHECK-OUTPUT-NEXT: lvar init
134156 // CHECK-OUTPUT-NEXT: 84
135157 print ( test_struct ( Mystruct ( ) ) )
158+
159+ // CHECK-OUTPUT-LABEL: test_overwritten_struct
160+ print ( " test_overwritten_struct " )
161+ // CHECK-OUTPUT-NEXT: lvar init
162+ // CHECK-OUTPUT-NEXT: lvar init
163+ // CHECK-OUTPUT-NEXT: 85
164+ print ( test_overwritten_struct ( Mystruct ( ) ) )
136165}
137166
138167calltests ( )
0 commit comments