< prev index next >

src/hotspot/share/opto/compile.cpp

Print this page




2836   kit.replace_call(vbox_alloc, vec_obj, true);
2837   C->remove_macro_node(vbox_alloc);
2838   return vec_obj;
2839 }
2840 
2841 void Compile::expand_vunbox_node(VectorUnboxNode* vec_unbox) {
2842   if (vec_unbox->outcnt() > 0) {
2843     GraphKit kit;
2844     PhaseGVN& gvn = kit.gvn();
2845 
2846     Node* obj = vec_unbox->obj();
2847     const TypeInstPtr* tinst = gvn.type(obj)->isa_instptr();
2848     ciInstanceKlass* from_kls = tinst->klass()->as_instance_klass();
2849     BasicType bt = vec_unbox->vect_type()->element_basic_type();
2850     BasicType masktype = bt;
2851 
2852     const char* field_name = "vec";
2853     if (from_kls->is_vectormask()) {
2854       field_name = "bits";
2855       bt = T_BOOLEAN;



2856     }
2857 
2858     ciField* field = from_kls->get_field_by_name(ciSymbol::make(field_name),
2859       ciSymbol::make(TypeArrayKlass::external_name(bt)), false);
2860 
2861     int offset = field->offset_in_bytes();
2862     Node* vec_adr = kit.basic_plus_adr(obj, offset);
2863 
2864     Node* mem = vec_unbox->mem();
2865     Node* ctrl = vec_unbox->in(0);
2866     Node* vec_field_ld = LoadNode::make(gvn,
2867                                         ctrl,
2868                                         mem,
2869                                         vec_adr,
2870                                         vec_adr->bottom_type()->is_ptr(),
2871                                         TypeOopPtr::make_from_klass(field->type()->as_klass()),
2872                                         T_OBJECT,
2873                                         MemNode::unordered);
2874     vec_field_ld = gvn.transform(vec_field_ld);
2875 
2876     Node* adr = kit.array_element_address(vec_field_ld, gvn.intcon(0), bt);
2877     const TypePtr* adr_type = adr->bottom_type()->is_ptr();
2878     int num_elem = vec_unbox->bottom_type()->is_vect()->length();
2879     Node* vec_val_load = LoadVectorNode::make(0,
2880                                               ctrl,
2881                                               mem,
2882                                               adr,
2883                                               adr_type,
2884                                               num_elem,
2885                                               bt);
2886     vec_val_load = gvn.transform(vec_val_load);
2887 
2888     if (from_kls->is_vectormask() && masktype != T_BOOLEAN) {
2889       assert(vec_unbox->bottom_type()->is_vect()->element_basic_type() == masktype, "expect mask type consistency");
2890       vec_val_load = gvn.transform(new VectorLoadMaskNode(vec_val_load, TypeVect::make(masktype, num_elem)));



2891     }
2892 
2893     gvn.hash_delete(vec_unbox);
2894     vec_unbox->disconnect_inputs(NULL, C);
2895     C->gvn_replace_by(vec_unbox, vec_val_load);
2896   }
2897   C->remove_macro_node(vec_unbox);
2898 }
2899 
2900 void Compile::eliminate_vbox_alloc_node(VectorBoxAllocateNode* vbox_alloc) {
2901   JVMState* jvms = clone_jvms(C, vbox_alloc);
2902   GraphKit kit(jvms);
2903   // FIXME replace VBA with a safepoint. Otherwise, no safepoints left in tight loops.
2904   kit.replace_call(vbox_alloc, kit.top(), true);
2905   C->remove_macro_node(vbox_alloc);
2906 }
2907 
2908 //------------------------------Code_Gen---------------------------------------
2909 // Given a graph, generate code for it
2910 void Compile::Code_Gen() {




2836   kit.replace_call(vbox_alloc, vec_obj, true);
2837   C->remove_macro_node(vbox_alloc);
2838   return vec_obj;
2839 }
2840 
2841 void Compile::expand_vunbox_node(VectorUnboxNode* vec_unbox) {
2842   if (vec_unbox->outcnt() > 0) {
2843     GraphKit kit;
2844     PhaseGVN& gvn = kit.gvn();
2845 
2846     Node* obj = vec_unbox->obj();
2847     const TypeInstPtr* tinst = gvn.type(obj)->isa_instptr();
2848     ciInstanceKlass* from_kls = tinst->klass()->as_instance_klass();
2849     BasicType bt = vec_unbox->vect_type()->element_basic_type();
2850     BasicType masktype = bt;
2851 
2852     const char* field_name = "vec";
2853     if (from_kls->is_vectormask()) {
2854       field_name = "bits";
2855       bt = T_BOOLEAN;
2856     } else if (from_kls->is_vectorshuffle()) {
2857       field_name = "reorder";
2858       bt = T_BYTE;
2859     }
2860 
2861     ciField* field = from_kls->get_field_by_name(ciSymbol::make(field_name),
2862       ciSymbol::make(TypeArrayKlass::external_name(bt)), false);
2863 
2864     int offset = field->offset_in_bytes();
2865     Node* vec_adr = kit.basic_plus_adr(obj, offset);
2866 
2867     Node* mem = vec_unbox->mem();
2868     Node* ctrl = vec_unbox->in(0);
2869     Node* vec_field_ld = LoadNode::make(gvn,
2870                                         ctrl,
2871                                         mem,
2872                                         vec_adr,
2873                                         vec_adr->bottom_type()->is_ptr(),
2874                                         TypeOopPtr::make_from_klass(field->type()->as_klass()),
2875                                         T_OBJECT,
2876                                         MemNode::unordered);
2877     vec_field_ld = gvn.transform(vec_field_ld);
2878 
2879     Node* adr = kit.array_element_address(vec_field_ld, gvn.intcon(0), bt);
2880     const TypePtr* adr_type = adr->bottom_type()->is_ptr();
2881     int num_elem = vec_unbox->bottom_type()->is_vect()->length();
2882     Node* vec_val_load = LoadVectorNode::make(0,
2883                                               ctrl,
2884                                               mem,
2885                                               adr,
2886                                               adr_type,
2887                                               num_elem,
2888                                               bt);
2889     vec_val_load = gvn.transform(vec_val_load);
2890 
2891     if (from_kls->is_vectormask() && masktype != T_BOOLEAN) {
2892       assert(vec_unbox->bottom_type()->is_vect()->element_basic_type() == masktype, "expect mask type consistency");
2893       vec_val_load = gvn.transform(new VectorLoadMaskNode(vec_val_load, TypeVect::make(masktype, num_elem)));
2894     } else if (from_kls->is_vectorshuffle()) {
2895       assert(vec_unbox->bottom_type()->is_vect()->element_basic_type() == masktype, "expect shuffle type consistency");
2896       vec_val_load = gvn.transform(new VectorLoadShuffleNode(vec_val_load, TypeVect::make(masktype, num_elem)));
2897     }
2898 
2899     gvn.hash_delete(vec_unbox);
2900     vec_unbox->disconnect_inputs(NULL, C);
2901     C->gvn_replace_by(vec_unbox, vec_val_load);
2902   }
2903   C->remove_macro_node(vec_unbox);
2904 }
2905 
2906 void Compile::eliminate_vbox_alloc_node(VectorBoxAllocateNode* vbox_alloc) {
2907   JVMState* jvms = clone_jvms(C, vbox_alloc);
2908   GraphKit kit(jvms);
2909   // FIXME replace VBA with a safepoint. Otherwise, no safepoints left in tight loops.
2910   kit.replace_call(vbox_alloc, kit.top(), true);
2911   C->remove_macro_node(vbox_alloc);
2912 }
2913 
2914 //------------------------------Code_Gen---------------------------------------
2915 // Given a graph, generate code for it
2916 void Compile::Code_Gen() {


< prev index next >