From b72062f452564ff7374c6145141147a16e26840d Mon Sep 17 00:00:00 2001 From: Uros Bizjak Date: Mon, 29 Jun 2009 01:12:37 +0200 Subject: [PATCH] re PR tree-optimization/40550 (Segmentation fault caused by alignment error in sse code) PR tree-optimization/40550 * tree-vect-generic.c (expand_vector_operations_1): Compute in vector_compute_type only when the size of vector_compute_type is less than the size of type. testsuite/ChangeLog: PR tree-optimization/40550 * gcc.dg/pr40550.c: New test. From-SVN: r149040 --- gcc/ChangeLog | 7 +++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/pr40550.c | 34 ++++++++++++++++++++++++++++++++++ gcc/tree-vect-generic.c | 6 ++++-- 4 files changed, 50 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/pr40550.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 2af5b4801242..a1763870e0df 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2009-06-28 Uros Bizjak + + PR tree-optimization/40550 + * tree-vect-generic.c (expand_vector_operations_1): Compute in + vector_compute_type only when the size of vector_compute_type is + less than the size of type. + 2009-06-27 Kai Tietz Merged from trunk rev/148061 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 52f7de0f2916..c5d17fef3798 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2009-06-28 Uros Bizjak + + PR tree-optimization/40550 + * gcc.dg/pr40550.c: New test. + 2009-06-25 Richard Guenther Backport from mainline diff --git a/gcc/testsuite/gcc.dg/pr40550.c b/gcc/testsuite/gcc.dg/pr40550.c new file mode 100644 index 000000000000..27935ab005a9 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr40550.c @@ -0,0 +1,34 @@ +/* { dg-do run } */ +/* { dg-options "-msse" { target { { i?86-*-* x86_64-*-* } && ilp32 } } } */ + +#ifdef __i386__ +#include "cpuid.h" +#endif + +typedef float v2sf __attribute__ ((vector_size (2 * sizeof(float)))); + +static void test (void) +{ + v2sf a = {1.0, 0.0}; + v2sf b = {0.0, 1.0}; + v2sf d; + d = a + b; +} + +int main () +{ + +#ifdef __i386__ + unsigned int eax, ebx, ecx, edx; + + if (!__get_cpuid (1, &eax, &ebx, &ecx, &edx)) + return 0; + + if (!(edx & bit_SSE)) + return 0; +#endif + + test (); + + return 0; +} diff --git a/gcc/tree-vect-generic.c b/gcc/tree-vect-generic.c index 76a51e0f090b..37ed2d13d5b8 100644 --- a/gcc/tree-vect-generic.c +++ b/gcc/tree-vect-generic.c @@ -467,8 +467,10 @@ expand_vector_operations_1 (block_stmt_iterator *bsi) tree vector_compute_type = type_for_widest_vector_mode (TYPE_MODE (TREE_TYPE (type)), op, TYPE_SATURATING (TREE_TYPE (type))); - if (vector_compute_type != NULL_TREE) - compute_type = vector_compute_type; + if (vector_compute_type != NULL_TREE + && (TYPE_VECTOR_SUBPARTS (vector_compute_type) + < TYPE_VECTOR_SUBPARTS (compute_type))) + compute_type = vector_compute_type; } /* If we are breaking a BLKmode vector into smaller pieces, -- 2.47.2