|
243 | 243 | (global $B.desc (ref null $B.desc) (ref.null none))
|
244 | 244 | )
|
245 | 245 |
|
| 246 | +(module |
| 247 | + ;; These chains could be merged except for the cast to the descriptor in the |
| 248 | + ;; subtype chain. |
| 249 | + (rec |
| 250 | + ;; CHECK: (rec |
| 251 | + ;; CHECK-NEXT: (type $A (sub (descriptor $A.desc (struct)))) |
| 252 | + (type $A (sub (descriptor $A.desc (struct)))) |
| 253 | + ;; CHECK: (type $A.desc (sub (describes $A (struct)))) |
| 254 | + (type $A.desc (sub (describes $A (struct)))) |
| 255 | + ;; CHECK: (type $B (sub $A (descriptor $B.desc (struct)))) |
| 256 | + (type $B (sub $A (descriptor $B.desc (struct)))) |
| 257 | + ;; CHECK: (type $B.desc (sub $A.desc (describes $B (struct)))) |
| 258 | + (type $B.desc (sub $A.desc (describes $B (struct)))) |
| 259 | + ) |
| 260 | + |
| 261 | + ;; CHECK: (type $4 (func)) |
| 262 | + |
| 263 | + ;; CHECK: (global $A (ref null $A) (ref.null none)) |
| 264 | + (global $A (ref null $A) (ref.null none)) |
| 265 | + ;; CHECK: (global $A.desc (ref null $A.desc) (ref.null none)) |
| 266 | + (global $A.desc (ref null $A.desc) (ref.null none)) |
| 267 | + ;; CHECK: (global $B (ref null $B) (ref.null none)) |
| 268 | + (global $B (ref null $B) (ref.null none)) |
| 269 | + ;; CHECK: (global $B.desc (ref null $B.desc) (ref.null none)) |
| 270 | + (global $B.desc (ref null $B.desc) (ref.null none)) |
| 271 | + |
| 272 | + ;; CHECK: (func $cast-desc (type $4) |
| 273 | + ;; CHECK-NEXT: (drop |
| 274 | + ;; CHECK-NEXT: (ref.test (ref (exact $B.desc)) |
| 275 | + ;; CHECK-NEXT: (struct.new_default $B.desc) |
| 276 | + ;; CHECK-NEXT: ) |
| 277 | + ;; CHECK-NEXT: ) |
| 278 | + ;; CHECK-NEXT: ) |
| 279 | + (func $cast-desc |
| 280 | + (drop |
| 281 | + (ref.test (ref $B.desc) |
| 282 | + (struct.new $B.desc) |
| 283 | + ) |
| 284 | + ) |
| 285 | + ) |
| 286 | +) |
| 287 | + |
| 288 | + |
246 | 289 | (module
|
247 | 290 | ;; These chains could be merged except for the exact cast to the descriptor in
|
248 | 291 | ;; the supertype chain.
|
|
285 | 328 | )
|
286 | 329 | )
|
287 | 330 |
|
| 331 | +(module |
| 332 | + ;; Like above, but now the cast to the supertype descriptor is not exact, so |
| 333 | + ;; we can still merge. |
| 334 | + (rec |
| 335 | + ;; CHECK: (rec |
| 336 | + ;; CHECK-NEXT: (type $A (sub (descriptor $A.desc (struct)))) |
| 337 | + (type $A (sub (descriptor $A.desc (struct)))) |
| 338 | + ;; CHECK: (type $A.desc (sub (describes $A (struct)))) |
| 339 | + (type $A.desc (sub (describes $A (struct)))) |
| 340 | + (type $B (sub $A (descriptor $B.desc (struct)))) |
| 341 | + (type $B.desc (sub $A.desc (describes $B (struct)))) |
| 342 | + ) |
| 343 | + |
| 344 | + ;; CHECK: (type $2 (func (param anyref))) |
| 345 | + |
| 346 | + ;; CHECK: (global $A (ref null $A) (ref.null none)) |
| 347 | + (global $A (ref null $A) (ref.null none)) |
| 348 | + ;; CHECK: (global $A.desc (ref null $A.desc) (ref.null none)) |
| 349 | + (global $A.desc (ref null $A.desc) (ref.null none)) |
| 350 | + ;; CHECK: (global $B (ref null $A) (ref.null none)) |
| 351 | + (global $B (ref null $B) (ref.null none)) |
| 352 | + ;; CHECK: (global $B.desc (ref null $A.desc) (ref.null none)) |
| 353 | + (global $B.desc (ref null $B.desc) (ref.null none)) |
| 354 | + |
| 355 | + ;; CHECK: (func $cast-desc (type $2) (param $0 anyref) |
| 356 | + ;; CHECK-NEXT: (drop |
| 357 | + ;; CHECK-NEXT: (ref.test (ref $A.desc) |
| 358 | + ;; CHECK-NEXT: (local.get $0) |
| 359 | + ;; CHECK-NEXT: ) |
| 360 | + ;; CHECK-NEXT: ) |
| 361 | + ;; CHECK-NEXT: ) |
| 362 | + (func $cast-desc (param anyref) |
| 363 | + (drop |
| 364 | + (ref.test (ref $A.desc) |
| 365 | + (local.get 0) |
| 366 | + ) |
| 367 | + ) |
| 368 | + ) |
| 369 | +) |
| 370 | + |
288 | 371 | (module
|
289 | 372 | ;; $A chain and $B differ only in the in index they reference in the $X chain.
|
290 | 373 | ;; They should not be merged.
|
|
0 commit comments