From fcbb6018abaf04d30e2cf6fff2eb35115412cdd5 Mon Sep 17 00:00:00 2001 From: Andrew MacLeod Date: Fri, 13 Nov 2020 13:56:01 -0500 Subject: [PATCH] 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. --- gcc/gimple-range.h | 12 ++++++------ gcc/gimple.h | 42 ++++++++++++++++++++++-------------------- 2 files changed, 28 insertions(+), 26 deletions(-) diff --git a/gcc/gimple-range.h b/gcc/gimple-range.h index dde41e9e743..92bb5305c18 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 (s)) + return range_op_handler (gimple_assign_rhs_code (ass), + TREE_TYPE (gimple_assign_lhs (ass))); + if (const gcond *cond = dyn_cast (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 d359f7827b1..b935ad4f761 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 (stmt)) + return gimple_assign_rhs_code (ass); + if (const gcond *cond = dyn_cast (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 -- 2.30.2