re PR rtl-optimization/48389 (ICE: in make_edges, at cfgbuild.c:319 with -mtune=penti...
authorMichael Matz <matz@gcc.gnu.org>
Fri, 8 Apr 2011 20:18:08 +0000 (20:18 +0000)
committerMichael Matz <matz@gcc.gnu.org>
Fri, 8 Apr 2011 20:18:08 +0000 (20:18 +0000)
PR middle-end/48389
* jump.c (rebuild_jump_labels_1, rebuild_jump_labels_chain): New
functions.
(rebuild_jump_labels): Call rebuild_jump_labels_1.
* rtl.h (rebuild_jump_labels_chain): Declare.
* cfgexpand.c (gimple_expand_cfg): Initialize JUMP_LABEL also on
        insns inserted on edges.

testsuite/
* gcc.target/i386/pr48389.c: New test.

From-SVN: r172208

gcc/ChangeLog
gcc/cfgexpand.c
gcc/jump.c
gcc/rtl.h
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/pr48389.c [new file with mode: 0644]

index 9fd40ebf7a0be3d8ce3c8c1d43532de912f74b12..bc6b580207d53456d149e15a5bb12fa9da2a1da5 100644 (file)
@@ -1,3 +1,13 @@
+2011-04-08  Michael Matz  <matz@suse.de>
+
+       PR middle-end/48389
+       * jump.c (rebuild_jump_labels_1, rebuild_jump_labels_chain): New
+       functions.
+       (rebuild_jump_labels): Call rebuild_jump_labels_1.
+       * rtl.h (rebuild_jump_labels_chain): Declare.
+       * cfgexpand.c (gimple_expand_cfg): Initialize JUMP_LABEL also on
+       insns inserted on edges.
+
 2011-04-08  Joseph Myers  <joseph@codesourcery.com>
 
        * config.gcc (arm*-*-*): Add arm/arm-tables.opt to extra_options.
@@ -16,7 +26,7 @@
        * config/arm/t-arm ($(srcdir)/config/arm/arm-tables.opt): New.
        (arm.o): Update dependencies.
 
-2011-04-08  Basile Starynkevitch  <basile@starynkevitch.net>
+2011-04-08  Basile Starynkevitch  <basile@starynkevitch.net>
 
        * gengtype.c (write_typed_alloc_def): New argument f. Use it instead
        of header_file.
index 81a23d4c8abff6b0deb6ac129e2d74a6fd808d56..cc1382fa4dfac7881a5d34d1c2d35d9499067904 100644 (file)
@@ -4143,6 +4143,8 @@ gimple_expand_cfg (void)
   /* Zap the tree EH table.  */
   set_eh_throw_stmt_table (cfun, NULL);
 
+  /* We need JUMP_LABEL be set in order to redirect jumps, and hence
+     split edges which edge insertions might do.  */
   rebuild_jump_labels (get_insns ());
 
   FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR, EXIT_BLOCK_PTR, next_bb)
