Author: meiye
Date: 2011-05-23 13:18:57 -0400 (Mon, 23 May 2011)
New Revision: 3616

Modified:
   trunk/osprey/be/opt/opt_proactive.cxx
   trunk/osprey/be/opt/opt_wn.cxx
   trunk/osprey/be/opt/opt_wn.h
Log:
 Change interface of 'WN_get_val' to use std::pair to return two values.  CR: 
Sun Chan

Modified: trunk/osprey/be/opt/opt_proactive.cxx
===================================================================
--- trunk/osprey/be/opt/opt_proactive.cxx       2011-05-23 17:14:34 UTC (rev 
3615)
+++ trunk/osprey/be/opt/opt_proactive.cxx       2011-05-23 17:18:57 UTC (rev 
3616)
@@ -11571,9 +11571,13 @@
   WN * wn_tmp = (WN *) WN_MAP_Get(map, wn_key);
   int val_tmp;
 
-  if (wn_tmp && WN_get_val(wn_key, &val_tmp, map)
-      && (val_tmp < val))
-    return;
+  if (wn_tmp) {
+    std::pair<bool,int> p_val = WN_get_val(wn_key, map);
+    val_tmp = p_val.second;
+    if (p_val.first
+       && (val_tmp < val))
+      return;
+  }
 
   Set_map(map, wn_key, Get_const_wn(val));
 }
@@ -11620,13 +11624,16 @@
     WN * wn_tmp;
     int val;
     int val2;
