4.9 backports

Jakub Jelinek jakub@redhat.com
Wed Oct 1 09:40:00 GMT 2014


Hi!

I'd like to create 4.9.2-rc1 soon (anyone has any pending patches
for 4.9 branch?), so I've bootstrapped/regtested following 3
backports on x86_64-linux and i686-linux.

Ok for 4.9?
Is the new PR63306 testcase ok for trunk too?

	Jakub
-------------- next part --------------
2014-10-01  Jakub Jelinek  <jakub@redhat.com>

	Backported from mainline
	2014-09-10  Jan Hubicka  <hubicka@ucw.cz>

	PR tree-optimization/63186
	* ipa-split.c (test_nonssa_use): Skip nonforced labels.
	(mark_nonssa_use): Likewise.
	(verify_non_ssa_vars): Verify all header blocks for label
	definitions.

	* gcc.dg/pr63186.c: New testcase.

--- gcc/ipa-split.c	(revision 215148)
+++ gcc/ipa-split.c	(revision 215149)
@@ -167,7 +167,11 @@ test_nonssa_use (gimple, tree t, tree, v
       || (TREE_CODE (t) == VAR_DECL
 	  && auto_var_in_fn_p (t, current_function_decl))
       || TREE_CODE (t) == RESULT_DECL
-      || TREE_CODE (t) == LABEL_DECL)
+	 /* Normal labels are part of CFG and will be handled gratefuly.
+	    Forced labels however can be used directly by statements and
+	    need to stay in one partition along with their uses.  */
+      || (TREE_CODE (t) == LABEL_DECL
+	  && FORCED_LABEL (t)))
     return bitmap_bit_p ((bitmap)data, DECL_UID (t));
 
   /* For DECL_BY_REFERENCE, the return value is actually a pointer.  We want
@@ -213,6 +217,7 @@ verify_non_ssa_vars (struct split_point
   edge e;
   edge_iterator ei;
   bool ok = true;
+  basic_block bb;
 
   FOR_EACH_EDGE (e, ei, current->entry_bb->preds)
     if (e->src != ENTRY_BLOCK_PTR_FOR_FN (cfun)
@@ -225,8 +230,8 @@ verify_non_ssa_vars (struct split_point
   while (!worklist.is_empty ())
     {
       gimple_stmt_iterator bsi;
-      basic_block bb = worklist.pop ();
 
+      bb = worklist.pop ();
       FOR_EACH_EDGE (e, ei, bb->preds)
 	if (e->src != ENTRY_BLOCK_PTR_FOR_FN (cfun)
 	    && bitmap_set_bit (seen, e->src->index))
@@ -250,10 +255,10 @@ verify_non_ssa_vars (struct split_point
 	  if (gimple_code (stmt) == GIMPLE_LABEL
 	      && test_nonssa_use (stmt, gimple_label_label (stmt),
 				  NULL_TREE, non_ssa_vars))
-	  {
-	    ok = false;
-	    goto done;
-	  }
+	    {
+	      ok = false;
+	      goto done;
+	    }
 	}
       for (bsi = gsi_start_phis (bb); !gsi_end_p (bsi); gsi_next (&bsi))
 	{
@@ -286,6 +291,27 @@ verify_non_ssa_vars (struct split_point
 	    }
 	}
     }
+
+  /* Verify that the rest of function does not define any label
+     used by the split part.  */
+  FOR_EACH_BB_FN (bb, cfun)
+    if (!bitmap_bit_p (current->split_bbs, bb->index)
+	&& !bitmap_bit_p (seen, bb->index))
+      {
+        gimple_stmt_iterator bsi;
+        for (bsi = gsi_start_bb (bb); !gsi_end_p (bsi); gsi_next (&bsi))
+	  if (gimple_code (gsi_stmt (bsi)) == GIMPLE_LABEL
+	      && test_nonssa_use (gsi_stmt (bsi),
+				  gimple_label_label (gsi_stmt (bsi)),
+				  NULL_TREE, non_ssa_vars))
+	    {
+	      ok = false;
+	      goto done;
+	    }
+	  else if (gimple_code (gsi_stmt (bsi)) != GIMPLE_LABEL)
+	    break;
+      }
+    
 done:
   BITMAP_FREE (seen);
   worklist.release ();
