) On Tue, Jan 12, 2021 at 3:50 PM Martin Liška <mli...@suse.cz> wrote: > > Hello. > > As seen in the PR, we need to fix also virtual PHIs, otherwise > TODO_cfg will skip edges for a missing PHI argument. > > Patch can bootstrap on x86_64-linux-gnu and survives regression tests. > > Ready to be installed?
OK - doesn't this mean you can remove the mark_virtual_operands_for_renaming (fun); call and thus TODO_update_ssa? Btw, the pass seems to unconditionally schedule TODO_cleanup_cfg - it would be nice to only do that (return TODO_cleanup_cfg from pass_if_to_switch::execute) if it did any transform. Thanks, Richard. > Thanks, > Martin > > gcc/ChangeLog: > > PR tree-optimization/98455 > * gimple-if-to-switch.cc (condition_info::record_phi_mapping): > Record also virtual PHIs. > > gcc/testsuite/ChangeLog: > > PR tree-optimization/98455 > * gcc.dg/tree-ssa/pr98455.c: New test. > --- > gcc/gimple-if-to-switch.cc | 7 ++----- > gcc/testsuite/gcc.dg/tree-ssa/pr98455.c | 19 +++++++++++++++++++ > 2 files changed, 21 insertions(+), 5 deletions(-) > create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/pr98455.c > > diff --git a/gcc/gimple-if-to-switch.cc b/gcc/gimple-if-to-switch.cc > index 560753d0311..96213d86c28 100644 > --- a/gcc/gimple-if-to-switch.cc > +++ b/gcc/gimple-if-to-switch.cc > @@ -91,11 +91,8 @@ condition_info::record_phi_mapping (edge e, mapping_vec > *vec) > gsi_next (&gsi)) > { > gphi *phi = gsi.phi (); > - if (!virtual_operand_p (gimple_phi_result (phi))) > - { > - tree arg = PHI_ARG_DEF_FROM_EDGE (phi, e); > - vec->safe_push (std::make_pair (phi, arg)); > - } > + tree arg = PHI_ARG_DEF_FROM_EDGE (phi, e); > + vec->safe_push (std::make_pair (phi, arg)); > } > } > > diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr98455.c > b/gcc/testsuite/gcc.dg/tree-ssa/pr98455.c > new file mode 100644 > index 00000000000..24e249f6fcb > --- /dev/null > +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr98455.c > @@ -0,0 +1,19 @@ > +/* PR tree-optimization/98455 */ > +/* { dg-do compile } */ > +/* { dg-options "-O1 -fno-tree-dce --param case-values-threshold=1" } */ > + > +void > +n4 (int io, int vb) > +{ > + double uc[2] = { 1.0, 2.0, }; > + > + if (io == 0) > + uc[0] = 0.0; > + > + for (;;) > + if (io == 0) > + if (vb == 0) > + uc[0] = uc[1]; > + else if (vb == 1) > + uc[1] = 0.0; > +} > -- > 2.29.2 >