diff options
author | Martin Liska <mliska@suse.cz> | 2021-01-12 13:40:44 +0100 |
---|---|---|
committer | Martin Liska <mliska@suse.cz> | 2021-01-13 11:33:28 +0100 |
commit | 7875e8dc831f30eec7203e090a209efe4c01a27d (patch) | |
tree | 48b1f10b1e11157c58ca1bad0181aa2f339acec9 | |
parent | 0db5f48848632cc571022b2c700ddcf69264f433 (diff) | |
download | gcc-7875e8dc831f30eec7203e090a209efe4c01a27d.zip gcc-7875e8dc831f30eec7203e090a209efe4c01a27d.tar.gz gcc-7875e8dc831f30eec7203e090a209efe4c01a27d.tar.bz2 |
if-to-switch: fix also virtual phis
gcc/ChangeLog:
PR tree-optimization/98455
* gimple-if-to-switch.cc (condition_info::record_phi_mapping):
Record also virtual PHIs.
(pass_if_to_switch::execute): Return TODO_cleanup_cfg only
conditionally.
gcc/testsuite/ChangeLog:
PR tree-optimization/98455
* gcc.dg/tree-ssa/pr98455.c: New test.
-rw-r--r-- | gcc/gimple-if-to-switch.cc | 11 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/pr98455.c | 19 |
2 files changed, 23 insertions, 7 deletions
diff --git a/gcc/gimple-if-to-switch.cc b/gcc/gimple-if-to-switch.cc index 560753d..1712fc4 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)); } } @@ -470,7 +467,7 @@ const pass_data pass_data_if_to_switch = 0, /* properties_provided */ 0, /* properties_destroyed */ 0, /* todo_flags_start */ - TODO_cleanup_cfg | TODO_update_ssa /* todo_flags_finish */ + TODO_update_ssa /* todo_flags_finish */ }; class pass_if_to_switch : public gimple_opt_pass @@ -575,7 +572,7 @@ pass_if_to_switch::execute (function *fun) if (!all_candidates.is_empty ()) { free_dominance_info (CDI_DOMINATORS); - mark_virtual_operands_for_renaming (fun); + return TODO_cleanup_cfg; } return 0; 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 0000000..24e249f --- /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; +} |