[PATCH] Fix switchconv vop handling (PR tree-optimization/80632)

Richard Biener rguenther@suse.de
Fri May 5 16:01:00 GMT 2017


On May 5, 2017 5:36:14 PM GMT+02:00, Jakub Jelinek <jakub@redhat.com> wrote:
>Hi!
>
>My recent switchconv changes allowed final_bb virtual phi to be
>present,
>but kind of assumed that the vop will be marked for renaming, which
>sometimes happened and sometimes didn't.
>The following patch instead attempts to find out what .MEM_NN we need
>(for switches without non-standard default: that is for any edges from
>the
>switch or switch forwarders to final_bb, otherwise it is any edge
>except
>the default: one).
>
>Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

OK.

Richard.

>2017-05-05  Jakub Jelinek  <jakub@redhat.com>
>
>	PR tree-optimization/80632
>	* tree-switch-conversion.c (struct switch_conv_info): Add target_vop
>	field.
>	(build_arrays): Initialize it for virtual phis.
>	(fix_phi_nodes): Use it for virtual phis.
>
>	* gcc.dg/pr80632.c: New test.
>
>--- gcc/tree-switch-conversion.c.jj	2017-05-03 09:41:38.000000000 +0200
>+++ gcc/tree-switch-conversion.c	2017-05-05 12:04:29.434702222 +0200
>@@ -581,6 +581,9 @@ struct switch_conv_info
>      switch expression is out of range.  */
>   tree *target_outbound_names;
> 
>+  /* VOP SSA_NAME.  */
>+  tree target_vop;
>+
>/* The first load statement that loads a temporary from a new static
>array.
>    */
>   gimple *arr_ref_first;
>@@ -1216,6 +1219,24 @@ build_arrays (gswitch *swtch, struct swi
>       gphi *phi = gpi.phi ();
>       if (!virtual_operand_p (gimple_phi_result (phi)))
> 	build_one_array (swtch, i++, arr_index_type, phi, tidx, info);
>+      else
>+	{
>+	  edge e;
>+	  edge_iterator ei;
>+	  FOR_EACH_EDGE (e, ei, info->switch_bb->succs)
>+	    {
>+	      if (e->dest == info->final_bb)
>+		break;
>+	      if (!info->default_case_nonstandard
>+		  || e->dest != info->default_bb)
>+		{
>+		  e = single_succ_edge (e->dest);
>+		  break;
>+		}
>+	    }
>+	  gcc_assert (e && e->dest == info->final_bb);
>+	  info->target_vop = PHI_ARG_DEF_FROM_EDGE (phi, e);
>+	}
>     }
> }
> 
>@@ -1279,7 +1300,7 @@ fix_phi_nodes (edge e1f, edge e2f, basic
>       gphi *phi = gsi.phi ();
>       tree inbound, outbound;
>       if (virtual_operand_p (gimple_phi_result (phi)))
>-	inbound = outbound = gimple_vop (cfun);
>+	inbound = outbound = info->target_vop;
>       else
> 	{
> 	  inbound = info->target_inbound_names[i];
>--- gcc/testsuite/gcc.dg/pr80632.c.jj	2017-05-05 12:13:25.126024275
>+0200
>+++ gcc/testsuite/gcc.dg/pr80632.c	2017-05-05 12:12:14.000000000 +0200
>@@ -0,0 +1,35 @@
>+/* PR tree-optimization/80632 */
>+/* { dg-do compile } */
>+/* { dg-options "-O2" } */
>+
>+extern int bar (void);
>+extern void baz (void);
>+int a;
>+
>+int
>+foo (void)
>+{
>+  int c = 8;
>+  if (bar ())
>+    {
>+      baz ();
>+      switch (a)
>+	{
>+	case 0:
>+	  c = 1;
>+	  break;
>+	case 1:
>+	  c = 0;
>+	  break;
>+	case 2:
>+	  c = 0;
>+	  break;
>+	case 3:
>+	  c = 0;
>+	  break;
>+	default:
>+	  c = 1;
>+	}
>+    }
>+  return c;
>+}
>
>	Jakub



More information about the Gcc-patches mailing list