From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 7936) id B4C7C3858D20; Thu, 2 May 2024 19:23:07 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org B4C7C3858D20 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1714677787; bh=Y+W8BjMjklPKVjWEYAC158ifHT7o8CUljA74CR9czb4=; h=From:To:Subject:Date:From; b=nKASwOmsYej29WgBAG54M+XDBNy0up7HzID8qr3GtTW4L+GQP6cTu8DXzXjUFbB/R 05FTpojluQImIwo01H442bwmNkxWNIEN9iXTfeKShGivHXEQh68mkZbJ9q3IIimmed hspzYVvts3MdqiigFlrTZ9TB9YN2qcqtR31aA1f4= MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" From: Richard Ball To: gcc-cvs@gcc.gnu.org Subject: [gcc r12-10410] tree-optimization/114672 - WIDEN_MULT_PLUS_EXPR type mismatch X-Act-Checkin: gcc X-Git-Author: Richard Biener X-Git-Refname: refs/heads/releases/gcc-12 X-Git-Oldrev: 04ca18ff5e2592ac88a5b72248332f519a17184b X-Git-Newrev: 87e37c72cfb153d65ac8b26d6f2d1fe155818318 Message-Id: <20240502192307.B4C7C3858D20@sourceware.org> Date: Thu, 2 May 2024 19:23:07 +0000 (GMT) List-Id: https://gcc.gnu.org/g:87e37c72cfb153d65ac8b26d6f2d1fe155818318 commit r12-10410-g87e37c72cfb153d65ac8b26d6f2d1fe155818318 Author: Richard Biener Date: Wed Apr 10 10:33:40 2024 +0200 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. (cherry picked from commit 912753cc5f18d786e334dd425469fa7f93155661) Diff: --- gcc/testsuite/gcc.dg/torture/pr114672.c | 14 ++++++++++++++ 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 00000000000..b69511fe8db --- /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 bab0cc5aef4..ffd8eebd2a9 100644 --- a/gcc/tree-ssa-math-opts.cc +++ b/gcc/tree-ssa-math-opts.cc @@ -2802,8 +2802,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)