diff options
author | Richard Biener <rguenther@suse.de> | 2016-04-21 14:09:33 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2016-04-21 14:09:33 +0000 |
commit | 49f428c9f4fa376516756458871646215ea8c807 (patch) | |
tree | 5fabcb4e1b5cda6c5491fe891edb73df02f559ce /gcc | |
parent | c2bd3b691151c9776db7e7370c2e8b1c72bf8752 (diff) | |
download | gcc-49f428c9f4fa376516756458871646215ea8c807.zip gcc-49f428c9f4fa376516756458871646215ea8c807.tar.gz gcc-49f428c9f4fa376516756458871646215ea8c807.tar.bz2 |
re PR tree-optimization/70725 (Internal compiler error (ICE) on valid code)
2016-04-21 Richard Biener <rguenther@suse.de>
PR tree-optimization/70725
* tree-if-conv.c (if_convertible_phi_p): Adjust guard
for phi_convertible_by_degenerating_args.
(predicate_all_scalar_phis): Handle single-argument PHIs.
From-SVN: r235341
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/tree-if-conv.c | 31 |
2 files changed, 28 insertions, 10 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 50d13cb..4ad22d8 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,12 @@ 2016-04-21 Richard Biener <rguenther@suse.de> + PR tree-optimization/70725 + * tree-if-conv.c (if_convertible_phi_p): Adjust guard + for phi_convertible_by_degenerating_args. + (predicate_all_scalar_phis): Handle single-argument PHIs. + +2016-04-21 Richard Biener <rguenther@suse.de> + PR middle-end/70747 * fold-const.c (fold_comparison): Return properly typed constant boolean. diff --git a/gcc/tree-if-conv.c b/gcc/tree-if-conv.c index 04a1d3e..2d14901 100644 --- a/gcc/tree-if-conv.c +++ b/gcc/tree-if-conv.c @@ -659,7 +659,7 @@ if_convertible_phi_p (struct loop *loop, basic_block bb, gphi *phi, if (bb != loop->header) { - if (gimple_phi_num_args (phi) != 2 + if (gimple_phi_num_args (phi) > 2 && !aggressive_if_conv && !phi_convertible_by_degenerating_args (phi)) { @@ -1911,20 +1911,31 @@ predicate_all_scalar_phis (struct loop *loop) if (bb == loop->header) continue; - if (EDGE_COUNT (bb->preds) == 1) - continue; - phi_gsi = gsi_start_phis (bb); if (gsi_end_p (phi_gsi)) continue; - gsi = gsi_after_labels (bb); - while (!gsi_end_p (phi_gsi)) + if (EDGE_COUNT (bb->preds) == 1) { - phi = phi_gsi.phi (); - predicate_scalar_phi (phi, &gsi); - release_phi_node (phi); - gsi_next (&phi_gsi); + /* Propagate degenerate PHIs. */ + for (phi_gsi = gsi_start_phis (bb); !gsi_end_p (phi_gsi); + gsi_next (&phi_gsi)) + { + gphi *phi = phi_gsi.phi (); + replace_uses_by (gimple_phi_result (phi), + gimple_phi_arg_def (phi, 0)); + } + } + else + { + gsi = gsi_after_labels (bb); + while (!gsi_end_p (phi_gsi)) + { + phi = phi_gsi.phi (); + predicate_scalar_phi (phi, &gsi); + release_phi_node (phi); + gsi_next (&phi_gsi); + } } set_phi_nodes (bb, NULL); |