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][1/n] Wading through data-dependence analysis


I'm somewhat stuck with fixing PR50067 because when I fix some bugs
I get missed-optimizations because we do rely on those bugs ...

Well, I'm still trying to not dump in one mega-patch rewriting it
all, so this is the only piece that passed bootstrap and regtest
individually (heh ...).  It will avoid some (but unfortunately
not all) fallout from followups.  And it adds some more debugging
printing.

Bootstrapped and tested on x86_64-unknown-linux-gnu, applied to trunk.

Richard.

2011-08-23  Richard Guenther  <rguenther@suse.de>

	* tree-data-ref.c (dr_analyze_indices): Add comments, handle
	REALPART_EXPR and IMAGPART_EXPR similar to ARRAY_REFs.
	(create_data_ref): Also dump access functions for the created
	data-ref.

Index: gcc/tree-data-ref.c
===================================================================
--- gcc/tree-data-ref.c	(revision 177949)
+++ gcc/tree-data-ref.c	(working copy)
@@ -844,20 +844,35 @@ dr_analyze_indices (struct data_referenc
   if (nest)
     before_loop = block_before_loop (nest);
 
+  /* Analyze access functions of dimensions we know to be independent.  */
   while (handled_component_p (aref))
     {
+      /* For ARRAY_REFs the base is the reference with the index replaced
+	 by zero.  */
       if (TREE_CODE (aref) == ARRAY_REF)
 	{
 	  op = TREE_OPERAND (aref, 1);
 	  if (nest)
 	    {
-  	      access_fn = analyze_scalar_evolution (loop, op);
+	      access_fn = analyze_scalar_evolution (loop, op);
 	      access_fn = instantiate_scev (before_loop, loop, access_fn);
 	      VEC_safe_push (tree, heap, access_fns, access_fn);
 	    }
-
 	  TREE_OPERAND (aref, 1) = build_int_cst (TREE_TYPE (op), 0);
 	}
+      /* REALPART_EXPR and IMAGPART_EXPR can be handled like accesses
+	 into a two element array with a constant index.  The base is
+	 then just the immediate underlying object.  */
+      else if (TREE_CODE (aref) == REALPART_EXPR)
+	{
+	  ref = TREE_OPERAND (ref, 0);
+	  VEC_safe_push (tree, heap, access_fns, integer_zero_node);
+	}
+      else if (TREE_CODE (aref) == IMAGPART_EXPR)
+	{
+	  ref = TREE_OPERAND (ref, 0);
+	  VEC_safe_push (tree, heap, access_fns, integer_one_node);
+	}
 
       aref = TREE_OPERAND (aref, 0);
     }
@@ -956,6 +971,7 @@ create_data_ref (loop_p nest, loop_p loo
 
   if (dump_file && (dump_flags & TDF_DETAILS))
     {
+      unsigned i;
       fprintf (dump_file, "\tbase_address: ");
       print_generic_expr (dump_file, DR_BASE_ADDRESS (dr), TDF_SLIM);
       fprintf (dump_file, "\n\toffset from base address: ");
@@ -969,6 +985,11 @@ create_data_ref (loop_p nest, loop_p loo
       fprintf (dump_file, "\n\tbase_object: ");
       print_generic_expr (dump_file, DR_BASE_OBJECT (dr), TDF_SLIM);
       fprintf (dump_file, "\n");
+      for (i = 0; i < DR_NUM_DIMENSIONS (dr); i++)
+	{
+	  fprintf (dump_file, "\tAccess function %d: ", i);
+	  print_generic_stmt (dump_file, DR_ACCESS_FN (dr, i), TDF_SLIM);
+	}
     }
 
   return dr;


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