]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
backport: re PR target/37101 (wrong code: tree vectorizer omits bogus movq/movlps...
authorUros Bizjak <ubizjak@gmail.com>
Fri, 29 Aug 2008 09:41:57 +0000 (11:41 +0200)
committerUros Bizjak <uros@gcc.gnu.org>
Fri, 29 Aug 2008 09:41:57 +0000 (11:41 +0200)
Backport from mainline:
2008-08-14  Christophe Saout  <christophe@saout.de>
    Uros Bizjak  <ubizjak@gmail.com>

PR target/37101
* config/i386/sse.md (vec_concatv2di): Remove movlps alternative.

testsuite/ChangeLog:

Backport from mainline:
2008-08-14  Uros Bizjak  <ubizjak@gmail.com>

PR target/37101
* gcc.target/i386/pr37101.c: New test.

From-SVN: r139758

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

index 54346a319302febc2401620df972fd0a4665b83c..7faf2a9ae212096fb797639593a5521f3d32012b 100644 (file)
@@ -1,3 +1,12 @@
+2008-08-29  Uros Bizjak  <ubizjak@gmail.com>
+
+       Backport from mainline:
+       2008-08-14  Christophe Saout  <christophe@saout.de>
+                   Uros Bizjak  <ubizjak@gmail.com>
+
+       PR target/37101
+       * config/i386/sse.md (vec_concatv2di): Remove movlps alternative.
+
 2008-08-06  Aldy Hernandez  <aldyh@redhat.com>
 
        PR middle-end/35432
index 0055acdbc08598cae866e6f4fe3e6cde635a5e03..440934a927731f4a9caeefeda61f34208201af8a 100644 (file)
    (set_attr "mode" "TI,V4SF,V2SF")])
 
 (define_insn "*vec_concatv2di"
-  [(set (match_operand:V2DI 0 "register_operand"     "=Y,?Y,Y,x,x,x")
+  [(set (match_operand:V2DI 0 "register_operand"     "=Y,?Y,Y,x,x")
        (vec_concat:V2DI
-         (match_operand:DI 1 "nonimmediate_operand" " m,*y,0,0,0,m")
-         (match_operand:DI 2 "vector_move_operand"  " C, C,Y,x,m,0")))]
+         (match_operand:DI 1 "nonimmediate_operand" " m,*y,0,0,0")
+         (match_operand:DI 2 "vector_move_operand"  " C, C,Y,x,m")))]
   "TARGET_SSE"
   "@
    movq\t{%1, %0|%0, %1}
    movq2dq\t{%1, %0|%0, %1}
    punpcklqdq\t{%2, %0|%0, %2}
    movlhps\t{%2, %0|%0, %2}
-   movhps\t{%2, %0|%0, %2}
-   movlps\t{%1, %0|%0, %1}"
-  [(set_attr "type" "ssemov,ssemov,sselog,ssemov,ssemov,ssemov")
-   (set_attr "mode" "TI,TI,TI,V4SF,V2SF,V2SF")])
+   movhps\t{%2, %0|%0, %2}"
+  [(set_attr "type" "ssemov,ssemov,sselog,ssemov,ssemov")
+   (set_attr "mode" "TI,TI,TI,V4SF,V2SF")])
 
 (define_expand "vec_setv2di"
   [(match_operand:V2DI 0 "register_operand" "")
index 9e112d784b3e5a6afe4df331371a5223b37a1ee2..9581a72d6edbc2aed50dd5829ec6f985198f3ca7 100644 (file)
@@ -1,3 +1,11 @@
+2008-08-29  Uros Bizjak  <ubizjak@gmail.com>
+
+       Backport from mainline:
+       2008-08-14  Uros Bizjak  <ubizjak@gmail.com>
+
+       PR target/37101
+       * gcc.target/i386/pr37101.c: New test.
+
 2008-08-06  Aldy Hernandez  <aldyh@redhat.com>
 
        PR middle-end/35432
diff --git a/gcc/testsuite/gcc.target/i386/pr37101.c b/gcc/testsuite/gcc.target/i386/pr37101.c
new file mode 100644 (file)
index 0000000..8fd3bfc
--- /dev/null
@@ -0,0 +1,64 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -msse2 -ftree-vectorize -march=nocona" } */
+
+typedef __SIZE_TYPE__ size_t;
+extern void *malloc (size_t);
+extern void free (void *);
+
+typedef struct _Resource
+{
+  struct _Resource *next;
+  unsigned int id;
+} ResourceRec, *ResourcePtr;
+
+typedef struct _ClientResource
+{
+  ResourcePtr *resources;
+  int elements;
+  int buckets;
+  int hashsize;
+} ClientResourceRec;
+
+static ClientResourceRec clientTable[256];
+
+void
+RebuildTable (int client)
+{
+  int j;
+  ResourcePtr res, next;
+  ResourcePtr **tails, *resources;
+  ResourcePtr **tptr, *rptr;
+
+  j = 2 * clientTable[client].buckets;
+
+  tails =
+    (ResourcePtr **) malloc ((unsigned long) (j * sizeof (ResourcePtr *)));
+  resources =
+    (ResourcePtr *) malloc ((unsigned long) (j * sizeof (ResourcePtr)));
+
+  for (rptr = resources, tptr = tails; --j >= 0; rptr++, tptr++)
+    {
+      *rptr = ((ResourcePtr) ((void *) 0));
+      *tptr = rptr;
+    }
+
+  clientTable[client].hashsize++;
+  for (j = clientTable[client].buckets,
+       rptr = clientTable[client].resources; --j >= 0; rptr++)
+    {
+      for (res = *rptr; res; res = next)
+       {
+         next = res->next;
+         res->next = ((ResourcePtr) ((void *) 0));
+         tptr = &tails[Hash (client, res->id)];
+         **tptr = res;
+         *tptr = &res->next;
+       }
+    }
+  free ((void *) tails);
+  clientTable[client].buckets *= 2;
+  free ((void *) clientTable[client].resources);
+  clientTable[client].resources = resources;
+}
+
+/* { dg-final { scan-assembler-not "movlps" } } */