On May 5, 2017 5:36:14 PM GMT+02:00, Jakub Jelinek <ja...@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 <ja...@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