aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorAldy Hernandez <aldyh@redhat.com>2020-04-20 10:10:32 +0200
committerAldy Hernandez <aldyh@redhat.com>2020-04-20 16:09:26 +0200
commit6b179b967a7e8f915f3aa0fc7dfe5f919f66ca59 (patch)
treef78b8e7b6d2386e841715359b90dbcdd03daedde /gcc
parent717b963ed0a386c4e1993f13f97401bcd38671b0 (diff)
downloadgcc-6b179b967a7e8f915f3aa0fc7dfe5f919f66ca59.zip
gcc-6b179b967a7e8f915f3aa0fc7dfe5f919f66ca59.tar.gz
gcc-6b179b967a7e8f915f3aa0fc7dfe5f919f66ca59.tar.bz2
Optimize logical operands whose operands may be known.
This optimizes: 0 = x | y Operands are known to be 0. 1 = x & y Operands are known to be 1.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/gimple-range-gori.cc110
-rw-r--r--gcc/gimple-range-gori.h6
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/rvrp-logic-1.c252
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/rvrp-logic-2.c193
4 files changed, 516 insertions, 45 deletions
diff --git a/gcc/gimple-range-gori.cc b/gcc/gimple-range-gori.cc
index a277a9a..e58fb4b 100644
--- a/gcc/gimple-range-gori.cc
+++ b/gcc/gimple-range-gori.cc
@@ -900,10 +900,62 @@ gori_compute::logical_combine (irange &r, enum tree_code code,
return true;
}
+// 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
+// NAME coming into STMT.
+
+void
+gori_compute::compute_logical_operands_in_chain (irange &true_range,
+ irange &false_range,
+ gimple *stmt,
+ const irange &lhs,
+ tree name,
+ const irange *name_range,
+ tree op, bool op_in_chain)
+{
+ if (!op_in_chain)
+ {
+ // If op is not in chain, use its known value.
+ get_tree_range (true_range, name, name, name_range);
+ false_range = 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;
+ }
+
+ // Calulate ranges for true and false on both sides, since the false
+ // path is not always a simple inversion of the true side.
+ 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);
+ 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);
+}
+
// Given a logical STMT, calculate true and false for each potential
-// path using NAME and resolve the outcome based on the logical
+// path using NAME, and resolve the outcome based on the logical
// operator. If present, NAME_RANGE is any known range for NAME
-// coming into S.
+// coming into STMT.
bool
gori_compute::compute_logical_operands (irange &r, gimple *stmt,
@@ -911,57 +963,26 @@ gori_compute::compute_logical_operands (irange &r, gimple *stmt,
tree name,
const irange *name_range)
{
- tree op1, op2;
- bool op1_in_chain, op2_in_chain;
- widest_irange op1_true, op1_false, op2_true, op2_false;
-
// Reaching this point means NAME is not in this stmt, but one of
// the names in it ought to be derived from it. */
- op1 = gimple_range_operand1 (stmt);
- op2 = gimple_range_operand2 (stmt);
+ tree op1 = gimple_range_operand1 (stmt);
+ tree op2 = gimple_range_operand2 (stmt);
gcc_checking_assert (op1 != name && op2 != name);
- op1_in_chain = (gimple_range_ssa_p (op1)
- && m_gori_map.in_chain_p (name, op1));
- op2_in_chain = (gimple_range_ssa_p (op2)
- && m_gori_map.in_chain_p (name, op2));
+ bool op1_in_chain = (gimple_range_ssa_p (op1)
+ && m_gori_map.in_chain_p (name, op1));
+ bool op2_in_chain = (gimple_range_ssa_p (op2)
+ && m_gori_map.in_chain_p (name, op2));
// If neither operand is derived, then this stmt tells us nothing.
if (!op1_in_chain && !op2_in_chain)
return false;
- // The false path is not always a simple inversion of the true side.
- // Calulate ranges for true and false on both sides.
- if (op1_in_chain)
- {
- if (!compute_operand_range (op1_true, SSA_NAME_DEF_STMT (op1),
- m_bool_one, name, name_range))
- get_tree_range (op1_true, name, name, name_range);
- if (!compute_operand_range (op1_false, SSA_NAME_DEF_STMT (op1),
- m_bool_zero, name, name_range))
- get_tree_range (op1_false, name, name, name_range);
- }
- else
- {
- // Otherwise just get the value for name in operand 1 position.
- get_tree_range (op1_true, name, name, name_range);
- op1_false = op1_true;
- }
- if (op2_in_chain)
- {
- if (!compute_operand_range (op2_true, SSA_NAME_DEF_STMT (op2),
- m_bool_one, name, name_range))
- get_tree_range (op2_true, name, name, name_range);
- if (!compute_operand_range (op2_false, SSA_NAME_DEF_STMT (op2),
- m_bool_zero, name, name_range))
- get_tree_range (op2_false, name, name, name_range);
- }
- else
- {
- // Otherwise just get the value for name in operand 2 position.
- get_tree_range (op2_true, name, name, name_range);
- op2_false = op2_true;
- }
+ widest_irange op1_true, op1_false, op2_true, op2_false;
+ compute_logical_operands_in_chain (op1_true, op1_false, stmt, lhs,
+ name, name_range, op1, op1_in_chain);
+ compute_logical_operands_in_chain (op2_true, op2_false, stmt, lhs,
+ name, name_range, op2, op2_in_chain);
if (!logical_combine (r, gimple_expr_code (stmt), lhs,
op1_true, op1_false, op2_true, op2_false))
r.set_varying (TREE_TYPE (name));
@@ -969,7 +990,6 @@ gori_compute::compute_logical_operands (irange &r, gimple *stmt,
return true;
}
-
// Calculate a range for NAME from the operand 1 position of STMT
// assuming the result of the statement is LHS. Return the range in
// R, or false if no range could be calculated. If present,
diff --git a/gcc/gimple-range-gori.h b/gcc/gimple-range-gori.h
index bfdeb7f..48e3979 100644
--- a/gcc/gimple-range-gori.h
+++ b/gcc/gimple-range-gori.h
@@ -169,6 +169,12 @@ protected:
virtual bool compute_logical_operands (irange &r, gimple *stmt,
const irange &lhs,
tree name, const irange *name_range);
+ void compute_logical_operands_in_chain (irange &true_range,
+ irange &false_range,
+ gimple *stmt, const irange &lhs,
+ tree name,
+ const irange *name_range,
+ tree op, bool op_in_chain);
bool logical_combine (irange &r, enum tree_code code,
const irange &lhs,
const irange &op1_true,
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/rvrp-logic-1.c b/gcc/testsuite/gcc.dg/tree-ssa/rvrp-logic-1.c
new file mode 100644
index 0000000..6e8009e
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/rvrp-logic-1.c
@@ -0,0 +1,252 @@
+/* Extracted from fedora build for compile time issues with ranger
+ taking a long time to evalaute deeply nested logical expressions. */
+
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+
+typedef struct
+{
+ unsigned value;
+} aarch64_sys_reg;
+
+typedef unsigned long long aarch64_feature_set;
+
+int
+aarch64_sys_reg_supported_p (const aarch64_feature_set features,
+ const aarch64_sys_reg *reg)
+{
+
+
+ if (reg->value == ((((3) << 19) | (((0)) << 16) | ((4) << 12) | (((2)) << 8) | (((3)) << 5)) >> 5)
+ && !((~(features) & (0x00200000)) == 0))
+ return 0;
+
+
+ if ((reg->value == ((((3) << 19) | ((3) << 16) | ((13) << 12) | ((0) << 8) | ((7) << 5)) >> 5)
+ || reg->value == ((((3) << 19) | ((0) << 16) | ((13) << 12) | ((0) << 8) | ((7) << 5)) >> 5)
+ || reg->value == ((((3) << 19) | ((4) << 16) | ((13) << 12) | ((0) << 8) | ((7) << 5)) >> 5)
+ || reg->value == ((((3) << 19) | ((6) << 16) | ((13) << 12) | ((0) << 8) | ((7) << 5)) >> 5)
+ || reg->value == ((((3) << 19) | ((5) << 16) | ((13) << 12) | ((0) << 8) | ((7) << 5)) >> 5))
+ && !((~(features) & (0x200000000000ULL)) == 0))
+ return 0;
+
+
+ if (reg->value == ((((3) << 19) | ((0) << 16) | ((0) << 12) | ((3) << 8) | ((4) << 5)) >> 5)
+ && !((~(features) & (0x400000000000ULL)) == 0))
+ return 0;
+
+
+ if (reg->value == ((((3) << 19) | (((3)) << 16) | ((4) << 12) | (((2)) << 8) | (((6)) << 5)) >> 5)
+ && !((~(features) & (0x800000000000ULL)) == 0))
+ return 0;
+
+
+ if ((reg->value == ((((3) << 19) | ((4) << 16) | ((2) << 12) | ((0) << 8) | ((1) << 5)) >> 5)
+ || reg->value == ((((3) << 19) | ((4) << 16) | ((13) << 12) | ((0) << 8) | ((1) << 5)) >> 5)
+ || reg->value == ((((3) << 19) | ((4) << 16) | ((14) << 12) | ((3) << 8) | ((0) << 5)) >> 5)
+ || reg->value == ((((3) << 19) | ((4) << 16) | ((14) << 12) | ((3) << 8) | ((1) << 5)) >> 5)
+ || reg->value == ((((3) << 19) | ((4) << 16) | ((14) << 12) | ((3) << 8) | ((2) << 5)) >> 5))
+ && !((~(features) & (0x01000000)) == 0))
+ return 0;
+
+
+ if ((reg->value == ((((3) << 19) | (((5)) << 16) | ((4) << 12) | (((0)) << 8) | (((0)) << 5)) >> 5)
+ || reg->value == ((((3) << 19) | (((5)) << 16) | ((4) << 12) | (((0)) << 8) | (((1)) << 5)) >> 5)
+ || reg->value == ((((3) << 19) | ((5) << 16) | ((1) << 12) | ((0) << 8) | ((0) << 5)) >> 5)
+ || reg->value == ((((3) << 19) | ((5) << 16) | ((1) << 12) | ((0) << 8) | ((2) << 5)) >> 5)
+ || reg->value == ((((3) << 19) | ((5) << 16) | ((2) << 12) | ((0) << 8) | ((0) << 5)) >> 5)
+ || reg->value == ((((3) << 19) | ((5) << 16) | ((2) << 12) | ((0) << 8) | ((1) << 5)) >> 5)
+ || reg->value == ((((3) << 19) | ((5) << 16) | ((2) << 12) | ((0) << 8) | ((2) << 5)) >> 5)
+ || reg->value == ((((3) << 19) | ((5) << 16) | ((5) << 12) | ((1) << 8) | ((0) << 5)) >> 5)
+ || reg->value == ((((3) << 19) | ((5) << 16) | ((5) << 12) | ((1) << 8) | ((1) << 5)) >> 5)
+ || reg->value == ((((3) << 19) | ((5) << 16) | ((5) << 12) | ((2) << 8) | ((0) << 5)) >> 5)
+ || reg->value == ((((3) << 19) | ((5) << 16) | ((6) << 12) | ((0) << 8) | ((0) << 5)) >> 5)
+ || reg->value == ((((3) << 19) | ((5) << 16) | ((10) << 12) | ((2) << 8) | ((0) << 5)) >> 5)
+ || reg->value == ((((3) << 19) | ((5) << 16) | ((10) << 12) | ((3) << 8) | ((0) << 5)) >> 5)
+ || reg->value == ((((3) << 19) | ((5) << 16) | ((12) << 12) | ((0) << 8) | ((0) << 5)) >> 5)
+ || reg->value == ((((3) << 19) | ((5) << 16) | ((13) << 12) | ((0) << 8) | ((1) << 5)) >> 5)
+ || reg->value == ((((3) << 19) | ((5) << 16) | ((14) << 12) | ((1) << 8) | ((0) << 5)) >> 5))
+ && !((~(features) & (0x01000000)) == 0))
+ return 0;
+
+
+ if ((reg->value == ((((3) << 19) | ((5) << 16) | ((14) << 12) | ((2) << 8) | ((0) << 5)) >> 5)
+ || reg->value == ((((3) << 19) | ((5) << 16) | ((14) << 12) | ((2) << 8) | ((1) << 5)) >> 5)
+ || reg->value == ((((3) << 19) | ((5) << 16) | ((14) << 12) | ((2) << 8) | ((2) << 5)) >> 5)
+ || reg->value == ((((3) << 19) | ((5) << 16) | ((14) << 12) | ((3) << 8) | ((0) << 5)) >> 5)
+ || reg->value == ((((3) << 19) | ((5) << 16) | ((14) << 12) | ((3) << 8) | ((1) << 5)) >> 5)
+ || reg->value == ((((3) << 19) | ((5) << 16) | ((14) << 12) | ((3) << 8) | ((2) << 5)) >> 5))
+ && !((~(features) & (0x01000000)) == 0))
+ return 0;
+
+
+
+
+ if (reg->value == ((((3) << 19) | ((0) << 16) | ((0) << 12) | ((7) << 8) | ((2) << 5)) >> 5)
+ && !((~(features) & (0x00000020)) == 0))
+ return 0;
+
+
+ if (reg->value == ((((3) << 19) | (((0)) << 16) | ((4) << 12) | (((2)) << 8) | (((4)) << 5)) >> 5)
+ && !((~(features) & (0x00000020)) == 0))
+ return 0;
+
+
+
+
+
+ if ((reg->value == ((((3) << 19) | ((0) << 16) | ((5) << 12) | ((3) << 8) | ((0) << 5)) >> 5)
+ || reg->value == ((((3) << 19) | ((0) << 16) | ((5) << 12) | ((3) << 8) | ((1) << 5)) >> 5)
+ || reg->value == ((((3) << 19) | ((0) << 16) | ((5) << 12) | ((3) << 8) | ((2) << 5)) >> 5)
+ || reg->value == ((((3) << 19) | ((0) << 16) | ((5) << 12) | ((3) << 8) | ((3) << 5)) >> 5)
+ || reg->value == ((((3) << 19) | ((0) << 16) | ((5) << 12) | ((4) << 8) | ((0) << 5)) >> 5)
+ || reg->value == ((((3) << 19) | ((0) << 16) | ((5) << 12) | ((4) << 8) | ((1) << 5)) >> 5)
+ || reg->value == ((((3) << 19) | ((0) << 16) | ((5) << 12) | ((4) << 8) | ((2) << 5)) >> 5)
+ || reg->value == ((((3) << 19) | ((0) << 16) | ((5) << 12) | ((4) << 8) | ((3) << 5)) >> 5)
+ || reg->value == ((((3) << 19) | ((0) << 16) | ((5) << 12) | ((5) << 8) | ((0) << 5)) >> 5)
+ || reg->value == ((((3) << 19) | ((0) << 16) | ((5) << 12) | ((5) << 8) | ((1) << 5)) >> 5))
+ && !((~(features) & (0x04000000)) == 0))
+ return 0;
+
+
+ if ((reg->value == ((((3) << 19) | ((4) << 16) | ((5) << 12) | ((2) << 8) | ((3) << 5)) >> 5)
+ || reg->value == ((((3) << 19) | ((0) << 16) | ((12) << 12) | ((1) << 8) | ((1) << 5)) >> 5)
+ || reg->value == ((((3) << 19) | ((4) << 16) | ((12) << 12) | ((1) << 8) | ((1) << 5)) >> 5))
+ && !((~(features) & (0x04000000)) == 0))
+ return 0;
+
+
+ if ((reg->value == ((((3) << 19) | ((0) << 16) | ((9) << 12) | ((10) << 8) | ((0) << 5)) >> 5)
+ || reg->value == ((((3) << 19) | ((0) << 16) | ((9) << 12) | ((10) << 8) | ((1) << 5)) >> 5)
+ || reg->value == ((((3) << 19) | ((0) << 16) | ((9) << 12) | ((10) << 8) | ((3) << 5)) >> 5)
+ || reg->value == ((((3) << 19) | ((0) << 16) | ((9) << 12) | ((10) << 8) | ((7) << 5)) >> 5)
+ || reg->value == ((((3) << 19) | ((0) << 16) | ((9) << 12) | ((9) << 8) | ((0) << 5)) >> 5)
+ || reg->value == ((((3) << 19) | ((0) << 16) | ((9) << 12) | ((9) << 8) | ((2) << 5)) >> 5)
+ || reg->value == ((((3) << 19) | ((0) << 16) | ((9) << 12) | ((9) << 8) | ((3) << 5)) >> 5)
+ || reg->value == ((((3) << 19) | ((0) << 16) | ((9) << 12) | ((9) << 8) | ((4) << 5)) >> 5)
+ || reg->value == ((((3) << 19) | ((0) << 16) | ((9) << 12) | ((9) << 8) | ((5) << 5)) >> 5)
+ || reg->value == ((((3) << 19) | ((0) << 16) | ((9) << 12) | ((9) << 8) | ((6) << 5)) >> 5)
+ || reg->value == ((((3) << 19) | ((0) << 16) | ((9) << 12) | ((9) << 8) | ((7) << 5)) >> 5)
+ || reg->value == ((((3) << 19) | ((4) << 16) | ((9) << 12) | ((9) << 8) | ((0) << 5)) >> 5)
+ || reg->value == ((((3) << 19) | ((5) << 16) | ((9) << 12) | ((9) << 8) | ((0) << 5)) >> 5))
+ && !((~(features) & (0x08000000)) == 0))
+ return 0;
+
+
+ if ((reg->value == ((((3) << 19) | ((0) << 16) | ((2) << 12) | ((1) << 8) | ((0) << 5)) >> 5)
+ || reg->value == ((((3) << 19) | ((0) << 16) | ((2) << 12) | ((1) << 8) | ((1) << 5)) >> 5)
+ || reg->value == ((((3) << 19) | ((0) << 16) | ((2) << 12) | ((1) << 8) | ((2) << 5)) >> 5)
+ || reg->value == ((((3) << 19) | ((0) << 16) | ((2) << 12) | ((1) << 8) | ((3) << 5)) >> 5)
+ || reg->value == ((((3) << 19) | ((0) << 16) | ((2) << 12) | ((2) << 8) | ((0) << 5)) >> 5)
+ || reg->value == ((((3) << 19) | ((0) << 16) | ((2) << 12) | ((2) << 8) | ((1) << 5)) >> 5)
+ || reg->value == ((((3) << 19) | ((0) << 16) | ((2) << 12) | ((2) << 8) | ((2) << 5)) >> 5)
+ || reg->value == ((((3) << 19) | ((0) << 16) | ((2) << 12) | ((2) << 8) | ((3) << 5)) >> 5)
+ || reg->value == ((((3) << 19) | ((0) << 16) | ((2) << 12) | ((3) << 8) | ((0) << 5)) >> 5)
+ || reg->value == ((((3) << 19) | ((0) << 16) | ((2) << 12) | ((3) << 8) | ((1) << 5)) >> 5))
+ && !((~(features) & (0x00000040)) == 0))
+ return 0;
+
+
+ if ((reg->value == ((((3) << 19) | ((0) << 16) | ((0) << 12) | ((4) << 8) | ((4) << 5)) >> 5)
+ || reg->value == ((((3) << 19) | ((0) << 16) | ((1) << 12) | ((2) << 8) | ((0) << 5)) >> 5)
+ || reg->value == ((((3) << 19) | ((4) << 16) | ((1) << 12) | ((2) << 8) | ((0) << 5)) >> 5)
+ || reg->value == ((((3) << 19) | ((6) << 16) | ((1) << 12) | ((2) << 8) | ((0) << 5)) >> 5)
+ || reg->value == ((((3) << 19) | ((5) << 16) | ((1) << 12) | ((2) << 8) | ((0) << 5)) >> 5)
+ || reg->value == ((((3) << 19) | ((0) << 16) | ((0) << 12) | ((0) << 8) | ((7) << 5)) >> 5))
+ && !((~(features) & (0x10000000)) == 0))
+ return 0;
+
+
+
+
+ if (reg->value == ((((3) << 19) | (((3)) << 16) | ((4) << 12) | (((2)) << 8) | (((5)) << 5)) >> 5)
+ && !((~(features) & (0x000000800ULL)) == 0))
+ return 0;
+
+
+ if ((reg->value == ((((3) << 19) | ((4) << 16) | ((2) << 12) | ((6) << 8) | ((2) << 5)) >> 5)
+ || reg->value == ((((3) << 19) | ((4) << 16) | ((2) << 12) | ((6) << 8) | ((0) << 5)) >> 5)
+ || reg->value == ((((3) << 19) | ((4) << 16) | ((14) << 12) | ((4) << 8) | ((0) << 5)) >> 5)
+ || reg->value == ((((3) << 19) | ((4) << 16) | ((14) << 12) | ((4) << 8) | ((2) << 5)) >> 5)
+ || reg->value == ((((3) << 19) | ((4) << 16) | ((14) << 12) | ((4) << 8) | ((1) << 5)) >> 5)
+ || reg->value == ((((3) << 19) | ((4) << 16) | ((14) << 12) | ((5) << 8) | ((0) << 5)) >> 5)
+ || reg->value == ((((3) << 19) | ((4) << 16) | ((14) << 12) | ((5) << 8) | ((2) << 5)) >> 5)
+ || reg->value == ((((3) << 19) | ((4) << 16) | ((14) << 12) | ((5) << 8) | ((1) << 5)) >> 5)
+ || reg->value == ((((3) << 19) | ((4) << 16) | ((1) << 12) | ((3) << 8) | ((1) << 5)) >> 5)
+ || reg->value == ((((3) << 19) | ((4) << 16) | ((2) << 12) | ((2) << 8) | ((0) << 5)) >> 5))
+ && !((~(features) & (0x000000800ULL)) == 0))
+ return 0;
+
+
+ if ((reg->value == ((((1) << 19) | (((0)) << 16) | (((8)) << 12) | (((1)) << 8) | (((0)) << 5)) >> 5)
+ || reg->value == ((((1) << 19) | (((0)) << 16) | (((8)) << 12) | (((1)) << 8) | (((1)) << 5)) >> 5)
+ || reg->value == ((((1) << 19) | (((0)) << 16) | (((8)) << 12) | (((1)) << 8) | (((2)) << 5)) >> 5)
+ || reg->value == ((((1) << 19) | (((0)) << 16) | (((8)) << 12) | (((1)) << 8) | (((3)) << 5)) >> 5)
+ || reg->value == ((((1) << 19) | (((0)) << 16) | (((8)) << 12) | (((1)) << 8) | (((5)) << 5)) >> 5)
+ || reg->value == ((((1) << 19) | (((0)) << 16) | (((8)) << 12) | (((1)) << 8) | (((7)) << 5)) >> 5)
+ || reg->value == ((((1) << 19) | (((4)) << 16) | (((8)) << 12) | (((4)) << 8) | (((0)) << 5)) >> 5)
+ || reg->value == ((((1) << 19) | (((4)) << 16) | (((8)) << 12) | (((4)) << 8) | (((4)) << 5)) >> 5)
+ || reg->value == ((((1) << 19) | (((4)) << 16) | (((8)) << 12) | (((1)) << 8) | (((1)) << 5)) >> 5)
+ || reg->value == ((((1) << 19) | (((4)) << 16) | (((8)) << 12) | (((1)) << 8) | (((5)) << 5)) >> 5)
+ || reg->value == ((((1) << 19) | (((4)) << 16) | (((8)) << 12) | (((1)) << 8) | (((6)) << 5)) >> 5)
+ || reg->value == ((((1) << 19) | (((6)) << 16) | (((8)) << 12) | (((1)) << 8) | (((1)) << 5)) >> 5)
+ || reg->value == ((((1) << 19) | (((6)) << 16) | (((8)) << 12) | (((1)) << 8) | (((5)) << 5)) >> 5)
+ || reg->value == ((((1) << 19) | (((4)) << 16) | (((8)) << 12) | (((1)) << 8) | (((0)) << 5)) >> 5)
+ || reg->value == ((((1) << 19) | (((4)) << 16) | (((8)) << 12) | (((1)) << 8) | (((4)) << 5)) >> 5)
+ || reg->value == ((((1) << 19) | (((6)) << 16) | (((8)) << 12) | (((1)) << 8) | (((0)) << 5)) >> 5)
+ || reg->value == ((((1) << 19) | (((0)) << 16) | (((8)) << 12) | (((6)) << 8) | (((1)) << 5)) >> 5)
+ || reg->value == ((((1) << 19) | (((0)) << 16) | (((8)) << 12) | (((6)) << 8) | (((3)) << 5)) >> 5)
+ || reg->value == ((((1) << 19) | (((0)) << 16) | (((8)) << 12) | (((6)) << 8) | (((5)) << 5)) >> 5)
+ || reg->value == ((((1) << 19) | (((0)) << 16) | (((8)) << 12) | (((6)) << 8) | (((7)) << 5)) >> 5)
+ || reg->value == ((((1) << 19) | (((0)) << 16) | (((8)) << 12) | (((2)) << 8) | (((1)) << 5)) >> 5)
+ || reg->value == ((((1) << 19) | (((0)) << 16) | (((8)) << 12) | (((2)) << 8) | (((3)) << 5)) >> 5)
+ || reg->value == ((((1) << 19) | (((0)) << 16) | (((8)) << 12) | (((2)) << 8) | (((5)) << 5)) >> 5)
+ || reg->value == ((((1) << 19) | (((0)) << 16) | (((8)) << 12) | (((2)) << 8) | (((7)) << 5)) >> 5)
+ || reg->value == ((((1) << 19) | (((0)) << 16) | (((8)) << 12) | (((5)) << 8) | (((1)) << 5)) >> 5)
+ || reg->value == ((((1) << 19) | (((0)) << 16) | (((8)) << 12) | (((5)) << 8) | (((3)) << 5)) >> 5)
+ || reg->value == ((((1) << 19) | (((0)) << 16) | (((8)) << 12) | (((5)) << 8) | (((5)) << 5)) >> 5)
+ || reg->value == ((((1) << 19) | (((0)) << 16) | (((8)) << 12) | (((5)) << 8) | (((7)) << 5)) >> 5)
+ || reg->value == ((((1) << 19) | (((4)) << 16) | (((8)) << 12) | (((0)) << 8) | (((2)) << 5)) >> 5)
+ || reg->value == ((((1) << 19) | (((4)) << 16) | (((8)) << 12) | (((0)) << 8) | (((6)) << 5)) >> 5)
+ || reg->value == ((((1) << 19) | (((4)) << 16) | (((8)) << 12) | (((4)) << 8) | (((2)) << 5)) >> 5)
+ || reg->value == ((((1) << 19) | (((4)) << 16) | (((8)) << 12) | (((4)) << 8) | (((6)) << 5)) >> 5)
+ || reg->value == ((((1) << 19) | (((4)) << 16) | (((8)) << 12) | (((4)) << 8) | (((3)) << 5)) >> 5)
+ || reg->value == ((((1) << 19) | (((4)) << 16) | (((8)) << 12) | (((4)) << 8) | (((7)) << 5)) >> 5)
+ || reg->value == ((((1) << 19) | (((4)) << 16) | (((8)) << 12) | (((6)) << 8) | (((1)) << 5)) >> 5)
+ || reg->value == ((((1) << 19) | (((4)) << 16) | (((8)) << 12) | (((6)) << 8) | (((5)) << 5)) >> 5)
+ || reg->value == ((((1) << 19) | (((4)) << 16) | (((8)) << 12) | (((2)) << 8) | (((1)) << 5)) >> 5)
+ || reg->value == ((((1) << 19) | (((4)) << 16) | (((8)) << 12) | (((2)) << 8) | (((5)) << 5)) >> 5)
+ || reg->value == ((((1) << 19) | (((4)) << 16) | (((8)) << 12) | (((5)) << 8) | (((1)) << 5)) >> 5)
+ || reg->value == ((((1) << 19) | (((4)) << 16) | (((8)) << 12) | (((5)) << 8) | (((5)) << 5)) >> 5)
+ || reg->value == ((((1) << 19) | (((6)) << 16) | (((8)) << 12) | (((6)) << 8) | (((1)) << 5)) >> 5)
+ || reg->value == ((((1) << 19) | (((6)) << 16) | (((8)) << 12) | (((6)) << 8) | (((5)) << 5)) >> 5)
+ || reg->value == ((((1) << 19) | (((6)) << 16) | (((8)) << 12) | (((2)) << 8) | (((1)) << 5)) >> 5)
+ || reg->value == ((((1) << 19) | (((6)) << 16) | (((8)) << 12) | (((2)) << 8) | (((5)) << 5)) >> 5)
+ || reg->value == ((((1) << 19) | (((6)) << 16) | (((8)) << 12) | (((5)) << 8) | (((1)) << 5)) >> 5)
+ || reg->value == ((((1) << 19) | (((6)) << 16) | (((8)) << 12) | (((5)) << 8) | (((5)) << 5)) >> 5))
+ && !((~(features) & (0x000000800ULL)) == 0))
+ return 0;
+
+
+
+ if ((reg->value == ((((3) << 19) | ((3) << 16) | ((2) << 12) | ((4) << 8) | ((0) << 5)) >> 5)
+ || reg->value == ((((3) << 19) | ((3) << 16) | ((2) << 12) | ((4) << 8) | ((1) << 5)) >> 5))
+ && !(((~(features) & (0x80000000000ULL)) == 0)
+ && ((~(features) & (0x2000000000ULL)) == 0)))
+ return 0;
+
+
+ if ((reg->value == ((((3) << 19) | ((3) << 16) | ((4) << 12) | ((2) << 8) | ((7) << 5)) >> 5)
+ || reg->value == ((((3) << 19) | ((0) << 16) | ((6) << 12) | ((6) << 8) | ((1) << 5)) >> 5)
+ || reg->value == ((((3) << 19) | ((0) << 16) | ((6) << 12) | ((5) << 8) | ((0) << 5)) >> 5)
+ || reg->value == ((((3) << 19) | ((4) << 16) | ((6) << 12) | ((5) << 8) | ((0) << 5)) >> 5)
+ || reg->value == ((((3) << 19) | ((6) << 16) | ((6) << 12) | ((6) << 8) | ((0) << 5)) >> 5)
+ || reg->value == ((((3) << 19) | ((5) << 16) | ((6) << 12) | ((6) << 8) | ((0) << 5)) >> 5)
+ || reg->value == ((((3) << 19) | ((0) << 16) | ((1) << 12) | ((0) << 8) | ((5) << 5)) >> 5)
+ || reg->value == ((((3) << 19) | ((0) << 16) | ((1) << 12) | ((0) << 8) | ((6) << 5)) >> 5))
+ && !(((~(features) & (0x1000000000000ULL)) == 0)))
+ return 0;
+
+ return 1;
+}
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/rvrp-logic-2.c b/gcc/testsuite/gcc.dg/tree-ssa/rvrp-logic-2.c
new file mode 100644
index 0000000..1e67914
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/rvrp-logic-2.c
@@ -0,0 +1,193 @@
+/* Extracted from i386.c for compile time issues with ranger taking a
+ long time to evalaute deeply nested logical expressions. */
+
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+enum machine_mode
+{
+ E_VOIDmode,
+ E_BLKmode,
+ E_CCmode,
+ E_CCGCmode,
+ E_CCGOCmode,
+ E_CCNOmode,
+ E_CCGZmode,
+ E_CCAmode,
+ E_CCCmode,
+ E_CCOmode,
+ E_CCPmode,
+ E_CCSmode,
+ E_CCZmode,
+ E_CCFPmode,
+ E_BImode,
+ E_QImode,
+ E_HImode,
+ E_SImode,
+ E_DImode,
+ E_TImode,
+ E_OImode,
+ E_XImode,
+ E_P2QImode,
+ E_P2HImode,
+ E_QQmode,
+ E_HQmode,
+ E_SQmode,
+ E_DQmode,
+ E_TQmode,
+ E_UQQmode,
+ E_UHQmode,
+ E_USQmode,
+ E_UDQmode,
+ E_UTQmode,
+ E_HAmode,
+ E_SAmode,
+ E_DAmode,
+ E_TAmode,
+ E_UHAmode,
+ E_USAmode,
+ E_UDAmode,
+ E_UTAmode,
+ E_SFmode,
+ E_DFmode,
+ E_XFmode,
+ E_TFmode,
+ E_SDmode,
+ E_DDmode,
+ E_TDmode,
+ E_CQImode,
+ E_CP2QImode,
+ E_CHImode,
+ E_CP2HImode,
+ E_CSImode,
+ E_CDImode,
+ E_CTImode,
+ E_COImode,
+ E_CXImode,
+ E_SCmode,
+ E_DCmode,
+ E_XCmode,
+ E_TCmode,
+ E_V2QImode,
+ E_V4QImode,
+ E_V2HImode,
+ E_V1SImode,
+ E_V8QImode,
+ E_V4HImode,
+ E_V2SImode,
+ E_V1DImode,
+ E_V12QImode,
+ E_V6HImode,
+ E_V14QImode,
+ E_V16QImode,
+ E_V8HImode,
+ E_V4SImode,
+ E_V2DImode,
+ E_V1TImode,
+ E_V32QImode,
+ E_V16HImode,
+ E_V8SImode,
+ E_V4DImode,
+ E_V2TImode,
+ E_V64QImode,
+ E_V32HImode,
+ E_V16SImode,
+ E_V8DImode,
+ E_V4TImode,
+ E_V128QImode,
+ E_V64HImode,
+ E_V32SImode,
+ E_V16DImode,
+ E_V8TImode,
+ E_V64SImode,
+ E_V2SFmode,
+ E_V4SFmode,
+ E_V2DFmode,
+ E_V8SFmode,
+ E_V4DFmode,
+ E_V2TFmode,
+ E_V16SFmode,
+ E_V8DFmode,
+ E_V4TFmode,
+ E_V32SFmode,
+ E_V16DFmode,
+ E_V8TFmode,
+ E_V64SFmode,
+ E_V32DFmode,
+ E_V16TFmode,
+ MAX_MACHINE_MODE,
+ MIN_MODE_RANDOM = E_VOIDmode,
+ MAX_MODE_RANDOM = E_BLKmode,
+ MIN_MODE_CC = E_CCmode,
+ MAX_MODE_CC = E_CCFPmode,
+ MIN_MODE_INT = E_QImode,
+ MAX_MODE_INT = E_XImode,
+ MIN_MODE_PARTIAL_INT = E_P2QImode,
+ MAX_MODE_PARTIAL_INT = E_P2HImode,
+ MIN_MODE_FRACT = E_QQmode,
+ MAX_MODE_FRACT = E_TQmode,
+ MIN_MODE_UFRACT = E_UQQmode,
+ MAX_MODE_UFRACT = E_UTQmode,
+ MIN_MODE_ACCUM = E_HAmode,
+ MAX_MODE_ACCUM = E_TAmode,
+ MIN_MODE_UACCUM = E_UHAmode,
+ MAX_MODE_UACCUM = E_UTAmode,
+ MIN_MODE_FLOAT = E_SFmode,
+ MAX_MODE_FLOAT = E_TFmode,
+ MIN_MODE_DECIMAL_FLOAT = E_SDmode,
+ MAX_MODE_DECIMAL_FLOAT = E_TDmode,
+ MIN_MODE_COMPLEX_INT = E_CQImode,
+ MAX_MODE_COMPLEX_INT = E_CXImode,
+ MIN_MODE_COMPLEX_FLOAT = E_SCmode,
+ MAX_MODE_COMPLEX_FLOAT = E_TCmode,
+ MIN_MODE_VECTOR_BOOL = E_VOIDmode,
+ MAX_MODE_VECTOR_BOOL = E_VOIDmode,
+ MIN_MODE_VECTOR_INT = E_V2QImode,
+ MAX_MODE_VECTOR_INT = E_V64SImode,
+ MIN_MODE_VECTOR_FRACT = E_VOIDmode,
+ MAX_MODE_VECTOR_FRACT = E_VOIDmode,
+ MIN_MODE_VECTOR_UFRACT = E_VOIDmode,
+ MAX_MODE_VECTOR_UFRACT = E_VOIDmode,
+ MIN_MODE_VECTOR_ACCUM = E_VOIDmode,
+ MAX_MODE_VECTOR_ACCUM = E_VOIDmode,
+ MIN_MODE_VECTOR_UACCUM = E_VOIDmode,
+ MAX_MODE_VECTOR_UACCUM = E_VOIDmode,
+ MIN_MODE_VECTOR_FLOAT = E_V2SFmode,
+ MAX_MODE_VECTOR_FLOAT = E_V16TFmode,
+ NUM_MACHINE_MODES = MAX_MACHINE_MODE
+};
+
+extern unsigned get_mode_alignment (enum machine_mode);
+long
+ix86_static_rtx_alignment (enum machine_mode mode)
+{
+ if (mode == E_DFmode)
+ return 64;
+ if (((mode) == E_XFmode
+ || ((mode) == ((void) 0, E_V1TImode)
+ || (mode) == E_TImode
+ || (mode) == ((void) 0, E_V16QImode)
+ || (mode) == E_TFmode
+ || (mode) == ((void) 0, E_V8HImode)
+ || (mode) == ((void) 0, E_V2DFmode)
+ || (mode) == ((void) 0, E_V2DImode)
+ || (mode) == ((void) 0, E_V4SFmode)
+ || (mode) == ((void) 0, E_V4SImode)
+ || (mode) == ((void) 0, E_V32QImode)
+ || (mode) == ((void) 0, E_V16HImode)
+ || (mode) == ((void) 0, E_V8SImode)
+ || (mode) == ((void) 0, E_V4DImode)
+ || (mode) == ((void) 0, E_V8SFmode)
+ || (mode) == ((void) 0, E_V4DFmode)
+ || (mode) == ((void) 0, E_V2TImode)
+ || (mode) == ((void) 0, E_V8DImode)
+ || (mode) == ((void) 0, E_V64QImode)
+ || (mode) == ((void) 0, E_V16SImode)
+ || (mode) == ((void) 0, E_V32HImode)
+ || (mode) == ((void) 0, E_V8DFmode)
+ || (mode) == ((void) 0, E_V16SFmode))))
+ return ((128) >
+ (get_mode_alignment (mode)) ? (128)
+ : (get_mode_alignment (mode)));
+ return get_mode_alignment (mode);
+}