https://gcc.gnu.org/g:5b46c01c50662a1c730e6658ea4307d4f80da578

commit r15-7344-g5b46c01c50662a1c730e6658ea4307d4f80da578
Author: Richard Biener <rguent...@suse.de>
Date:   Mon Feb 3 15:27:30 2025 +0100

    rtl-optimization/117611 - ICE in simplify_shift_const_1
    
    The following checks we have a scalar int shift mode before
    enforcing it.  As AVR shows the mode can be a signed _Accum mode
    as well.
    
            PR rtl-optimization/117611
            * combine.cc (simplify_shift_const_1): Bail if not
            scalar int mode.
    
            * gcc.dg/fixed-point/pr117611.c: New testcase.

Diff:
---
 gcc/combine.cc                              | 6 ++++--
 gcc/testsuite/gcc.dg/fixed-point/pr117611.c | 7 +++++++
 2 files changed, 11 insertions(+), 2 deletions(-)

diff --git a/gcc/combine.cc b/gcc/combine.cc
index 90828108ba4c..3beeb514b817 100644
--- a/gcc/combine.cc
+++ b/gcc/combine.cc
@@ -10635,8 +10635,10 @@ simplify_shift_const_1 (enum rtx_code code, 
machine_mode result_mode,
                                             outer_op, outer_const);
        }
 
-      scalar_int_mode shift_unit_mode
-       = as_a <scalar_int_mode> (GET_MODE_INNER (shift_mode));
+      scalar_int_mode shift_unit_mode;
+      if (!is_a <scalar_int_mode> (GET_MODE_INNER (shift_mode),
+                                  &shift_unit_mode))
+       return NULL_RTX;
 
       /* Handle cases where the count is greater than the size of the mode
         minus 1.  For ASHIFT, use the size minus one as the count (this can
diff --git a/gcc/testsuite/gcc.dg/fixed-point/pr117611.c 
b/gcc/testsuite/gcc.dg/fixed-point/pr117611.c
new file mode 100644
index 000000000000..c76093f12d19
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/fixed-point/pr117611.c
@@ -0,0 +1,7 @@
+/* { dg-do compile } */
+/* { dg-options "-Os" } */
+
+_Accum acc1 (_Accum x)
+{
+    return x << 16;
+}

Reply via email to