aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2015-03-23 16:31:59 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2015-03-23 16:31:59 +0100
commit404b86eda8700e30a71b51cddada39b57e13d28a (patch)
tree494209ca4232b1968dc996e686b586128f2dd778
parentf45be077ec1a40e5b3046cd19bd32e8e1ebaca73 (diff)
downloadgcc-404b86eda8700e30a71b51cddada39b57e13d28a.zip
gcc-404b86eda8700e30a71b51cddada39b57e13d28a.tar.gz
gcc-404b86eda8700e30a71b51cddada39b57e13d28a.tar.bz2
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
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/config/i386/i386.c17
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/pr65504.f9028
4 files changed, 52 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index d660363..a5eb8c4 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index 82a4848..22bc81f 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -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. */
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index d3958f6..4e041b1 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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.
diff --git a/gcc/testsuite/gfortran.dg/pr65504.f90 b/gcc/testsuite/gfortran.dg/pr65504.f90
new file mode 100644
index 0000000..3860422
--- /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