aboutsummaryrefslogtreecommitdiff
path: root/gcc/gimplify.c
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2012-04-05 13:38:47 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2012-04-05 13:38:47 +0000
commit216820a4ad105b4f0802372fa3437d00bdb182d9 (patch)
tree8683318a9371cb594b545fa16e42b2a11e4bf33a /gcc/gimplify.c
parenteaf6ca186f3f165d0b641e02461dcb57d9c0d04d (diff)
downloadgcc-216820a4ad105b4f0802372fa3437d00bdb182d9.zip
gcc-216820a4ad105b4f0802372fa3437d00bdb182d9.tar.gz
gcc-216820a4ad105b4f0802372fa3437d00bdb182d9.tar.bz2
gimple.c (walk_gimple_op): Compute val_only for the LHS of an assigment in the canonical way...
2012-04-05 Richard Guenther <rguenther@suse.de> * gimple.c (walk_gimple_op): Compute val_only for the LHS of an assigment in the canonical way, avoiding is_gimple_mem_rhs. (is_gimple_mem_rhs, is_gimple_reg_rhs, is_gimple_stmt): Move ... * gimplify.c (is_gimple_mem_rhs, is_gimple_reg_rhs, is_gimple_stmt): ... here and make static. * gimple.h (is_gimple_mem_rhs, is_gimple_reg_rhs, is_gimple_stmt): Remove. From-SVN: r186165
Diffstat (limited to 'gcc/gimplify.c')
-rw-r--r--gcc/gimplify.c77
1 files changed, 77 insertions, 0 deletions
diff --git a/gcc/gimplify.c b/gcc/gimplify.c
index 3c41294..43e3518 100644
--- a/gcc/gimplify.c
+++ b/gcc/gimplify.c
@@ -550,6 +550,29 @@ lookup_tmp_var (tree val, bool is_formal)
return ret;
}
+/* Returns true iff T is a valid RHS for an assignment to a renamed
+ user -- or front-end generated artificial -- variable. */
+
+static bool
+is_gimple_reg_rhs (tree t)
+{
+ return get_gimple_rhs_class (TREE_CODE (t)) != GIMPLE_INVALID_RHS;
+}
+
+/* Returns true iff T is a valid RHS for an assignment to an un-renamed
+ LHS, or for a call argument. */
+
+static bool
+is_gimple_mem_rhs (tree t)
+{
+ /* If we're dealing with a renamable type, either source or dest must be
+ a renamed variable. */
+ if (is_gimple_reg_type (TREE_TYPE (t)))
+ return is_gimple_val (t);
+ else
+ return is_gimple_val (t) || is_gimple_lvalue (t);
+}
+
/* Return true if T is a CALL_EXPR or an expression that can be
assigned to a temporary. Note that this predicate should only be
used during gimplification. See the rationale for this in
@@ -4515,6 +4538,60 @@ gimplify_modify_expr_rhs (tree *expr_p, tree *from_p, tree *to_p,
return ret;
}
+
+/* Return true if T looks like a valid GIMPLE statement. */
+
+static bool
+is_gimple_stmt (tree t)
+{
+ const enum tree_code code = TREE_CODE (t);
+
+ switch (code)
+ {
+ case NOP_EXPR:
+ /* The only valid NOP_EXPR is the empty statement. */
+ return IS_EMPTY_STMT (t);
+
+ case BIND_EXPR:
+ case COND_EXPR:
+ /* These are only valid if they're void. */
+ return TREE_TYPE (t) == NULL || VOID_TYPE_P (TREE_TYPE (t));
+
+ case SWITCH_EXPR:
+ case GOTO_EXPR:
+ case RETURN_EXPR:
+ case LABEL_EXPR:
+ case CASE_LABEL_EXPR:
+ case TRY_CATCH_EXPR:
+ case TRY_FINALLY_EXPR:
+ case EH_FILTER_EXPR:
+ case CATCH_EXPR:
+ case ASM_EXPR:
+ case STATEMENT_LIST:
+ case OMP_PARALLEL:
+ case OMP_FOR:
+ case OMP_SECTIONS:
+ case OMP_SECTION:
+ case OMP_SINGLE:
+ case OMP_MASTER:
+ case OMP_ORDERED:
+ case OMP_CRITICAL:
+ case OMP_TASK:
+ /* These are always void. */
+ return true;
+
+ case CALL_EXPR:
+ case MODIFY_EXPR:
+ case PREDICT_EXPR:
+ /* These are valid regardless of their type. */
+ return true;
+
+ default:
+ return false;
+ }
+}
+
+
/* Promote partial stores to COMPLEX variables to total stores. *EXPR_P is
a MODIFY_EXPR with a lhs of a REAL/IMAGPART_EXPR of a variable with
DECL_GIMPLE_REG_P set.