mirror of git://gcc.gnu.org/git/gcc.git
widening_mul: Reset flow sensitive info in maybe_optimize_guarding_check [PR122104]
In PR95852 I've added an optimization where next to just pattern
recognizing r = x * y; r / x != y or r = x * y; r / x == y
as .MUL_OVERFLOW or negation thereof it also recognizes
r = x * y; x && (r / x != y) or r = x * y; !x || (r / x == y)
by optimizing the guarding condition to always true/false.
The problem with that is that some value ranges recorded for
the SSA_NAMEs in the formerly conditional, now unconditional
basic block can be invalid.
This patch fixes it by calling reset_flow_sensitive_info_in_bb
if we optimize the guarding condition.
2025-10-04 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/122104
* tree-ssa-math-opts.cc (maybe_optimize_guarding_check): Call
reset_flow_sensitive_info_in_bb on bb when optimizing out the
guarding condition.
* gcc.target/i386/pr122104.c: New test.
(cherry picked from commit 867f777cee
)
This commit is contained in:
parent
28061487f8
commit
5d74b473f8
|
@ -0,0 +1,12 @@
|
|||
/* PR tree-optimization/122104 */
|
||||
/* { dg-do compile } */
|
||||
/* { dg-options "-O2 -fdump-tree-widening_mul-alias" } */
|
||||
/* { dg-final { scan-tree-dump "\\.MUL_OVERFLOW" "widening_mul" } } */
|
||||
/* { dg-final { scan-tree-dump-not "# RANGE \\\[irange\\\] unsigned int \\\[1, " "widening_mul" } } */
|
||||
|
||||
int
|
||||
foo (int x)
|
||||
{
|
||||
int r = (unsigned) x * 35;
|
||||
return x && ((unsigned) r / x) != 35U;
|
||||
}
|
|
@ -3802,6 +3802,7 @@ maybe_optimize_guarding_check (vec<gimple *> &mul_stmts, gimple *cond_stmt,
|
|||
else
|
||||
gimple_cond_make_false (zero_cond);
|
||||
update_stmt (zero_cond);
|
||||
reset_flow_sensitive_info_in_bb (bb);
|
||||
*cfg_changed = true;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue