|
590 | 590 | ;; CHECK: (func $rmw-cmpxchg-ref (type $4) (param $0 (ref null $struct)) (param $1 (ref null $struct)) (result (ref null $struct)) |
591 | 591 | ;; CHECK-NEXT: (local $2 (ref null $struct)) |
592 | 592 | ;; CHECK-NEXT: (local $3 (ref null $struct)) |
593 | | - ;; CHECK-NEXT: (local $4 (ref null $struct)) |
| 593 | + ;; CHECK-NEXT: (local $4 eqref) |
594 | 594 | ;; CHECK-NEXT: (local $5 (ref null $struct)) |
595 | 595 | ;; CHECK-NEXT: (drop |
596 | 596 | ;; CHECK-NEXT: (block (result nullref) |
|
1146 | 1146 | (unreachable) |
1147 | 1147 | ) |
1148 | 1148 | ) |
| 1149 | + |
| 1150 | +(module |
| 1151 | + (rec |
| 1152 | + ;; CHECK: (rec |
| 1153 | + ;; CHECK-NEXT: (type $outer (struct (field (mut (ref $inner))))) |
| 1154 | + (type $outer (struct (field (mut (ref $inner))))) |
| 1155 | + ;; CHECK: (type $inner (struct)) |
| 1156 | + (type $inner (struct)) |
| 1157 | + |
| 1158 | + ;; CHECK: (type $shared-outer (shared (struct (field (mut (ref $shared-inner)))))) |
| 1159 | + (type $shared-outer (shared (struct (field (mut (ref $shared-inner)))))) |
| 1160 | + ;; CHECK: (type $shared-inner (shared (struct))) |
| 1161 | + (type $shared-inner (shared (struct))) |
| 1162 | + ) |
| 1163 | + |
| 1164 | + ;; CHECK: (type $4 (func)) |
| 1165 | + |
| 1166 | + ;; CHECK: (func $cmpxchg-non-nullable-field (type $4) |
| 1167 | + ;; CHECK-NEXT: (local $0 (ref $inner)) |
| 1168 | + ;; CHECK-NEXT: (local $1 (ref $inner)) |
| 1169 | + ;; CHECK-NEXT: (local $2 (ref $inner)) |
| 1170 | + ;; CHECK-NEXT: (local $3 eqref) |
| 1171 | + ;; CHECK-NEXT: (local $4 (ref $inner)) |
| 1172 | + ;; CHECK-NEXT: (drop |
| 1173 | + ;; CHECK-NEXT: (block (result (ref $inner)) |
| 1174 | + ;; CHECK-NEXT: (drop |
| 1175 | + ;; CHECK-NEXT: (block (result nullref) |
| 1176 | + ;; CHECK-NEXT: (local.set $1 |
| 1177 | + ;; CHECK-NEXT: (struct.new_default $inner) |
| 1178 | + ;; CHECK-NEXT: ) |
| 1179 | + ;; CHECK-NEXT: (local.set $0 |
| 1180 | + ;; CHECK-NEXT: (local.get $1) |
| 1181 | + ;; CHECK-NEXT: ) |
| 1182 | + ;; CHECK-NEXT: (ref.null none) |
| 1183 | + ;; CHECK-NEXT: ) |
| 1184 | + ;; CHECK-NEXT: ) |
| 1185 | + ;; CHECK-NEXT: (local.set $3 |
| 1186 | + ;; CHECK-NEXT: (block (result nullref) |
| 1187 | + ;; CHECK-NEXT: (ref.null none) |
| 1188 | + ;; CHECK-NEXT: ) |
| 1189 | + ;; CHECK-NEXT: ) |
| 1190 | + ;; CHECK-NEXT: (local.set $4 |
| 1191 | + ;; CHECK-NEXT: (struct.new_default $inner) |
| 1192 | + ;; CHECK-NEXT: ) |
| 1193 | + ;; CHECK-NEXT: (local.set $2 |
| 1194 | + ;; CHECK-NEXT: (local.get $0) |
| 1195 | + ;; CHECK-NEXT: ) |
| 1196 | + ;; CHECK-NEXT: (if |
| 1197 | + ;; CHECK-NEXT: (ref.eq |
| 1198 | + ;; CHECK-NEXT: (local.get $0) |
| 1199 | + ;; CHECK-NEXT: (local.get $3) |
| 1200 | + ;; CHECK-NEXT: ) |
| 1201 | + ;; CHECK-NEXT: (then |
| 1202 | + ;; CHECK-NEXT: (local.set $0 |
| 1203 | + ;; CHECK-NEXT: (local.get $4) |
| 1204 | + ;; CHECK-NEXT: ) |
| 1205 | + ;; CHECK-NEXT: ) |
| 1206 | + ;; CHECK-NEXT: ) |
| 1207 | + ;; CHECK-NEXT: (local.get $2) |
| 1208 | + ;; CHECK-NEXT: ) |
| 1209 | + ;; CHECK-NEXT: ) |
| 1210 | + ;; CHECK-NEXT: ) |
| 1211 | + (func $cmpxchg-non-nullable-field |
| 1212 | + (drop |
| 1213 | + (struct.atomic.rmw.cmpxchg $outer 0 |
| 1214 | + ;; When `ref` gets optimized, we need to make sure the scratch local for |
| 1215 | + ;; `expected` is nullable, even though the operand and field are both |
| 1216 | + ;; non-nullable. This avoids type errors when we later optimize the |
| 1217 | + ;; `expected` field and make it a nullref. |
| 1218 | + (struct.new $outer |
| 1219 | + (struct.new_default $inner) |
| 1220 | + ) |
| 1221 | + (struct.new_default $inner) |
| 1222 | + (struct.new_default $inner) |
| 1223 | + ) |
| 1224 | + ) |
| 1225 | + ) |
| 1226 | + |
| 1227 | + ;; CHECK: (func $cmpxchg-non-nullable-field-shared (type $4) |
| 1228 | + ;; CHECK-NEXT: (local $0 (ref $shared-inner)) |
| 1229 | + ;; CHECK-NEXT: (local $1 (ref $shared-inner)) |
| 1230 | + ;; CHECK-NEXT: (local $2 (ref $shared-inner)) |
| 1231 | + ;; CHECK-NEXT: (local $3 (ref null (shared eq))) |
| 1232 | + ;; CHECK-NEXT: (local $4 (ref $shared-inner)) |
| 1233 | + ;; CHECK-NEXT: (drop |
| 1234 | + ;; CHECK-NEXT: (block (result (ref $shared-inner)) |
| 1235 | + ;; CHECK-NEXT: (drop |
| 1236 | + ;; CHECK-NEXT: (block (result (ref null (shared none))) |
| 1237 | + ;; CHECK-NEXT: (local.set $1 |
| 1238 | + ;; CHECK-NEXT: (struct.new_default $shared-inner) |
| 1239 | + ;; CHECK-NEXT: ) |
| 1240 | + ;; CHECK-NEXT: (local.set $0 |
| 1241 | + ;; CHECK-NEXT: (local.get $1) |
| 1242 | + ;; CHECK-NEXT: ) |
| 1243 | + ;; CHECK-NEXT: (ref.null (shared none)) |
| 1244 | + ;; CHECK-NEXT: ) |
| 1245 | + ;; CHECK-NEXT: ) |
| 1246 | + ;; CHECK-NEXT: (local.set $3 |
| 1247 | + ;; CHECK-NEXT: (block (result (ref null (shared none))) |
| 1248 | + ;; CHECK-NEXT: (ref.null (shared none)) |
| 1249 | + ;; CHECK-NEXT: ) |
| 1250 | + ;; CHECK-NEXT: ) |
| 1251 | + ;; CHECK-NEXT: (local.set $4 |
| 1252 | + ;; CHECK-NEXT: (struct.new_default $shared-inner) |
| 1253 | + ;; CHECK-NEXT: ) |
| 1254 | + ;; CHECK-NEXT: (local.set $2 |
| 1255 | + ;; CHECK-NEXT: (local.get $0) |
| 1256 | + ;; CHECK-NEXT: ) |
| 1257 | + ;; CHECK-NEXT: (if |
| 1258 | + ;; CHECK-NEXT: (ref.eq |
| 1259 | + ;; CHECK-NEXT: (local.get $0) |
| 1260 | + ;; CHECK-NEXT: (local.get $3) |
| 1261 | + ;; CHECK-NEXT: ) |
| 1262 | + ;; CHECK-NEXT: (then |
| 1263 | + ;; CHECK-NEXT: (local.set $0 |
| 1264 | + ;; CHECK-NEXT: (local.get $4) |
| 1265 | + ;; CHECK-NEXT: ) |
| 1266 | + ;; CHECK-NEXT: ) |
| 1267 | + ;; CHECK-NEXT: ) |
| 1268 | + ;; CHECK-NEXT: (local.get $2) |
| 1269 | + ;; CHECK-NEXT: ) |
| 1270 | + ;; CHECK-NEXT: ) |
| 1271 | + ;; CHECK-NEXT: ) |
| 1272 | + (func $cmpxchg-non-nullable-field-shared |
| 1273 | + (drop |
| 1274 | + (struct.atomic.rmw.cmpxchg $shared-outer 0 |
| 1275 | + ;; Same, but now with shared types. The scratch local must be a shared |
| 1276 | + ;; eqref. |
| 1277 | + (struct.new $shared-outer |
| 1278 | + (struct.new_default $shared-inner) |
| 1279 | + ) |
| 1280 | + (struct.new_default $shared-inner) |
| 1281 | + (struct.new_default $shared-inner) |
| 1282 | + ) |
| 1283 | + ) |
| 1284 | + ) |
| 1285 | +) |
0 commit comments