This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Teach sccvn about constant vars


Hi,
testing the patch together with fortran constructor fix uncovered two typos in the previous version
so newly computed index was not used at all.
Fixed thus.
Bootstrapped/regtested x86_64-linux with the fortran fix. OK?

Honza

> 	* tree-ssa-ccp.c (fold_const_aggregate_ref): Fix handling of array_ref_low_bound
> 	in string access folding.

Index: tree-ssa-ccp.c
===================================================================
--- tree-ssa-ccp.c	(revision 163947)
+++ tree-ssa-ccp.c	(working copy)
@@ -1398,17 +1398,30 @@ fold_const_aggregate_ref (tree t)
 	}
 
       /* Fold read from constant string.  */
-      if (TREE_CODE (ctor) == STRING_CST)
+      if (TREE_CODE (ctor) == STRING_CST
+	  && TREE_CODE (idx) == INTEGER_CST)
 	{
+	  tree low_bound = array_ref_low_bound (t);
+	  double_int low_bound_cst;
+	  double_int index_cst;
+	  double_int length_cst;
+	  bool signed_p = TYPE_UNSIGNED (TREE_TYPE (idx));
+
+	  if (TREE_CODE (low_bound) != INTEGER_CST)
+	    return NULL_TREE;
+	  low_bound_cst = tree_to_double_int (low_bound);
+	  index_cst = tree_to_double_int (idx);
+	  length_cst = uhwi_to_double_int (TREE_STRING_LENGTH (ctor));
+	  index_cst = double_int_sub (index_cst, low_bound_cst);
 	  if ((TYPE_MODE (TREE_TYPE (t))
 	       == TYPE_MODE (TREE_TYPE (TREE_TYPE (ctor))))
 	      && (GET_MODE_CLASS (TYPE_MODE (TREE_TYPE (TREE_TYPE (ctor))))
 	          == MODE_INT)
 	      && GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (TREE_TYPE (ctor)))) == 1
-	      && compare_tree_int (idx, TREE_STRING_LENGTH (ctor)) < 0)
+	      && double_int_cmp (index_cst, length_cst, signed_p) < 0)
 	    return build_int_cst_type (TREE_TYPE (t),
 				       (TREE_STRING_POINTER (ctor)
-					[TREE_INT_CST_LOW (idx)]));
+					[double_int_to_uhwi (index_cst)]));
 	  return NULL_TREE;
 	}
 


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]