@@ -4153,6 +4155,7 @@ gimple_expand_cfg (void)
        {
          if (e->insns.r)
            {
+             rebuild_jump_labels_chain (e->insns.r);
              /* Avoid putting insns before parm_birth_insn.  */
              if (e->src == ENTRY_BLOCK_PTR
                  && single_succ_p (ENTRY_BLOCK_PTR)
index 8adfbfd5c405f80b71213544e24f6beccabd20df..39fc2340c31085561a3bb3b0323bb028076d40fc 100644 (file)
@@ -72,12 +72,9 @@ static void redirect_exp_1 (rtx *, rtx, rtx, rtx);
 static int invert_exp_1 (rtx, rtx);
 static int returnjump_p_1 (rtx *, void *);
 \f
-/* This function rebuilds the JUMP_LABEL field and REG_LABEL_TARGET
-   notes in jumping insns and REG_LABEL_OPERAND notes in non-jumping
-   instructions and jumping insns that have labels as operands
-   (e.g. cbranchsi4).  */
-void
-rebuild_jump_labels (rtx f)
+/* Worker for rebuild_jump_labels and rebuild_jump_labels_chain.  */
+static void
+rebuild_jump_labels_1 (rtx f, bool count_forced)
 {
   rtx insn;
 
@@ -89,11 +86,31 @@ rebuild_jump_labels (rtx f)
      closely enough to delete them here, so make sure their reference
      count doesn't drop to zero.  */
 
-  for (insn = forced_labels; insn; insn = XEXP (insn, 1))
-    if (LABEL_P (XEXP (insn, 0)))
-      LABEL_NUSES (XEXP (insn, 0))++;
+  if (count_forced)
+    for (insn = forced_labels; insn; insn = XEXP (insn, 1))
+      if (LABEL_P (XEXP (insn, 0)))
+       LABEL_NUSES (XEXP (insn, 0))++;
   timevar_pop (TV_REBUILD_JUMP);
 }
+
+/* This function rebuilds the JUMP_LABEL field and REG_LABEL_TARGET
+   notes in jumping insns and REG_LABEL_OPERAND notes in non-jumping
+   instructions and jumping insns that have labels as operands
+   (e.g. cbranchsi4).  */
+void
+rebuild_jump_labels (rtx f)
+{
+  rebuild_jump_labels_1 (f, true);
+}
+
+/* This function is like rebuild_jump_labels, but doesn't run over
+   forced_labels.  It can be used on insn chains that aren't the 
+   main function chain.  */
+void
+rebuild_jump_labels_chain (rtx chain)
+{
+  rebuild_jump_labels_1 (chain, false);
+}
 \f
 /* Some old code expects exactly one BARRIER as the NEXT_INSN of a
    non-fallthru insn.  This is not generally true, as multiple barriers
index 84c102b14e59b5be20d822b69d6ab1228639b453..67dbf2b6ab5aea183881e9c11352bd894c33d037 100644 (file)
--- a/gcc/rtl.h
+++ b/gcc/rtl.h
@@ -2315,6 +2315,7 @@ extern int redirect_jump_1 (rtx, rtx);
 extern void redirect_jump_2 (rtx, rtx, rtx, int, int);
 extern int redirect_jump (rtx, rtx, int);
 extern void rebuild_jump_labels (rtx);
+extern void rebuild_jump_labels_chain (rtx);
 extern rtx reversed_comparison (const_rtx, enum machine_mode);
 extern enum rtx_code reversed_comparison_code (const_rtx, const_rtx);
 extern enum rtx_code reversed_comparison_code_parts (enum rtx_code, const_rtx,
index acd66d099de0dcb394578703ae5cdc8a1fab3749..4f5fb0006dbb74c8612a9ecd343ba01f4b91d51a 100644 (file)
@@ -1,3 +1,8 @@
+2011-04-08  Michael Matz  <matz@suse.de>
+
+       PR middle-end/48389
+       * gcc.target/i386/pr48389.c: New test.
+
 2011-04-08  Andrey Belevantsev  <abel@ispras.ru>
 
        PR rtl-optimization/48272
        PR fortran/47775
        * gfortran.dg/func_result_6.f90: New.
 
+2011-02-18  Michael Matz  <matz@suse.de>
+
+       PR fortran/45586
+       * gfortran.dg/lto/pr45586_0.f90: New test.
+       * gfortran.dg/typebound_proc_20.f90: Ditto.
+       * gfortran.dg/typebound_proc_21.f90: Ditto.
+
 2011-02-18  Paolo Carlini  <paolo.carlini@oracle.com>
 
        PR c++/47795
diff --git a/gcc/testsuite/gcc.target/i386/pr48389.c b/gcc/testsuite/gcc.target/i386/pr48389.c
new file mode 100644 (file)
index 0000000..d43f664
--- /dev/null
@@ -0,0 +1,13 @@
+/* PR middle-end/48389 */
+/* { dg-do compile } */
+/* { dg-options "-O -mtune=pentiumpro -Wno-abi" } */
+/* { dg-require-effective-target ilp32 } */
+typedef float V2SF __attribute__ ((vector_size (128)));
+V2SF foo (int x, V2SF a)
+{
+  V2SF b = {};
+  if (x & 42)
+    b = a;
+  a += b;
+  return a;
+}