diff options
author | Aldy Hernandez <aldyh@redhat.com> | 2020-04-20 10:10:32 +0200 |
---|---|---|
committer | Aldy Hernandez <aldyh@redhat.com> | 2020-04-20 16:09:26 +0200 |
commit | 6b179b967a7e8f915f3aa0fc7dfe5f919f66ca59 (patch) | |
tree | f78b8e7b6d2386e841715359b90dbcdd03daedde /gcc | |
parent | 717b963ed0a386c4e1993f13f97401bcd38671b0 (diff) | |
download | gcc-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.cc | 110 | ||||
-rw-r--r-- | gcc/gimple-range-gori.h | 6 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/rvrp-logic-1.c | 252 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/rvrp-logic-2.c | 193 |
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); +} |