From 92d21cdc58db7fffac2b0b7a40e7d24a90a04259 Mon Sep 17 00:00:00 2001 From: Jonathan Worthington Date: Wed, 15 May 2019 14:55:49 +0200 Subject: [PATCH] Don't break arg instruction sequence When we insert a materialization, make sure it goes prior to the prepargs. --- src/spesh/pea.c | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/src/spesh/pea.c b/src/spesh/pea.c index bf4aaba3b9..dca1537673 100644 --- a/src/spesh/pea.c +++ b/src/spesh/pea.c @@ -277,6 +277,27 @@ static MVMSpeshOperand resolve_materialization_target(MVMThreadContext *tc, MVMS } } +/* We should not stick a materialization in an args sequence; insert it + * prior to that. */ +MVMSpeshIns * find_materialization_insertion_point(MVMThreadContext *tc, MVMSpeshIns *ins) { + while (ins) { + switch (ins->info->opcode) { + case MVM_OP_arg_i: + case MVM_OP_arg_n: + case MVM_OP_arg_s: + case MVM_OP_arg_o: + case MVM_OP_argconst_i: + case MVM_OP_argconst_n: + case MVM_OP_argconst_s: + ins = ins->prev; + break; + default: + return ins; + } + } + MVM_oops(tc, "Spesh PEA: failed to find materialization insertion point"); +} + /* Emit the materialization of an object into the specified register. */ static void emit_materialization(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *bb, MVMSpeshIns *prior_to, MVMSpeshOperand target, @@ -526,7 +547,8 @@ static void apply_transform(MVMThreadContext *tc, MVMSpeshGraph *g, GraphState * MaterializationTarget *alias_target = initial_target->next; MVMSpeshIns *prior_to = t->materialize.prior_to; MVMuint8 *used = t->materialize.used; - emit_materialization(tc, g, bb, prior_to, + emit_materialization(tc, g, bb, + find_materialization_insertion_point(tc, prior_to), resolve_materialization_target(tc, g, gs, initial_target), gs, t->allocation, used); while (alias_target) {