mirror of
https://github.com/gcc-mirror/gcc.git
synced 2024-11-21 13:40:47 +00:00
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:
parent
af1277b4d0
commit
6e84a41622
25
gcc/testsuite/gcc.dg/torture/pr117496-1.c
Normal file
25
gcc/testsuite/gcc.dg/torture/pr117496-1.c
Normal 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++;
|
||||||
|
}
|
||||||
|
}
|
@ -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,10 +7978,16 @@ 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));
|
||||||
insert_predicates_for_cond (EQ_EXPR, nlhs, rhs, e, nullptr);
|
/* 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);
|
||||||
|
|
||||||
|
/* 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));
|
||||||
insert_predicates_for_cond (EQ_EXPR, nlhs, rhs, e, nullptr);
|
if (nlhs != lhs)
|
||||||
|
insert_predicates_for_cond (EQ_EXPR, nlhs, rhs, e, nullptr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user