+    std::pair<bool,int> p_val;
 
     switch (opr) {
     case OPR_GT:
       op1 = WN_kid(wn, 0);
       op2 = WN_kid(wn, 1);
+      p_val = WN_get_val(op2, _low_map);
+      val = p_val.second;
 
-      if (WN_get_val(op2, &val, _low_map)) {
+      if (p_val.first) {
        Set_map(_low_map, op1, op2);
        Infer_val_range(op1, TRUE, TRUE);
       }
@@ -11636,8 +11643,10 @@
     case OPR_LT:
       op1 = WN_kid(wn, 0);
       op2 = WN_kid(wn, 1);
-
-      if (WN_get_val(op1, &val, _low_map)) {
+      p_val = WN_get_val(op1, _low_map);
+      val = p_val.second;
+      
+      if (p_val.first) {
        Set_map(_low_map, op2, op1);
        Infer_val_range(op2, TRUE, TRUE);
       }
@@ -11646,8 +11655,10 @@
     case OPR_LE:
       op1 = WN_kid(wn, 0);
       op2 = WN_kid(wn, 1);
+      p_val = WN_get_val(op1, _low_map);
+      val = p_val.second;
 
-      if (WN_get_val(op1, &val, _low_map)) {
+      if (p_val.first) {
        wn_tmp = Get_const_wn(val - 1);
        Set_map(_low_map, op2, wn_tmp);
        Infer_val_range(op2, TRUE, TRUE);
@@ -11661,23 +11672,30 @@
       if (WN_operator(op2) == OPR_INTCONST) {
        if (_low_map) {
          wn_tmp = (WN *) WN_MAP_Get(_low_map, wn);
-
-         if (wn_tmp && WN_get_val(wn_tmp, &val, _low_map)) {
-           long long new_val = -1 * WN_const_val(op2) + val;
-           wn_tmp = Get_const_wn(new_val);
-           Set_map(_low_map, op1, wn_tmp);
-           Infer_val_range(op1, TRUE, TRUE);
+         if (wn_tmp) {
+           p_val = WN_get_val(wn_tmp, _low_map);
+           val = p_val.second;     
+           if (p_val.first) {
+             long long new_val = -1 * WN_const_val(op2) + val;
+             wn_tmp = Get_const_wn(new_val);
+             Set_map(_low_map, op1, wn_tmp);
+             Infer_val_range(op1, TRUE, TRUE);
+           }
          }
        }
        
        if (_high_map) {
          wn_tmp = (WN *) WN_MAP_Get(_high_map, wn);
 
-         if (wn_tmp && WN_get_val(wn_tmp, &val, _high_map)) {
-           long long new_val = -1 * WN_const_val(op2) + val;
-           wn_tmp = Get_const_wn(new_val);
-           Set_map(_high_map, op1, wn_tmp);
-           Infer_val_range(op1, TRUE, TRUE);
+         if (wn_tmp) {
+           p_val =  WN_get_val(wn_tmp,  _high_map);
+           val = p_val.second;
+           if (p_val.first) {
+             long long new_val = -1 * WN_const_val(op2) + val;
+             wn_tmp = Get_const_wn(new_val);
+             Set_map(_high_map, op1, wn_tmp);
+             Infer_val_range(op1, TRUE, TRUE);
+           }
          }
        }
       }
@@ -11692,14 +11710,22 @@
       if (_low_map) {
        wn_tmp = (WN * ) WN_MAP_Get(_low_map, wn);
 
-       if (wn_tmp && WN_get_val(wn_tmp, &val, _low_map)) {
-         wn_tmp = (WN *) WN_MAP_Get(_low_map, op2);
-
-         if (wn_tmp && WN_get_val(op2, &val2, _low_map)) {
-           long long new_val = val2 + val;
-           wn_tmp = Get_const_wn(new_val);
-           Set_map(_low_map, op1, wn_tmp);
-           Infer_val_range(op1, TRUE, TRUE);
+       if (wn_tmp) {
+         p_val = WN_get_val(wn_tmp,  _low_map);
+         val = p_val.second;
+         if (p_val.first) {
+           wn_tmp = (WN *) WN_MAP_Get(_low_map, op2);
+           
+           if (wn_tmp) {
+             p_val = WN_get_val(op2, _low_map);
+             val2 = p_val.second;
+             if  (p_val.first) {
+               long long new_val = val2 + val;
+               wn_tmp = Get_const_wn(new_val);
+               Set_map(_low_map, op1, wn_tmp);
+               Infer_val_range(op1, TRUE, TRUE);
+             }
+           }
          }
        }
       }
@@ -11707,14 +11733,22 @@
       if (_high_map) {
        wn_tmp = (WN * ) WN_MAP_Get(_high_map, wn);
 
-       if (wn_tmp && WN_get_val(wn_tmp, &val, _high_map)) {
-         wn_tmp = (WN *) WN_MAP_Get(_high_map, op2);
+       if (wn_tmp) {
+         p_val = WN_get_val(wn_tmp,  _high_map);
+         val = p_val.second;
+         if (p_val.first) {
+           wn_tmp = (WN *) WN_MAP_Get(_high_map, op2);
          
-         if (wn_tmp && WN_get_val(op2, &val2, _high_map)) {
-           long long new_val = val2 + val;
-           wn_tmp = Get_const_wn(new_val);
-           Set_map(_high_map, op1, wn_tmp);
-           Infer_val_range(op1, TRUE, TRUE);
+           if (wn_tmp) {
+             p_val = WN_get_val(op2,  _high_map);
+             val2 = p_val.second;
+             if (p_val.first) {
+               long long new_val = val2 + val;
+               wn_tmp = Get_const_wn(new_val);
+               Set_map(_high_map, op1, wn_tmp);
+               Infer_val_range(op1, TRUE, TRUE);
+             }
+           }
          }
        }
       }
@@ -11812,8 +11846,10 @@
          && wn_load && OPERATOR_is_scalar_load(WN_operator(wn_load))
          && (WN_aux(wn_load) == WN_aux(wn_step))
          && (WN_operator(wn_add) == OPR_ADD)) {
-       int val;
-       if (WN_get_val(WN_kid(wn_add,1), &val, _low_map)) {
+       std::pair<bool, int> p_val = WN_get_val(WN_kid(wn_add,1),_low_map);
+       int val = p_val.second;
+
+       if (p_val.first) {
          if (val > 0)
            set_low = TRUE;
          else

Modified: trunk/osprey/be/opt/opt_wn.cxx
===================================================================
--- trunk/osprey/be/opt/opt_wn.cxx      2011-05-23 17:14:34 UTC (rev 3615)
+++ trunk/osprey/be/opt/opt_wn.cxx      2011-05-23 17:18:57 UTC (rev 3616)
@@ -1792,42 +1792,51 @@
   return OPERATOR_is_volatile(OPCODE_operator(opc));
 }
 
-// Evaluate value of an integral WHIRL, return it in *val.
-// Return FALSE if wn is not evaluatable. wn_map gives a WHIRL-to-WHIRL
-// map that maps a WHIRL to another WHIRL containing the same value.
+// Given an integral WHIRL, query whether it is evaluatable and get the 
evaluated value.
+// 'wn_map' gives a WHIRL-to-WHIRL  map that maps a WHIRL to another WHIRL 
containing the same value.
 // (TODO: Implementation is incomplete for all operators)
-BOOL
-WN_get_val(WN * wn, int * val, const WN_MAP& wn_map)
+std::pair<bool,int>
+WN_get_val(WN * wn, const WN_MAP& wn_map)
 {
-  int val1, val2;
+  int val1, val2, val;
   OPERATOR opr = WN_operator(wn);
   WN * op1;
   WN * op2;
 
   if (opr == OPR_INTCONST) {
-    *val = WN_const_val(wn);
-    return TRUE;
+    val = WN_const_val(wn);
+    return std::pair<bool, int>(TRUE, val);
   }
   else if (wn_map) {
     WN * wn_val = (WN *) WN_MAP_Get(wn_map, wn);
     if (wn_val)
-      return WN_get_val(wn_val, val, wn_map);
+      return WN_get_val(wn_val, wn_map);
   }
 
+  std::pair<bool,int> pair1;
+  std::pair<bool,int> pair2;
   switch (opr) {
   case OPR_ADD:
-    if (WN_get_val(WN_kid(wn,0), &val1, wn_map)
-       && WN_get_val(WN_kid(wn, 1), &val2, wn_map)) {
-      *val = val1 + val2;
-      return TRUE;
+    pair1 = WN_get_val(WN_kid(wn, 0), wn_map);
+    pair2 = WN_get_val(WN_kid(wn, 1), wn_map);
+    val1 = pair1.second;
+    val2 = pair2.second;
+    if (pair1.first
+       && pair2.first) {
+      val = val1 + val2;
+      return std::pair<bool,int>(TRUE, val);
     }
     break;
   case OPR_MPY:
     op1 = WN_kid(wn, 0);
     op2 = WN_kid(wn, 1);
-    
-    if (WN_get_val(op1, &val1, wn_map)
-       && WN_get_val(op2, &val2, wn_map)
+    pair1 = WN_get_val(op1, wn_map);
+    pair2 = WN_get_val(op2, wn_map);
+    val1 = pair1.second;
+    val2 = pair2.second;
+
+    if (pair1.first
+       && pair2.first
        && (val1 > 0)
        && (val2 > 0)
        && ((WN_operator(op1) == OPR_INTCONST)
@@ -1836,15 +1845,15 @@
       // Or "b >= c2", where c0, c1, c2 are constants.
       // The inferred value can be incorrect if either "c0",
       // "c1" or "c2" is non-positive.
-      *val = val1 * val2;
-      return TRUE;
+      val = val1 * val2;
+      return std::pair<bool,int>(TRUE, val);
     }
     break;
   default:
     ;
   }
 
-  return FALSE;
+  return std::pair<bool,int>(FALSE,0);
 }
 
 // Walk nodes in the given WHIRL tree, collect operands for ADD operators.
@@ -1910,6 +1919,7 @@
   OPERATOR opr1 = WN_operator(wn1);
   OPERATOR opr2 = WN_operator(wn2);
   int val;
+  std::pair<bool,int> p_val;
 
   if ((opr1 == OPR_INTCONST) && (opr2 == OPR_INTCONST)) {
     return (WN_const_val(wn1) != WN_const_val(wn2));
@@ -1924,11 +1934,16 @@
 
     if (opr2 == OPR_INTCONST) {
       int bit2 = WN_get_bit_from_const(wn2);
-
-      if (WN_get_val(bit1, &val, lo_map) && (val > bit2))
+      p_val = WN_get_val(bit1, lo_map);
+      val = p_val.second;
+      if (p_val.first && (val > bit2)) 
        return TRUE;
-      else if (WN_get_val(bit1, &val, hi_map) && (val < bit2))
-       return TRUE;
+      else {
+       p_val = WN_get_val(bit1, hi_map);
+       val = p_val.second;
+       if (p_val.first && (val < bit2))
+         return TRUE;
+      }
     }
     else {
       WN * bit2 = WN_get_bit_from_expr(wn2);
@@ -1939,11 +1954,16 @@
   }
   else if ( opr2 == OPR_INTCONST) {
     int int_val = WN_const_val(wn2);
-
-    if (WN_get_val(wn1, &val, lo_map) && (val > int_val))
+    p_val = WN_get_val(wn1, lo_map);
+    val = p_val.second;
+    if (p_val.first && (val > int_val))
       return TRUE;
-    else if (WN_get_val(wn1, &val, hi_map) && (val < int_val))
-      return TRUE;
+    else{
+      p_val = WN_get_val(wn1, hi_map);
+      val = p_val.second;
+      if (p_val.first && (val < int_val))
+       return TRUE;
+    }
   }
   else {
     MEM_POOL * pool = Malloc_Mem_Pool;
@@ -1982,6 +2002,7 @@
 
     int delta_lo = delta;
     int delta_hi = delta;
+    std::pair<bool, int> p_val;
 
     if (stack2) {
       for (int i = 0; i < stack2->Elements(); i++) {
@@ -2004,15 +2025,21 @@
 
        if (!found) {
          int val;
+         p_val = WN_get_val(wn2_iter, lo_map);
+         val = p_val.second;
 
-         if (WN_get_val(wn2_iter, &val, lo_map)) 
+         if (p_val.first)
            delta_hi -= val;
-         else if (WN_get_val(wn2_iter, &val, hi_map))
-           delta_lo -= val;
          else {
-           CXX_DELETE(stack1, pool);
-           CXX_DELETE(stack2, pool);
-           return FALSE;
+           p_val = WN_get_val(wn2_iter, hi_map);
+           val = p_val.second;
+           if (p_val.first)
+             delta_lo -= val;
+           else {
+             CXX_DELETE(stack1, pool);
+             CXX_DELETE(stack2, pool);
+             return FALSE;
+           }
          }
        }
       }
@@ -2025,16 +2052,22 @@
 
        if (WN_operator(wn_iter) == OPR_INTCONST)
          continue;
-       
-       if (WN_get_val(wn_iter, &val, lo_map)) 
+
+       p_val = WN_get_val(wn_iter, lo_map);
+       val = p_val.second;
+       if (p_val.first)
          delta_lo += val;
-       else if (WN_get_val(wn_iter, &val, hi_map))
-         delta_hi += val;
        else {
-         CXX_DELETE(stack1, pool);
-         if (stack2)
-           CXX_DELETE(stack2, pool);
-         return FALSE;
+         p_val = WN_get_val(wn_iter, hi_map);
+         val = p_val.second;
+         if (p_val.first)
+           delta_hi += val;
+         else {
+           CXX_DELETE(stack1, pool);
+           if (stack2)
+             CXX_DELETE(stack2, pool);
+           return FALSE;
+         }
        }
       }
     }

Modified: trunk/osprey/be/opt/opt_wn.h
===================================================================
--- trunk/osprey/be/opt/opt_wn.h        2011-05-23 17:14:34 UTC (rev 3615)
+++ trunk/osprey/be/opt/opt_wn.h        2011-05-23 17:18:57 UTC (rev 3616)
@@ -349,7 +349,7 @@
 extern BOOL OPCODE_is_fake(OPCODE opc);
 extern BOOL OPERATOR_is_volatile(OPERATOR oper);
 extern BOOL OPCODE_is_volatile(OPCODE opc);
-extern BOOL WN_get_val(WN *, int *, const WN_MAP&);
+extern std::pair<bool, int> WN_get_val(WN *, const WN_MAP&);
 extern BOOL WN_has_disjoint_val_range(WN *, WN *, const WN_MAP&, const 
WN_MAP&);
 extern void Collect_operands(WN *, STACK<WN *> *, STACK<WN *> *);
 


------------------------------------------------------------------------------
What Every C/C++ and Fortran developer Should Know!
Read this article and learn how Intel has extended the reach of its 
next-generation tools to help Windows* and Linux* C/C++ and Fortran 
developers boost performance applications - including clusters. 
http://p.sf.net/sfu/intel-dev2devmay
_______________________________________________
Open64-devel mailing list
Open64-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/open64-devel

Reply via email to