diff --git a/gcc/combine.cc b/gcc/combine.cc
index 90828108ba4c07db8b5bbdcde2f512ddf2622c0e..3beeb514b81746404831db00df5e1cd0cfe7a91f 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 0000000000000000000000000000000000000000..c76093f12d19fa0f9d2e78a69a1f014e26a2eef2
--- /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;
+}