aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorAndrew MacLeod <amacleod@redhat.com>2020-11-13 13:56:01 -0500
committerAndrew MacLeod <amacleod@redhat.com>2020-11-13 13:59:44 -0500
commitfcbb6018abaf04d30e2cf6fff2eb35115412cdd5 (patch)
treec727a4cb985b90cfcb860d5e8a09f54615a1bd45 /gcc
parent84096498a7bd788599d4a7ca63543fc7c297645e (diff)
downloadgcc-fcbb6018abaf04d30e2cf6fff2eb35115412cdd5.zip
gcc-fcbb6018abaf04d30e2cf6fff2eb35115412cdd5.tar.gz
gcc-fcbb6018abaf04d30e2cf6fff2eb35115412cdd5.tar.bz2
Re: Fix gimple_expr_code?
have gimple_expr_code return the correct code for GIMPLE_ASSIGN. use gassign and gcond in gimple_range_handler. * gimple-range.h (gimple_range_handler): Cast to gimple stmt kinds before asking for code and type. * gimple.h (gimple_expr_code): Call gassign and gcond routines to get their expr_code.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/gimple-range.h12
-rw-r--r--gcc/gimple.h42
2 files changed, 28 insertions, 26 deletions
diff --git a/gcc/gimple-range.h b/gcc/gimple-range.h
index dde41e9..92bb530 100644
--- a/gcc/gimple-range.h
+++ b/gcc/gimple-range.h
@@ -97,12 +97,12 @@ extern bool gimple_range_calc_op2 (irange &r, const gimple *s,
static inline range_operator *
gimple_range_handler (const gimple *s)
{
- if (gimple_code (s) == GIMPLE_ASSIGN)
- return range_op_handler (gimple_assign_rhs_code (s),
- TREE_TYPE (gimple_assign_lhs (s)));
- if (gimple_code (s) == GIMPLE_COND)
- return range_op_handler (gimple_cond_code (s),
- TREE_TYPE (gimple_cond_lhs (s)));
+ if (const gassign *ass = dyn_cast<const gassign *> (s))
+ return range_op_handler (gimple_assign_rhs_code (ass),
+ TREE_TYPE (gimple_assign_lhs (ass)));
+ if (const gcond *cond = dyn_cast<const gcond *> (s))
+ return range_op_handler (gimple_cond_code (cond),
+ TREE_TYPE (gimple_cond_lhs (cond)));
return NULL;
}
diff --git a/gcc/gimple.h b/gcc/gimple.h
index d359f78..b935ad4 100644
--- a/gcc/gimple.h
+++ b/gcc/gimple.h
@@ -2229,26 +2229,6 @@ gimple_set_modified (gimple *s, bool modifiedp)
}
-/* Return the tree code for the expression computed by STMT. This is
- only valid for GIMPLE_COND, GIMPLE_CALL and GIMPLE_ASSIGN. For
- GIMPLE_CALL, return CALL_EXPR as the expression code for
- consistency. This is useful when the caller needs to deal with the
- three kinds of computation that GIMPLE supports. */
-
-static inline enum tree_code
-gimple_expr_code (const gimple *stmt)
-{
- enum gimple_code code = gimple_code (stmt);
- if (code == GIMPLE_ASSIGN || code == GIMPLE_COND)
- return (enum tree_code) stmt->subcode;
- else
- {
- gcc_gimple_checking_assert (code == GIMPLE_CALL);
- return CALL_EXPR;
- }
-}
-
-
/* Return true if statement STMT contains volatile operands. */
static inline bool
@@ -3793,6 +3773,28 @@ gimple_cond_set_condition (gcond *stmt, enum tree_code code, tree lhs,
gimple_cond_set_rhs (stmt, rhs);
}
+
+/* Return the tree code for the expression computed by STMT. This is
+ only valid for GIMPLE_COND, GIMPLE_CALL and GIMPLE_ASSIGN. For
+ GIMPLE_CALL, return CALL_EXPR as the expression code for
+ consistency. This is useful when the caller needs to deal with the
+ three kinds of computation that GIMPLE supports. */
+
+static inline enum tree_code
+gimple_expr_code (const gimple *stmt)
+{
+ if (const gassign *ass = dyn_cast<const gassign *> (stmt))
+ return gimple_assign_rhs_code (ass);
+ if (const gcond *cond = dyn_cast<const gcond *> (stmt))
+ return gimple_cond_code (cond);
+ else
+ {
+ gcc_gimple_checking_assert (gimple_code (stmt) == GIMPLE_CALL);
+ return CALL_EXPR;
+ }
+}
+
+
/* Return the LABEL_DECL node used by GIMPLE_LABEL statement GS. */
static inline tree