From: Jakub Jelinek Date: Sun, 16 Jan 2011 20:16:30 +0000 (+0100) Subject: backport: re PR rtl-optimization/46804 (gfortran.dg/char_cshift_2.f90 FAILs with... X-Git-Tag: releases/gcc-4.5.3~306 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8c7f5dba8caf0bff5002046d341dafa9079036d5;p=thirdparty%2Fgcc.git backport: re PR rtl-optimization/46804 (gfortran.dg/char_cshift_2.f90 FAILs with -fregmove) Backport from mainline 2010-12-10 Jakub Jelinek PR rtl-optimization/46804 * regmove.c (optimize_reg_copy_3): Look for REG_EQUAL note on the setter of src_reg rather than on insn. If it is equal to the setter's original SET_SRC, replace it with its zero or sign extension instead of dropping it. * gfortran.dg/pr46804.f90: New test. From-SVN: r168863 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3260141e7c6c..109c878484c4 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -3,6 +3,12 @@ Backport from mainline 2010-12-10 Jakub Jelinek + PR rtl-optimization/46804 + * regmove.c (optimize_reg_copy_3): Look for REG_EQUAL note + on the setter of src_reg rather than on insn. If it is + equal to the setter's original SET_SRC, replace it with its + zero or sign extension instead of dropping it. + PR rtl-optimization/46865 * rtl.c (rtx_equal_p_cb, rtx_equal_p): For last operand of ASM_OPERANDS and ASM_INPUT if integers are different, diff --git a/gcc/regmove.c b/gcc/regmove.c index 25fcc52b213b..33e1445e413e 100644 --- a/gcc/regmove.c +++ b/gcc/regmove.c @@ -513,7 +513,7 @@ optimize_reg_copy_3 (rtx insn, rtx dest, rtx src) rtx src_reg = XEXP (src, 0); int src_no = REGNO (src_reg); int dst_no = REGNO (dest); - rtx p, set; + rtx p, set, set_insn; enum machine_mode old_mode; basic_block bb = BLOCK_FOR_INSN (insn); @@ -551,6 +551,7 @@ optimize_reg_copy_3 (rtx insn, rtx dest, rtx src) GET_MODE_BITSIZE (GET_MODE (src_reg)))) return; + set_insn = p; old_mode = GET_MODE (src_reg); PUT_MODE (src_reg, GET_MODE (src)); XEXP (src, 0) = SET_SRC (set); @@ -583,9 +584,19 @@ optimize_reg_copy_3 (rtx insn, rtx dest, rtx src) } else { - rtx note = find_reg_note (p, REG_EQUAL, NULL_RTX); + rtx note = find_reg_note (set_insn, REG_EQUAL, NULL_RTX); if (note) - remove_note (p, note); + { + if (rtx_equal_p (XEXP (note, 0), XEXP (src, 0))) + { + XEXP (note, 0) + = gen_rtx_fmt_e (GET_CODE (src), GET_MODE (src), + XEXP (note, 0)); + df_notes_rescan (set_insn); + } + else + remove_note (set_insn, note); + } } } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 0d8c6aa5f873..442f44631600 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -3,6 +3,9 @@ Backport from mainline 2010-12-10 Jakub Jelinek + PR rtl-optimization/46804 + * gfortran.dg/pr46804.f90: New test. + PR rtl-optimization/46865 * gcc.target/i386/pr46865-1.c: New test. * gcc.target/i386/pr46865-2.c: New test. diff --git a/gcc/testsuite/gfortran.dg/pr46804.f90 b/gcc/testsuite/gfortran.dg/pr46804.f90 new file mode 100644 index 000000000000..ee44a56c8977 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pr46804.f90 @@ -0,0 +1,36 @@ +! PR rtl-optimization/46804 +! { dg-do run } +! { dg-options "-O -fPIC -fexpensive-optimizations -fgcse -foptimize-register-move -fpeel-loops -fno-tree-loop-optimize" } + +program main + integer, parameter :: n1 = 2, n2 = 3, n3 = 4, slen = 3 + character (len = slen), dimension (n1, n2, n3) :: a + integer (kind = 1), dimension (2, 4) :: shift1 + integer (kind = 2), dimension (2, 4) :: shift2 + integer (kind = 4), dimension (2, 4) :: shift3 + do i3 = 1, n3 + do i2 = 1, n2 + do i1 = 1, n1 + a (i1, i2, i3) = 'ab'(i1:i1) // 'cde'(i2:i2) // 'fghi'(i3:i3) + end do + end do + end do + shift1 (1, :) = (/ 4, 11, 19, 20 /) + shift1 (2, :) = (/ 55, 5, 1, 2 /) + shift2 = shift1 + shift3 = shift1 + call test (cshift (a, shift2, 2)) + call test (cshift (a, shift3, 2)) +contains + subroutine test (b) + character (len = slen), dimension (n1, n2, n3) :: b + do i3 = 1, n3 + do i2 = 1, n2 + do i1 = 1, n1 + i2p = mod (shift1 (i1, i3) + i2 - 1, n2) + 1 + if (b (i1, i2, i3) .ne. a (i1, i2p, i3)) call abort + end do + end do + end do + end subroutine test +end program main