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

Reply via email to