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
2014-10-01  Jakub Jelinek  <ja...@redhat.com>

        Backported from mainline
        2014-09-10  Jan Hubicka  <hubi...@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()
+{
+}
2014-10-01  Jakub Jelinek  <ja...@redhat.com>

        Backported from mainline
        2014-09-18  Vladimir Makarov  <vmaka...@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--;
+}
2014-10-01  Jakub Jelinek  <ja...@redhat.com>

        PR c++/63306
        Backported from mainline
        2014-08-01  James Greenhalgh  <james.greenha...@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> &)
+{
+}

Reply via email to