The following fixes unexpected simplification of x << C as x * (1<<C) to a constant.
Bootstrapped and tested on x86_64-unknown-linux-gnu, pushed. PR tree-optimization/108387 * tree-ssa-sccvn.cc (visit_nary_op): Check for SSA_NAME value before inserting expression into the tables. * gcc.dg/pr108387.c: New testcase. --- gcc/testsuite/gcc.dg/pr108387.c | 13 +++++++++++++ gcc/tree-ssa-sccvn.cc | 3 ++- 2 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.dg/pr108387.c diff --git a/gcc/testsuite/gcc.dg/pr108387.c b/gcc/testsuite/gcc.dg/pr108387.c new file mode 100644 index 00000000000..114186b6c5d --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr108387.c @@ -0,0 +1,13 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fno-tree-ccp" } */ + +void bar2 (unsigned char, unsigned char); + +void +foo1 (char c) +{ + unsigned char t = c; + t *= 2; + unsigned char t1 = t << 7; + bar2 (t, t1); +} diff --git a/gcc/tree-ssa-sccvn.cc b/gcc/tree-ssa-sccvn.cc index a01022b0d12..0dba3f39aa0 100644 --- a/gcc/tree-ssa-sccvn.cc +++ b/gcc/tree-ssa-sccvn.cc @@ -5405,7 +5405,8 @@ visit_nary_op (tree lhs, gassign *stmt) if (result) { bool changed = set_ssa_val_to (lhs, result); - vn_nary_op_insert_stmt (stmt, result); + if (TREE_CODE (result) == SSA_NAME) + vn_nary_op_insert_stmt (stmt, result); return changed; } } -- 2.35.3