|
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