public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* Fix PR48389: ICE in make_edges
@ 2011-04-08 13:33 Michael Matz
  2011-04-08 13:37 ` Jakub Jelinek
  2011-04-08 15:04 ` Jeff Law
  0 siblings, 2 replies; 6+ messages in thread
From: Michael Matz @ 2011-04-08 13:33 UTC (permalink / raw)
  To: gcc-patches; +Cc: law

Hi,

the problem is that some initializers expand to loops.  If such 
initializers are inserted on edges we have looping control flow on them.  
Even if we have no loops, but normal control flow on them (which can 
happen in other situations) we still forget to initialize JUMP_LABEL on 
them leading to potential problems downstream (no idea why we never hit 
any real problems until we had loops on edges, this problem is latent 
since expand from SSA form).

So, we have to initialize the jump labels somewhen.  The obvious idea to 
simply call rebuild_jump_labels after all insertions are done doesn't 
work, because the jump labels are already needed for splitting edges (for 
patching the jump insns), which insertion might cause.

So, instead than this I've added another interface to initialize jump 
labels for a non-main chain of instructions (in fact it's the same as with 
the main chain, merely not diddling with the forced_labels list).

Fixes the testcase, gcc dg.exp is clean, I'm currently regstrapping this 
on x86_64-linux.  Okay if that passes?


Ciao,
Michael.
	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 (expand_gimple_basic_block): Use PAT_VAR_LOCATION_LOC,
	not INSN_VAR_LOCATION_LOC.
	(gimple_expand_cfg): Initialize JUMP_LABEL also on insn inserted
	on edges.

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

Index: jump.c
===================================================================
--- jump.c	(revision 171901)
+++ jump.c	(working copy)
@@ -72,12 +72,9 @@ static void redirect_exp_1 (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: cfgexpand.c
===================================================================
--- cfgexpand.c	(revision 171901)
+++ cfgexpand.c	(working copy)
@@ -3582,9 +3582,9 @@ expand_gimple_basic_block (basic_block b
 		{
 		  /* We can't dump the insn with a TREE where an RTX
 		     is expected.  */
-		  INSN_VAR_LOCATION_LOC (val) = const0_rtx;
+		  PAT_VAR_LOCATION_LOC (val) = const0_rtx;
 		  maybe_dump_rtl_for_gimple_stmt (stmt, last);
-		  INSN_VAR_LOCATION_LOC (val) = (rtx)value;
+		  PAT_VAR_LOCATION_LOC (val) = (rtx)value;
 		}
 
 	      /* In order not to generate too many debug temporaries,
@@ -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: rtl.h
===================================================================
--- rtl.h	(revision 171901)
+++ rtl.h	(working copy)
@@ -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: testsuite/gcc.target/i386/pr48389.c
===================================================================
--- testsuite/gcc.target/i386/pr48389.c	(revision 0)
+++ testsuite/gcc.target/i386/pr48389.c	(revision 0)
@@ -0,0 +1,12 @@
+/* PR middle-end/48389 */
+/* { dg-do compile } */
+/* { dg-options "-O -m32 -mtune=pentiumpro -Wno-abi" } */
+typedef float V2SF __attribute__ ((vector_size (128)));
+V2SF foo (int x, V2SF a)
+{
+  V2SF b = {};
+  if (x & 42)
+    b = a;
+  a += b;
+  return a;
+}

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2011-04-08 15:04 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-04-08 13:33 Fix PR48389: ICE in make_edges Michael Matz
2011-04-08 13:37 ` Jakub Jelinek
2011-04-08 13:59   ` Michael Matz
2011-04-08 14:03     ` Jakub Jelinek
2011-04-08 14:55     ` H.J. Lu
2011-04-08 15:04 ` Jeff Law

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).