diff options
author | Aldy Hernandez <aldyh@redhat.com> | 2020-04-21 11:57:29 +0200 |
---|---|---|
committer | Aldy Hernandez <aldyh@redhat.com> | 2020-04-21 11:57:29 +0200 |
commit | b9f248d8fa1a654adf82cdc7f107cd35d4384562 (patch) | |
tree | c1a7653170372afed3ad3eb1245c315bedf59af7 | |
parent | f5267b36977c5b349cc37447dbd750dee8735214 (diff) | |
download | gcc-b9f248d8fa1a654adf82cdc7f107cd35d4384562.zip gcc-b9f248d8fa1a654adf82cdc7f107cd35d4384562.tar.gz gcc-b9f248d8fa1a654adf82cdc7f107cd35d4384562.tar.bz2 |
Refactor compute_logical_operands_in_chain.
-rw-r--r-- | gcc/gimple-range-gori.cc | 54 | ||||
-rw-r--r-- | gcc/gimple-range-gori.h | 6 |
2 files changed, 41 insertions, 19 deletions
diff --git a/gcc/gimple-range-gori.cc b/gcc/gimple-range-gori.cc index 0a8dcdb..158c016 100644 --- a/gcc/gimple-range-gori.cc +++ b/gcc/gimple-range-gori.cc @@ -885,6 +885,38 @@ gori_compute::logical_combine (irange &r, enum tree_code code, return true; } +bool +gori_compute::optimize_logical_operands (irange &true_range, + irange &false_range, + gimple *stmt, + const irange &lhs, + tree name, + const irange *name_range, + tree op) +{ + enum tree_code code = gimple_expr_code (stmt); + + // Optimize [0 = x | y], since neither operand can ever be non-zero. + if ((code == BIT_IOR_EXPR || code == TRUTH_OR_EXPR) && lhs.zero_p ()) + { + if (!compute_operand_range (false_range, SSA_NAME_DEF_STMT (op), + m_bool_zero, name, name_range)) + get_tree_range (false_range, name, name, name_range); + true_range = false_range; + return true; + } + // Optimize [1 = x & y], since neither operand can ever be zero. + if ((code == BIT_AND_EXPR || code == TRUTH_AND_EXPR) && lhs == m_bool_one) + { + if (!compute_operand_range (true_range, SSA_NAME_DEF_STMT (op), + m_bool_one, name, name_range)) + get_tree_range (true_range, name, name, name_range); + false_range = true_range; + return true; + } + return false; +} + // Given a logical STMT, calculate TRUE_RANGE and FALSE_RANGE for each // potential path of NAME, assuming NAME came through the OP chain if // OP_IN_CHAIN is true. If present, NAME_RANGE is any known range for @@ -907,25 +939,9 @@ gori_compute::compute_logical_operands_in_chain (irange &true_range, return; } - enum tree_code code = gimple_expr_code (stmt); - // Optimize [0 = x | y], since neither operand can ever be non-zero. - if ((code == BIT_IOR_EXPR || code == TRUTH_OR_EXPR) && lhs.zero_p ()) - { - if (!compute_operand_range (false_range, SSA_NAME_DEF_STMT (op), - m_bool_zero, name, name_range)) - get_tree_range (false_range, name, name, name_range); - true_range = false_range; - return; - } - // Optimize [1 = x & y], since neither operand can ever be zero. - if ((code == BIT_AND_EXPR || code == TRUTH_AND_EXPR) && lhs == m_bool_one) - { - if (!compute_operand_range (true_range, SSA_NAME_DEF_STMT (op), - m_bool_one, name, name_range)) - get_tree_range (true_range, name, name, name_range); - false_range = true_range; - return; - } + if (optimize_logical_operands (true_range, false_range, + stmt, lhs, name, name_range, op)) + return; // Calulate ranges for true and false on both sides, since the false // path is not always a simple inversion of the true side. diff --git a/gcc/gimple-range-gori.h b/gcc/gimple-range-gori.h index 48e3979..df7e4cc 100644 --- a/gcc/gimple-range-gori.h +++ b/gcc/gimple-range-gori.h @@ -175,6 +175,12 @@ protected: tree name, const irange *name_range, tree op, bool op_in_chain); + bool optimize_logical_operands (irange &true_range, irange &false_range, + gimple *stmt, + const irange &lhs, + tree name, const irange *name_range, + tree op); + bool logical_combine (irange &r, enum tree_code code, const irange &lhs, const irange &op1_true, |