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]

[PATCH] Re: fix 23714


Richard Henderson wrote:

> On Tue, Oct 18, 2005 at 11:09:02PM +0200, Ulrich Weigand wrote:
> > In the alternative, we could just call discover_nonconstant_array_refs
> > for the non-optimizing case too -- what would you prefer?
> 
> Well certainly that's the correct solution for 4.1.

The following patch implements this by moving the call to
discover_nonconstant_array_refs from rewrite_out_of_ssa
to tree_expand_cfg.

Bootstrapped/regtested on s390-ibm-linux and s390x-ibm-linux
on mainline and the 4.0 branch; fixes the s390x namelist_14.f90
regression.

OK for mainline and 4.0 ?

Bye,
Ulrich


ChangeLog:

	* cfgexpand.c (discover_nonconstant_array_refs_r,
	discover_nonconstant_array_refs): Move here from tree-outof-ssa.c
	(tree_expand_cfg): Call discover_nonconstant_array_refs.
	* tree-outof-ssa.c (rewrite_out_of_ssa): Remove call to
	discover_nonconstant_array_refs.

Index: gcc/cfgexpand.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/cfgexpand.c,v
retrieving revision 2.52
diff -c -p -r2.52 cfgexpand.c
*** gcc/cfgexpand.c	12 Oct 2005 16:29:35 -0000	2.52
--- gcc/cfgexpand.c	18 Oct 2005 21:31:42 -0000
*************** construct_exit_block (void)
*** 1463,1468 ****
--- 1463,1529 ----
    update_bb_for_insn (exit_block);
  }
  
+ /* Helper function for discover_nonconstant_array_refs. 
+    Look for ARRAY_REF nodes with non-constant indexes and mark them
+    addressable.  */
+ 
+ static tree
+ discover_nonconstant_array_refs_r (tree * tp, int *walk_subtrees,
+ 				   void *data ATTRIBUTE_UNUSED)
+ {
+   tree t = *tp;
+ 
+   if (IS_TYPE_OR_DECL_P (t))
+     *walk_subtrees = 0;
+   else if (TREE_CODE (t) == ARRAY_REF || TREE_CODE (t) == ARRAY_RANGE_REF)
+     {
+       while (((TREE_CODE (t) == ARRAY_REF || TREE_CODE (t) == ARRAY_RANGE_REF)
+ 	      && is_gimple_min_invariant (TREE_OPERAND (t, 1))
+ 	      && (!TREE_OPERAND (t, 2)
+ 		  || is_gimple_min_invariant (TREE_OPERAND (t, 2))))
+ 	     || (TREE_CODE (t) == COMPONENT_REF
+ 		 && (!TREE_OPERAND (t,2)
+ 		     || is_gimple_min_invariant (TREE_OPERAND (t, 2))))
+ 	     || TREE_CODE (t) == BIT_FIELD_REF
+ 	     || TREE_CODE (t) == REALPART_EXPR
+ 	     || TREE_CODE (t) == IMAGPART_EXPR
+ 	     || TREE_CODE (t) == VIEW_CONVERT_EXPR
+ 	     || TREE_CODE (t) == NOP_EXPR
+ 	     || TREE_CODE (t) == CONVERT_EXPR)
+ 	t = TREE_OPERAND (t, 0);
+ 
+       if (TREE_CODE (t) == ARRAY_REF || TREE_CODE (t) == ARRAY_RANGE_REF)
+ 	{
+ 	  t = get_base_address (t);
+ 	  if (t && DECL_P (t))
+ 	    TREE_ADDRESSABLE (t) = 1;
+ 	}
+ 
+       *walk_subtrees = 0;
+     }
+ 
+   return NULL_TREE;
+ }
+ 
+ /* RTL expansion is not able to compile array references with variable
+    offsets for arrays stored in single register.  Discover such
+    expressions and mark variables as addressable to avoid this
+    scenario.  */
+ 
+ static void
+ discover_nonconstant_array_refs (void)
+ {
+   basic_block bb;
+   block_stmt_iterator bsi;
+ 
+   FOR_EACH_BB (bb)
+     {
+       for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
+ 	walk_tree (bsi_stmt_ptr (bsi), discover_nonconstant_array_refs_r,
+ 		   NULL , NULL);
+     }
+ }
+ 
  /* Translate the intermediate representation contained in the CFG
     from GIMPLE trees to RTL.
  
*************** tree_expand_cfg (void)
*** 1484,1489 ****
--- 1545,1553 ----
    /* Prepare the rtl middle end to start recording block changes.  */
    reset_block_changes ();
  
