Commit f4fe2ff
committed
ZJIT: Optimize send with a nil block to SendWithoutBlockDirect
A call like `foo(&block)` sets VM_CALL_ARGS_BLOCKARG, which previously
forced a dynamic dispatch even when the block argument is nil and the
callee is an ISEQ method that could otherwise be reduced to a
SendDirect.
Passing a nil block argument is equivalent to calling without a block,
so when we can prove the block argument is nil we strip it and treat the
call as blockless. This happens when the block argument is either:
* statically known to be nil, or
* profiled as monomorphically nil, in which case we emit a
GuardBitEquals against nil (side exit reason BlockArgNotNil) before
stripping it so a non-nil block at runtime takes a side exit.
When the block argument can't be proven nil, we fall back to a dynamic
Send and record the SendBlockArgNotNil fallback reason.
The stripped-block frame state is used only for the callee frame
for the direct send. The pre-call guards (the nil-block GuardBitEquals,
the receiver GuardType, and the method-redefinition PatchPoint) keep
using the original frame state, which still has the block argument on
the stack so that it is there if we side exit.1 parent a5f6050 commit f4fe2ff
4 files changed
Lines changed: 145 additions & 29 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
452 | 452 | | |
453 | 453 | | |
454 | 454 | | |
| 455 | + | |
| 456 | + | |
| 457 | + | |
| 458 | + | |
| 459 | + | |
| 460 | + | |
| 461 | + | |
| 462 | + | |
| 463 | + | |
| 464 | + | |
| 465 | + | |
| 466 | + | |
| 467 | + | |
| 468 | + | |
| 469 | + | |
| 470 | + | |
| 471 | + | |
| 472 | + | |
| 473 | + | |
| 474 | + | |
| 475 | + | |
| 476 | + | |
| 477 | + | |
| 478 | + | |
| 479 | + | |
| 480 | + | |
| 481 | + | |
| 482 | + | |
| 483 | + | |
| 484 | + | |
| 485 | + | |
| 486 | + | |
| 487 | + | |
| 488 | + | |
| 489 | + | |
| 490 | + | |
| 491 | + | |
| 492 | + | |
| 493 | + | |
| 494 | + | |
| 495 | + | |
| 496 | + | |
| 497 | + | |
| 498 | + | |
| 499 | + | |
| 500 | + | |
| 501 | + | |
| 502 | + | |
| 503 | + | |
| 504 | + | |
455 | 505 | | |
456 | 506 | | |
457 | 507 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
531 | 531 | | |
532 | 532 | | |
533 | 533 | | |
| 534 | + | |
534 | 535 | | |
535 | 536 | | |
536 | 537 | | |
| |||
694 | 695 | | |
695 | 696 | | |
696 | 697 | | |
| 698 | + | |
| 699 | + | |
697 | 700 | | |
698 | 701 | | |
699 | 702 | | |
| |||
768 | 771 | | |
769 | 772 | | |
770 | 773 | | |
| 774 | + | |
771 | 775 | | |
772 | 776 | | |
773 | 777 | | |
| |||
2488 | 2492 | | |
2489 | 2493 | | |
2490 | 2494 | | |
2491 | | - | |
| 2495 | + | |
2492 | 2496 | | |
2493 | 2497 | | |
2494 | 2498 | | |
| |||
3803 | 3807 | | |
3804 | 3808 | | |
3805 | 3809 | | |
3806 | | - | |
| 3810 | + | |
3807 | 3811 | | |
3808 | 3812 | | |
3809 | 3813 | | |
| |||
3864 | 3868 | | |
3865 | 3869 | | |
3866 | 3870 | | |
| 3871 | + | |
| 3872 | + | |
| 3873 | + | |
| 3874 | + | |
| 3875 | + | |
| 3876 | + | |
| 3877 | + | |
| 3878 | + | |
| 3879 | + | |
| 3880 | + | |
| 3881 | + | |
| 3882 | + | |
| 3883 | + | |
| 3884 | + | |
| 3885 | + | |
| 3886 | + | |
| 3887 | + | |
| 3888 | + | |
| 3889 | + | |
| 3890 | + | |
| 3891 | + | |
| 3892 | + | |
| 3893 | + | |
| 3894 | + | |
| 3895 | + | |
| 3896 | + | |
| 3897 | + | |
| 3898 | + | |
| 3899 | + | |
| 3900 | + | |
| 3901 | + | |
| 3902 | + | |
| 3903 | + | |
| 3904 | + | |
| 3905 | + | |
| 3906 | + | |
| 3907 | + | |
| 3908 | + | |
| 3909 | + | |
| 3910 | + | |
| 3911 | + | |
| 3912 | + | |
| 3913 | + | |
| 3914 | + | |
| 3915 | + | |
| 3916 | + | |
3867 | 3917 | | |
3868 | 3918 | | |
3869 | | - | |
| 3919 | + | |
| 3920 | + | |
| 3921 | + | |
3870 | 3922 | | |
3871 | 3923 | | |
3872 | 3924 | | |
| |||
3882 | 3934 | | |
3883 | 3935 | | |
3884 | 3936 | | |
3885 | | - | |
| 3937 | + | |
3886 | 3938 | | |
3887 | 3939 | | |
3888 | 3940 | | |
| |||
3922 | 3974 | | |
3923 | 3975 | | |
3924 | 3976 | | |
3925 | | - | |
| 3977 | + | |
3926 | 3978 | | |
3927 | 3979 | | |
3928 | 3980 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
5207 | 5207 | | |
5208 | 5208 | | |
5209 | 5209 | | |
5210 | | - | |
| 5210 | + | |
5211 | 5211 | | |
5212 | 5212 | | |
5213 | 5213 | | |
| |||
5263 | 5263 | | |
5264 | 5264 | | |
5265 | 5265 | | |
5266 | | - | |
| 5266 | + | |
5267 | 5267 | | |
5268 | 5268 | | |
5269 | 5269 | | |
| |||
5428 | 5428 | | |
5429 | 5429 | | |
5430 | 5430 | | |
5431 | | - | |
| 5431 | + | |
5432 | 5432 | | |
5433 | 5433 | | |
5434 | 5434 | | |
| |||
5496 | 5496 | | |
5497 | 5497 | | |
5498 | 5498 | | |
5499 | | - | |
| 5499 | + | |
5500 | 5500 | | |
5501 | 5501 | | |
5502 | 5502 | | |
| |||
9519 | 9519 | | |
9520 | 9520 | | |
9521 | 9521 | | |
9522 | | - | |
| 9522 | + | |
9523 | 9523 | | |
9524 | 9524 | | |
9525 | 9525 | | |
| |||
9559 | 9559 | | |
9560 | 9560 | | |
9561 | 9561 | | |
9562 | | - | |
| 9562 | + | |
| 9563 | + | |
| 9564 | + | |
| 9565 | + | |
9563 | 9566 | | |
9564 | | - | |
| 9567 | + | |
9565 | 9568 | | |
9566 | 9569 | | |
9567 | 9570 | | |
| |||
9600 | 9603 | | |
9601 | 9604 | | |
9602 | 9605 | | |
9603 | | - | |
| 9606 | + | |
9604 | 9607 | | |
9605 | 9608 | | |
9606 | 9609 | | |
| |||
9768 | 9771 | | |
9769 | 9772 | | |
9770 | 9773 | | |
9771 | | - | |
| 9774 | + | |
9772 | 9775 | | |
9773 | 9776 | | |
9774 | 9777 | | |
| |||
9799 | 9802 | | |
9800 | 9803 | | |
9801 | 9804 | | |
9802 | | - | |
| 9805 | + | |
| 9806 | + | |
| 9807 | + | |
9803 | 9808 | | |
9804 | | - | |
| 9809 | + | |
9805 | 9810 | | |
9806 | 9811 | | |
9807 | 9812 | | |
| |||
9830 | 9835 | | |
9831 | 9836 | | |
9832 | 9837 | | |
9833 | | - | |
9834 | | - | |
9835 | | - | |
9836 | | - | |
9837 | | - | |
9838 | | - | |
| 9838 | + | |
| 9839 | + | |
| 9840 | + | |
9839 | 9841 | | |
9840 | 9842 | | |
9841 | 9843 | | |
| 9844 | + | |
| 9845 | + | |
| 9846 | + | |
| 9847 | + | |
| 9848 | + | |
9842 | 9849 | | |
9843 | | - | |
| 9850 | + | |
| 9851 | + | |
| 9852 | + | |
| 9853 | + | |
9844 | 9854 | | |
9845 | | - | |
| 9855 | + | |
9846 | 9856 | | |
9847 | 9857 | | |
9848 | 9858 | | |
| |||
13203 | 13213 | | |
13204 | 13214 | | |
13205 | 13215 | | |
13206 | | - | |
| 13216 | + | |
13207 | 13217 | | |
13208 | 13218 | | |
13209 | 13219 | | |
| |||
13248 | 13258 | | |
13249 | 13259 | | |
13250 | 13260 | | |
13251 | | - | |
| 13261 | + | |
13252 | 13262 | | |
13253 | 13263 | | |
13254 | 13264 | | |
| |||
17095 | 17105 | | |
17096 | 17106 | | |
17097 | 17107 | | |
17098 | | - | |
| 17108 | + | |
17099 | 17109 | | |
17100 | 17110 | | |
17101 | 17111 | | |
| |||
17118 | 17128 | | |
17119 | 17129 | | |
17120 | 17130 | | |
17121 | | - | |
| 17131 | + | |
17122 | 17132 | | |
17123 | 17133 | | |
17124 | 17134 | | |
| |||
19326 | 19336 | | |
19327 | 19337 | | |
19328 | 19338 | | |
19329 | | - | |
| 19339 | + | |
19330 | 19340 | | |
19331 | 19341 | | |
19332 | 19342 | | |
| |||
0 commit comments