From ed6fa12929896f7771ce9e1f5bef380001d74af7 Mon Sep 17 00:00:00 2001 From: Uros Bizjak Date: Thu, 14 Aug 2008 13:57:18 +0200 Subject: [PATCH] re PR target/37101 (wrong code: tree vectorizer omits bogus movq/movlps construct) PR target/37101 * config/i386/sse.md (vec_concatv2di): Remove movlps alternative. (*vec_concatv2di_rex64_sse4_1): Ditto. (*vec_concatv2di_rex64_sse): Ditto. testsuite/ChangeLog: PR target/37101 * gcc.target/i386/pr37101.c: New test. From-SVN: r139095 --- gcc/ChangeLog | 17 ++++++--- gcc/config/i386/sse.md | 41 ++++++++++----------- gcc/testsuite/ChangeLog | 7 +++- gcc/testsuite/gcc.target/i386/pr37101.c | 64 +++++++++++++++++++++++++++++++++ 4 files changed, 101 insertions(+), 28 deletions(-) create mode 100644 gcc/testsuite/gcc.target/i386/pr37101.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ed3129d..50a5355 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2008-08-14 Christophe Saout + Uros Bizjak + + PR target/37101 + * config/i386/sse.md (vec_concatv2di): Remove movlps alternative. + (*vec_concatv2di_rex64_sse4_1): Ditto. + (*vec_concatv2di_rex64_sse): Ditto. + 2008-08-14 Jakub Jelinek PR middle-end/37103 @@ -139,7 +147,6 @@ 2008-08-12 Nathan Froyd PR libgomp/26165 - * gcc.c (include_spec_function): Tweak call to find_a_file. 2008-08-12 Jakub Jelinek @@ -155,7 +162,7 @@ 2008-08-12 Anatoly Sokolov - * final.c (final_scan_insn): Use app_enable/app_disable functions. + * final.c (final_scan_insn): Use app_enable/app_disable functions. 2008-08-12 Ulrich Weigand @@ -685,8 +692,8 @@ 2008-08-07 Bob Wilson - * config/xtensa/xtensa.c (xtensa_copy_incoming_a7): Copy incoming value - in a6 after the set_frame_ptr insn. + * config/xtensa/xtensa.c (xtensa_copy_incoming_a7): Copy incoming + value in a6 after the set_frame_ptr insn. 2008-08-07 Richard Henderson @@ -774,7 +781,7 @@ * matrix-reorg.c (compute_offset): Avoid C++ keywords. 2008-08-06 Manuel Lopez-Ibanez - + PR 26785 * diagnostic.c (permerror_at): New. * toplev.h (permerror_at): Declare. diff --git a/gcc/config/i386/sse.md b/gcc/config/i386/sse.md index 1d0ae86..c8bf42d 100644 --- a/gcc/config/i386/sse.md +++ b/gcc/config/i386/sse.md @@ -4952,26 +4952,25 @@ (set_attr "mode" "TI,V4SF,V2SF")]) (define_insn "vec_concatv2di" - [(set (match_operand:V2DI 0 "register_operand" "=Y2 ,?Y2,Y2,x,x,x") + [(set (match_operand:V2DI 0 "register_operand" "=Y2 ,?Y2,Y2,x,x") (vec_concat:V2DI - (match_operand:DI 1 "nonimmediate_operand" " mY2,*y ,0 ,0,0,m") - (match_operand:DI 2 "vector_move_operand" " C , C,Y2,x,m,0")))] + (match_operand:DI 1 "nonimmediate_operand" " mY2,*y ,0 ,0,0") + (match_operand:DI 2 "vector_move_operand" " C , C,Y2,x,m")))] "!TARGET_64BIT && 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_insn "*vec_concatv2di_rex64_sse4_1" - [(set (match_operand:V2DI 0 "register_operand" "=x ,x ,Yi,!x,x,x,x,x") + [(set (match_operand:V2DI 0 "register_operand" "=x ,x ,Yi,!x,x,x,x") (vec_concat:V2DI - (match_operand:DI 1 "nonimmediate_operand" " 0 ,mx,r ,*y,0,0,0,m") - (match_operand:DI 2 "vector_move_operand" " rm,C ,C ,C ,x,x,m,0")))] + (match_operand:DI 1 "nonimmediate_operand" " 0 ,mx,r ,*y,0,0,0") + (match_operand:DI 2 "vector_move_operand" " rm,C ,C ,C ,x,x,m")))] "TARGET_64BIT && TARGET_SSE4_1" "@ pinsrq\t{$0x1, %2, %0|%0, %2, 0x1} @@ -4980,17 +4979,16 @@ 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" "sselog,ssemov,ssemov,ssemov,sselog,ssemov,ssemov,ssemov") - (set_attr "prefix_extra" "1,*,*,*,*,*,*,*") - (set_attr "mode" "TI,TI,TI,TI,TI,V4SF,V2SF,V2SF")]) + movhps\t{%2, %0|%0, %2}" + [(set_attr "type" "sselog,ssemov,ssemov,ssemov,sselog,ssemov,ssemov") + (set_attr "prefix_extra" "1,*,*,*,*,*,*") + (set_attr "mode" "TI,TI,TI,TI,TI,V4SF,V2SF")]) (define_insn "*vec_concatv2di_rex64_sse" - [(set (match_operand:V2DI 0 "register_operand" "=Y2 ,Yi,!Y2,Y2,x,x,x") + [(set (match_operand:V2DI 0 "register_operand" "=Y2 ,Yi,!Y2,Y2,x,x") (vec_concat:V2DI - (match_operand:DI 1 "nonimmediate_operand" " mY2,r ,*y ,0 ,0,0,m") - (match_operand:DI 2 "vector_move_operand" " C ,C ,C ,Y2,x,m,0")))] + (match_operand:DI 1 "nonimmediate_operand" " mY2,r ,*y ,0 ,0,0") + (match_operand:DI 2 "vector_move_operand" " C ,C ,C ,Y2,x,m")))] "TARGET_64BIT && TARGET_SSE" "@ movq\t{%1, %0|%0, %1} @@ -4998,10 +4996,9 @@ 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,ssemov,sselog,ssemov,ssemov,ssemov") - (set_attr "mode" "TI,TI,TI,TI,V4SF,V2SF,V2SF")]) + movhps\t{%2, %0|%0, %2}" + [(set_attr "type" "ssemov,ssemov,ssemov,sselog,ssemov,ssemov") + (set_attr "mode" "TI,TI,TI,TI,V4SF,V2SF")]) (define_expand "vec_unpacku_hi_v16qi" [(match_operand:V8HI 0 "register_operand" "") diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index ca3aa251..1430434 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2008-08-14 Uros Bizjak + + PR target/37101 + * gcc.target/i386/pr37101.c: New test. + 2008-08-14 Jakub Jelinek PR middle-end/37103 @@ -126,7 +131,7 @@ loop. Should be vectorizable on targets that support vector unpack. * gcc.dg/vect/vect-widen-mult-u8.c, - gcc.dg/vect/wrapv-vect-reduc-dot-s8b.c,. + gcc.dg/vect/wrapv-vect-reduc-dot-s8b.c, gcc.dg/vect/wrapv-vect-reduc-dot-s8b.c: Likewise. * gcc.dg/vect/vect-35.c: Should be vectorizable on targets that support vector pack. Avoid vectorization of the init loop. diff --git a/gcc/testsuite/gcc.target/i386/pr37101.c b/gcc/testsuite/gcc.target/i386/pr37101.c new file mode 100644 index 0000000..8fd3bfc --- /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" } } */ -- 2.7.4