Patchwork Teach sccvn about constant vars

login
register
mail settings
Submitter Jan Hubicka
Date Sept. 7, 2010, 2:39 p.m.
Message ID <20100907143953.GF21528@kam.mff.cuni.cz>
Download mbox | patch
Permalink /patch/64027/
State New
Headers show

Comments

Jan Hubicka - Sept. 7, 2010, 2:39 p.m.
Hi,
this patch fixes the ignored low_bound in array_ref folding and converts arithmetics
to double_int.
Note that the code (without the low_bound bug) exist in another two copies - in 
fold_read_from_constant_string and in expr.c

I hope to remove the expr.c code by end of week (we need to process the remaining
sccvn patch and should be there).  In expr.c I can also put in the INTEGER_CST
code but since this is used by frontend too we sould miss optimization when
lower bound and index are variables.  So I guess I can keep the busy operation
there and remove the call from tree-ssa-ccp that should be redundant now.

Boostrapped/regtested x86_64, OK?
Honza

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

Patch

Index: tree-ssa-ccp.c
===================================================================
--- tree-ssa-ccp.c	(revision 163947)
+++ tree-ssa-ccp.c	(working copy)
@@ -1398,14 +1398,27 @@  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));
+	  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)]));