Author: shenruifen
Date: 2011-05-26 23:34:34 -0400 (Thu, 26 May 2011)
New Revision: 3631

Modified:
   trunk/osprey/be/cg/gcm.cxx
Log:
(1) Refine code
(2) Fix bug in Find_Limit_OP and SL special part

Approved by Mr Sunchan and Lai Jianxin



Modified: trunk/osprey/be/cg/gcm.cxx
===================================================================
--- trunk/osprey/be/cg/gcm.cxx  2011-05-27 01:38:45 UTC (rev 3630)
+++ trunk/osprey/be/cg/gcm.cxx  2011-05-27 03:34:34 UTC (rev 3631)
@@ -657,7 +657,6 @@
   if (OP_Defs_TN(op, SP_TN) || OP_Defs_Reg(op, REGISTER_CLASS_sp, REGISTER_sp))
     return TRUE;
 
-#if !defined(TARG_SL)
   // Do extra processing for BRP instructions.
   if (OP_branch_predict(op)) {
     UINT64 num_insts = 0;
@@ -675,67 +674,8 @@
     if ((num_insts * 1.3 * INST_BYTES) >= DEFAULT_BRP_BRANCH_LIMIT)
       return TRUE;
   }
-#endif
 
   // Even SP ref OPS are a trouble for circular scheduling
-  if( Motion_Is_CIRC_ABOVE(motion_type) ) {
-     if (OP_Refs_TN(op,  SP_TN) || 
-        OP_Refs_Reg(op, REGISTER_CLASS_sp, REGISTER_sp)) return TRUE;
-
-#if !defined(TARG_SL)
-     // No need to circular-schedule BRP ops.
-     if (OP_branch_predict(op)) return TRUE;
-
-     if (OP_memory(op)) {
-       if (OP_no_alias(op) || OP_prefetch(op)) return FALSE;
-       /* Needn't consider the out-of-bound problem .
-        * I'll try to bring in the speculation variable later
-        */
-       // If <PROC> has delayed exception mechanism, either by speculative
-       // loads or predication, return FALSE.
-       if (PROC_has_delayed_exception() && OP_has_predicate(op)) { 
-        return FALSE;
-       } else {
-
-        // TODO: Need to add more relaxation rules w.r.t memory accesses 
-        // which can be verified as safe. Disallow memory references which 
-        // belong to KIND_ARRAY type since circular scheduling them can lead 
-        // to out-of-bound accesses. Need to change constant operand 
-        // reference by a generic item. 
-
-        if (TN_is_symbol(OP_opnd(op, 1)) && 
-            ST_class(TN_var(OP_opnd(op, 1))) == CLASS_VAR && 
-            TY_kind(ST_type(TN_var(OP_opnd(op, 1)))) != KIND_ARRAY) 
-          return FALSE;
-       }
-       return TRUE;
-     } 
-#endif
-  }
-
-  // for the PRE-GCM stage, don't let local TN's which are ideal 
-  // candidates for peephole opportunities (eg. copy ops) be global TN's.
-  if (!Ignore_TN_Dep && (OP_copy(op) || OP_glue(op))) return TRUE;
-
-  // Do extra processing for BRP instructions.
-  if (OP_branch_predict(op)) {
-    UINT64 num_insts = 0;
-    BB *prev_bb;
-    for (prev_bb = source_bb; prev_bb && prev_bb != target_bb; 
-        prev_bb = BB_prev(prev_bb)) {
-      num_insts += BB_length(prev_bb);
-    }
-    
-    // It's assumed that about 1/3 nops will be added later, so include the
-    // expansion factor. The below condition checks that BRP instructions
-    // are not scheduled too early, such that they violate the offset
-    // restrictions.
-
-    if ((num_insts * 1.3 * INST_BYTES) >= DEFAULT_BRP_BRANCH_LIMIT)
-      return TRUE;
-  }
-
-  // Even SP ref OPS are a trouble for circular scheduling
   if (motion_type & GCM_CIRC_ABOVE) {
      if (OP_Refs_TN(op,  SP_TN) || 
         OP_Refs_Reg(op, REGISTER_CLASS_sp, REGISTER_sp)) return TRUE;
@@ -772,7 +712,6 @@
 
   if (!Ignore_TN_Dep && (OP_copy(op) || OP_glue(op))) return TRUE;
 
-#if !defined(TARG_SL)
   //TODO: need to check if this is not too conservative.
   INT i;
   for (i = 0; i < OP_results(op); ++i) {
@@ -839,7 +778,6 @@
       return TRUE;
   }
 #endif
-#endif
 
   return FALSE;
 }
@@ -1196,6 +1134,32 @@
   return FALSE;
 }
 
