|
6 | 6 | ;; CHECK: (type $FUNCSIG$v (func)) |
7 | 7 | (type $FUNCSIG$v (func)) |
8 | 8 |
|
9 | | - ;; CHECK: (type $5 (func (result i32))) |
10 | | - |
11 | 9 | ;; CHECK: (type $6 (func (param i32) (result i32))) |
12 | 10 |
|
| 11 | + ;; CHECK: (type $5 (func (result i32))) |
| 12 | + |
13 | 13 | ;; CHECK: (type $FUNCSIG$vf (func (param f32))) |
14 | 14 | (type $FUNCSIG$vf (func (param f32))) |
15 | 15 | ;; CHECK: (type $4 (func (result f64))) |
16 | 16 |
|
17 | 17 | ;; CHECK: (type $FUNCSIG$ddd (func (param f64 f64) (result f64))) |
18 | 18 |
|
| 19 | + ;; CHECK: (type $10 (func (param f32) (result f32))) |
| 20 | + |
19 | 21 | ;; CHECK: (type $FUNCSIG$id (func (param f64) (result i32))) |
20 | 22 | (type $FUNCSIG$id (func (param f64) (result i32))) |
21 | 23 | (type $FUNCSIG$ddd (func (param f64 f64) (result f64))) |
|
29 | 31 | ;; CHECK: (type $9 (func (param i32 i64))) |
30 | 32 | (type $9 (func (param i32 i64))) |
31 | 33 |
|
| 34 | + ;; CHECK: (type $15 (func (param eqref) (result i32))) |
| 35 | + |
| 36 | + ;; CHECK: (type $16 (func (param eqref) (result eqref))) |
| 37 | + |
32 | 38 | ;; CHECK: (import "env" "_emscripten_asm_const_vi" (func $_emscripten_asm_const_vi (type $FUNCSIG$v))) |
33 | 39 | (import "env" "_emscripten_asm_const_vi" (func $_emscripten_asm_const_vi)) |
34 | 40 |
|
|
1097 | 1103 | ) |
1098 | 1104 | ) |
1099 | 1105 |
|
1100 | | - ;; CHECK: (func $local-to-stack-1c-no (type $6) (param $x i32) (result i32) |
| 1106 | + ;; CHECK: (func $local-to-stack-1c (type $6) (param $x i32) (result i32) |
1101 | 1107 | ;; CHECK-NEXT: (local $temp i32) |
1102 | 1108 | ;; CHECK-NEXT: i32.const 1 |
1103 | 1109 | ;; CHECK-NEXT: call $local-to-stack |
1104 | | - ;; CHECK-NEXT: local.set $temp |
1105 | 1110 | ;; CHECK-NEXT: i32.const 2 |
1106 | 1111 | ;; CHECK-NEXT: call $local-to-stack |
1107 | 1112 | ;; CHECK-NEXT: drop |
1108 | 1113 | ;; CHECK-NEXT: i32.const 3 |
1109 | | - ;; CHECK-NEXT: local.get $temp |
1110 | 1114 | ;; CHECK-NEXT: i32.add |
1111 | 1115 | ;; CHECK-NEXT: ) |
1112 | | - (func $local-to-stack-1c-no (param $x i32) (result i32) |
| 1116 | + (func $local-to-stack-1c (param $x i32) (result i32) |
1113 | 1117 | (local $temp i32) |
1114 | 1118 | (local.set $temp (call $local-to-stack (i32.const 1))) |
1115 | 1119 | (drop (call $local-to-stack (i32.const 2))) |
1116 | 1120 | (i32.add |
1117 | | - (i32.const 3) ;; this is in the way |
| 1121 | + (i32.const 3) ;; in the way, but the add is commutative so we can |
| 1122 | + (local.get $temp) ;; still use the value on the stack |
| 1123 | + ) |
| 1124 | + ) |
| 1125 | + |
| 1126 | + ;; CHECK: (func $local-to-stack-1d-sub-no (type $6) (param $x i32) (result i32) |
| 1127 | + ;; CHECK-NEXT: (local $temp i32) |
| 1128 | + ;; CHECK-NEXT: i32.const 1 |
| 1129 | + ;; CHECK-NEXT: call $local-to-stack |
| 1130 | + ;; CHECK-NEXT: local.set $temp |
| 1131 | + ;; CHECK-NEXT: i32.const 2 |
| 1132 | + ;; CHECK-NEXT: call $local-to-stack |
| 1133 | + ;; CHECK-NEXT: drop |
| 1134 | + ;; CHECK-NEXT: i32.const 3 |
| 1135 | + ;; CHECK-NEXT: local.get $temp |
| 1136 | + ;; CHECK-NEXT: i32.sub |
| 1137 | + ;; CHECK-NEXT: ) |
| 1138 | + (func $local-to-stack-1d-sub-no (param $x i32) (result i32) |
| 1139 | + (local $temp i32) |
| 1140 | + (local.set $temp (call $local-to-stack (i32.const 1))) |
| 1141 | + (drop (call $local-to-stack (i32.const 2))) |
| 1142 | + (i32.sub |
| 1143 | + (i32.const 3) ;; not commutative: the set/get pair must stay |
1118 | 1144 | (local.get $temp) |
1119 | 1145 | ) |
1120 | 1146 | ) |
|
1292 | 1318 | (local.get $temp2) |
1293 | 1319 | ) |
1294 | 1320 |
|
1295 | | - ;; CHECK: (func $local-to-stack-overlapping-multi-8-no (type $6) (param $x i32) (result i32) |
| 1321 | + ;; CHECK: (func $local-to-stack-overlapping-multi-8 (type $6) (param $x i32) (result i32) |
1296 | 1322 | ;; CHECK-NEXT: (local $temp1 i32) |
1297 | 1323 | ;; CHECK-NEXT: (local $temp2 i32) |
1298 | 1324 | ;; CHECK-NEXT: i32.const 1 |
1299 | 1325 | ;; CHECK-NEXT: call $local-to-stack-multi-4 |
1300 | | - ;; CHECK-NEXT: local.set $temp1 |
1301 | 1326 | ;; CHECK-NEXT: i32.const 1 |
1302 | 1327 | ;; CHECK-NEXT: call $local-to-stack-multi-4 |
1303 | 1328 | ;; CHECK-NEXT: i32.const 3 |
1304 | 1329 | ;; CHECK-NEXT: call $local-to-stack-multi-4 |
1305 | 1330 | ;; CHECK-NEXT: drop |
1306 | | - ;; CHECK-NEXT: local.get $temp1 |
1307 | 1331 | ;; CHECK-NEXT: i32.add |
1308 | 1332 | ;; CHECK-NEXT: ) |
1309 | | - (func $local-to-stack-overlapping-multi-8-no (param $x i32) (result i32) |
| 1333 | + (func $local-to-stack-overlapping-multi-8 (param $x i32) (result i32) |
1310 | 1334 | (local $temp1 i32) |
1311 | 1335 | (local $temp2 i32) |
1312 | 1336 | (local.set $temp1 (call $local-to-stack-multi-4 (i32.const 1))) |
1313 | 1337 | (local.set $temp2 (call $local-to-stack-multi-4 (i32.const 1))) |
1314 | 1338 | (drop (call $local-to-stack-multi-4 (i32.const 3))) |
1315 | | - (i32.add |
1316 | | - (local.get $temp2) ;; the timing |
1317 | | - (local.get $temp1) ;; it sucks |
| 1339 | + (i32.add ;; the operands are flipped, but the add is commutative |
| 1340 | + (local.get $temp2) |
| 1341 | + (local.get $temp1) |
1318 | 1342 | ) |
1319 | 1343 | ) |
1320 | 1344 |
|
|
1459 | 1483 | ) |
1460 | 1484 | ) |
1461 | 1485 | ) |
| 1486 | + |
| 1487 | + ;; A ref.eq with an intervening value: its operands can be swapped. |
| 1488 | + ;; CHECK: (func $local-to-stack-ref-eq (type $15) (param $x eqref) (result i32) |
| 1489 | + ;; CHECK-NEXT: (local $temp eqref) |
| 1490 | + ;; CHECK-NEXT: local.get $x |
| 1491 | + ;; CHECK-NEXT: call $eqref-value |
| 1492 | + ;; CHECK-NEXT: local.get $x |
| 1493 | + ;; CHECK-NEXT: call $eqref-value |
| 1494 | + ;; CHECK-NEXT: drop |
| 1495 | + ;; CHECK-NEXT: local.get $x |
| 1496 | + ;; CHECK-NEXT: ref.eq |
| 1497 | + ;; CHECK-NEXT: ) |
| 1498 | + (func $local-to-stack-ref-eq (param $x eqref) (result i32) |
| 1499 | + (local $temp eqref) |
| 1500 | + (local.set $temp (call $eqref-value (local.get $x))) |
| 1501 | + (drop (call $eqref-value (local.get $x))) |
| 1502 | + (ref.eq |
| 1503 | + (local.get $x) |
| 1504 | + (local.get $temp) |
| 1505 | + ) |
| 1506 | + ) |
| 1507 | + |
| 1508 | + ;; CHECK: (func $eqref-value (type $16) (param $x eqref) (result eqref) |
| 1509 | + ;; CHECK-NEXT: local.get $x |
| 1510 | + ;; CHECK-NEXT: call $eqref-value |
| 1511 | + ;; CHECK-NEXT: ) |
| 1512 | + (func $eqref-value (param $x eqref) (result eqref) |
| 1513 | + (call $eqref-value (local.get $x)) |
| 1514 | + ) |
| 1515 | + |
| 1516 | + ;; f32.min has swappable operands, so the set/get pair can be removed. |
| 1517 | + ;; CHECK: (func $local-to-stack-f32-min (type $10) (param $x f32) (result f32) |
| 1518 | + ;; CHECK-NEXT: (local $temp f32) |
| 1519 | + ;; CHECK-NEXT: local.get $x |
| 1520 | + ;; CHECK-NEXT: call $float-value |
| 1521 | + ;; CHECK-NEXT: local.get $x |
| 1522 | + ;; CHECK-NEXT: call $float-value |
| 1523 | + ;; CHECK-NEXT: drop |
| 1524 | + ;; CHECK-NEXT: local.get $x |
| 1525 | + ;; CHECK-NEXT: f32.min |
| 1526 | + ;; CHECK-NEXT: ) |
| 1527 | + (func $local-to-stack-f32-min (param $x f32) (result f32) |
| 1528 | + (local $temp f32) |
| 1529 | + (local.set $temp (call $float-value (local.get $x))) |
| 1530 | + (drop (call $float-value (local.get $x))) |
| 1531 | + (f32.min |
| 1532 | + (local.get $x) |
| 1533 | + (local.get $temp) |
| 1534 | + ) |
| 1535 | + ) |
| 1536 | + |
| 1537 | + ;; CHECK: (func $float-value (type $10) (param $x f32) (result f32) |
| 1538 | + ;; CHECK-NEXT: local.get $x |
| 1539 | + ;; CHECK-NEXT: call $float-value |
| 1540 | + ;; CHECK-NEXT: ) |
| 1541 | + (func $float-value (param $x f32) (result f32) |
| 1542 | + (call $float-value (local.get $x)) |
| 1543 | + ) |
| 1544 | + |
| 1545 | + ;; Two values are in the way, so the set/get pair must stay. |
| 1546 | + ;; CHECK: (func $local-to-stack-two-in-the-way (type $6) (param $x i32) (result i32) |
| 1547 | + ;; CHECK-NEXT: (local $temp i32) |
| 1548 | + ;; CHECK-NEXT: i32.const 1 |
| 1549 | + ;; CHECK-NEXT: call $local-to-stack |
| 1550 | + ;; CHECK-NEXT: local.set $temp |
| 1551 | + ;; CHECK-NEXT: i32.const 2 |
| 1552 | + ;; CHECK-NEXT: call $local-to-stack |
| 1553 | + ;; CHECK-NEXT: drop |
| 1554 | + ;; CHECK-NEXT: i32.const 3 |
| 1555 | + ;; CHECK-NEXT: call $local-to-stack |
| 1556 | + ;; CHECK-NEXT: i32.const 4 |
| 1557 | + ;; CHECK-NEXT: call $local-to-stack |
| 1558 | + ;; CHECK-NEXT: local.get $temp |
| 1559 | + ;; CHECK-NEXT: i32.add |
| 1560 | + ;; CHECK-NEXT: i32.add |
| 1561 | + ;; CHECK-NEXT: ) |
| 1562 | + (func $local-to-stack-two-in-the-way (param $x i32) (result i32) |
| 1563 | + (local $temp i32) |
| 1564 | + (local.set $temp (call $local-to-stack (i32.const 1))) |
| 1565 | + (drop (call $local-to-stack (i32.const 2))) |
| 1566 | + (i32.add |
| 1567 | + (call $local-to-stack (i32.const 3)) |
| 1568 | + (i32.add |
| 1569 | + (call $local-to-stack (i32.const 4)) |
| 1570 | + (local.get $temp) |
| 1571 | + ) |
| 1572 | + ) |
| 1573 | + ) |
1462 | 1574 | ) |
0 commit comments