@@ -88,20 +88,42 @@ func test_no_hoisting(_ c: Myclass, _ b: Bool) -> Int {
88
88
return v
89
89
}
90
90
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
+
91
94
// 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
92
113
// CHECK: [[GETTER:%[0-9]+]] = function_ref @$s4test8MystructV4lvarSivg
93
114
// 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]]({{.*}})
96
116
// CHECK: [[V1VAL:%[0-9]+]] = struct_extract [[V1]]
97
117
// CHECK: [[V2VAL:%[0-9]+]] = struct_extract [[V2]]
98
118
// CHECK: builtin "sadd{{.*}}"([[V1VAL]] {{.*}}, [[V2VAL]]
99
- // CHECK: } // end sil function '$s4test0A7_structySiAA8MystructVF '
119
+ // CHECK: } // end sil function '$s4test0A19_overwritten_structySiAA8MystructVF '
100
120
@inline ( never)
101
- func test_struct ( _ s: Mystruct ) -> Int {
121
+ func test_overwritten_struct ( _ s: Mystruct ) -> Int {
102
122
var sm = s
103
123
g = 42
104
124
let v1 = sm. lvar
125
+ sm = s
126
+ g = 43
105
127
let v2 = sm. lvar
106
128
return v1 &+ v2
107
129
}
@@ -133,6 +155,13 @@ func calltests() {
133
155
// CHECK-OUTPUT-NEXT: lvar init
134
156
// CHECK-OUTPUT-NEXT: 84
135
157
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 ( ) ) )
136
165
}
137
166
138
167
calltests ( )
0 commit comments