@@ -468,8 +468,6 @@ MVMint32 MVM_jit_expr_apply_template_adhoc(MVMThreadContext *tc, MVMJitExprTree
468
468
static void analyze_node (MVMThreadContext * tc , MVMJitTreeTraverser * traverser ,
469
469
MVMJitExprTree * tree , MVMint32 node ) {
470
470
471
- const struct OpInfo * op_info = get_op_info (tree -> nodes [node ]);
472
-
473
471
MVMint32 first_child = MVM_JIT_EXPR_FIRST_CHILD (tree , node );
474
472
MVMint32 nchild = MVM_JIT_EXPR_NCHILD (tree , node );
475
473
MVMint32 * links = MVM_JIT_EXPR_LINKS (tree , node );
@@ -653,6 +651,91 @@ static MVMint32 tree_is_empty(MVMThreadContext *tc, MVMJitExprTree *tree) {
653
651
return MVM_VECTOR_ELEMS (tree -> nodes ) == 0 ;
654
652
}
655
653
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
+
656
739
MVMJitExprTree * MVM_jit_expr_tree_build (MVMThreadContext * tc , MVMJitGraph * jg , MVMSpeshIterator * iter ) {
657
740
MVMSpeshGraph * sg = jg -> sg ;
658
741
MVMSpeshIns * entry = iter -> ins ;
@@ -697,6 +780,7 @@ MVMJitExprTree * MVM_jit_expr_tree_build(MVMThreadContext *tc, MVMJitGraph *jg,
697
780
MVMuint16 opcode = ins -> info -> opcode ;
698
781
MVMSpeshAnn * ann ;
699
782
const MVMJitExprTemplate * template ;
783
+ MVMObject * type_object ;
700
784
MVMint32 before_label = -1 , after_label = -1 , root = 0 ;
701
785
702
786
struct ValueDefinition * defined_value = NULL ;
@@ -781,6 +865,9 @@ MVMJitExprTree * MVM_jit_expr_tree_build(MVMThreadContext *tc, MVMJitGraph *jg,
781
865
goto emit ;
782
866
}
783
867
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); */
784
871
template = MVM_jit_get_template_for_opcode (opcode );
785
872
BAIL (template == NULL , "Cannot get template for: %s" , ins -> info -> name );
786
873
if (tree_is_empty (tc , tree )) {
0 commit comments