summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog11
-rw-r--r--gcc/gimple.c20
-rw-r--r--gcc/gimplify.c11
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.target/spu/pr40001.c17
-rw-r--r--gcc/tree-ssa.c4
6 files changed, 51 insertions, 17 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 62b394a1a76..d05e7cbda97 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,14 @@
+2009-05-02 Richard Guenther <rguenther@suse.de>
+
+ PR middle-end/40001
+ * tree-ssa.c (execute_update_addresses_taken): Properly check
+ if we can mark a variable DECL_GIMPLE_REG_P.
+ * gimple.c (is_gimple_reg): Re-order check for DECL_GIMPLE_REG_P
+ back to the end of the function.
+ (is_gimple_reg_type): Remove complex type special casing.
+ * gimplify.c (gimplify_bind_expr): Do not set DECL_GIMPLE_REG_P
+ if not optimizing.
+
2009-05-02 Ben Elliston <bje@au.ibm.com>
* doc/collect2.texi (Collect2): Document search path behaviour
diff --git a/gcc/gimple.c b/gcc/gimple.c
index db7f872b5cc..6ea1470df57 100644
--- a/gcc/gimple.c
+++ b/gcc/gimple.c
@@ -2805,13 +2805,7 @@ is_gimple_id (tree t)
bool
is_gimple_reg_type (tree type)
{
- /* In addition to aggregate types, we also exclude complex types if not
- optimizing because they can be subject to partial stores in GNU C by
- means of the __real__ and __imag__ operators and we cannot promote
- them to total stores (see gimplify_modify_expr_complex_part). */
- return !(AGGREGATE_TYPE_P (type)
- || (TREE_CODE (type) == COMPLEX_TYPE && !optimize));
-
+ return !AGGREGATE_TYPE_P (type);
}
/* Return true if T is a non-aggregate register variable. */
@@ -2825,12 +2819,6 @@ is_gimple_reg (tree t)
if (!is_gimple_variable (t))
return false;
- /* Complex and vector values must have been put into SSA-like form.
- That is, no assignments to the individual components. */
- if (TREE_CODE (TREE_TYPE (t)) == COMPLEX_TYPE
- || TREE_CODE (TREE_TYPE (t)) == VECTOR_TYPE)
- return DECL_GIMPLE_REG_P (t);
-
if (!is_gimple_reg_type (TREE_TYPE (t)))
return false;
@@ -2857,6 +2845,12 @@ is_gimple_reg (tree t)
if (TREE_CODE (t) == VAR_DECL && DECL_HARD_REGISTER (t))
return false;
+ /* Complex and vector values must have been put into SSA-like form.
+ That is, no assignments to the individual components. */
+ if (TREE_CODE (TREE_TYPE (t)) == COMPLEX_TYPE
+ || TREE_CODE (TREE_TYPE (t)) == VECTOR_TYPE)
+ return DECL_GIMPLE_REG_P (t);
+
return true;
}
diff --git a/gcc/gimplify.c b/gcc/gimplify.c
index d886784895f..24481d15c43 100644
--- a/gcc/gimplify.c
+++ b/gcc/gimplify.c
@@ -1218,9 +1218,14 @@ gimplify_bind_expr (tree *expr_p, gimple_seq *pre_p)
/* Preliminarily mark non-addressed complex variables as eligible
for promotion to gimple registers. We'll transform their uses
- as we find them. */
- if ((TREE_CODE (TREE_TYPE (t)) == COMPLEX_TYPE
- || TREE_CODE (TREE_TYPE (t)) == VECTOR_TYPE)
+ as we find them.
+ We exclude complex types if not optimizing because they can be
+ subject to partial stores in GNU C by means of the __real__ and
+ __imag__ operators and we cannot promote them to total stores
+ (see gimplify_modify_expr_complex_part). */
+ if (optimize
+ && (TREE_CODE (TREE_TYPE (t)) == COMPLEX_TYPE
+ || TREE_CODE (TREE_TYPE (t)) == VECTOR_TYPE)
&& !TREE_THIS_VOLATILE (t)
&& (TREE_CODE (t) == VAR_DECL && !DECL_HARD_REGISTER (t))
&& !needs_to_live_in_memory (t))
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 69a3e67dbbe..5fce794638f 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2009-05-02 Richard Guenther <rguenther@suse.de>
+
+ PR middle-end/40001
+ * gcc.target/spu/pr40001.c: New testcase.
+
2009-04-30 Adam Nemet <anemet@caviumnetworks.com>
* gcc.dg/ssp-1.c (__stack_chk_fail): Remove static.
diff --git a/gcc/testsuite/gcc.target/spu/pr40001.c b/gcc/testsuite/gcc.target/spu/pr40001.c
new file mode 100644
index 00000000000..442f72d4fa8
--- /dev/null
+++ b/gcc/testsuite/gcc.target/spu/pr40001.c
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+/* { dg-options "-O" } */
+
+void *
+sbrk (unsigned int increment)
+{
+ volatile register
+ __attribute__ ((__spu_vector__)) unsigned int sp_r1 __asm__ ("1");
+ unsigned int sps;
+
+ sps = __builtin_spu_extract (sp_r1, 0);
+ if (sps - 4096 >= increment)
+ return 0;
+ else
+ return ((void *) -1);
+}
+
diff --git a/gcc/tree-ssa.c b/gcc/tree-ssa.c
index ddf52022b54..edbae39cd0e 100644
--- a/gcc/tree-ssa.c
+++ b/gcc/tree-ssa.c
@@ -1573,7 +1573,9 @@ execute_update_addresses_taken (bool do_optimize)
if (!DECL_GIMPLE_REG_P (var)
&& !bitmap_bit_p (not_reg_needs, DECL_UID (var))
&& (TREE_CODE (TREE_TYPE (var)) == COMPLEX_TYPE
- || TREE_CODE (TREE_TYPE (var)) == VECTOR_TYPE))
+ || TREE_CODE (TREE_TYPE (var)) == VECTOR_TYPE)
+ && !TREE_THIS_VOLATILE (var)
+ && (TREE_CODE (var) != VAR_DECL || !DECL_HARD_REGISTER (var)))
{
DECL_GIMPLE_REG_P (var) = 1;
mark_sym_for_renaming (var);
OpenPOWER on IntegriCloud