< prev index next >

src/hotspot/share/opto/lcm.cpp

Print this page

        

@@ -783,13 +783,16 @@
   set_next_call(block, call, next_call);
 }
 
 //------------------------------add_call_kills-------------------------------------
 // helper function that adds caller save registers to MachProjNode
-static void add_call_kills(MachProjNode *proj, RegMask& regs, const char* save_policy, bool exclude_soe) {
+static void add_call_kills(MachProjNode *proj, RegMask& regs, const char* save_policy, bool exclude_soe, bool exclude_fp) {
   // Fill in the kill mask for the call
   for( OptoReg::Name r = OptoReg::Name(0); r < _last_Mach_Reg; r=OptoReg::add(r,1) ) {
+    if (exclude_fp && (register_save_type[r] == Op_RegF || register_save_type[r] == Op_RegD)) {
+      continue;
+    }
     if( !regs.Member(r) ) {     // Not already defined by the call
       // Save-on-call register?
       if ((save_policy[r] == 'C') ||
           (save_policy[r] == 'A') ||
           ((save_policy[r] == 'E') && exclude_soe)) {

@@ -886,11 +889,11 @@
     MachCallStaticJavaNode* mcallstaticjava = (MachCallStaticJavaNode*) mcall;
     if (mcallstaticjava->_method_handle_invoke)
       proj->_rout.OR(Matcher::method_handle_invoke_SP_save_mask());
   }
 
-  add_call_kills(proj, regs, save_policy, exclude_soe);
+  add_call_kills(proj, regs, save_policy, exclude_soe, mcall->preserves_fp_registers());
 
   return node_cnt;
 }
 
 

@@ -1127,11 +1130,11 @@
 
       MachProjNode *proj = new MachProjNode( n, 1, RegMask::Empty, MachProjNode::fat_proj );
       map_node_to_block(proj, block);
       block->insert_node(proj, phi_cnt++);
 
-      add_call_kills(proj, regs, _matcher._c_reg_save_policy, false);
+      add_call_kills(proj, regs, _matcher._c_reg_save_policy, false, false);
     }
 
     // Children are now all ready
     for (DUIterator_Fast i5max, i5 = n->fast_outs(i5max); i5 < i5max; i5++) {
       Node* m = n->fast_out(i5); // Get user
< prev index next >