From c685de4a22030cd5bf773568dd7395d5b428ec3c Mon Sep 17 00:00:00 2001 From: Richard Guenther Date: Mon, 27 Apr 2009 15:50:05 +0000 Subject: [PATCH] re PR c/39928 (gimplify_expr failure) 2009-04-27 Richard Guenther PR middle-end/39928 * gimplify.c (gimplify_expr): If we are required to create a temporary make sure it ends up as register. * gcc.c-torture/compile/pr39928-1.c: New testcase. * gcc.c-torture/compile/pr39928-2.c: Likewise. From-SVN: r146846 --- gcc/ChangeLog | 6 ++++++ gcc/gimplify.c | 7 ++++++- gcc/testsuite/ChangeLog | 6 ++++++ gcc/testsuite/gcc.c-torture/compile/pr39928-1.c | 8 ++++++++ gcc/testsuite/gcc.c-torture/compile/pr39928-2.c | 8 ++++++++ 5 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.c-torture/compile/pr39928-1.c create mode 100644 gcc/testsuite/gcc.c-torture/compile/pr39928-2.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b8bf3437e28..8913e38db5d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2009-04-27 Richard Guenther + + PR middle-end/39928 + * gimplify.c (gimplify_expr): If we are required to create + a temporary make sure it ends up as register. + 2009-04-27 H.J. Lu PR target/39903 diff --git a/gcc/gimplify.c b/gcc/gimplify.c index f831e479cac..d886784895f 100644 --- a/gcc/gimplify.c +++ b/gcc/gimplify.c @@ -7184,7 +7184,12 @@ gimplify_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p, /* The postqueue might change the value of the expression between the initialization and use of the temporary, so we can't use a formal temp. FIXME do we care? */ - *expr_p = get_initialized_tmp_var (*expr_p, pre_p, post_p); + { + *expr_p = get_initialized_tmp_var (*expr_p, pre_p, post_p); + if (TREE_CODE (TREE_TYPE (*expr_p)) == COMPLEX_TYPE + || TREE_CODE (TREE_TYPE (*expr_p)) == VECTOR_TYPE) + DECL_GIMPLE_REG_P (*expr_p) = 1; + } else *expr_p = get_formal_tmp_var (*expr_p, pre_p); } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 9579635ded1..79b0ea129fc 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2009-04-27 Richard Guenther + + PR middle-end/39928 + * gcc.c-torture/compile/pr39928-1.c: New testcase. + * gcc.c-torture/compile/pr39928-2.c: Likewise. + 2009-04-27 H.J. Lu PR target/39903 diff --git a/gcc/testsuite/gcc.c-torture/compile/pr39928-1.c b/gcc/testsuite/gcc.c-torture/compile/pr39928-1.c new file mode 100644 index 00000000000..3bee4380e5b --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr39928-1.c @@ -0,0 +1,8 @@ +typedef float __m128 __attribute__ ((__vector_size__ (16), __may_alias__)); +extern __m128 _mm_sub_ps (__m128 __A, __m128 __B); +extern __m128 _mm_mul_ps (__m128 __A, __m128 __B); +__m128 +vq_nbest(const __m128 *codebook, __m128 d, __m128 in) +{ + return _mm_sub_ps(d, _mm_mul_ps(in, *codebook++)); +} diff --git a/gcc/testsuite/gcc.c-torture/compile/pr39928-2.c b/gcc/testsuite/gcc.c-torture/compile/pr39928-2.c new file mode 100644 index 00000000000..6f0d30cc0d1 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr39928-2.c @@ -0,0 +1,8 @@ +typedef _Complex float __m128; +extern __m128 _mm_sub_ps (__m128 __A, __m128 __B); +extern __m128 _mm_mul_ps (__m128 __A, __m128 __B); +__m128 +vq_nbest(const __m128 *codebook, __m128 d, __m128 in) +{ + return _mm_sub_ps(d, _mm_mul_ps(in, *codebook++)); +}