diff mbox

Remove strict-alignment checks in SRA

Message ID 20120323140748.GA10407@virgil.arch.suse.de
State New
Headers show

Commit Message

Martin Jambor March 23, 2012, 2:07 p.m. UTC
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?

Thanks,

Martin


2012-03-20  Martin Jambor  <mjambor@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.

Comments

Richard Biener March 26, 2012, 10:52 a.m. UTC | #1
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  <mjambor@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
>  {
> 
>
diff mbox

Patch

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
 {