From 2b32c27d98a24ef789729ded2e0c42108a9ea9e9 Mon Sep 17 00:00:00 2001
From: Jakub Jelinek <jakub@gcc.gnu.org>
Date: Fri, 13 Nov 2009 19:38:36 +0100
Subject: [PATCH] re PR middle-end/42029 (ICE with complex data type and openmp
 for reduction clause)

	PR middle-end/42029
	* gimplify.c (gimplify_omp_atomic): Set DECL_GIMPLE_REG_P on
	tmp_load if needed.

	* libgomp.c/pr42029.c: New test.

From-SVN: r154161
---
 gcc/ChangeLog                         | 10 ++++++++--
 gcc/gimplify.c                        |  2 ++
 libgomp/ChangeLog                     |  5 +++++
 libgomp/testsuite/libgomp.c/pr42029.c | 19 +++++++++++++++++++
 4 files changed, 34 insertions(+), 2 deletions(-)
 create mode 100644 libgomp/testsuite/libgomp.c/pr42029.c

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index bb92e10b867c..e5dec6f98a3d 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,8 +1,14 @@
+2009-11-13  Jakub Jelinek  <jakub@redhat.com>
+
+	PR middle-end/42029
+	* gimplify.c (gimplify_omp_atomic): Set DECL_GIMPLE_REG_P on
+	tmp_load if needed.
+
 2009-11-13  Uros Bizjak  <ubizjak@gmail.com>
 
 	PR target/41900
-	(*call_pop_1, *call_1, *call_value_pop_1, *call_value_1): Use "lsm"
-	as operand 1 constraint.
+	* config/i386/i386.md (*call_pop_1, *call_1, *call_value_pop_1,
+	*call_value_1): Use "lsm" as operand 1 constraint.
 	* config/i386/predicates.md (call_insn_operand): Depend on
 	index_register_operand to avoid %esp register.
 
diff --git a/gcc/gimplify.c b/gcc/gimplify.c
index d68aacd04f39..8404e0fd13ae 100644
--- a/gcc/gimplify.c
+++ b/gcc/gimplify.c
@@ -6231,6 +6231,8 @@ gimplify_omp_atomic (tree *expr_p, gimple_seq *pre_p)
   tree tmp_load;
 
    tmp_load = create_tmp_var (type, NULL);
+   if (TREE_CODE (type) == COMPLEX_TYPE || TREE_CODE (type) == VECTOR_TYPE)
+     DECL_GIMPLE_REG_P (tmp_load) = 1;
    if (goa_stabilize_expr (&rhs, pre_p, addr, tmp_load) < 0)
      return GS_ERROR;
 
diff --git a/libgomp/ChangeLog b/libgomp/ChangeLog
index ba9393ed9608..e36c7e2ca7f7 100644
--- a/libgomp/ChangeLog
+++ b/libgomp/ChangeLog
@@ -1,3 +1,8 @@
+2009-11-13  Jakub Jelinek  <jakub@redhat.com>
+
+	PR middle-end/42029
+	* libgomp.c/pr42029.c: New test.
+
 2009-10-26  Jakub Jelinek  <jakub@redhat.com>
 
 	* acinclude.m4 (LIBGOMP_CHECK_LINKER_FEATURES): Avoid using too many
diff --git a/libgomp/testsuite/libgomp.c/pr42029.c b/libgomp/testsuite/libgomp.c/pr42029.c
new file mode 100644
index 000000000000..ea7ac2c0986a
--- /dev/null
+++ b/libgomp/testsuite/libgomp.c/pr42029.c
@@ -0,0 +1,19 @@
+/* PR middle-end/42029 */
+/* { dg-do run } */
+
+extern void abort (void);
+
+int
+main ()
+{
+  int i;
+  _Complex int c = 0;
+
+#pragma omp parallel for private(i) reduction(+:c)
+  for (i = 0; i < 8; ++i)
+    c += 1;
+
+  if (c != 8)
+    abort ();
+  return 0;
+}
-- 
GitLab