Commit f1f10541 by Richard Sandiford Committed by Richard Sandiford

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
parent d119bf79
2019-07-18 Richard Sandiford <richard.sandiford@arm.com>
* 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.
2019-07-18 Richard Biener <rguenther@suse.de> 2019-07-18 Richard Biener <rguenther@suse.de>
* tree-ssa-sccvn.c (vn_walk_cb_data::push_partial_def): Refactor * tree-ssa-sccvn.c (vn_walk_cb_data::push_partial_def): Refactor
......
...@@ -508,6 +508,8 @@ ei_cond (edge_iterator ei, edge *p) ...@@ -508,6 +508,8 @@ ei_cond (edge_iterator ei, edge *p)
#define CLEANUP_CFGLAYOUT 32 /* Do cleanup in cfglayout mode. */ #define CLEANUP_CFGLAYOUT 32 /* Do cleanup in cfglayout mode. */
#define CLEANUP_CFG_CHANGED 64 /* The caller changed the CFG. */ #define CLEANUP_CFG_CHANGED 64 /* The caller changed the CFG. */
#define CLEANUP_NO_PARTITIONING 128 /* Do not try to fix partitions. */ #define CLEANUP_NO_PARTITIONING 128 /* Do not try to fix partitions. */
#define CLEANUP_FORCE_FAST_DCE 0x100 /* Force run_fast_dce to be called
at least once. */
/* Return true if BB is in a transaction. */ /* Return true if BB is in a transaction. */
......
...@@ -3193,7 +3193,10 @@ cleanup_cfg (int mode) ...@@ -3193,7 +3193,10 @@ cleanup_cfg (int mode)
&& !delete_trivially_dead_insns (get_insns (), max_reg_num ())) && !delete_trivially_dead_insns (get_insns (), max_reg_num ()))
break; break;
if ((mode & CLEANUP_CROSSJUMP) && crossjumps_occurred) if ((mode & CLEANUP_CROSSJUMP) && crossjumps_occurred)
{
run_fast_dce (); run_fast_dce ();
mode &= ~CLEANUP_FORCE_FAST_DCE;
}
} }
else else
break; break;
...@@ -3202,6 +3205,9 @@ cleanup_cfg (int mode) ...@@ -3202,6 +3205,9 @@ cleanup_cfg (int mode)
if (mode & CLEANUP_CROSSJUMP) if (mode & CLEANUP_CROSSJUMP)
remove_fake_exit_edges (); remove_fake_exit_edges ();
if (mode & CLEANUP_FORCE_FAST_DCE)
run_fast_dce ();
/* Don't call delete_dead_jumptables in cfglayout mode, because /* Don't call delete_dead_jumptables in cfglayout mode, because
that function assumes that jump tables are in the insns stream. that function assumes that jump tables are in the insns stream.
But we also don't _have_ to delete dead jumptables in cfglayout But we also don't _have_ to delete dead jumptables in cfglayout
......
...@@ -5457,6 +5457,8 @@ if_convert (bool after_combine) ...@@ -5457,6 +5457,8 @@ if_convert (bool after_combine)
static unsigned int static unsigned int
rest_of_handle_if_conversion (void) rest_of_handle_if_conversion (void)
{ {
int flags = 0;
if (flag_if_conversion) if (flag_if_conversion)
{ {
if (dump_file) if (dump_file)
...@@ -5466,9 +5468,12 @@ rest_of_handle_if_conversion (void) ...@@ -5466,9 +5468,12 @@ rest_of_handle_if_conversion (void)
} }
cleanup_cfg (CLEANUP_EXPENSIVE); cleanup_cfg (CLEANUP_EXPENSIVE);
if_convert (false); 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; return 0;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment