|
947 | 947 |
|
948 | 948 | ;; THIRD__: (type $3 (func (param anyref i32))) |
949 | 949 |
|
950 | | - ;; THIRD__: (type $4 (func (param (ref $A)))) |
| 950 | + ;; THIRD__: (type $4 (func (param i32))) |
951 | 951 |
|
952 | | - ;; THIRD__: (type $5 (func (param anyref))) |
| 952 | + ;; THIRD__: (type $5 (func (param (ref $A)))) |
953 | 953 |
|
954 | | - ;; THIRD__: (type $6 (func (param i32) (result (ref $A)))) |
955 | | - |
956 | | - ;; THIRD__: (type $7 (func (param i32))) |
957 | | - |
958 | | - ;; THIRD__: (type $8 (func (result (ref $A)))) |
| 954 | + ;; THIRD__: (type $6 (func (param anyref))) |
959 | 955 |
|
960 | 956 | ;; THIRD__: (import "a" "b" (func $import (type $1))) |
961 | 957 | ;; TWOTRDS: (type $1 (func)) |
|
964 | 960 |
|
965 | 961 | ;; TWOTRDS: (type $3 (func (param anyref i32))) |
966 | 962 |
|
967 | | - ;; TWOTRDS: (type $4 (func (param (ref $A)))) |
| 963 | + ;; TWOTRDS: (type $4 (func (param i32))) |
968 | 964 |
|
969 | | - ;; TWOTRDS: (type $5 (func (param anyref))) |
| 965 | + ;; TWOTRDS: (type $5 (func (param (ref $A)))) |
970 | 966 |
|
971 | | - ;; TWOTRDS: (type $6 (func (param i32))) |
| 967 | + ;; TWOTRDS: (type $6 (func (param anyref))) |
972 | 968 |
|
973 | 969 | ;; TWOTRDS: (import "a" "b" (func $import (type $1))) |
974 | 970 | ;; HUNDRED: (type $1 (func (param anyref) (result (ref $A)))) |
|
984 | 980 |
|
985 | 981 | ;; DEFAULT: (import "a" "c" (func $import2 (type $4) (param (ref $A)))) |
986 | 982 | ;; ZERO___: (import "a" "c" (func $import2 (type $8) (param (ref $A)))) |
987 | | - ;; THIRD__: (import "a" "c" (func $import2 (type $4) (param (ref $A)))) |
988 | | - ;; TWOTRDS: (import "a" "c" (func $import2 (type $4) (param (ref $A)))) |
| 983 | + ;; THIRD__: (import "a" "c" (func $import2 (type $5) (param (ref $A)))) |
| 984 | + ;; TWOTRDS: (import "a" "c" (func $import2 (type $5) (param (ref $A)))) |
989 | 985 | ;; HUNDRED: (import "a" "c" (func $import2 (type $4) (param (ref $A)))) |
990 | 986 | (import "a" "c" (func $import2 (param (ref $A)))) |
991 | 987 |
|
|
1173 | 1169 | ;; THIRD__-NEXT: ) |
1174 | 1170 | ;; THIRD__-NEXT: ) |
1175 | 1171 | ;; THIRD__-NEXT: ) |
1176 | | - ;; THIRD__-NEXT: (drop |
1177 | | - ;; THIRD__-NEXT: (call $target-long |
1178 | | - ;; THIRD__-NEXT: (struct.new $A |
1179 | | - ;; THIRD__-NEXT: (local.get $y) |
1180 | | - ;; THIRD__-NEXT: ) |
1181 | | - ;; THIRD__-NEXT: ) |
| 1172 | + ;; THIRD__-NEXT: (call $target-long_6 |
| 1173 | + ;; THIRD__-NEXT: (local.get $y) |
1182 | 1174 | ;; THIRD__-NEXT: ) |
1183 | 1175 | ;; THIRD__-NEXT: (call $import2 |
1184 | 1176 | ;; THIRD__-NEXT: (call $target-long |
|
1187 | 1179 | ;; THIRD__-NEXT: ) |
1188 | 1180 | ;; THIRD__-NEXT: ) |
1189 | 1181 | ;; THIRD__-NEXT: ) |
1190 | | - ;; THIRD__-NEXT: (call $target-long_6) |
| 1182 | + ;; THIRD__-NEXT: (call $target-long_7) |
1191 | 1183 | ;; THIRD__-NEXT: ) |
1192 | 1184 | ;; TWOTRDS: (func $calls-long (type $3) (param $x anyref) (param $y i32) |
1193 | 1185 | ;; TWOTRDS-NEXT: (call $import2 |
|
1207 | 1199 | ;; TWOTRDS-NEXT: ) |
1208 | 1200 | ;; TWOTRDS-NEXT: ) |
1209 | 1201 | ;; TWOTRDS-NEXT: ) |
1210 | | - ;; TWOTRDS-NEXT: (drop |
1211 | | - ;; TWOTRDS-NEXT: (call $target-long |
1212 | | - ;; TWOTRDS-NEXT: (struct.new $A |
1213 | | - ;; TWOTRDS-NEXT: (local.get $y) |
1214 | | - ;; TWOTRDS-NEXT: ) |
1215 | | - ;; TWOTRDS-NEXT: ) |
| 1202 | + ;; TWOTRDS-NEXT: (call $target-long_6 |
| 1203 | + ;; TWOTRDS-NEXT: (local.get $y) |
1216 | 1204 | ;; TWOTRDS-NEXT: ) |
1217 | 1205 | ;; TWOTRDS-NEXT: (call $import2 |
1218 | 1206 | ;; TWOTRDS-NEXT: (call $target-long |
|
1221 | 1209 | ;; TWOTRDS-NEXT: ) |
1222 | 1210 | ;; TWOTRDS-NEXT: ) |
1223 | 1211 | ;; TWOTRDS-NEXT: ) |
1224 | | - ;; TWOTRDS-NEXT: (drop |
1225 | | - ;; TWOTRDS-NEXT: (call $target-long |
1226 | | - ;; TWOTRDS-NEXT: (struct.new $A |
1227 | | - ;; TWOTRDS-NEXT: (i32.const 42) |
1228 | | - ;; TWOTRDS-NEXT: ) |
1229 | | - ;; TWOTRDS-NEXT: ) |
1230 | | - ;; TWOTRDS-NEXT: ) |
| 1212 | + ;; TWOTRDS-NEXT: (call $target-long_7) |
1231 | 1213 | ;; TWOTRDS-NEXT: ) |
1232 | 1214 | ;; HUNDRED: (func $calls-long (type $2) (param $x anyref) (param $y i32) |
1233 | 1215 | ;; HUNDRED-NEXT: (call $import2 |
|
1275 | 1257 | ;; * Optimize in all cases when the minimum benefit is 0% (except the |
1276 | 1258 | ;; first call, which is a trivial call context). Removing a cast is |
1277 | 1259 | ;; enough to justify optimizing. |
1278 | | - ;; * In 33% we optimize only the very last case. There we remove both a |
1279 | | - ;; cast and a struct.new, which ends up just over 33%. |
1280 | | - ;; * In 66% and 100% we optimize nothing at all. |
| 1260 | + ;; * In 33% and 66% we optimize only two cases. There we remove both a cast |
| 1261 | + ;; and a struct.new, and the struct.new's high cost makes it worthwhile. |
| 1262 | + ;; * In 100% we optimize nothing at all. |
1281 | 1263 |
|
1282 | 1264 | ;; Call with an unknown input and the output is sent to an import. |
1283 | 1265 | (call $import2 |
|
1379 | 1361 | ;; THIRD__-NEXT: (local.get $x) |
1380 | 1362 | ;; THIRD__-NEXT: ) |
1381 | 1363 | ;; THIRD__-NEXT: ) |
1382 | | - ;; THIRD__-NEXT: (call $target-short_7 |
| 1364 | + ;; THIRD__-NEXT: (call $target-short_8 |
1383 | 1365 | ;; THIRD__-NEXT: (local.get $x) |
1384 | 1366 | ;; THIRD__-NEXT: ) |
1385 | 1367 | ;; THIRD__-NEXT: (call $import2 |
1386 | | - ;; THIRD__-NEXT: (call $target-short_8 |
1387 | | - ;; THIRD__-NEXT: (local.get $y) |
| 1368 | + ;; THIRD__-NEXT: (call $target-short |
| 1369 | + ;; THIRD__-NEXT: (struct.new $A |
| 1370 | + ;; THIRD__-NEXT: (local.get $y) |
| 1371 | + ;; THIRD__-NEXT: ) |
1388 | 1372 | ;; THIRD__-NEXT: ) |
1389 | 1373 | ;; THIRD__-NEXT: ) |
1390 | 1374 | ;; THIRD__-NEXT: (call $target-short_9 |
1391 | 1375 | ;; THIRD__-NEXT: (local.get $y) |
1392 | 1376 | ;; THIRD__-NEXT: ) |
1393 | 1377 | ;; THIRD__-NEXT: (call $import2 |
1394 | | - ;; THIRD__-NEXT: (call $target-short_10) |
| 1378 | + ;; THIRD__-NEXT: (call $target-short |
| 1379 | + ;; THIRD__-NEXT: (struct.new $A |
| 1380 | + ;; THIRD__-NEXT: (i32.const 42) |
| 1381 | + ;; THIRD__-NEXT: ) |
| 1382 | + ;; THIRD__-NEXT: ) |
1395 | 1383 | ;; THIRD__-NEXT: ) |
1396 | | - ;; THIRD__-NEXT: (call $target-short_11) |
| 1384 | + ;; THIRD__-NEXT: (call $target-short_10) |
1397 | 1385 | ;; THIRD__-NEXT: ) |
1398 | 1386 | ;; TWOTRDS: (func $calls-short (type $3) (param $x anyref) (param $y i32) |
1399 | 1387 | ;; TWOTRDS-NEXT: (call $import2 |
1400 | 1388 | ;; TWOTRDS-NEXT: (call $target-short |
1401 | 1389 | ;; TWOTRDS-NEXT: (local.get $x) |
1402 | 1390 | ;; TWOTRDS-NEXT: ) |
1403 | 1391 | ;; TWOTRDS-NEXT: ) |
1404 | | - ;; TWOTRDS-NEXT: (call $target-short_6 |
| 1392 | + ;; TWOTRDS-NEXT: (call $target-short_8 |
1405 | 1393 | ;; TWOTRDS-NEXT: (local.get $x) |
1406 | 1394 | ;; TWOTRDS-NEXT: ) |
1407 | 1395 | ;; TWOTRDS-NEXT: (call $import2 |
|
1411 | 1399 | ;; TWOTRDS-NEXT: ) |
1412 | 1400 | ;; TWOTRDS-NEXT: ) |
1413 | 1401 | ;; TWOTRDS-NEXT: ) |
1414 | | - ;; TWOTRDS-NEXT: (call $target-short_7 |
| 1402 | + ;; TWOTRDS-NEXT: (call $target-short_9 |
1415 | 1403 | ;; TWOTRDS-NEXT: (local.get $y) |
1416 | 1404 | ;; TWOTRDS-NEXT: ) |
1417 | 1405 | ;; TWOTRDS-NEXT: (call $import2 |
|
1421 | 1409 | ;; TWOTRDS-NEXT: ) |
1422 | 1410 | ;; TWOTRDS-NEXT: ) |
1423 | 1411 | ;; TWOTRDS-NEXT: ) |
1424 | | - ;; TWOTRDS-NEXT: (call $target-short_8) |
| 1412 | + ;; TWOTRDS-NEXT: (call $target-short_10) |
1425 | 1413 | ;; TWOTRDS-NEXT: ) |
1426 | 1414 | ;; HUNDRED: (func $calls-short (type $2) (param $x anyref) (param $y i32) |
1427 | 1415 | ;; HUNDRED-NEXT: (call $import2 |
|
1466 | 1454 | (func $calls-short (param $x anyref) (param $y i32) |
1467 | 1455 | ;; As above, but now calling the short function: |
1468 | 1456 | ;; * 0% is the same with the long function: any improvement is enough. |
1469 | | - ;; * 33% optimizes them all (but for the first, which is a trivial call |
1470 | | - ;; context). |
| 1457 | + ;; * 33% optimizes some, but not all (the first is a trivial call context; |
| 1458 | + ;; some of the others do not optimize because the struct.new is |
| 1459 | + ;; expensive, and if the output goes into another call, we cannot remove |
| 1460 | + ;; it). |
1471 | 1461 | ;; * 66% optimizes a few less cases: when the output isn't dropped then we |
1472 | 1462 | ;; can't do enough work to justify it. |
1473 | 1463 | ;; * 100% optimizes nothing. |
|
1606 | 1596 | ;; ZERO___-NEXT: (nop) |
1607 | 1597 | ;; ZERO___-NEXT: ) |
1608 | 1598 |
|
1609 | | -;; THIRD__: (func $target-long_6 (type $1) |
| 1599 | +;; THIRD__: (func $target-long_6 (type $4) (param $0 i32) |
1610 | 1600 | ;; THIRD__-NEXT: (call $import) |
1611 | 1601 | ;; THIRD__-NEXT: (call $import) |
1612 | 1602 | ;; THIRD__-NEXT: (call $import) |
|
1615 | 1605 | ;; THIRD__-NEXT: (call $import) |
1616 | 1606 | ;; THIRD__-NEXT: ) |
1617 | 1607 |
|
1618 | | -;; THIRD__: (func $target-short_7 (type $5) (param $0 anyref) |
1619 | | -;; THIRD__-NEXT: (nop) |
1620 | | -;; THIRD__-NEXT: ) |
1621 | | - |
1622 | | -;; THIRD__: (func $target-short_8 (type $6) (param $0 i32) (result (ref $A)) |
1623 | | -;; THIRD__-NEXT: (struct.new $A |
1624 | | -;; THIRD__-NEXT: (local.get $0) |
1625 | | -;; THIRD__-NEXT: ) |
| 1608 | +;; THIRD__: (func $target-long_7 (type $1) |
| 1609 | +;; THIRD__-NEXT: (call $import) |
| 1610 | +;; THIRD__-NEXT: (call $import) |
| 1611 | +;; THIRD__-NEXT: (call $import) |
| 1612 | +;; THIRD__-NEXT: (call $import) |
| 1613 | +;; THIRD__-NEXT: (call $import) |
| 1614 | +;; THIRD__-NEXT: (call $import) |
1626 | 1615 | ;; THIRD__-NEXT: ) |
1627 | 1616 |
|
1628 | | -;; THIRD__: (func $target-short_9 (type $7) (param $0 i32) |
| 1617 | +;; THIRD__: (func $target-short_8 (type $6) (param $0 anyref) |
1629 | 1618 | ;; THIRD__-NEXT: (nop) |
1630 | 1619 | ;; THIRD__-NEXT: ) |
1631 | 1620 |
|
1632 | | -;; THIRD__: (func $target-short_10 (type $8) (result (ref $A)) |
1633 | | -;; THIRD__-NEXT: (struct.new $A |
1634 | | -;; THIRD__-NEXT: (i32.const 42) |
1635 | | -;; THIRD__-NEXT: ) |
| 1621 | +;; THIRD__: (func $target-short_9 (type $4) (param $0 i32) |
| 1622 | +;; THIRD__-NEXT: (nop) |
1636 | 1623 | ;; THIRD__-NEXT: ) |
1637 | 1624 |
|
1638 | | -;; THIRD__: (func $target-short_11 (type $1) |
| 1625 | +;; THIRD__: (func $target-short_10 (type $1) |
1639 | 1626 | ;; THIRD__-NEXT: (nop) |
1640 | 1627 | ;; THIRD__-NEXT: ) |
1641 | 1628 |
|
1642 | | -;; TWOTRDS: (func $target-short_6 (type $5) (param $0 anyref) |
| 1629 | +;; TWOTRDS: (func $target-long_6 (type $4) (param $0 i32) |
| 1630 | +;; TWOTRDS-NEXT: (call $import) |
| 1631 | +;; TWOTRDS-NEXT: (call $import) |
| 1632 | +;; TWOTRDS-NEXT: (call $import) |
| 1633 | +;; TWOTRDS-NEXT: (call $import) |
| 1634 | +;; TWOTRDS-NEXT: (call $import) |
| 1635 | +;; TWOTRDS-NEXT: (call $import) |
| 1636 | +;; TWOTRDS-NEXT: ) |
| 1637 | + |
| 1638 | +;; TWOTRDS: (func $target-long_7 (type $1) |
| 1639 | +;; TWOTRDS-NEXT: (call $import) |
| 1640 | +;; TWOTRDS-NEXT: (call $import) |
| 1641 | +;; TWOTRDS-NEXT: (call $import) |
| 1642 | +;; TWOTRDS-NEXT: (call $import) |
| 1643 | +;; TWOTRDS-NEXT: (call $import) |
| 1644 | +;; TWOTRDS-NEXT: (call $import) |
| 1645 | +;; TWOTRDS-NEXT: ) |
| 1646 | + |
| 1647 | +;; TWOTRDS: (func $target-short_8 (type $6) (param $0 anyref) |
1643 | 1648 | ;; TWOTRDS-NEXT: (nop) |
1644 | 1649 | ;; TWOTRDS-NEXT: ) |
1645 | 1650 |
|
1646 | | -;; TWOTRDS: (func $target-short_7 (type $6) (param $0 i32) |
| 1651 | +;; TWOTRDS: (func $target-short_9 (type $4) (param $0 i32) |
1647 | 1652 | ;; TWOTRDS-NEXT: (nop) |
1648 | 1653 | ;; TWOTRDS-NEXT: ) |
1649 | 1654 |
|
1650 | | -;; TWOTRDS: (func $target-short_8 (type $1) |
| 1655 | +;; TWOTRDS: (func $target-short_10 (type $1) |
1651 | 1656 | ;; TWOTRDS-NEXT: (nop) |
1652 | 1657 | ;; TWOTRDS-NEXT: ) |
0 commit comments