This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH][1/n] Wading through data-dependence analysis
- From: Richard Guenther <rguenther at suse dot de>
- To: gcc-patches at gcc dot gnu dot org
- Date: Tue, 23 Aug 2011 10:27:31 +0200 (CEST)
- Subject: [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;