machine_mode new_mode, unsigned int regno,
unsigned int copy_regno ATTRIBUTE_UNUSED)
{
+ /* All three modes precision have to be ordered to each other,
+ otherwise partial_subreg_p won't work. */
+ if (!ordered_p (GET_MODE_PRECISION (orig_mode),
+ GET_MODE_PRECISION (copy_mode))
+ || !ordered_p (GET_MODE_PRECISION (copy_mode),
+ GET_MODE_PRECISION (new_mode)))
+ return NULL_RTX;
+
if (partial_subreg_p (copy_mode, orig_mode)
&& partial_subreg_p (copy_mode, new_mode))
return NULL_RTX;
--- /dev/null
+/* PR rtl-optimization/124649 */
+/* { dg-do compile } */
+/* { dg-additional-options "-mcpu=neoverse-v1" { target aarch64*-*-* } } */
+
+void f(char *g, int b) {
+ int k = b & 4 + 1;
+ int c[b];
+ if (k == 1)
+ b >>= 3;
+ b &= 1;
+ c[0] = b;
+ for (int i = 0; i < k; i++)
+ g[i] = c[i];
+}
+