Skip to content

Commit 23dd12d

Browse files
committed
[JIT] Get type object for type-variant opcodes
Stolen from the devirtualization code in graph.c
1 parent e4a756c commit 23dd12d

File tree

1 file changed

+89
-2
lines changed

1 file changed

+89
-2
lines changed

src/jit/expr.c

Lines changed: 89 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -468,8 +468,6 @@ MVMint32 MVM_jit_expr_apply_template_adhoc(MVMThreadContext *tc, MVMJitExprTree
468468
static void analyze_node(MVMThreadContext *tc, MVMJitTreeTraverser *traverser,
469469
MVMJitExprTree *tree, MVMint32 node) {
470470

471-
const struct OpInfo *op_info = get_op_info(tree->nodes[node]);
472-
473471
MVMint32 first_child = MVM_JIT_EXPR_FIRST_CHILD(tree, node);
474472
MVMint32 nchild = MVM_JIT_EXPR_NCHILD(tree, node);
475473
MVMint32 *links = MVM_JIT_EXPR_LINKS(tree, node);
@@ -653,6 +651,91 @@ static MVMint32 tree_is_empty(MVMThreadContext *tc, MVMJitExprTree *tree) {
653651
return MVM_VECTOR_ELEMS(tree->nodes) == 0;
654652
}
655653

654+
static MVMObject* get_type_object_for_instruction(MVMThreadContext *tc, MVMSpeshGraph *sg, MVMSpeshIns *ins, MVMuint16 opcode) {
655+
MVMSpeshOperand type_operand;
656+
MVMSpeshFacts *type_facts;
657+
switch (opcode) {
658+
case MVM_OP_unshift_i:
659+
case MVM_OP_unshift_n:
660+
case MVM_OP_unshift_s:
661+
case MVM_OP_unshift_o:
662+
case MVM_OP_bindkey_i:
663+
case MVM_OP_bindkey_n:
664+
case MVM_OP_bindkey_s:
665+
case MVM_OP_bindkey_o:
666+
case MVM_OP_bindpos_i:
667+
case MVM_OP_bindpos_n:
668+
case MVM_OP_bindpos_s:
669+
case MVM_OP_bindpos_o:
670+
case MVM_OP_bindattr_i:
671+
case MVM_OP_bindattr_n:
672+
case MVM_OP_bindattr_s:
673+
case MVM_OP_bindattr_o:
674+
case MVM_OP_bindattrs_i:
675+
case MVM_OP_bindattrs_n:
676+
case MVM_OP_bindattrs_s:
677+
case MVM_OP_bindattrs_o:
678+
case MVM_OP_push_i:
679+
case MVM_OP_push_n:
680+
case MVM_OP_push_s:
681+
case MVM_OP_push_o:
682+
case MVM_OP_deletekey:
683+
case MVM_OP_setelemspos:
684+
case MVM_OP_splice:
685+
case MVM_OP_assign_i:
686+
case MVM_OP_assign_n:
687+
case MVM_OP_assign_s:
688+
type_operand = ins->operands[0];
689+
break;
690+
case MVM_OP_atpos_i:
691+
case MVM_OP_atpos_n:
692+
case MVM_OP_atpos_s:
693+
case MVM_OP_atpos_o:
694+
case MVM_OP_atkey_i:
695+
case MVM_OP_atkey_n:
696+
case MVM_OP_atkey_s:
697+
case MVM_OP_atkey_o:
698+
case MVM_OP_elems:
699+
case MVM_OP_shift_i:
700+
case MVM_OP_shift_n:
701+
case MVM_OP_shift_s:
702+
case MVM_OP_shift_o:
703+
case MVM_OP_pop_i:
704+
case MVM_OP_pop_n:
705+
case MVM_OP_pop_s:
706+
case MVM_OP_pop_o:
707+
case MVM_OP_existskey:
708+
case MVM_OP_existspos:
709+
case MVM_OP_getattr_i:
710+
case MVM_OP_getattr_n:
711+
case MVM_OP_getattr_s:
712+
case MVM_OP_getattr_o:
713+
case MVM_OP_getattrs_i:
714+
case MVM_OP_getattrs_n:
715+
case MVM_OP_getattrs_s:
716+
case MVM_OP_getattrs_o:
717+
case MVM_OP_attrinited:
718+
case MVM_OP_hintfor:
719+
case MVM_OP_slice:
720+
case MVM_OP_decont_i:
721+
case MVM_OP_decont_n:
722+
case MVM_OP_decont_s:
723+
type_operand = ins->operands[1];
724+
break;
725+
case MVM_OP_box_i:
726+
case MVM_OP_box_n:
727+
case MVM_OP_box_s:
728+
type_operand = ins->operands[2];
729+
break;
730+
default:
731+
return NULL;
732+
}
733+
type_facts = MVM_spesh_get_facts(tc, sg, type_operand);
734+
if (type_facts != NULL && type_facts->flags & MVM_SPESH_FACT_KNOWN_TYPE)
735+
return type_facts->type;
736+
return NULL;
737+
}
738+
656739
MVMJitExprTree * MVM_jit_expr_tree_build(MVMThreadContext *tc, MVMJitGraph *jg, MVMSpeshIterator *iter) {
657740
MVMSpeshGraph *sg = jg->sg;
658741
MVMSpeshIns *entry = iter->ins;
@@ -697,6 +780,7 @@ MVMJitExprTree * MVM_jit_expr_tree_build(MVMThreadContext *tc, MVMJitGraph *jg,
697780
MVMuint16 opcode = ins->info->opcode;
698781
MVMSpeshAnn *ann;
699782
const MVMJitExprTemplate *template;
783+
MVMObject *type_object;
700784
MVMint32 before_label = -1, after_label = -1, root = 0;
701785

702786
struct ValueDefinition *defined_value = NULL;
@@ -781,6 +865,9 @@ MVMJitExprTree * MVM_jit_expr_tree_build(MVMThreadContext *tc, MVMJitGraph *jg,
781865
goto emit;
782866
}
783867

868+
type_object = get_type_object_for_instruction(tc, sg, ins, opcode);
869+
/* if (type_object != NULL);
870+
fprintf(stderr, "opcode=%s type_object=%p debug_name=%s\n", ins->info->name, type_object, type_object->st->debug_name); */
784871
template = MVM_jit_get_template_for_opcode(opcode);
785872
BAIL(template == NULL, "Cannot get template for: %s", ins->info->name);
786873
if (tree_is_empty(tc, tree)) {

0 commit comments

Comments
 (0)