Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
also speed up non-sunk ++, as well as --
Turns out that, even in non-sunk context, turning $++ into ($i = $i + 1) - 1
is a whole lot faster than allocating a temp.
  • Loading branch information
TimToady committed Dec 16, 2015
1 parent df82f43 commit eac2b86
Showing 1 changed file with 15 additions and 6 deletions.
21 changes: 15 additions & 6 deletions src/Perl6/Optimizer.nqp
Expand Up @@ -1414,17 +1414,26 @@ class Perl6::Optimizer {
}
}
}
elsif $!level >= 2 &&
($op.name eq '&prefix:<++>' ||
$op.name eq '&postfix:<++>' && $!void_context)
{
elsif $!level >= 2 && ($op.name eq '&prefix:<++>' || $op.name eq '&postfix:<++>' ||
$op.name eq '&prefix:<-->' || $op.name eq '&postfix:<-->') {
my $var := $op[0];
if nqp::istype($var,QAST::Var) && $var.scope eq 'lexicalref' && nqp::objprimspec($var.returns) == 1 {
my $want := QAST::Want.new(
my $add := nqp::eqat($op.name,'++', -3) ?? 'add_i' !! 'sub_i';
my $sub := nqp::eqat($op.name,'++', -3) ?? 'sub_i' !! 'add_i';
my $one := QAST::Want.new(
QAST::WVal.new( :value($!symbols.find_lexical('Int')) ),
'Ii',
QAST::IVal.new( :value(1) ));
return QAST::Op.new( :op('assign_i'), :returns($var.returns), $var, QAST::Op.new(:op('add_i'), $var, $want));
if $!void_context || nqp::eqat($op.name,'&pre',0) { # can use simple add?
# $i = $i + 1 (or $i = $i - 1)
return QAST::Op.new( :op('assign_i'), :returns($var.returns), $var, QAST::Op.new(:op($add), $var, $one));
}
else { # can't, but still much faster to subtract 1 back out than to allocate temp
# ($i = $i + 1) - 1 (or ($i = $i - 1) + 1)
return QAST::Op.new( :op($sub), :returns($var.returns),
QAST::Op.new( :op('assign_i'), :returns($var.returns), $var, QAST::Op.new(:op($add), $var, $one)),
$one);
}
}
}
# If it's an onlystar proto, we have a couple of options.
Expand Down

0 comments on commit eac2b86

Please sign in to comment.