diff options
author | Richard Sandiford <richard.sandiford@arm.com> | 2019-07-18 08:24:16 +0000 |
---|---|---|
committer | Richard Sandiford <rsandifo@gcc.gnu.org> | 2019-07-18 08:24:16 +0000 |
commit | f1f10541903b082d27114db38947fb31f5364bcc (patch) | |
tree | 81b40e730cc48482b0a65592b9ea5e4372ae654b /gcc/ifcvt.c | |
parent | d119bf79862015d4ba3c7f8774835c216c9a26ed (diff) | |
download | gcc-f1f10541903b082d27114db38947fb31f5364bcc.zip gcc-f1f10541903b082d27114db38947fb31f5364bcc.tar.gz gcc-f1f10541903b082d27114db38947fb31f5364bcc.tar.bz2 |
Make ifcvt clean up dead comparisons
This change is needed to avoid a regression in gcc.dg/ifcvt-3.c
for a later patch. Without it, we enter CSE with a dead comparison left
by if-conversion and then eliminate the second (live) comparison in
favour of the dead one. That's functionally correct in itself, but it
meant that we'd combine the subtraction and comparison into a SUBS
before we have a chance to fold away the subtraction.
2019-07-18 Richard Sandiford <richard.sandiford@arm.com>
gcc/
* basic-block.h (CLEANUP_FORCE_FAST_DCE): New macro.
* cfgcleanup.c (cleanup_cfg): Call run_fast_dce if
CLEANUP_FORCE_FAST_DCE is set.
* ifcvt.c (rest_of_handle_if_conversion): Pass
CLEANUP_FORCE_FAST_DCE to the final cleanup_cfg call if
if-conversion succeeded.
From-SVN: r273569
Diffstat (limited to 'gcc/ifcvt.c')
-rw-r--r-- | gcc/ifcvt.c | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/gcc/ifcvt.c b/gcc/ifcvt.c index 7b2f6e6..e0c9522 100644 --- a/gcc/ifcvt.c +++ b/gcc/ifcvt.c @@ -5457,6 +5457,8 @@ if_convert (bool after_combine) static unsigned int rest_of_handle_if_conversion (void) { + int flags = 0; + if (flag_if_conversion) { if (dump_file) @@ -5466,9 +5468,12 @@ rest_of_handle_if_conversion (void) } cleanup_cfg (CLEANUP_EXPENSIVE); if_convert (false); + if (num_updated_if_blocks) + /* Get rid of any dead CC-related instructions. */ + flags |= CLEANUP_FORCE_FAST_DCE; } - cleanup_cfg (0); + cleanup_cfg (flags); return 0; } |