aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2009-04-27 15:50:05 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2009-04-27 15:50:05 +0000
commitc685de4a22030cd5bf773568dd7395d5b428ec3c (patch)
treed2931efd9d30e36b8c46feb3e2e5369830d7614d /gcc
parent952fa153c83cd79d30e67ff3c3c321246f7146cc (diff)
downloadgcc-c685de4a22030cd5bf773568dd7395d5b428ec3c.zip
gcc-c685de4a22030cd5bf773568dd7395d5b428ec3c.tar.gz
gcc-c685de4a22030cd5bf773568dd7395d5b428ec3c.tar.bz2
re PR c/39928 (gimplify_expr failure)
2009-04-27 Richard Guenther <rguenther@suse.de> 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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/gimplify.c7
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/pr39928-1.c8
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/pr39928-2.c8
5 files changed, 34 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index b8bf343..8913e38 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2009-04-27 Richard Guenther <rguenther@suse.de>
+
+ 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 <hongjiu.lu@intel.com>
PR target/39903
diff --git a/gcc/gimplify.c b/gcc/gimplify.c
index f831e47..d886784 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 9579635..79b0ea1 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2009-04-27 Richard Guenther <rguenther@suse.de>
+
+ 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 <hongjiu.lu@intel.com>
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 0000000..3bee438
--- /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 0000000..6f0d30c
--- /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++));
+}