On Fri, 23 Mar 2012, Martin Jambor wrote:
> Hi,
>
> since we now should be able to expand misaligned MEM_REFs properly and
> both SRA and IPA-SRA now tag the memory accesses with the appropriate
> alignment information, we should now be able to get rid off the SRA
> disabling in the face of potential strict-alignment expansion
> problems. The patch below does that.
>
> When I applied it before applying the patches fixing misaligned
> expansion, testcases gcc.dg/torture/pr52402.c and
> gcc.dg/tree-ssa/pr49923.c failed on strict-alignment platforms.
> However, when applied to the current trunk, they pass bootstrap and
> testsuite on sparc64-linux, ia64-linux, x86_64-linux and i686-linux.
> OK for trunk?
Ok.
Thanks,
Richard.
> Thanks,
>
> Martin
>
>
> 2012-03-20 Martin Jambor
>
> PR tree-optimization/50052
> * tree-sra.c (tree_non_aligned_mem_p): Removed.
> (tree_non_aligned_mem_for_access_p): Likewise.
> (build_accesses_from_assign): Removed strict alignment requirements
> checks.
> (access_precludes_ipa_sra_p): Likewise.
>
> * testsuite/gcc.dg/ipa/ipa-sra-2.c: Also run on strict-alignment
> platforms.
>
>
> Index: src/gcc/tree-sra.c
> ===
> --- src.orig/gcc/tree-sra.c
> +++ src/gcc/tree-sra.c
> @@ -1081,53 +1081,6 @@ disqualify_ops_if_throwing_stmt (gimple
>return false;
> }
>
> -/* Return true if EXP is a memory reference less aligned than ALIGN. This is
> - invoked only on strict-alignment targets. */
> -
> -static bool
> -tree_non_aligned_mem_p (tree exp, unsigned int align)
> -{
> - unsigned int exp_align;
> -
> - if (TREE_CODE (exp) == VIEW_CONVERT_EXPR)
> -exp = TREE_OPERAND (exp, 0);
> -
> - if (TREE_CODE (exp) == SSA_NAME || is_gimple_min_invariant (exp))
> -return false;
> -
> - /* get_object_alignment will fall back to BITS_PER_UNIT if it cannot
> - compute an explicit alignment. Pretend that dereferenced pointers
> - are always aligned on strict-alignment targets. */
> - if (TREE_CODE (exp) == MEM_REF || TREE_CODE (exp) == TARGET_MEM_REF)
> -exp_align = get_object_or_type_alignment (exp);
> - else
> -exp_align = get_object_alignment (exp);
> -
> - if (exp_align < align)
> -return true;
> -
> - return false;
> -}
> -
> -/* Return true if EXP is a memory reference less aligned than what the access
> - ACC would require. This is invoked only on strict-alignment targets. */
> -
> -static bool
> -tree_non_aligned_mem_for_access_p (tree exp, struct access *acc)
> -{
> - unsigned int acc_align;
> -
> - /* The alignment of the access is that of its expression. However, it may
> - have been artificially increased, e.g. by a local alignment promotion,
> - so we cap it to the alignment of the type of the base, on the grounds
> - that valid sub-accesses cannot be more aligned than that. */
> - acc_align = get_object_alignment (acc->expr);
> - if (acc->base && acc_align > TYPE_ALIGN (TREE_TYPE (acc->base)))
> -acc_align = TYPE_ALIGN (TREE_TYPE (acc->base));
> -
> - return tree_non_aligned_mem_p (exp, acc_align);
> -}
> -
> /* Scan expressions occuring in STMT, create access structures for all
> accesses
> to candidates for scalarization and remove those candidates which occur in
> statements or expressions that prevent them from being split apart.
> Return
> @@ -1154,11 +1107,7 @@ build_accesses_from_assign (gimple stmt)
>lacc = build_access_from_expr_1 (lhs, stmt, true);
>
>if (lacc)
> -{
> - lacc->grp_assignment_write = 1;
> - if (STRICT_ALIGNMENT && tree_non_aligned_mem_for_access_p (rhs, lacc))
> -lacc->grp_unscalarizable_region = 1;
> -}
> +lacc->grp_assignment_write = 1;
>
>if (racc)
> {
> @@ -1166,8 +1115,6 @@ build_accesses_from_assign (gimple stmt)
>if (should_scalarize_away_bitmap && !gimple_has_volatile_ops (stmt)
> && !is_gimple_reg_type (racc->type))
> bitmap_set_bit (should_scalarize_away_bitmap, DECL_UID (racc->base));
> - if (STRICT_ALIGNMENT && tree_non_aligned_mem_for_access_p (lhs, racc))
> -racc->grp_unscalarizable_region = 1;
> }
>
>if (lacc && racc
> @@ -3835,10 +3782,6 @@ access_precludes_ipa_sra_p (struct acces
> || gimple_code (access->stmt) == GIMPLE_ASM))
> return true;
>
> - if (STRICT_ALIGNMENT
> - && tree_non_aligned_mem_p (access->expr, TYPE_ALIGN (access->type)))
> -return true;
> -
>return false;
> }
>
> Index: src/gcc/testsuite/gcc.dg/ipa/ipa-sra-2.c
> ===
> --- src.orig/gcc/testsuite/gcc.dg/ipa/ipa-sra-2.c
> +++ src/gcc/testsuite/gcc.dg/ipa/ipa-sra-2.c
> @@ -1,6 +1,5 @@
> /* { dg-do compile } */
> /* { dg-options "-O2 -fipa-sra -fdump-tree-eipa_sra-details" } */
> -/* { dg-require-effective-target non_strict_align } */
>
> struct bovid
> {
>
>
--
Richard Guenthe