aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAldy Hernandez <aldyh@redhat.com>2020-04-21 11:57:29 +0200
committerAldy Hernandez <aldyh@redhat.com>2020-04-21 11:57:29 +0200
commitb9f248d8fa1a654adf82cdc7f107cd35d4384562 (patch)
treec1a7653170372afed3ad3eb1245c315bedf59af7
parentf5267b36977c5b349cc37447dbd750dee8735214 (diff)
downloadgcc-b9f248d8fa1a654adf82cdc7f107cd35d4384562.zip
gcc-b9f248d8fa1a654adf82cdc7f107cd35d4384562.tar.gz
gcc-b9f248d8fa1a654adf82cdc7f107cd35d4384562.tar.bz2
Refactor compute_logical_operands_in_chain.
-rw-r--r--gcc/gimple-range-gori.cc54
-rw-r--r--gcc/gimple-range-gori.h6
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,