diff options
author | Richard Biener <rguenther@suse.de> | 2023-01-13 08:37:24 +0100 |
---|---|---|
committer | Richard Biener <rguenther@suse.de> | 2023-01-13 09:40:01 +0100 |
commit | adbee4a197c7b735a3dd58cfac8933f70069f71d (patch) | |
tree | 5c1fd064ecb4c68a6ba19092c0ba28e26ccef744 | |
parent | 9b6c624820050cd5e11b2fbd9c997f94b691295a (diff) | |
download | gcc-adbee4a197c7b735a3dd58cfac8933f70069f71d.zip gcc-adbee4a197c7b735a3dd58cfac8933f70069f71d.tar.gz gcc-adbee4a197c7b735a3dd58cfac8933f70069f71d.tar.bz2 |
tree-optimization/108387 - ICE with VN handling of x << C as x * (1<<C)
The following fixes unexpected simplification of x << C as
x * (1<<C) to a constant.
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.
-rw-r--r-- | gcc/testsuite/gcc.dg/pr108387.c | 13 | ||||
-rw-r--r-- | gcc/tree-ssa-sccvn.cc | 3 |
2 files changed, 15 insertions, 1 deletions
diff --git a/gcc/testsuite/gcc.dg/pr108387.c b/gcc/testsuite/gcc.dg/pr108387.c new file mode 100644 index 0000000..114186b --- /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 a01022b..0dba3f3 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; } } |