@@ -735,7 +761,8 @@ mark_nonssa_use (gimple, tree t, tree, v
   if ((TREE_CODE (t) == VAR_DECL
        && auto_var_in_fn_p (t, current_function_decl))
       || TREE_CODE (t) == RESULT_DECL
-      || TREE_CODE (t) == LABEL_DECL)
+      || (TREE_CODE (t) == LABEL_DECL
+	  && FORCED_LABEL (t)))
     bitmap_set_bit ((bitmap)data, DECL_UID (t));
 
   /* For DECL_BY_REFERENCE, the return value is actually a pointer.  We want
--- gcc/testsuite/gcc.dg/pr63186.c	(revision 0)
+++ gcc/testsuite/gcc.dg/pr63186.c	(revision 215149)
@@ -0,0 +1,30 @@
+/* { dg-do link } */
+/* { dg-options "-O2" } */
+void *a;
+int b, c, d;
+
+void
+bar ()
+{
+  switch (c)
+    {
+    case 0:
+    lab:
+      __asm__ ("");
+      return;
+    default:
+      break;
+    }
+  b = 0;
+  d = 0;
+  a = &&lab;
+}
+
+void
+foo ()
+{
+  bar ();
+}
+main()
+{
+}
-------------- next part --------------
2014-10-01  Jakub Jelinek  <jakub@redhat.com>

	Backported from mainline
	2014-09-18  Vladimir Makarov  <vmakarov@redhat.com>

	PR debug/63285
	* haifa-sched.c (schedule_block): Advance cycle at the end of BB
	if advance != 0.

	* gcc.target/i386/pr63285.c: New test.

--- gcc/haifa-sched.c	(revision 215363)
+++ gcc/haifa-sched.c	(revision 215364)
@@ -6473,7 +6473,7 @@ schedule_block (basic_block *target_bb,
   if (ls.modulo_epilogue)
     success = true;
  end_schedule:
-  if (!ls.first_cycle_insn_p)
+  if (!ls.first_cycle_insn_p || advance)
     advance_one_cycle ();
   perform_replacements_new_cycle ();
   if (modulo_ii > 0)
--- gcc/testsuite/gcc.target/i386/pr63285.c	(revision 0)
+++ gcc/testsuite/gcc.target/i386/pr63285.c	(revision 215364)
@@ -0,0 +1,28 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fcompare-debug" } */
+
+struct S { int a; };
+struct T { int b, c; } a;
+long b;
+int c, d;
+void bar (int, int);
+void baz (void *, int);
+
+void
+foo (struct S *x, int y, int z, void *f, int *p, struct T *e)
+{
+  while (x)
+    {
+      baz (f, &d > p);
+      if (z & 1)
+        bar (f > (void *) &f, z);
+    }
+  if (c)
+    {
+      asm ("" : "+m" (a) : "i" (0));
+      y--;
+    }
+  if (e->b == e->c)
+    c = y;
+  y--;
+}
-------------- next part --------------
2014-10-01  Jakub Jelinek  <jakub@redhat.com>

	PR c++/63306
	Backported from mainline
	2014-08-01  James Greenhalgh  <james.greenhalgh@arm.com>

	PR regression/61510
	* cgraphunit.c (analyze_functions): Use get_create rather than get
	for decls which are clones of abstract functions.

	* g++.dg/ipa/pr63306.C: New test.

--- gcc/cgraphunit.c	(revision 213424)
+++ gcc/cgraphunit.c	(revision 213425)
@@ -1038,7 +1038,7 @@ analyze_functions (void)
 	      if (DECL_ABSTRACT_ORIGIN (decl))
 		{
 		  struct cgraph_node *origin_node
-	    	  = cgraph_get_node (DECL_ABSTRACT_ORIGIN (decl));
+		    = cgraph_get_create_node (DECL_ABSTRACT_ORIGIN (decl));
 		  origin_node->used_as_abstract_origin = true;
 		}
 	    }
--- gcc/testsuite/g++.dg/ipa/pr63306.C	2014-09-30 11:38:12.677972771 +0200
+++ gcc/testsuite/g++.dg/ipa/pr63306.C	2014-10-01 10:13:13.088369362 +0200
@@ -0,0 +1,14 @@
+// PR c++/63306
+// { dg-do compile { target c++11 } }
+
+template <typename...>
+class A;
+
+class B
+{
+  B (const int &, const A<int, int> &);
+};
+
+B::B (const int &, const A<int, int> &)
+{
+}


More information about the Gcc-patches mailing list