]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR target/43653 (ICE at reload1.c:1188 with -O1 -ftree-vectorize and empty struct)
authorUros Bizjak <uros@gcc.gnu.org>
Thu, 17 Feb 2011 21:22:02 +0000 (22:22 +0100)
committerUros Bizjak <uros@gcc.gnu.org>
Thu, 17 Feb 2011 21:22:02 +0000 (22:22 +0100)
PR target/43653
* config/i386/i386.c (ix86_secondary_reload): Handle SSE
input reload with PLUS RTX.

testsuite/ChangeLog:

PR target/43653
* gcc.target/i386/pr43653.c: New test.

From-SVN: r170256

gcc/ChangeLog
gcc/config/i386/i386.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/pr43653.c [new file with mode: 0644]

index 6a454199befbee95190c854b68609e265496c0f6..b55a0ac4c70f461b2d7e251ba308650a6cdfa7ac 100644 (file)
@@ -1,3 +1,9 @@
+2011-02-17  Uros Bizjak  <ubizjak@gmail.com>
+
+       PR target/43653
+       * config/i386/i386.c (ix86_secondary_reload): Handle SSE
+       input reload with PLUS RTX.
+
 2011-02-15  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
 
        PR pch/14940
        Backport from mainline:
        2010-12-30  Nathan Froyd  <froydnj@codesourcery.com>
 
-        PR target/44606
-        * reload1.c (choose_reload_regs): Don't look for equivalences for
-        output reloads of constant loads.
+       PR target/44606
+       * reload1.c (choose_reload_regs): Don't look for equivalences for
+       output reloads of constant loads.
 
 2011-01-30  Gerald Pfeifer  <gerald@pfeifer.com>
 
        Backport from mainline:
        2010-08-22  John David Anglin  <dave.anglin@nrc-cnrc.gc.ca>
 
-        PR boehm-gc/34544
+       PR boehm-gc/34544
        * gthr-posix.h (__gthread_active_init): Delete.
        (__gthread_active_p): Do activity check here.
        Don't include errno.h on hppa-hpux.  Update comment.
        (avx_maskstore<ssemodesuffix><avxmodesuffix>): Likewise.
 
 2011-01-17  Olivier Hainque  <hainque@adacore.com>
-            Michael Haubenwallner  <michael.haubenwallner@salomon.at>
-            Eric Botcazou  <ebotcazou@adacore.com>
+           Michael Haubenwallner  <michael.haubenwallner@salomon.at>
+           Eric Botcazou  <ebotcazou@adacore.com>
 
        PR target/46655
        * xcoffout.c (ASM_OUTPUT_LINE): Output line only if positive, and only
 
        Backport from mainline
        Fix PR45758: reset scevs before Graphite.
-        2010-09-24  Sebastian Pop  <sebastian.pop@amd.com>
+       2010-09-24  Sebastian Pop  <sebastian.pop@amd.com>
 
        PR tree-optimization/45552
        * graphite.c (graphite_initialize): Call scev_reset.
 
        Backport from mainline:
        2010-09-15  Olivier Hainque  <hainque@adacore.com>
-                   Jose Ruiz  <ruiz@adacore.com>
+                   Jose Ruiz  <ruiz@adacore.com>
 
        * config/alpha/osf.h (MD_UNWIND_SUPPORT): Define.
        * config/alpha/osf-unwind.h: New file.
