From: Jakub Jelinek Date: Wed, 3 Jun 2015 15:30:58 +0000 (+0200) Subject: backport: re PR target/65504 (select case with strings and -fgcse -O) X-Git-Tag: releases/gcc-4.9.3~107 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9bf03386ece9f47ea54d3299b9092b0f6861fe92;p=thirdparty%2Fgcc.git backport: re PR target/65504 (select case with strings and -fgcse -O) 2015-06-03 Jakub Jelinek Backported from mainline 2015-03-23 Jakub Jelinek PR target/65504 * config/i386/i386.c (ix86_copy_addr_to_reg): Set REG_POINTER on the pseudo. (expand_set_or_movmem_prologue_epilogue_by_misaligned_moves): Set REG_POINTER on *destptr after adjusting it for prologue size. * gfortran.dg/pr65504.f90: New test. From-SVN: r224089 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 399a340a5039..11c841b7da42 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,6 +1,14 @@ 2015-06-03 Jakub Jelinek Backported from mainline + 2015-03-23 Jakub Jelinek + + PR target/65504 + * config/i386/i386.c (ix86_copy_addr_to_reg): Set REG_POINTER + on the pseudo. + (expand_set_or_movmem_prologue_epilogue_by_misaligned_moves): Set + REG_POINTER on *destptr after adjusting it for prologue size. + 2015-03-18 Jakub Jelinek PR tree-optimization/65450 diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 394832966cd0..52c5497840c9 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -22789,12 +22789,19 @@ counter_mode (rtx count_exp) static rtx ix86_copy_addr_to_reg (rtx addr) { + rtx reg; if (GET_MODE (addr) == Pmode || GET_MODE (addr) == VOIDmode) - return copy_addr_to_reg (addr); + { + reg = copy_addr_to_reg (addr); + REG_POINTER (reg) = 1; + return reg; + } else { gcc_assert (GET_MODE (addr) == DImode && Pmode == SImode); - return gen_rtx_SUBREG (SImode, copy_to_mode_reg (DImode, addr), 0); + reg = copy_to_mode_reg (DImode, addr); + REG_POINTER (reg) = 1; + return gen_rtx_SUBREG (SImode, reg, 0); } } @@ -23685,6 +23692,8 @@ expand_set_or_movmem_prologue_epilogue_by_misaligned_moves (rtx destmem, rtx src *destptr = expand_simple_binop (GET_MODE (*destptr), PLUS, *destptr, GEN_INT (prolog_size), NULL_RTX, 1, OPTAB_DIRECT); + if (REG_P (*destptr) && REG_P (saveddest) && REG_POINTER (saveddest)) + REG_POINTER (*destptr) = 1; *destptr = expand_simple_binop (GET_MODE (*destptr), AND, *destptr, GEN_INT (-desired_align), *destptr, 1, OPTAB_DIRECT); @@ -23694,8 +23703,8 @@ expand_set_or_movmem_prologue_epilogue_by_misaligned_moves (rtx destmem, rtx src saveddest, 1, OPTAB_DIRECT); /* Adjust srcptr and count. */ if (!issetmem) - *srcptr = expand_simple_binop (GET_MODE (*srcptr), MINUS, *srcptr, saveddest, - *srcptr, 1, OPTAB_DIRECT); + *srcptr = expand_simple_binop (GET_MODE (*srcptr), MINUS, *srcptr, + saveddest, *srcptr, 1, OPTAB_DIRECT); *count = expand_simple_binop (GET_MODE (*count), PLUS, *count, saveddest, *count, 1, OPTAB_DIRECT); /* We copied at most size + prolog_size. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 0039d55f9d49..b93ef5b5db8a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,6 +1,11 @@ 2015-06-03 Jakub Jelinek Backported from mainline + 2015-03-23 Jakub Jelinek + + PR target/65504 + * gfortran.dg/pr65504.f90: New test. + 2015-03-18 Jakub Jelinek PR tree-optimization/65450 diff --git a/gcc/testsuite/gfortran.dg/pr65504.f90 b/gcc/testsuite/gfortran.dg/pr65504.f90 new file mode 100644 index 000000000000..3860422b3225 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pr65504.f90 @@ -0,0 +1,28 @@ +! PR target/65504 +! { dg-do run } + +program pr65504 + implicit none + type :: T + character (len=256) :: a + character (len=256) :: b + end type T + type (T) :: c + type (T) :: d + c = foo ("test") + d = foo ("test") + if (trim(c%b) .ne. "foo") call abort + contains + type (T) function foo (x) result (v) + character(len=*), intent(in) :: x + select case (x) + case ("test") + v%b = 'foo' + case ("bazx") + v%b = 'barx' + case default + print *, "unknown" + stop + end select + end function foo +end program pr65504