mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-03-21 17:21:03 +08:00
re PR target/65504 (select case with strings and -fgcse -O)
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: r221597
This commit is contained in:
parent
f45be077ec
commit
404b86eda8
@ -1,4 +1,10 @@
|
||||
2014-03-23 Jakub Jelinek <jakub@redhat.com>
|
||||
2015-03-23 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
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.
|
||||
|
||||
PR ipa/65521
|
||||
* ipa-icf.c (sem_item::update_hash_by_addr_refs): Hash
|
||||
|
@ -23457,12 +23457,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);
|
||||
}
|
||||
}
|
||||
|
||||
@ -24354,6 +24361,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);
|
||||
@ -24363,8 +24372,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. */
|
||||
|
@ -1,4 +1,7 @@
|
||||
2014-03-23 Jakub Jelinek <jakub@redhat.com>
|
||||
2015-03-23 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR target/65504
|
||||
* gfortran.dg/pr65504.f90: New test.
|
||||
|
||||
PR ipa/65521
|
||||
* gcc.dg/pr65521.c: New test.
|
||||
|
28
gcc/testsuite/gfortran.dg/pr65504.f90
Normal file
28
gcc/testsuite/gfortran.dg/pr65504.f90
Normal file
@ -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
|
Loading…
x
Reference in New Issue
Block a user