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: [PATCH] Fix PR39937, wrong types in forwprop


On Tue, 28 Apr 2009, Richard Guenther wrote:

> 
> We loose type conversions in array folding.
> 
> Fixed as follows.
> 
> Bootstrap / regtest pending.

And this version passes bootstrap and regtest on x86_64-unknown-linux-gnu.
Applied to trunk.

Richard.

2009-04-29  Richard Guenther  <rguenther@suse.de>

	PR middle-end/39937
	* tree-ssa-forwprop.c (forward_propagate_addr_expr_1): Do not
	loose type conversions.
	(forward_propagate_addr_expr): Fix tuplification bug.  Remove
	stmts only if there are no uses of its definition.

	* gcc.c-torture/compile/pr39937.c: New testcase.

Index: gcc/testsuite/gcc.c-torture/compile/pr39937.c
===================================================================
*** gcc/testsuite/gcc.c-torture/compile/pr39937.c	(revision 0)
--- gcc/testsuite/gcc.c-torture/compile/pr39937.c	(revision 0)
***************
*** 0 ****
--- 1,12 ----
+ int foo (__const char *__restrict __s);
+ static void 
+ read_anisou(char line[])
+ {
+   foo (line+1);
+ }
+ void
+ read_pdbfile(void)
+ {
+   char line[4096];
+   read_anisou (line);
+ }
Index: gcc/tree-ssa-forwprop.c
===================================================================
--- gcc/tree-ssa-forwprop.c	(revision 146971)
+++ gcc/tree-ssa-forwprop.c	(working copy)
@@ -862,12 +862,21 @@ forward_propagate_addr_expr_1 (tree name
      of the elements in X into &x[C1 + C2/element size].  */
   if (TREE_CODE (rhs2) == INTEGER_CST)
     {
-      tree new_rhs = maybe_fold_stmt_addition (gimple_expr_type (use_stmt),
+      tree new_rhs = maybe_fold_stmt_addition (TREE_TYPE (def_rhs),
 					       def_rhs, rhs2);
       if (new_rhs)
 	{
-	  gimple_assign_set_rhs_from_tree (use_stmt_gsi,
-					   unshare_expr (new_rhs));
+	  tree type = TREE_TYPE (gimple_assign_lhs (use_stmt));
+	  new_rhs = unshare_expr (new_rhs);
+	  if (!useless_type_conversion_p (type, TREE_TYPE (new_rhs)))
+	    {
+	      if (!is_gimple_min_invariant (new_rhs))
+		new_rhs = force_gimple_operand_gsi (use_stmt_gsi, new_rhs,
+						    true, NULL_TREE,
+						    true, GSI_SAME_STMT);
+	      new_rhs = fold_convert (type, new_rhs);
+	    }
+	  gimple_assign_set_rhs_from_tree (use_stmt_gsi, new_rhs);
 	  use_stmt = gsi_stmt (*use_stmt_gsi);
 	  update_stmt (use_stmt);
 	  tidy_after_forward_propagate_addr (use_stmt);
@@ -950,9 +959,8 @@ forward_propagate_addr_expr (tree name,
       use_rhs = gimple_assign_rhs1 (use_stmt);
       if (result
 	  && TREE_CODE (gimple_assign_lhs (use_stmt)) == SSA_NAME
-	  && (TREE_CODE (use_rhs) == SSA_NAME
-	      || (CONVERT_EXPR_P (use_rhs)
-		  && TREE_CODE (TREE_OPERAND (use_rhs, 0)) == SSA_NAME)))
+	  && TREE_CODE (use_rhs) == SSA_NAME
+	  && has_zero_uses (gimple_assign_lhs (use_stmt)))
 	{
 	  gimple_stmt_iterator gsi = gsi_for_stmt (use_stmt);
 	  release_defs (use_stmt);


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