index 29ef16d7753bef6251ca7eeb57cbf3d88bb3401b..c2a46502c813761b474297df77a5ca869ac3ac15 100644 (file)
@@ -25137,7 +25137,8 @@ ix86_secondary_reload (bool in_p, rtx x, enum reg_class rclass,
 {
   /* QImode spills from non-QI registers require
      intermediate register on 32bit targets.  */
-  if (!in_p && mode == QImode && !TARGET_64BIT
+  if (!TARGET_64BIT
+      && !in_p && mode == QImode
       && (rclass == GENERAL_REGS
          || rclass == LEGACY_REGS
          || rclass == INDEX_REGS))
@@ -25157,6 +25158,45 @@ ix86_secondary_reload (bool in_p, rtx x, enum reg_class rclass,
        return Q_REGS;
     }
 
+  /* This condition handles corner case where an expression involving
+     pointers gets vectorized.  We're trying to use the address of a
+     stack slot as a vector initializer.  
+
+     (set (reg:V2DI 74 [ vect_cst_.2 ])
+          (vec_duplicate:V2DI (reg/f:DI 20 frame)))
+
+     Eventually frame gets turned into sp+offset like this:
+
+     (set (reg:V2DI 21 xmm0 [orig:74 vect_cst_.2 ] [74])
+          (vec_duplicate:V2DI (plus:DI (reg/f:DI 7 sp)
+                                      (const_int 392 [0x188]))))
+
+     That later gets turned into:
+
+     (set (reg:V2DI 21 xmm0 [orig:74 vect_cst_.2 ] [74])
+          (vec_duplicate:V2DI (plus:DI (reg/f:DI 7 sp)
+           (mem/u/c/i:DI (symbol_ref/u:DI ("*.LC0") [flags 0x2]) [0 S8 A64]))))
+
+     We'll have the following reload recorded:
+
+     Reload 0: reload_in (DI) =
+           (plus:DI (reg/f:DI 7 sp)
+            (mem/u/c/i:DI (symbol_ref/u:DI ("*.LC0") [flags 0x2]) [0 S8 A64]))
+     reload_out (V2DI) = (reg:V2DI 21 xmm0 [orig:74 vect_cst_.2 ] [74])
+     SSE_REGS, RELOAD_OTHER (opnum = 0), can't combine
+     reload_in_reg: (plus:DI (reg/f:DI 7 sp) (const_int 392 [0x188]))
+     reload_out_reg: (reg:V2DI 21 xmm0 [orig:74 vect_cst_.2 ] [74])
+     reload_reg_rtx: (reg:V2DI 22 xmm1)
+
+     Which isn't going to work since SSE instructions can't handle scalar
+     additions.  Returning GENERAL_REGS forces the addition into integer
+     register and reload can handle subsequent reloads without problems.  */
+
+  if (in_p && GET_CODE (x) == PLUS
+      && SSE_CLASS_P (rclass)
+      && SCALAR_INT_MODE_P (mode))
+    return GENERAL_REGS;
+
   return NO_REGS;
 }
 
index 35c7fb9291c54e2fadba3a513da2072e1c0451e3..c312246053c4ba8131d09b599f8de36789119a28 100644 (file)
@@ -1,3 +1,8 @@
+2011-02-17  Uros Bizjak  <ubizjak@gmail.com>
+
+       PR target/43653
+       * gcc.target/i386/pr43653.c: New test.
+
 2011-02-14  Tobias Burnus  <burnus@net-b.de>
 
        * gfortran.dg/argument_checking_13.f90: Update dg-error.
@@ -62,8 +67,8 @@
        Backport from mainline:
        2010-12-30  Nathan Froyd  <froydnj@codesourcery.com>
 
-        PR target/44606
-        * gcc.dg/pr44606.c: New test.
+       PR target/44606
+       * gcc.dg/pr44606.c: New test.
 
 2011-01-27  Andreas Krebbel  <Andreas.Krebbel@de.ibm.com>
 
 
        Backport from mainline
        2010-12-06  Jakub Jelinek  <jakub@redhat.com>
+
        PR target/43897
        * gcc.target/ia64/pr43897.c: New test.
 
        * gcc.dg/pr46499-2.c: New test.
 
        2010-11-20  Jakub Jelinek  <jakub@redhat.com>
+
        PR c++/46538
        * g++.dg/other/error34.C: New test.
 
diff --git a/gcc/testsuite/gcc.target/i386/pr43653.c b/gcc/testsuite/gcc.target/i386/pr43653.c
new file mode 100644 (file)
index 0000000..22928ed
--- /dev/null
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+/* { dg-options "-O1 -ftree-vectorize -msse" } */
+
+typedef struct {} S;
+
+void *foo()
+{
+  S a[64], *p[64];
+  int i;
+
+  for (i = 0; i < 64; i++)
+    p[i] = &a[i];
+  return p[0];
+}