[PATCH] Fix PR83518 for aarch64

Richard Biener rguenther@suse.de
Tue Jul 23 10:09:00 GMT 2019


This is the last piece to fix the testcase for aarch64 and it's
gimplification of int a[] = { 1,2,3....} to a = *.LC0;

It also fixes having calls in GIMPLE FE IL when emitting a CFG.

Bootstrapped / tested on x86_64-unknown-linux-gnu, applied.

Richard.

2019-07-23  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/83518
	* tree-ssa-sccvn.c (vn_reference_lookup_3): Handle aggregate
	init from a constant even when partial defs are already recorded.

	c/
	* gimple-parser.c (c_parser_parse_gimple_body): When we have
	a CFG also rebuild cgraph edges.

	* gcc.dg/tree-ssa/ssa-fre-79.c: New testcase.

Index: gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-79.c
===================================================================
--- gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-79.c	(nonexistent)
+++ gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-79.c	(working copy)
@@ -0,0 +1,29 @@
+/* { dg-do run } */
+/* { dg-options "-O -fgimple -fdump-tree-fre1" } */
+
+struct S { char a[4]; };
+const struct S cs = { 1, 2, 3, 4 };
+
+int __GIMPLE(ssa,startwith("fre"))
+main ()
+{
+  struct S s;
+  short _1;
+
+  __BB(2):
+  s = cs;
+  s.a[1] = _Literal (char) 3;
+  _1 = __MEM <short, 1> (&s + 1);
+  if (_1 != _Literal (short) 0x303)
+    goto __BB3;
+  else
+    goto __BB4;
+
+  __BB(3):
+  __builtin_abort ();
+
+  __BB(4):
+  return 0;
+}
+
+/* { dg-final { scan-tree-dump-not "abort" "fre1" } } */
Index: gcc/c/gimple-parser.c
===================================================================
--- gcc/c/gimple-parser.c	(revision 273657)
+++ gcc/c/gimple-parser.c	(working copy)
@@ -356,6 +356,8 @@ c_parser_parse_gimple_body (c_parser *cp
       gcov_type t = PARAM_VALUE (PARAM_GIMPLE_FE_COMPUTED_HOT_BB_THRESHOLD);
       set_hot_bb_threshold (t);
       update_max_bb_count ();
+      cgraph_node::get_create (cfun->decl);
+      cgraph_edge::rebuild_edges ();
     }
   dump_function (TDI_gimple, current_function_decl);
 }
Index: gcc/tree-ssa-sccvn.c
===================================================================
--- gcc/tree-ssa-sccvn.c	(revision 273667)
+++ gcc/tree-ssa-sccvn.c	(working copy)
@@ -2702,9 +2702,7 @@ vn_reference_lookup_3 (ao_ref *ref, tree
 	   && gimple_assign_single_p (def_stmt)
 	   && (DECL_P (gimple_assign_rhs1 (def_stmt))
 	       || TREE_CODE (gimple_assign_rhs1 (def_stmt)) == MEM_REF
-	       || handled_component_p (gimple_assign_rhs1 (def_stmt)))
-	   /* Handling this is more complicated, give up for now.  */
-	   && data->partial_defs.is_empty ())
+	       || handled_component_p (gimple_assign_rhs1 (def_stmt))))
     {
       tree base2;
       int i, j, k;
@@ -2808,8 +2806,30 @@ vn_reference_lookup_3 (ao_ref *ref, tree
       /* Try folding the new reference to a constant.  */
       tree val = fully_constant_vn_reference_p (vr);
       if (val)
-	return vn_reference_lookup_or_insert_for_pieces
-		 (vuse, vr->set, vr->type, vr->operands, val);
+	{
+	  if (data->partial_defs.is_empty ())
+	    return vn_reference_lookup_or_insert_for_pieces
+		(vuse, vr->set, vr->type, vr->operands, val);
+	  /* This is the only interesting case for partial-def handling
+	     coming from targets that like to gimplify init-ctors as
+	     aggregate copies from constant data like aarch64 for
+	     PR83518.  */
+	  if (maxsize.is_constant (&maxsizei)
+	      && known_eq (ref->size, maxsize))
+	    {
+	      pd_data pd;
+	      pd.rhs = val;
+	      pd.offset = 0;
+	      pd.size = maxsizei / BITS_PER_UNIT;
+	      return data->push_partial_def (pd, vuse, maxsizei);
+	    }
+	}
+
+      /* Continuing with partial defs isn't easily possible here, we
+         have to find a full def from further lookups from here.  Probably
+	 not worth the special-casing everywhere.  */
+      if (!data->partial_defs.is_empty ())
+	return (void *)-1;
 
       /* Adjust *ref from the new operands.  */
       if (!ao_ref_init_from_vn_reference (&r, vr->set, vr->type, vr->operands))



More information about the Gcc-patches mailing list