+// ======================================================================
+// Find_Limit_OP
+// finds the <limit_op> of <tgt_bb>. The <limit_op> is the last <op> in
+// <tgt_bb> the <cur_op> can be moved before. The calculation of <limit_op>
+// also depends on whether its' PRE/POST GCM phase.
+// ======================================================================
+static OP*
+Find_Limit_OP(OP *cur_op, BB *cur_bb, BB *src_bb, BB *tgt_bb)
+{
+  OP *limit_op;
+
+  if (Cur_Gcm_Type & GCM_BEFORE_GRA) 
+    limit_op = BB_copy_xfer_op(tgt_bb);
+  else 
+    limit_op = BB_xfer_op(tgt_bb);
+
+  if (cur_bb == src_bb) 
+    limit_op = cur_op;
+  else if (cur_bb == tgt_bb)
+    limit_op = (limit_op) ? OP_prev(limit_op) : BB_last_op(cur_bb);
+  else 
+    limit_op = NULL;
+ 
+  return limit_op;
+}
+
 // =======================================================================
 // Can_Mem_Op_Be_Moved
 // checks to see if a <mem_op> can be moved from <src> to <dest>. For 
@@ -1269,13 +1233,7 @@
   // we only look for memory dependences here; register dependences and 
   // call dependences will be considered in the later phase only after we 
   // ensure that there aren't any memory dependences.
-  OP *last_op = BB_last_op(dest_bb);
-  if (cur_bb == dest_bb)
-    // check that the inst can be moved to <dest>
-    limit_op = (br_op = BB_xfer_op(dest_bb)) ? OP_prev(br_op) :
-       ((last_op = BB_last_op(dest_bb)) ? OP_prev(last_op) : last_op);
-  else 
-    limit_op = (cur_bb == src_bb) ? mem_op : NULL;
+  limit_op = Find_Limit_OP(mem_op, cur_bb, src_bb, dest_bb);
 
   BOOL read_read_dep;
   for (cur_op = ((forw && cur_bb != src_bb) || (!forw && cur_bb == src_bb)) ?
@@ -1327,6 +1285,9 @@
     }
   }
 #else
+        // if there is true alias, return FALSE
+        if (definite) return FALSE;
+        
         // #676123; first, if there exists an alias and <cur_bb> is not equal
         // to <dest_bb>, then there is nothing much other safety tests can do.
         if (cur_bb != dest_bb) return FALSE;
@@ -1392,6 +1353,7 @@
        Set_EAGER_PTR_SPEC(*cur_spec_type);
      }
 
+#if 0
     /* Have to be really careful in relaxing this constraint. This will
        allow circular scheduling of unsafe mem ops. More context analysis
        needs to be done on a global basis (not just the path containing
@@ -1399,6 +1361,7 @@
     if ( Motion_Is_CIRC_ABOVE(motion_type) && (cur_bb == src_bb)) {
       Set_CIRC_PTR_SPEC(*cur_spec_type);
     }
+#endif
 
   }
   if( !alias || EAGER_PTR_SPEC(*cur_spec_type) || 
CIRC_PTR_SPEC(*cur_spec_type) ) 
@@ -1737,30 +1700,6 @@
   REG_LIVE_Finish ();
 }
 
-// ======================================================================
-// Find_Limit_OP
-// finds the <limit_op> of <tgt_bb>. The <limit_op> is the last <op> in
-// <tgt_bb> the <cur_op> can be moved before. The calculation of <limit_op>
-// also depends on whether its' PRE/POST GCM phase.
-// ======================================================================
-static OP*
-Find_Limit_OP(OP *cur_op, BB *cur_bb, BB *src_bb, BB *tgt_bb)
-{
-  OP *limit_op;
-
-  if (Cur_Gcm_Type & GCM_BEFORE_GRA) 
-    limit_op = BB_copy_xfer_op(tgt_bb);
-  else 
-    limit_op = BB_xfer_op(tgt_bb);
-
-  if (cur_bb == tgt_bb)
-    limit_op = (limit_op) ? OP_prev(limit_op) : BB_last_op(cur_bb);
-  else 
-    limit_op = (cur_bb == src_bb) ? cur_op : NULL;
- 
-  return limit_op;
-}
-
 #if defined(TARG_SL)
 // ==================================================================
 // Cumulate_Local_TN_Promotion


------------------------------------------------------------------------------
vRanger cuts backup time in half-while increasing security.
With the market-leading solution for virtual backup and recovery, 
you get blazing-fast, flexible, and affordable data protection.
Download your free trial now. 
http://p.sf.net/sfu/quest-d2dcopy1
_______________________________________________
Open64-devel mailing list
Open64-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/open64-devel

Reply via email to