diff options
author | Martin Liska <mliska@suse.cz> | 2019-09-16 16:23:04 +0200 |
---|---|---|
committer | Martin Liska <marxin@gcc.gnu.org> | 2019-09-16 14:23:04 +0000 |
commit | cda65821d3c398f5ad969ca1de71e8cd70c58e55 (patch) | |
tree | 6fbc4b75458998b9de00ffd7f8b8945c8ec5c80a /gcc/match.pd | |
parent | 130c4034c732fae5196f02fe4248fb1a5a602276 (diff) | |
download | gcc-cda65821d3c398f5ad969ca1de71e8cd70c58e55.zip gcc-cda65821d3c398f5ad969ca1de71e8cd70c58e55.tar.gz gcc-cda65821d3c398f5ad969ca1de71e8cd70c58e55.tar.bz2 |
Rewrite second part of or_comparisons_1 into match.pd.
2019-09-16 Martin Liska <mliska@suse.cz>
* gimple-fold.c (or_comparisons_1): Remove rules moved
to ...
* match.pd: ... here.
From-SVN: r275752
Diffstat (limited to 'gcc/match.pd')
-rw-r--r-- | gcc/match.pd | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/gcc/match.pd b/gcc/match.pd index c465eab..4fd7590 100644 --- a/gcc/match.pd +++ b/gcc/match.pd @@ -2051,6 +2051,44 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) (if (code1 == NE_EXPR && val) { constant_boolean_node (true, type); }) (if (code1 == NE_EXPR && !val) @3)))))) +/* Convert (X OP1 CST1) || (X OP2 CST2). */ + +(for code1 (lt le gt ge) + (for code2 (lt le gt ge) + (simplify + (bit_ior (code1@3 @0 INTEGER_CST@1) (code2@4 @0 INTEGER_CST@2)) + (with + { + int cmp = tree_int_cst_compare (@1, @2); + } + (switch + /* Choose the more restrictive of two < or <= comparisons. */ + (if ((code1 == LT_EXPR || code1 == LE_EXPR) + && (code2 == LT_EXPR || code2 == LE_EXPR)) + (if ((cmp < 0) || (cmp == 0 && code1 == LT_EXPR)) + @4 + @3)) + /* Likewise chose the more restrictive of two > or >= comparisons. */ + (if ((code1 == GT_EXPR || code1 == GE_EXPR) + && (code2 == GT_EXPR || code2 == GE_EXPR)) + (if ((cmp > 0) || (cmp == 0 && code1 == GT_EXPR)) + @4 + @3)) + /* Check for singleton ranges. */ + (if (cmp == 0 + && ((code1 == LT_EXPR && code2 == GT_EXPR) + || (code1 == GT_EXPR && code2 == LT_EXPR))) + (ne @0 @2)) + /* Check for disjoint ranges. */ + (if (cmp >= 0 + && (code1 == LT_EXPR || code1 == LE_EXPR) + && (code2 == GT_EXPR || code2 == GE_EXPR)) + { constant_boolean_node (true, type); }) + (if (cmp <= 0 + && (code1 == GT_EXPR || code1 == GE_EXPR) + && (code2 == LT_EXPR || code2 == LE_EXPR)) + { constant_boolean_node (true, type); }) + ))))) /* We can't reassociate at all for saturating types. */ (if (!TYPE_SATURATING (type)) |