diff options
Diffstat (limited to 'gcc/tree-gimple.c')
-rw-r--r-- | gcc/tree-gimple.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/gcc/tree-gimple.c b/gcc/tree-gimple.c index abd35f7..d1e47f6 100644 --- a/gcc/tree-gimple.c +++ b/gcc/tree-gimple.c @@ -285,7 +285,13 @@ is_gimple_id (tree t) bool is_gimple_reg_type (tree type) { - return !AGGREGATE_TYPE_P (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 true if T is a non-aggregate register variable. */ @@ -328,8 +334,8 @@ is_gimple_reg (tree t) if (TREE_CODE (t) == VAR_DECL && DECL_HARD_REGISTER (t)) return false; - /* Complex values must have been put into ssa form. That is, no - assignments to the individual components. */ + /* 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); |