diff options
author | Pan Li <pan2.li@intel.com> | 2024-05-23 08:09:40 +0800 |
---|---|---|
committer | Pan Li <pan2.li@intel.com> | 2024-05-23 22:46:43 +0800 |
commit | dca3e6b9049ff3c1432d4717ca2309e7aad20447 (patch) | |
tree | 26daa9d000853416e33ee11e620b1395c6c463d6 /gcc | |
parent | 2b2476d4d18c92b8aba3567ebccd2100c2f7c258 (diff) | |
download | gcc-dca3e6b9049ff3c1432d4717ca2309e7aad20447.zip gcc-dca3e6b9049ff3c1432d4717ca2309e7aad20447.tar.gz gcc-dca3e6b9049ff3c1432d4717ca2309e7aad20447.tar.bz2 |
Match: Add overloaded types_match to avoid code dup [NFC]
There are sorts of match pattern for SAT related cases, there will be
some duplicated code to check the dest, op_0, op_1 are same tree types.
Aka ternary tree type matches. Thus, add overloaded types_match func
do this and avoid match code duplication.
The below test suites are passed for this patch:
* The rv64gcv fully regression test.
* The x86 bootstrap test.
* The x86 regression test.
gcc/ChangeLog:
* generic-match-head.cc (types_match): Add overloaded types_match
for 3 types.
* gimple-match-head.cc (types_match): Ditto.
* match.pd: Leverage overloaded types_match.
Signed-off-by: Pan Li <pan2.li@intel.com>
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/generic-match-head.cc | 10 | ||||
-rw-r--r-- | gcc/gimple-match-head.cc | 10 | ||||
-rw-r--r-- | gcc/match.pd | 30 |
3 files changed, 30 insertions, 20 deletions
diff --git a/gcc/generic-match-head.cc b/gcc/generic-match-head.cc index 0d3f648..e2e1e4b 100644 --- a/gcc/generic-match-head.cc +++ b/gcc/generic-match-head.cc @@ -59,6 +59,16 @@ types_match (tree t1, tree t2) return TYPE_MAIN_VARIANT (t1) == TYPE_MAIN_VARIANT (t2); } +/* Routine to determine if the types T1, T2 and T3 are effectively + the same for GENERIC. If T1, T2 or T2 is not a type, the test + applies to their TREE_TYPE. */ + +static inline bool +types_match (tree t1, tree t2, tree t3) +{ + return types_match (t1, t2) && types_match (t2, t3); +} + /* Return if T has a single use. For GENERIC, we assume this is always true. */ diff --git a/gcc/gimple-match-head.cc b/gcc/gimple-match-head.cc index 5f8a1a1..49b1dde 100644 --- a/gcc/gimple-match-head.cc +++ b/gcc/gimple-match-head.cc @@ -79,6 +79,16 @@ types_match (tree t1, tree t2) return types_compatible_p (t1, t2); } +/* Routine to determine if the types T1, T2 and T3 are effectively + the same for GIMPLE. If T1, T2 or T2 is not a type, the test + applies to their TREE_TYPE. */ + +static inline bool +types_match (tree t1, tree t2, tree t3) +{ + return types_match (t1, t2) && types_match (t2, t3); +} + /* Return if T has a single use. For GIMPLE, we also allow any non-SSA_NAME (ie constants) and zero uses to cope with uses that aren't linked up yet. */ diff --git a/gcc/match.pd b/gcc/match.pd index 35e3d82..7081d76 100644 --- a/gcc/match.pd +++ b/gcc/match.pd @@ -3048,38 +3048,28 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) /* Unsigned Saturation Add */ (match (usadd_left_part_1 @0 @1) (plus:c @0 @1) - (if (INTEGRAL_TYPE_P (type) - && TYPE_UNSIGNED (TREE_TYPE (@0)) - && types_match (type, TREE_TYPE (@0)) - && types_match (type, TREE_TYPE (@1))))) + (if (INTEGRAL_TYPE_P (type) && TYPE_UNSIGNED (type) + && types_match (type, @0, @1)))) (match (usadd_left_part_2 @0 @1) (realpart (IFN_ADD_OVERFLOW:c @0 @1)) - (if (INTEGRAL_TYPE_P (type) - && TYPE_UNSIGNED (TREE_TYPE (@0)) - && types_match (type, TREE_TYPE (@0)) - && types_match (type, TREE_TYPE (@1))))) + (if (INTEGRAL_TYPE_P (type) && TYPE_UNSIGNED (type) + && types_match (type, @0, @1)))) (match (usadd_right_part_1 @0 @1) (negate (convert (lt (plus:c @0 @1) @0))) - (if (INTEGRAL_TYPE_P (type) - && TYPE_UNSIGNED (TREE_TYPE (@0)) - && types_match (type, TREE_TYPE (@0)) - && types_match (type, TREE_TYPE (@1))))) + (if (INTEGRAL_TYPE_P (type) && TYPE_UNSIGNED (type) + && types_match (type, @0, @1)))) (match (usadd_right_part_1 @0 @1) (negate (convert (gt @0 (plus:c @0 @1)))) - (if (INTEGRAL_TYPE_P (type) - && TYPE_UNSIGNED (TREE_TYPE (@0)) - && types_match (type, TREE_TYPE (@0)) - && types_match (type, TREE_TYPE (@1))))) + (if (INTEGRAL_TYPE_P (type) && TYPE_UNSIGNED (type) + && types_match (type, @0, @1)))) (match (usadd_right_part_2 @0 @1) (negate (convert (ne (imagpart (IFN_ADD_OVERFLOW:c @0 @1)) integer_zerop))) - (if (INTEGRAL_TYPE_P (type) - && TYPE_UNSIGNED (TREE_TYPE (@0)) - && types_match (type, TREE_TYPE (@0)) - && types_match (type, TREE_TYPE (@1))))) + (if (INTEGRAL_TYPE_P (type) && TYPE_UNSIGNED (type) + && types_match (type, @0, @1)))) /* We cannot merge or overload usadd_left_part_1 and usadd_left_part_2 because the sub part of left_part_2 cannot work with right_part_1. |