+   /* Mark arrays indexed with non-constant indices with TREE_ADDRESSABLE.  */
+   discover_nonconstant_array_refs ();
+ 
    /* Expand the variables recorded during gimple lowering.  */
    expand_used_vars ();
  
Index: gcc/tree-outof-ssa.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/tree-outof-ssa.c,v
retrieving revision 2.66
diff -c -p -r2.66 tree-outof-ssa.c
*** gcc/tree-outof-ssa.c	4 Aug 2005 23:36:59 -0000	2.66
--- gcc/tree-outof-ssa.c	18 Oct 2005 21:31:42 -0000
*************** dump_replaceable_exprs (FILE *f, tree *e
*** 1826,1894 ****
  }
  
  
- /* Helper function for discover_nonconstant_array_refs. 
-    Look for ARRAY_REF nodes with non-constant indexes and mark them
-    addressable.  */
- 
- static tree
- discover_nonconstant_array_refs_r (tree * tp, int *walk_subtrees,
- 				   void *data ATTRIBUTE_UNUSED)
- {
-   tree t = *tp;
- 
-   if (IS_TYPE_OR_DECL_P (t))
-     *walk_subtrees = 0;
-   else if (TREE_CODE (t) == ARRAY_REF || TREE_CODE (t) == ARRAY_RANGE_REF)
-     {
-       while (((TREE_CODE (t) == ARRAY_REF || TREE_CODE (t) == ARRAY_RANGE_REF)
- 	      && is_gimple_min_invariant (TREE_OPERAND (t, 1))
- 	      && (!TREE_OPERAND (t, 2)
- 		  || is_gimple_min_invariant (TREE_OPERAND (t, 2))))
- 	     || (TREE_CODE (t) == COMPONENT_REF
- 		 && (!TREE_OPERAND (t,2)
- 		     || is_gimple_min_invariant (TREE_OPERAND (t, 2))))
- 	     || TREE_CODE (t) == BIT_FIELD_REF
- 	     || TREE_CODE (t) == REALPART_EXPR
- 	     || TREE_CODE (t) == IMAGPART_EXPR
- 	     || TREE_CODE (t) == VIEW_CONVERT_EXPR
- 	     || TREE_CODE (t) == NOP_EXPR
- 	     || TREE_CODE (t) == CONVERT_EXPR)
- 	t = TREE_OPERAND (t, 0);
- 
-       if (TREE_CODE (t) == ARRAY_REF || TREE_CODE (t) == ARRAY_RANGE_REF)
- 	{
- 	  t = get_base_address (t);
- 	  if (t && DECL_P (t))
- 	    TREE_ADDRESSABLE (t) = 1;
- 	}
- 
-       *walk_subtrees = 0;
-     }
- 
-   return NULL_TREE;
- }
- 
- 
- /* RTL expansion is not able to compile array references with variable
-    offsets for arrays stored in single register.  Discover such
-    expressions and mark variables as addressable to avoid this
-    scenario.  */
- 
- static void
- discover_nonconstant_array_refs (void)
- {
-   basic_block bb;
-   block_stmt_iterator bsi;
- 
-   FOR_EACH_BB (bb)
-     {
-       for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
- 	walk_tree (bsi_stmt_ptr (bsi), discover_nonconstant_array_refs_r,
- 		   NULL , NULL);
-     }
- }
- 
- 
  /* This function will rewrite the current program using the variable mapping
     found in MAP.  If the replacement vector VALUES is provided, any 
     occurrences of partitions with non-null entries in the vector will be 
--- 1826,1831 ----
*************** rewrite_out_of_ssa (void)
*** 2598,2606 ****
    /* Flush out flow graph and SSA data.  */
    delete_var_map (map);
  
-   /* Mark arrays indexed with non-constant indices with TREE_ADDRESSABLE.  */
-   discover_nonconstant_array_refs ();
- 
    in_ssa_p = false;
  }
  
--- 2535,2540 ----


-- 
  Dr. Ulrich Weigand
  Linux on zSeries Development
  Ulrich.Weigand@de.ibm.com


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