From: Jakub Jelinek Date: Tue, 16 Jun 2009 13:48:07 +0000 (+0200) Subject: re PR middle-end/40446 (ICE in gen_lowpart_general) X-Git-Tag: releases/gcc-4.5.0~5187 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=f2ff88729a86a0db86cc6a6ea98d3d5ebfeaa231;p=thirdparty%2Fgcc.git re PR middle-end/40446 (ICE in gen_lowpart_general) PR middle-end/40446 * expr.c (expand_expr_real_1) : Don't use gen_lowpart if op0 has complex mode. * g++.dg/other/pr40446.C: New test. From-SVN: r148533 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 524f71e8fcad..bbf4e60feb8d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2009-06-16 Jakub Jelinek + + PR middle-end/40446 + * expr.c (expand_expr_real_1) : Don't + use gen_lowpart if op0 has complex mode. + 2009-06-16 Richard Guenther * tree-ssa-structalias.c (do_ds_constraint): Stores in global diff --git a/gcc/expr.c b/gcc/expr.c index ec1800e63a20..34137c0cd07e 100644 --- a/gcc/expr.c +++ b/gcc/expr.c @@ -8321,7 +8321,8 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode, /* If neither mode is BLKmode, and both modes are the same size then we can use gen_lowpart. */ else if (mode != BLKmode && GET_MODE (op0) != BLKmode - && GET_MODE_SIZE (mode) == GET_MODE_SIZE (GET_MODE (op0))) + && GET_MODE_SIZE (mode) == GET_MODE_SIZE (GET_MODE (op0)) + && !COMPLEX_MODE_P (GET_MODE (op0))) { if (GET_CODE (op0) == SUBREG) op0 = force_reg (GET_MODE (op0), op0); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index fd2ca7357dca..689597830a74 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2009-06-16 Jakub Jelinek + + PR middle-end/40446 + * g++.dg/other/pr40446.C: New test. + 2009-06-16 Richard Guenther * gcc.dg/tree-ssa/pta-escape-1.c: New testcase. diff --git a/gcc/testsuite/g++.dg/other/pr40446.C b/gcc/testsuite/g++.dg/other/pr40446.C new file mode 100644 index 000000000000..33dbcec71591 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/pr40446.C @@ -0,0 +1,46 @@ +// PR middle-end/40446 +// { dg-do run { target i?86-*-* x86_64-*-* } } +// { dg-options "-O1 -msse2" } + +#include +#include "cpuid.h" + +extern "C" void abort (); + +struct S +{ + S (double r, double i) { __real__ s = r; __imag__ s = i; } + __complex__ double s; +}; + +__m128d +foo () +{ + S c (0, 1); + return _mm_load_pd ((double *) &c); +} + +static void +__attribute__((noinline)) +sse2_test () +{ + union { __m128d vec; double val[2]; } u; + u.vec = foo (); + if (u.val[0] != 0 || u.val[1] != 1) + abort (); +} + +int +main () +{ + unsigned int eax, ebx, ecx, edx; + + if (!__get_cpuid (1, &eax, &ebx, &ecx, &edx)) + return 0; + + /* Run SSE2 test only if host has SSE2 support. */ + if (edx & bit_SSE2) + sse2_test (); + + return 0; +}