diff options
author | Richard Biener <rguenther@suse.de> | 2024-04-10 10:33:40 +0200 |
---|---|---|
committer | Richard Biener <rguenther@suse.de> | 2024-04-10 18:43:24 +0200 |
commit | 912753cc5f18d786e334dd425469fa7f93155661 (patch) | |
tree | 85981b8aeaefe47944567a682cc7812174b9116d | |
parent | 5aa3fec38cc6f52285168b161bab1a869d864b44 (diff) | |
download | gcc-912753cc5f18d786e334dd425469fa7f93155661.zip gcc-912753cc5f18d786e334dd425469fa7f93155661.tar.gz gcc-912753cc5f18d786e334dd425469fa7f93155661.tar.bz2 |
tree-optimization/114672 - WIDEN_MULT_PLUS_EXPR type mismatch
The following makes sure to restrict WIDEN_MULT*_EXPR to a mode
precision final compute type as the mode is used to find the optab
and type checking chokes when seeing bit-precisions later which
would likely also not properly expanded to RTL.
PR tree-optimization/114672
* tree-ssa-math-opts.cc (convert_plusminus_to_widen): Only
allow mode-precision results.
* gcc.dg/torture/pr114672.c: New testcase.
-rw-r--r-- | gcc/testsuite/gcc.dg/torture/pr114672.c | 14 | ||||
-rw-r--r-- | gcc/tree-ssa-math-opts.cc | 5 |
2 files changed, 17 insertions, 2 deletions
diff --git a/gcc/testsuite/gcc.dg/torture/pr114672.c b/gcc/testsuite/gcc.dg/torture/pr114672.c new file mode 100644 index 0000000..b69511f --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr114672.c @@ -0,0 +1,14 @@ +/* { dg-do compile } */ + +struct { + __INT64_TYPE__ m : 60; +} s; + +short a; +short b; + +void +foo () +{ + s.m += a * b; +} diff --git a/gcc/tree-ssa-math-opts.cc b/gcc/tree-ssa-math-opts.cc index a8d25c2..705f4a4 100644 --- a/gcc/tree-ssa-math-opts.cc +++ b/gcc/tree-ssa-math-opts.cc @@ -2918,8 +2918,9 @@ convert_plusminus_to_widen (gimple_stmt_iterator *gsi, gimple *stmt, lhs = gimple_assign_lhs (stmt); type = TREE_TYPE (lhs); - if (TREE_CODE (type) != INTEGER_TYPE - && TREE_CODE (type) != FIXED_POINT_TYPE) + if ((TREE_CODE (type) != INTEGER_TYPE + && TREE_CODE (type) != FIXED_POINT_TYPE) + || !type_has_mode_precision_p (type)) return false; if (code == MINUS_EXPR) |