VN: Don't recurse on for the same value of a | b [PR117496]

After adding vn_valueize to the handle the `a | b ==/!= 0` case
of insert_predicates_for_cond, it would go into an infinite loop
as the Value number for either a or b could be the same as what it
is for the whole expression. This avoids that recursion so there is
no infinite loop here.

Bootstrapped and tested on x86_64-linux.

	PR tree-optimization/117496

gcc/ChangeLog:

	* tree-ssa-sccvn.cc (insert_predicates_for_cond): If the
	valueization for the new lhs is the same as the old one,
	don't recurse.

gcc/testsuite/ChangeLog:

	* gcc.dg/torture/pr117496-1.c: New test.

Signed-off-by: Andrew Pinski <quic_apinski@quicinc.com>
This commit is contained in:
Andrew Pinski 2024-11-08 13:39:05 -08:00
parent af1277b4d0
commit 6e84a41622
2 changed files with 34 additions and 2 deletions

View File

@ -0,0 +1,25 @@
/* { dg-do compile } */
/* PR tree-optimization/117496 */
/* This would go into an infinite loop into VN while recording
the predicates for the `tracks == 0 && wm == 0` GIMPLE_COND.
As wm_N and tracks_N would valueize back to `tracks | wm`. */
int main_argc, gargs_preemp, gargs_nopreemp;
static void gargs();
void main_argv() {
int tracks = 0;
gargs(main_argc, main_argv, &tracks);
}
void gargs(int, char *, int *tracksp) {
int tracks = *tracksp, wm;
for (;;) {
if (tracks == 0)
wm |= 4;
if (gargs_nopreemp)
gargs_preemp = 0;
if (tracks == 0 && wm == 0)
tracks++;
}
}

View File

@ -7900,6 +7900,7 @@ insert_related_predicates_on_edge (enum tree_code code, tree *ops, edge pred_e)
/* Insert on the TRUE_E true and FALSE_E false predicates /* Insert on the TRUE_E true and FALSE_E false predicates
derived from LHS CODE RHS. */ derived from LHS CODE RHS. */
static void static void
insert_predicates_for_cond (tree_code code, tree lhs, tree rhs, insert_predicates_for_cond (tree_code code, tree lhs, tree rhs,
edge true_e, edge false_e) edge true_e, edge false_e)
@ -7977,9 +7978,15 @@ insert_predicates_for_cond (tree_code code, tree lhs, tree rhs,
tree nlhs; tree nlhs;
nlhs = vn_valueize (gimple_assign_rhs1 (def_stmt)); nlhs = vn_valueize (gimple_assign_rhs1 (def_stmt));
/* A valueization of the `a` might return the old lhs
which is already handled above. */
if (nlhs != lhs)
insert_predicates_for_cond (EQ_EXPR, nlhs, rhs, e, nullptr); insert_predicates_for_cond (EQ_EXPR, nlhs, rhs, e, nullptr);
/* A valueization of the `b` might return the old lhs
which is already handled above. */
nlhs = vn_valueize (gimple_assign_rhs2 (def_stmt)); nlhs = vn_valueize (gimple_assign_rhs2 (def_stmt));
if (nlhs != lhs)
insert_predicates_for_cond (EQ_EXPR, nlhs, rhs, e, nullptr); insert_predicates_for_cond (EQ_EXPR, nlhs, rhs, e, nullptr);
} }
} }