diff options
author | Martin Liska <mliska@suse.cz> | 2019-09-16 16:22:50 +0200 |
---|---|---|
committer | Martin Liska <marxin@gcc.gnu.org> | 2019-09-16 14:22:50 +0000 |
commit | 130c4034c732fae5196f02fe4248fb1a5a602276 (patch) | |
tree | 088f417550125e1cdfb40c14a47ae2d9cd696f73 /gcc/gimple-fold.c | |
parent | ae9c3507829ca139749ac3f9cf4a78707a036d3b (diff) | |
download | gcc-130c4034c732fae5196f02fe4248fb1a5a602276.zip gcc-130c4034c732fae5196f02fe4248fb1a5a602276.tar.gz gcc-130c4034c732fae5196f02fe4248fb1a5a602276.tar.bz2 |
Rewrite first 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: r275751
Diffstat (limited to 'gcc/gimple-fold.c')
-rw-r--r-- | gcc/gimple-fold.c | 87 |
1 files changed, 1 insertions, 86 deletions
diff --git a/gcc/gimple-fold.c b/gcc/gimple-fold.c index f82bedc..694d2ee 100644 --- a/gcc/gimple-fold.c +++ b/gcc/gimple-fold.c @@ -6050,93 +6050,8 @@ or_comparisons_1 (tree type, enum tree_code code1, tree op1a, tree op1b, { int cmp = tree_int_cst_compare (op1b, op2b); - /* If we have (op1a != op1b), we should either be able to - return that or TRUE, depending on whether the constant op1b - also satisfies the other comparison against op2b. */ - if (code1 == NE_EXPR) - { - bool done = true; - bool val; - switch (code2) - { - case EQ_EXPR: val = (cmp == 0); break; - case NE_EXPR: val = (cmp != 0); break; - case LT_EXPR: val = (cmp < 0); break; - case GT_EXPR: val = (cmp > 0); break; - case LE_EXPR: val = (cmp <= 0); break; - case GE_EXPR: val = (cmp >= 0); break; - default: done = false; - } - if (done) - { - if (val) - return boolean_true_node; - else - return fold_build2 (code1, boolean_type_node, op1a, op1b); - } - } - /* Likewise if the second comparison is a != comparison. */ - else if (code2 == NE_EXPR) - { - bool done = true; - bool val; - switch (code1) - { - case EQ_EXPR: val = (cmp == 0); break; - case NE_EXPR: val = (cmp != 0); break; - case LT_EXPR: val = (cmp > 0); break; - case GT_EXPR: val = (cmp < 0); break; - case LE_EXPR: val = (cmp >= 0); break; - case GE_EXPR: val = (cmp <= 0); break; - default: done = false; - } - if (done) - { - if (val) - return boolean_true_node; - else - return fold_build2 (code2, boolean_type_node, op2a, op2b); - } - } - - /* See if an equality test is redundant with the other comparison. */ - else if (code1 == EQ_EXPR) - { - bool val; - switch (code2) - { - case EQ_EXPR: val = (cmp == 0); break; - case NE_EXPR: val = (cmp != 0); break; - case LT_EXPR: val = (cmp < 0); break; - case GT_EXPR: val = (cmp > 0); break; - case LE_EXPR: val = (cmp <= 0); break; - case GE_EXPR: val = (cmp >= 0); break; - default: - val = false; - } - if (val) - return fold_build2 (code2, boolean_type_node, op2a, op2b); - } - else if (code2 == EQ_EXPR) - { - bool val; - switch (code1) - { - case EQ_EXPR: val = (cmp == 0); break; - case NE_EXPR: val = (cmp != 0); break; - case LT_EXPR: val = (cmp > 0); break; - case GT_EXPR: val = (cmp < 0); break; - case LE_EXPR: val = (cmp >= 0); break; - case GE_EXPR: val = (cmp <= 0); break; - default: - val = false; - } - if (val) - return fold_build2 (code1, boolean_type_node, op1a, op1b); - } - /* Chose the less restrictive of two < or <= comparisons. */ - else if ((code1 == LT_EXPR || code1 == LE_EXPR) + if ((code1 == LT_EXPR || code1 == LE_EXPR) && (code2 == LT_EXPR || code2 == LE_EXPR)) { if ((cmp < 0) || (cmp == 0 && code1 == LT_EXPR)) |