@@ -87,20 +87,42 @@ func test_no_hoisting(_ c: Myclass, _ b: Bool) -> Int {
87
87
return v
88
88
}
89
89
90
+ // This test is disabled, because for structs, it does not work yet.
91
+ // CSE is too conservative to handle indirect getter arguments currently.
92
+
90
93
// CHECK-LABEL: sil {{.*}} @$s4test0A7_structySiAA8MystructVF
94
+ // CHECK-DISABLED: [[GETTER:%[0-9]+]] = function_ref @$s4test8MystructV4lvarSivg
95
+ // CHECK-DISABLED: [[V1:%[0-9]+]] = apply [[GETTER]]({{.*}})
96
+ // CHECK-DISABLED: [[V2OPT:%[0-9]+]] = load
97
+ // CHECK-DISABLED: [[V2:%[0-9]+]] = unchecked_enum_data [[V2OPT]]
98
+ // CHECK-DISABLED: [[V1VAL:%[0-9]+]] = struct_extract [[V1]]
99
+ // CHECK-DISABLED: [[V2VAL:%[0-9]+]] = struct_extract [[V2]]
100
+ // CHECK-DISABLED: builtin "sadd{{.*}}"([[V1VAL]] {{.*}}, [[V2VAL]]
101
+ // CHECK-DISABLED: } // end sil function '$s4test0A7_structySiAA8MystructVF'
102
+ @inline ( never)
103
+ func test_struct( _ s: Mystruct ) -> Int {
104
+ var sm = s
105
+ g = 42
106
+ let v1 = sm. lvar
107
+ let v2 = sm. lvar
108
+ return v1 &+ v2
109
+ }
110
+
111
+ // CHECK-LABEL: sil {{.*}} @$s4test0A19_overwritten_structySiAA8MystructVF
91
112
// CHECK: [[GETTER:%[0-9]+]] = function_ref @$s4test8MystructV4lvarSivg
92
113
// CHECK: [[V1:%[0-9]+]] = apply [[GETTER]]({{.*}})
93
- // CHECK: [[V2OPT:%[0-9]+]] = load
94
- // CHECK: [[V2:%[0-9]+]] = unchecked_enum_data [[V2OPT]]
114
+ // CHECK: [[V2:%[0-9]+]] = apply [[GETTER]]({{.*}})
95
115
// CHECK: [[V1VAL:%[0-9]+]] = struct_extract [[V1]]
96
116
// CHECK: [[V2VAL:%[0-9]+]] = struct_extract [[V2]]
97
117
// CHECK: builtin "sadd{{.*}}"([[V1VAL]] {{.*}}, [[V2VAL]]
98
- // CHECK: } // end sil function '$s4test0A7_structySiAA8MystructVF '
118
+ // CHECK: } // end sil function '$s4test0A19_overwritten_structySiAA8MystructVF '
99
119
@inline ( never)
100
- func test_struct ( _ s: Mystruct ) -> Int {
120
+ func test_overwritten_struct ( _ s: Mystruct ) -> Int {
101
121
var sm = s
102
122
g = 42
103
123
let v1 = sm. lvar
124
+ sm = s
125
+ g = 43
104
126
let v2 = sm. lvar
105
127
return v1 &+ v2
106
128
}
@@ -132,6 +154,13 @@ func calltests() {
132
154
// CHECK-OUTPUT-NEXT: lvar init
133
155
// CHECK-OUTPUT-NEXT: 84
134
156
print ( test_struct ( Mystruct ( ) ) )
157
+
158
+ // CHECK-OUTPUT-LABEL: test_overwritten_struct
159
+ print ( " test_overwritten_struct " )
160
+ // CHECK-OUTPUT-NEXT: lvar init
161
+ // CHECK-OUTPUT-NEXT: lvar init
162
+ // CHECK-OUTPUT-NEXT: 85
163
+ print ( test_overwritten_struct ( Mystruct ( ) ) )
135
164
}
136
165
137
166
calltests ( )
0 commit comments