summaryrefslogtreecommitdiff
path: root/regen/opcodes
diff options
context:
space:
mode:
authorRichard Leach <richardleach@users.noreply.github.com>2022-08-02 21:48:26 +0000
committerRichard Leach <richardleach@users.noreply.github.com>2022-10-24 23:21:17 +0100
commit10a5c9138224597d018843f3b298a928555b67f0 (patch)
tree008b756c7b5f34777576c94ebca07c22ee4c271f /regen/opcodes
parent71a3dd321d7fa8259a22a1ca1e87aa820a8deef2 (diff)
downloadperl-10a5c9138224597d018843f3b298a928555b67f0.tar.gz
OP_EMPTYAVHV - optimized empty ANONLIST/ANONHASH
This commit introduces a new OP to replace cases of OP_ANONLIST and OP_ANONHASH where there are zero elements, which is very common in Perl code. As an example, `my $x = {}` is currently implemented like this: ... 6 <2> sassign vKS/2 ->7 4 <@> anonhash sK* ->5 3 <0> pushmark s ->4 5 <0> padsv[$x:1,2] sRM*/LVINTRO ->6 The pushmark serves no meaningful purpose when there are zero elements and the anonhash, besides undoing the pushmark, performs work that is unnecessary for this special case. The peephole optimizer, which also checks for applicability of a related TARGMY optimization, transforms this example into: ... - <1> ex-sassign vKS/2 ->4 3 <@> emptyavhv[$x:1,2] vK*/LVINTRO,ANONHASH,TARGMY ->4 - <0> ex-pushmark s ->3 - <0> ex-padsv sRM*/LVINTRO ->-
Diffstat (limited to 'regen/opcodes')
-rw-r--r--regen/opcodes1
1 files changed, 1 insertions, 0 deletions
diff --git a/regen/opcodes b/regen/opcodes
index f6b68ec61b..c48c337076 100644
--- a/regen/opcodes
+++ b/regen/opcodes
@@ -261,6 +261,7 @@ list list ck_null m@ L
lslice list slice ck_null 2 H L L
anonlist anonymous array ([]) ck_fun ms@ L
anonhash anonymous hash ({}) ck_fun ms@ L
+emptyavhv empty anon hash/array ck_fun sT@ L
splice splice ck_fun m@ A S? S? L
push push ck_fun imsT@ A L