From: Uros Bizjak Date: Fri, 29 Aug 2008 09:41:57 +0000 (+0200) Subject: backport: re PR target/37101 (wrong code: tree vectorizer omits bogus movq/movlps... X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=154f20cad35eb02ed10c1218dc2be024eb26d671;p=thirdparty%2Fgcc.git backport: re PR target/37101 (wrong code: tree vectorizer omits bogus movq/movlps construct) Backport from mainline: 2008-08-14 Christophe Saout Uros Bizjak PR target/37101 * config/i386/sse.md (vec_concatv2di): Remove movlps alternative. testsuite/ChangeLog: Backport from mainline: 2008-08-14 Uros Bizjak PR target/37101 * gcc.target/i386/pr37101.c: New test. From-SVN: r139758 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 54346a319302..7faf2a9ae212 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2008-08-29 Uros Bizjak + + Backport from mainline: + 2008-08-14 Christophe Saout + Uros Bizjak + + PR target/37101 + * config/i386/sse.md (vec_concatv2di): Remove movlps alternative. + 2008-08-06 Aldy Hernandez PR middle-end/35432 diff --git a/gcc/config/i386/sse.md b/gcc/config/i386/sse.md index 0055acdbc085..440934a92773 100644 --- a/gcc/config/i386/sse.md +++ b/gcc/config/i386/sse.md @@ -3576,20 +3576,19 @@ (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" "") diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 9e112d784b3e..9581a72d6edb 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2008-08-29 Uros Bizjak + + Backport from mainline: + 2008-08-14 Uros Bizjak + + PR target/37101 + * gcc.target/i386/pr37101.c: New test. + 2008-08-06 Aldy Hernandez 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 index 000000000000..8fd3bfc5f85e --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr37101.c @@ -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" } } */