diff --git a/gcc/ira-conflicts.cc b/gcc/ira-conflicts.cc index 83274c53330..15ac42d8848 100644 --- a/gcc/ira-conflicts.cc +++ b/gcc/ira-conflicts.cc @@ -227,8 +227,9 @@ go_through_subreg (rtx x, int *offset) if (REGNO (reg) < FIRST_PSEUDO_REGISTER) *offset = subreg_regno_offset (REGNO (reg), GET_MODE (reg), SUBREG_BYTE (x), GET_MODE (x)); + /* The offset is always 0 for paradoxical subregs. */ else if (!can_div_trunc_p (SUBREG_BYTE (x), - REGMODE_NATURAL_SIZE (GET_MODE (x)), offset)) + REGMODE_NATURAL_SIZE (GET_MODE (reg)), offset)) /* Checked by validate_subreg. We must know at compile time which inner hard registers are being accessed. */ gcc_unreachable (); diff --git a/gcc/testsuite/gfortran.dg/pr115281.f90 b/gcc/testsuite/gfortran.dg/pr115281.f90 new file mode 100644 index 00000000000..80aa822e745 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pr115281.f90 @@ -0,0 +1,39 @@ +! { dg-options "-O3" } +! { dg-additional-options "-mcpu=neoverse-v1" { target aarch64*-*-* } } + +SUBROUTINE fn0(ma, mb, nt) + CHARACTER ca + REAL r0(ma) + INTEGER i0(mb) + REAL r1(3,mb) + REAL r2(3,mb) + REAL r3(3,3) + zero=0.0 + do na = 1, nt + nt = i0(na) + do l = 1, 3 + r1 (l, na) = r0 (nt) + r2(l, na) = zero + enddo + enddo + if (ca .ne.'z') then + do j = 1, 3 + do i = 1, 3 + r4 = zero + enddo + enddo + do na = 1, nt + do k = 1, 3 + do l = 1, 3 + do m = 1, 3 + r3 = r4 * v + enddo + enddo + enddo + do i = 1, 3 + do k = 1, ifn (r3) + enddo + enddo + enddo + endif +END