Author: shihui
Date: 2011-04-13 06:26:44 -0400 (Wed, 13 Apr 2011)
New Revision: 3550

Modified:
   trunk/osprey/be/com/constraint_graph.cxx
   trunk/osprey/be/com/constraint_graph.h
Log:
Fix bug750:

In ConstraintGraph::processExpr
If expr is adding pointer with an unknown offset, the added pointer may points 
to ohter unknown offset.
The processing for this case is, conservatively adjust pointer's CG Node ST's 
modulus according to pointer's type.
AdjustPointsToForKCycle is used for this purpose, kcycle value got from pointed 
type's size.

Current implementation get pointed type from CGNODE's ST, which is incorrect 
when it's different with WN node's Type.
In this bug, cgnode's ST's type is derived class type, WN node's type is base 
class type.
So node's modulus need change from derived calss's size to base class's size.

Fix is in ConstraintGraph::processExpr, when setting kcycle, if Wn has pecified 
TY, use WN node's type.

Code Review: Jian-Xin


Modified: trunk/osprey/be/com/constraint_graph.cxx
===================================================================
--- trunk/osprey/be/com/constraint_graph.cxx    2011-04-13 09:59:03 UTC (rev 
3549)
+++ trunk/osprey/be/com/constraint_graph.cxx    2011-04-13 10:26:44 UTC (rev 
3550)
@@ -996,6 +996,20 @@
   return false;
 }
 
+// get WN node's TY, used for determin kcycle
+TY&
+ConstraintGraph::getTY(const WN* wn, const ConstraintGraphNode* node)
+{
+  if (OPERATOR_has_1ty(WN_operator(wn))) {
+    TY_IDX ty_idx = WN_ty(wn);
+    return Ty_Table[ty_idx];
+  }
+  else {
+    ST *st = &St_Table[SYM_ST_IDX(node->cg_st_idx())];
+    return Ty_Table[ST_type(st)];
+  }
+}
+
 // This just recursively processes all initvs starting from initv_idx
 // and adds any nodes that correspond to symbols to pts
 void
@@ -1878,8 +1892,7 @@
         // size of the pointed-to type.
         if (!kid0CGNode->checkFlags(CG_NODE_FLAGS_NOT_POINTER) && 
             kid1CGNode->checkFlags(CG_NODE_FLAGS_NOT_POINTER)) {
-          ST *st = &St_Table[SYM_ST_IDX(kid0CGNode->cg_st_idx())];
-          TY &ty = Ty_Table[ST_type(st)];
+          TY &ty = getTY(WN_kid0(expr), kid0CGNode);
           INT32 size = 1;
           if (TY_kind(ty) == KIND_POINTER)
             size = TY_size(Ty_Table[TY_pointed(ty)]);
@@ -1893,8 +1906,7 @@
         // Check the other kid
         if (!kid1CGNode->checkFlags(CG_NODE_FLAGS_NOT_POINTER) && 
             kid0CGNode->checkFlags(CG_NODE_FLAGS_NOT_POINTER)) {
-          ST *st = &St_Table[SYM_ST_IDX(kid1CGNode->cg_st_idx())];
-          TY &ty = Ty_Table[ST_type(st)];
+          TY &ty = getTY(WN_kid1(expr), kid1CGNode);
           INT32 size = 1;
           if (TY_kind(ty) == KIND_POINTER)
             size = TY_size(Ty_Table[TY_pointed(ty)]);
@@ -1913,14 +1925,12 @@
         // is of a pointer type, set it to the size of the pointed-to type. 
         // Compute size from first kid
         INT32 size0 = 1;
-        ST *kid0st = &St_Table[SYM_ST_IDX(kid0CGNode->cg_st_idx())];
-        TY &kid0ty = Ty_Table[ST_type(kid0st)];
+        TY &kid0ty = getTY(WN_kid0(expr), kid0CGNode);
         if (TY_kind(kid0ty) == KIND_POINTER)
           size0 = TY_size(Ty_Table[TY_pointed(kid0ty)]);
         // Compute size from other kid
         INT32 size1 = 1;
-        ST *kid1st = &St_Table[SYM_ST_IDX(kid1CGNode->cg_st_idx())];
-        TY &kid1ty = Ty_Table[ST_type(kid1st)];
+        TY &kid1ty = getTY(WN_kid1(expr), kid1CGNode);
         if (TY_kind(kid1ty) == KIND_POINTER)
           size1 = TY_size(Ty_Table[TY_pointed(kid1ty)]);
 

Modified: trunk/osprey/be/com/constraint_graph.h
===================================================================
--- trunk/osprey/be/com/constraint_graph.h      2011-04-13 09:59:03 UTC (rev 
3549)
+++ trunk/osprey/be/com/constraint_graph.h      2011-04-13 10:26:44 UTC (rev 
3550)
@@ -1624,6 +1624,8 @@
 
   ConstraintGraphNode *genTempCGNode();
 
+  TY& getTY(const WN* wn, const ConstraintGraphNode* node);
+
   UINT32 findMaxTypeSize();
 
   void buildCGFromSummary();


------------------------------------------------------------------------------
Forrester Wave Report - Recovery time is now measured in hours and minutes
not days. Key insights are discussed in the 2010 Forrester Wave Report as
part of an in-depth evaluation of disaster recovery service providers.
Forrester found the best-in-class provider in terms of services and vision.
Read this report now!  http://p.sf.net/sfu/ibm-webcastpromo
_______________________________________________
Open64-devel mailing list
Open64-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/open64-devel

Reply via email to