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 <mjam...@suse.cz> > > 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 Guenther <rguent...@suse.de> SUSE / SUSE Labs SUSE LINUX Products GmbH - Nuernberg - AG Nuernberg - HRB 16746 GF: Jeff Hawn, Jennifer Guild, Felix Imendörffer