[gcc r11-2906] tree-optimization/96522 - transfer of flow-sensitive info in copy_ref_info

Richard Biener rguenth@gcc.gnu.org
Thu Aug 27 12:26:06 GMT 2020


https://gcc.gnu.org/g:eb68d9d828f94d28afa5900fbf3072bbcd64ba8a

commit r11-2906-geb68d9d828f94d28afa5900fbf3072bbcd64ba8a
Author: Richard Biener <rguenther@suse.de>
Date:   Thu Aug 27 11:48:15 2020 +0200

    tree-optimization/96522 - transfer of flow-sensitive info in copy_ref_info
    
    This removes the bogus tranfer of flow-sensitive info in copy_ref_info
    plus fixes one oversight in FRE when flow-sensitive non-NULLness was added to
    points-to info.
    
    2020-08-27  Richard Biener  <rguenther@suse.de>
    
            PR tree-optimization/96522
            * tree-ssa-address.c (copy_ref_info): Reset flow-sensitive
            info of the copied points-to.  Transfer bigger alignment
            via the access type.
            * tree-ssa-sccvn.c (eliminate_dom_walker::eliminate_stmt):
            Reset all flow-sensitive info.
    
            * gcc.dg/torture/pr96522.c: New testcase.

Diff:
---
 gcc/testsuite/gcc.dg/torture/pr96522.c | 36 +++++++++++++++++++++++++
 gcc/tree-ssa-address.c                 | 48 +++++++++++++---------------------
 gcc/tree-ssa-sccvn.c                   |  3 +--
 3 files changed, 55 insertions(+), 32 deletions(-)

diff --git a/gcc/testsuite/gcc.dg/torture/pr96522.c b/gcc/testsuite/gcc.dg/torture/pr96522.c
new file mode 100644
index 00000000000..2f55d1aeb4d
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr96522.c
@@ -0,0 +1,36 @@
+/* { dg-do run } */
+/* { dg-additional-options "-fno-tree-pta" } */
+
+__attribute__((noipa)) void
+bar (void)
+{
+  volatile int v = 1;
+  if (v)
+    __builtin_abort ();
+}
+
+__attribute__((noipa)) void
+baz (void)
+{
+}
+
+__attribute__((noipa)) void
+foo (int n, double *p, double *x)
+{
+  if (n < 10 && p != 0)
+    for (int i = 0; i < 10; i++)
+      if (x[0] < p[i])
+        x[i] = 0;
+  if (p != 0)
+    bar ();
+  else
+    baz ();
+}
+
+int
+main ()
+{
+  double arr[10];
+  foo (1000, 0, arr);
+  return 0;
+}
diff --git a/gcc/tree-ssa-address.c b/gcc/tree-ssa-address.c
index ec3741d7598..93eae192212 100644
--- a/gcc/tree-ssa-address.c
+++ b/gcc/tree-ssa-address.c
@@ -47,6 +47,7 @@ along with GCC; see the file COPYING3.  If not see
 #include "dumpfile.h"
 #include "tree-affine.h"
 #include "gimplify.h"
+#include "builtins.h"
 
 /* FIXME: We compute address costs using RTL.  */
 #include "tree-ssa-address.h"
@@ -1015,45 +1016,24 @@ copy_ref_info (tree new_ref, tree old_ref)
 
   new_ptr_base = TREE_OPERAND (new_ref, 0);
 
+  tree base = get_base_address (old_ref);
+  if (!base)
+    return;
+
   /* We can transfer points-to information from an old pointer
      or decl base to the new one.  */
   if (new_ptr_base
       && TREE_CODE (new_ptr_base) == SSA_NAME
       && !SSA_NAME_PTR_INFO (new_ptr_base))
     {
-      tree base = get_base_address (old_ref);
-      if (!base)
-	;
-      else if ((TREE_CODE (base) == MEM_REF
-		|| TREE_CODE (base) == TARGET_MEM_REF)
-	       && TREE_CODE (TREE_OPERAND (base, 0)) == SSA_NAME
-	       && SSA_NAME_PTR_INFO (TREE_OPERAND (base, 0)))
+      if ((TREE_CODE (base) == MEM_REF
+	   || TREE_CODE (base) == TARGET_MEM_REF)
+	  && TREE_CODE (TREE_OPERAND (base, 0)) == SSA_NAME
+	  && SSA_NAME_PTR_INFO (TREE_OPERAND (base, 0)))
 	{
-	  struct ptr_info_def *new_pi;
-	  unsigned int align, misalign;
-
 	  duplicate_ssa_name_ptr_info
 	    (new_ptr_base, SSA_NAME_PTR_INFO (TREE_OPERAND (base, 0)));
-	  new_pi = SSA_NAME_PTR_INFO (new_ptr_base);
-	  /* We have to be careful about transferring alignment information.  */
-	  if (get_ptr_info_alignment (new_pi, &align, &misalign)
-	      && TREE_CODE (old_ref) == MEM_REF
-	      && !(TREE_CODE (new_ref) == TARGET_MEM_REF
-		   && (TMR_INDEX2 (new_ref)
-		       /* TODO: Below conditions can be relaxed if TMR_INDEX
-			  is an indcution variable and its initial value and
-			  step are aligned.  */
-		       || (TMR_INDEX (new_ref) && !TMR_STEP (new_ref))
-		       || (TMR_STEP (new_ref)
-			   && (TREE_INT_CST_LOW (TMR_STEP (new_ref))
-			       < align)))))
-	    {
-	      poly_uint64 inc = (mem_ref_offset (old_ref)
-				 - mem_ref_offset (new_ref)).force_uhwi ();
-	      adjust_ptr_info_misalignment (new_pi, inc);
-	    }
-	  else
-	    mark_ptr_info_alignment_unknown (new_pi);
+	  reset_flow_sensitive_info (new_ptr_base);
 	}
       else if (VAR_P (base)
 	       || TREE_CODE (base) == PARM_DECL
@@ -1063,6 +1043,14 @@ copy_ref_info (tree new_ref, tree old_ref)
 	  pt_solution_set_var (&pi->pt, base);
 	}
     }
+
+  /* And alignment info.  Note we cannot transfer misalignment info
+     since that sits on the SSA name but this is flow-sensitive info
+     which we cannot transfer in this generic routine.  */
+  unsigned old_align = get_object_alignment (old_ref);
+  unsigned new_align = get_object_alignment (new_ref);
+  if (new_align < old_align)
+    TREE_TYPE (new_ref) = build_aligned_type (TREE_TYPE (new_ref), old_align);
 }
 
 /* Move constants in target_mem_ref REF to offset.  Returns the new target
diff --git a/gcc/tree-ssa-sccvn.c b/gcc/tree-ssa-sccvn.c
index c5f4a1e53a9..8fbb1dd46d1 100644
--- a/gcc/tree-ssa-sccvn.c
+++ b/gcc/tree-ssa-sccvn.c
@@ -5860,8 +5860,7 @@ eliminate_dom_walker::eliminate_stmt (basic_block b, gimple_stmt_iterator *gsi)
 	      duplicate_ssa_name_ptr_info (sprime,
 					   SSA_NAME_PTR_INFO (lhs));
 	      if (b != sprime_b)
-		mark_ptr_info_alignment_unknown
-		    (SSA_NAME_PTR_INFO (sprime));
+		reset_flow_sensitive_info (sprime);
 	    }
 	  else if (INTEGRAL_TYPE_P (TREE_TYPE (lhs))
 		   && SSA_NAME_RANGE_INFO (lhs)


More information about the Gcc-cvs mailing list