]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
backport: re PR target/65504 (select case with strings and -fgcse -O)
authorJakub Jelinek <jakub@redhat.com>
Wed, 3 Jun 2015 15:30:58 +0000 (17:30 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Wed, 3 Jun 2015 15:30:58 +0000 (17:30 +0200)
2015-06-03  Jakub Jelinek  <jakub@redhat.com>

Backported from mainline
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.

* gfortran.dg/pr65504.f90: New test.

From-SVN: r224089

gcc/ChangeLog
gcc/config/i386/i386.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/pr65504.f90 [new file with mode: 0644]

index 399a340a503912521e5157a69d32281daa8700b2..11c841b7da42bb08bb76aea8d8d8c9661ee04a14 100644 (file)
@@ -1,6 +1,14 @@
 2015-06-03  Jakub Jelinek  <jakub@redhat.com>
 
        Backported from mainline
+       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.
+
        2015-03-18  Jakub Jelinek  <jakub@redhat.com>
 
        PR tree-optimization/65450
index 394832966cd030d09fd5d270b57b102d457d2bbe..52c5497840c93c50c547be62b4165e391450543d 100644 (file)
@@ -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.  */
index 0039d55f9d490886c1792a2af2d725498ea04bb4..b93ef5b5db8a8ebf6fe19fe77e616f0fa4df6b02 100644 (file)
@@ -1,6 +1,11 @@
 2015-06-03  Jakub Jelinek  <jakub@redhat.com>
 
        Backported from mainline
+       2015-03-23  Jakub Jelinek  <jakub@redhat.com>
+
+       PR target/65504
+       * gfortran.dg/pr65504.f90: New test.
+
        2015-03-18  Jakub Jelinek  <jakub@redhat.com>
 
        PR tree-optimization/65450
diff --git a/gcc/testsuite/gfortran.dg/pr65504.f90 b/gcc/testsuite/gfortran.dg/pr65504.f90
new file mode 100644 (file)
index 0000000..3860422
--- /dev/null
@@ -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