Skip to content

Commit

Permalink
Replace p6recont_ro C ext op with a desugar
Browse files Browse the repository at this point in the history
This results in slightly larger code (though this is not a commonly
occurring thing), but means that spesh can see into it further and
hopefully better optimize it.

This also fixes the longstanding bug with recont_ro mishandling a
Proxy. Sadly, that in turn regresses spectests.
  • Loading branch information
jnthn committed Jun 11, 2018
1 parent ff952e6 commit 8e4611a
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 27 deletions.
36 changes: 36 additions & 0 deletions src/Perl6/Actions.nqp
Expand Up @@ -709,6 +709,42 @@ register_op_desugar('p6scalarfromdesc', -> $qast {
)
)
});
register_op_desugar('p6recont_ro', -> $qast {
my $result := QAST::Node.unique('result');
my $Scalar := QAST::WVal.new( :value(nqp::gethllsym('perl6', 'Scalar')) );
QAST::Stmt.new(
QAST::Op.new(
:op('bind'),
QAST::Var.new( :name($result), :scope('local'), :decl('var') ),
$qast[0]
),
QAST::Op.new(
:op('if'),
QAST::Op.new(
:op('if'),
QAST::Op.new(
:op('isconcrete_nd'),
QAST::Var.new( :name($result), :scope('local') )
),
QAST::Op.new(
:op('isrwcont'),
QAST::Var.new( :name($result), :scope('local') )
)
),
QAST::Op.new(
:op('p6bindattrinvres'),
QAST::Op.new( :op('create'), $Scalar ),
$Scalar,
QAST::SVal.new( :value('$!value') ),
QAST::Op.new(
:op('decont'),
QAST::Var.new( :name($result), :scope('local') )
)
),
QAST::Var.new( :name($result), :scope('local') )
)
)
});

sub can-use-p6forstmt($block) {
my $past_block := $block.ann('past_block');
Expand Down
4 changes: 0 additions & 4 deletions src/vm/moar/Perl6/Ops.nqp
Expand Up @@ -47,9 +47,6 @@ MAST::ExtOpRegistry.register_extop('p6var',
MAST::ExtOpRegistry.register_extop('p6reprname',
$MVM_operand_obj +| $MVM_operand_write_reg,
$MVM_operand_obj +| $MVM_operand_read_reg);
MAST::ExtOpRegistry.register_extop('p6recont_ro',
$MVM_operand_obj +| $MVM_operand_write_reg,
$MVM_operand_obj +| $MVM_operand_read_reg);
MAST::ExtOpRegistry.register_extop('p6decontrv',
$MVM_operand_obj +| $MVM_operand_write_reg,
$MVM_operand_obj +| $MVM_operand_read_reg);
Expand Down Expand Up @@ -108,7 +105,6 @@ $ops.add_hll_moarop_mapping('perl6', 'p6box_i', 'p6box_i');
$ops.add_hll_moarop_mapping('perl6', 'p6box_n', 'p6box_n');
$ops.add_hll_moarop_mapping('perl6', 'p6box_s', 'p6box_s');
$ops.add_hll_moarop_mapping('perl6', 'p6box_u', 'p6box_u');
$ops.add_hll_moarop_mapping('perl6', 'p6recont_ro', 'p6recont_ro');
$ops.add_hll_op('perl6', 'p6store', -> $qastcomp, $op {
my @ops;
my $cont_res := $qastcomp.as_mast($op[0], :want($MVM_reg_obj));
Expand Down
23 changes: 0 additions & 23 deletions src/vm/moar/ops/perl6_ops.c
Expand Up @@ -217,28 +217,6 @@ static void p6bool_discover(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshIns
#endif
}

static MVMuint8 s_p6recont_ro[] = {
MVM_operand_obj | MVM_operand_write_reg,
MVM_operand_obj | MVM_operand_read_reg,
};
static void p6recont_ro(MVMThreadContext *tc, MVMuint8 *cur_op) {
MVMObject *check = GET_REG(tc, 2).o;
if (IS_CONCRETE(check) && STABLE(check)->container_spec == Rakudo_containers_get_scalar()) {
MVMObject *desc = ((Rakudo_Scalar *)check)->descriptor;
if (!MVM_is_null(tc, desc) && ((Rakudo_ContainerDescriptor *)desc)->rw) {
/* We have an rw container; re-containerize it. */
MVMROOT(tc, check, {
MVMObject *result = MVM_repr_alloc_init(tc, Scalar);
MVM_ASSIGN_REF(tc, &(result->header), ((Rakudo_Scalar *)result)->value,
((Rakudo_Scalar *)check)->value);
GET_REG(tc, 0).o = result;
});
return;
}
}
GET_REG(tc, 0).o = check;
}

/* The .VAR operation. Wraps in an outer Scalar container so we can actually
* operate on the underlying Scalar, if we have a container. */
static MVMuint8 s_p6var[] = {
Expand Down Expand Up @@ -701,7 +679,6 @@ MVM_DLL_EXPORT void Rakudo_ops_init(MVMThreadContext *tc) {
MVM_ext_register_extop(tc, "p6box_u", p6box_u, 2, s_p6box_u, NULL, p6box_u_discover, MVM_EXTOP_PURE | MVM_EXTOP_ALLOCATING);
MVM_ext_register_extop(tc, "p6settypes", p6settypes, 1, s_p6settypes, NULL, NULL, 0);
MVM_ext_register_extop(tc, "p6bool", p6bool, 2, s_p6bool, NULL, p6bool_discover, MVM_EXTOP_PURE);
MVM_ext_register_extop(tc, "p6recont_ro", p6recont_ro, 2, s_p6recont_ro, NULL, NULL, MVM_EXTOP_PURE);
MVM_ext_register_extop(tc, "p6var", p6var, 2, s_p6var, NULL, NULL, MVM_EXTOP_PURE | MVM_EXTOP_ALLOCATING);
MVM_ext_register_extop(tc, "p6reprname", p6reprname, 2, s_p6reprname, NULL, p6reprname_discover, MVM_EXTOP_PURE | MVM_EXTOP_ALLOCATING);
MVM_ext_register_extop(tc, "p6decontrv", p6decontrv, 2, s_p6decontrv, p6decontrv_spesh, NULL, MVM_EXTOP_PURE);
Expand Down

0 comments on commit 8e4611a

Please sign in to comment.