diff options
author | Richard Biener <rguenther@suse.de> | 2022-11-28 10:25:44 +0100 |
---|---|---|
committer | Richard Biener <rguenther@suse.de> | 2022-11-28 11:17:03 +0100 |
commit | 2b293a949c0fbe21e47c4bc99f807dc941c02bb6 (patch) | |
tree | 5d9e02bd0eb54690ff9fdd0324a66b6f84a86bb7 | |
parent | 9fa67f1c1228a852e23943a41e68b664172c654c (diff) | |
download | gcc-2b293a949c0fbe21e47c4bc99f807dc941c02bb6.zip gcc-2b293a949c0fbe21e47c4bc99f807dc941c02bb6.tar.gz gcc-2b293a949c0fbe21e47c4bc99f807dc941c02bb6.tar.bz2 |
tree-optimization/107493 - SCEV analysis with conversions
This shows another case where trying to validate conversions during
the CHREC SCC analysis fails because said analysis assumes we are
converting a complete SCC. Like the constraint on the initial
conversion seen restrict all conversions handled to sign-changes.
PR tree-optimization/107493
* tree-scalar-evolution.cc (scev_dfs::follow_ssa_edge_expr):
Only handle no-op and sign-changing conversions.
* gcc.dg/torture/pr107493.c: New testcase.
-rw-r--r-- | gcc/testsuite/gcc.dg/torture/pr107493.c | 13 | ||||
-rw-r--r-- | gcc/tree-scalar-evolution.cc | 10 |
2 files changed, 21 insertions, 2 deletions
diff --git a/gcc/testsuite/gcc.dg/torture/pr107493.c b/gcc/testsuite/gcc.dg/torture/pr107493.c new file mode 100644 index 0000000..b366921 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr107493.c @@ -0,0 +1,13 @@ +/* { dg-do run { target int32plus } } */ + +int a; +int b(int c) { return c; } +int main() +{ + a = -21; + for (; a <= 0; a = (unsigned short)(b(a + 2) + 8)) + ; + if (a != 65525) + __builtin_abort(); + return 0; +} diff --git a/gcc/tree-scalar-evolution.cc b/gcc/tree-scalar-evolution.cc index 6006033..f75398a 100644 --- a/gcc/tree-scalar-evolution.cc +++ b/gcc/tree-scalar-evolution.cc @@ -1227,10 +1227,16 @@ scev_dfs::follow_ssa_edge_expr (gimple *at_stmt, tree expr, { CASE_CONVERT: { - /* This assignment is under the form "a_1 = (cast) rhs. */ + /* This assignment is under the form "a_1 = (cast) rhs. We cannot + validate any precision altering conversion during the SCC + analysis, so don't even try. */ + if (!tree_nop_conversion_p (type, TREE_TYPE (rhs0))) + return t_false; t_bool res = follow_ssa_edge_expr (at_stmt, rhs0, evolution_of_loop, limit); - *evolution_of_loop = chrec_convert (type, *evolution_of_loop, at_stmt); + if (res == t_true) + *evolution_of_loop = chrec_convert (type, *evolution_of_loop, + at_stmt); return res; } |