Commit c7e90196 by Jakub Jelinek

phiopt: Avoid -fcompare-debug bug in phiopt [PR94211]

Two years ago, I've added support for up to 2 simple preparation statements
in value_replacement, but the
-      && estimate_num_insns (assign, &eni_time_weights)
+      && estimate_num_insns (bb_seq (middle_bb), &eni_time_weights)
change, meant that we compute the cost of all those statements rather than
just the single assign that has been the single supported non-debug
statement in the bb before, doesn't do what I thought would do, gimple_seq
is just gimple * and thus it can't be really overloaded depending on whether
we pass a single gimple * or a whole sequence.  Which means in the last
two years it doesn't count all the statements, but only the first one.
With -g that happens to be a DEBUG_STMT, or it could be e.g. the first
preparation statement which could be much cheaper than the actual assign.

2020-03-19  Jakub Jelinek  <jakub@redhat.com>

	PR tree-optimization/94211
	* tree-ssa-phiopt.c (value_replacement): Use estimate_num_insns_seq
	instead of estimate_num_insns for bb_seq (middle_bb).  Rename
	emtpy_or_with_defined_p variable to empty_or_with_defined_p, adjust
	all uses.

	* gcc.dg/pr94211.c: New test.
parent f3280e4c
2020-03-19 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/94211
* tree-ssa-phiopt.c (value_replacement): Use estimate_num_insns_seq
instead of estimate_num_insns for bb_seq (middle_bb). Rename
emtpy_or_with_defined_p variable to empty_or_with_defined_p, adjust
all uses.
2020-03-19 Richard Biener <rguenther@suse.de> 2020-03-19 Richard Biener <rguenther@suse.de>
PR ipa/94217 PR ipa/94217
......
2020-03-19 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/94211
* gcc.dg/pr94211.c: New test.
2020-03-19 Richard Biener <rguenther@suse.de> 2020-03-19 Richard Biener <rguenther@suse.de>
PR middle-end/94216 PR middle-end/94216
......
/* PR tree-optimization/94211 */
/* { dg-do compile } */
/* { dg-options "-O2 -fcompare-debug" } */
long
foo (long a, long b)
{
if (__builtin_expect (b == 1, 1))
return a;
int e = a + 1;
return a / b;
}
...@@ -1056,7 +1056,7 @@ value_replacement (basic_block cond_bb, basic_block middle_bb, ...@@ -1056,7 +1056,7 @@ value_replacement (basic_block cond_bb, basic_block middle_bb,
gimple *cond; gimple *cond;
edge true_edge, false_edge; edge true_edge, false_edge;
enum tree_code code; enum tree_code code;
bool emtpy_or_with_defined_p = true; bool empty_or_with_defined_p = true;
/* If the type says honor signed zeros we cannot do this /* If the type says honor signed zeros we cannot do this
optimization. */ optimization. */
...@@ -1075,7 +1075,7 @@ value_replacement (basic_block cond_bb, basic_block middle_bb, ...@@ -1075,7 +1075,7 @@ value_replacement (basic_block cond_bb, basic_block middle_bb,
{ {
if (gimple_code (stmt) != GIMPLE_PREDICT if (gimple_code (stmt) != GIMPLE_PREDICT
&& gimple_code (stmt) != GIMPLE_NOP) && gimple_code (stmt) != GIMPLE_NOP)
emtpy_or_with_defined_p = false; empty_or_with_defined_p = false;
continue; continue;
} }
/* Now try to adjust arg0 or arg1 according to the computation /* Now try to adjust arg0 or arg1 according to the computation
...@@ -1085,7 +1085,7 @@ value_replacement (basic_block cond_bb, basic_block middle_bb, ...@@ -1085,7 +1085,7 @@ value_replacement (basic_block cond_bb, basic_block middle_bb,
&& jump_function_from_stmt (&arg0, stmt)) && jump_function_from_stmt (&arg0, stmt))
|| (lhs == arg1 || (lhs == arg1
&& jump_function_from_stmt (&arg1, stmt))) && jump_function_from_stmt (&arg1, stmt)))
emtpy_or_with_defined_p = false; empty_or_with_defined_p = false;
} }
cond = last_stmt (cond_bb); cond = last_stmt (cond_bb);
...@@ -1137,7 +1137,7 @@ value_replacement (basic_block cond_bb, basic_block middle_bb, ...@@ -1137,7 +1137,7 @@ value_replacement (basic_block cond_bb, basic_block middle_bb,
/* If the middle basic block was empty or is defining the /* If the middle basic block was empty or is defining the
PHI arguments and this is a single phi where the args are different PHI arguments and this is a single phi where the args are different
for the edges e0 and e1 then we can remove the middle basic block. */ for the edges e0 and e1 then we can remove the middle basic block. */
if (emtpy_or_with_defined_p if (empty_or_with_defined_p
&& single_non_singleton_phi_for_edges (phi_nodes (gimple_bb (phi)), && single_non_singleton_phi_for_edges (phi_nodes (gimple_bb (phi)),
e0, e1) == phi) e0, e1) == phi)
{ {
...@@ -1255,7 +1255,7 @@ value_replacement (basic_block cond_bb, basic_block middle_bb, ...@@ -1255,7 +1255,7 @@ value_replacement (basic_block cond_bb, basic_block middle_bb,
&& profile_status_for_fn (cfun) != PROFILE_ABSENT && profile_status_for_fn (cfun) != PROFILE_ABSENT
&& EDGE_PRED (middle_bb, 0)->probability < profile_probability::even () && EDGE_PRED (middle_bb, 0)->probability < profile_probability::even ()
/* If assign is cheap, there is no point avoiding it. */ /* If assign is cheap, there is no point avoiding it. */
&& estimate_num_insns (bb_seq (middle_bb), &eni_time_weights) && estimate_num_insns_seq (bb_seq (middle_bb), &eni_time_weights)
>= 3 * estimate_num_insns (cond, &eni_time_weights)) >= 3 * estimate_num_insns (cond, &eni_time_weights))
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