aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ira-conflicts.cc3
-rw-r--r--gcc/testsuite/gfortran.dg/pr115281.f9039
2 files changed, 41 insertions, 1 deletions
diff --git a/gcc/ira-conflicts.cc b/gcc/ira-conflicts.cc
index 83274c5..15ac42d 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 0000000..80aa822
--- /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