From 1ab303de181775ea8e8f7df474ac165f8223300d Mon Sep 17 00:00:00 2001 From: Andreas Krebbel Date: Tue, 25 Apr 2017 11:18:52 +0000 Subject: [PATCH] S/390: PR80464: Split MEM->GPR vector moves We do this already for TImode values but it was missing for vector modes. gcc/ChangeLog: 2017-04-25 Andreas Krebbel Backport from mainline 2017-04-25 Andreas Krebbel PR target/80464 * config/s390/vector.md: Split MEM->GPR vector moves for non-s_operand addresses. gcc/testsuite/ChangeLog: 2017-04-25 Andreas Krebbel Backport from mainline 2017-04-25 Andreas Krebbel PR target/80464 * gfortran.fortran-torture/compile/pr80464.f90: New test. From-SVN: r247191 --- gcc/ChangeLog | 9 +++++ gcc/config/s390/vector.md | 19 +++++++++ gcc/testsuite/ChangeLog | 8 ++++ .../compile/pr80464.f90 | 39 +++++++++++++++++++ 4 files changed, 75 insertions(+) create mode 100644 gcc/testsuite/gfortran.fortran-torture/compile/pr80464.f90 diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b5151e00ed8..f1905d656dd 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2017-04-25 Andreas Krebbel + + Backport from mainline + 2017-04-25 Andreas Krebbel + + PR target/80464 + * config/s390/vector.md: Split MEM->GPR vector moves for + non-s_operand addresses. + 2017-04-25 Andreas Krebbel Backport from mainline diff --git a/gcc/config/s390/vector.md b/gcc/config/s390/vector.md index 7535b9ddb17..2952893834a 100644 --- a/gcc/config/s390/vector.md +++ b/gcc/config/s390/vector.md @@ -248,6 +248,25 @@ operands[5] = operand_subword (operands[1], 0, 0, mode); }) +; This is the vector equivalent to the TImode splitter in s390.md. It +; is required if both target GPRs occur in the source address operand. + +; For non-s_operands at least one of the target GPRs does not conflict +; with the address operand and one of the splitters above will take +; over. +(define_split + [(set (match_operand:V_128 0 "register_operand" "") + (match_operand:V_128 1 "memory_operand" ""))] + "TARGET_ZARCH && reload_completed + && !VECTOR_REG_P (operands[0]) + && !s_operand (operands[1], VOIDmode)" + [(set (match_dup 0) (match_dup 1))] +{ + rtx addr = operand_subword (operands[0], 1, 0, mode); + addr = gen_lowpart (Pmode, addr); + s390_load_address (addr, XEXP (operands[1], 0)); + operands[1] = replace_equiv_address (operands[1], addr); +}) ; Moves for smaller vector modes. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index ed2b6fa5663..9f6f235a00e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2017-04-25 Andreas Krebbel + + Backport from mainline + 2017-04-25 Andreas Krebbel + + PR target/80464 + * gfortran.fortran-torture/compile/pr80464.f90: New test. + 2017-04-25 Andreas Krebbel Backport from mainline diff --git a/gcc/testsuite/gfortran.fortran-torture/compile/pr80464.f90 b/gcc/testsuite/gfortran.fortran-torture/compile/pr80464.f90 new file mode 100644 index 00000000000..d3a3943b59f --- /dev/null +++ b/gcc/testsuite/gfortran.fortran-torture/compile/pr80464.f90 @@ -0,0 +1,39 @@ +subroutine bla(a,bar,lb,ne,nt,v,b) + character*8 lb + integer bar(20),foo(8,5) + real*8 a(3,*),x(3,8),v(0:3,*) + if(lb(4:4).eq.'3') then + n=8 + elseif(lb(4:5).eq.'10') then + n=10 + ns=6 + m=4 + endif + call blub(id) + do + if(id.eq.0) exit + if(lb(4:4).eq.'6') then + m=1 + endif + if((n.eq.20).or.(n.eq.8)) then + if(b.eq.0) then + do i=1,ns + do j=1,3 + x(j,i)=a(j,bar(foo(i,ig))) + enddo + enddo + else + do i=1,ns + do j=1,3 + x(j,i)=a(j,bar(foo(i,ig)))+v(j,bar(foo(i,ig))) + enddo + enddo + endif + endif + do i=1,m + if(lb(4:5).eq.'1E') then + call blab(x) + endif + enddo + enddo +end subroutine bla