From 6b6aa8d388ce3a330fb65db4e9d5120fbe3c1fe7 Mon Sep 17 00:00:00 2001 From: Marc Glisse Date: Tue, 26 Apr 2016 16:02:09 +0200 Subject: [PATCH] match.pd: X + X --> X * 2 for integers 2016-04-26 Marc Glisse gcc/ * genmatch.c (write_predicate): Add ATTRIBUTE_UNUSED. * fold-const.c (fold_binary_loc): Remove 2 transformations superseded by match.pd. * match.pd (x+x -> x*2): Generalize to integers. gcc/testsuite/ * gcc.dg/fold-plusmult.c: Adjust. * gcc.dg/no-strict-overflow-6.c: Adjust. * gcc.dg/gomp/loop-1.c: Xfail some tests. From-SVN: r235444 --- gcc/ChangeLog | 7 +++++++ gcc/fold-const.c | 19 ------------------- gcc/genmatch.c | 2 +- gcc/match.pd | 6 ++++-- gcc/testsuite/ChangeLog | 6 ++++++ gcc/testsuite/gcc.dg/fold-plusmult.c | 2 +- gcc/testsuite/gcc.dg/gomp/loop-1.c | 16 ++++++++-------- gcc/testsuite/gcc.dg/no-strict-overflow-6.c | 4 ++-- 8 files changed, 29 insertions(+), 33 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5dc4c748b47..e45f9c95c99 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2016-04-26 Marc Glisse + + * genmatch.c (write_predicate): Add ATTRIBUTE_UNUSED. + * fold-const.c (fold_binary_loc): Remove 2 transformations + superseded by match.pd. + * match.pd (x+x -> x*2): Generalize to integers. + 2016-04-26 Bernd Schmidt * config/i386/i386.md (operation on memory peephole): Duplicate an diff --git a/gcc/fold-const.c b/gcc/fold-const.c index 9514c71c629..1ce66e7d090 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -9956,25 +9956,6 @@ fold_binary_loc (location_t loc, fold_convert_loc (loc, type, negate_expr (op0)), tem); - /* (A + A) * C -> A * 2 * C */ - if (TREE_CODE (arg0) == PLUS_EXPR - && TREE_CODE (arg1) == INTEGER_CST - && operand_equal_p (TREE_OPERAND (arg0, 0), - TREE_OPERAND (arg0, 1), 0)) - return fold_build2_loc (loc, MULT_EXPR, type, - omit_one_operand_loc (loc, type, - TREE_OPERAND (arg0, 0), - TREE_OPERAND (arg0, 1)), - fold_build2_loc (loc, MULT_EXPR, type, - build_int_cst (type, 2) , arg1)); - - /* ((T) (X /[ex] C)) * C cancels out if the conversion is - sign-changing only. */ - if (TREE_CODE (arg1) == INTEGER_CST - && TREE_CODE (arg0) == EXACT_DIV_EXPR - && operand_equal_p (arg1, TREE_OPERAND (arg0, 1), 0)) - return fold_convert_loc (loc, type, TREE_OPERAND (arg0, 0)); - strict_overflow_p = false; if (TREE_CODE (arg1) == INTEGER_CST && 0 != (tem = extract_muldiv (op0, arg1, code, NULL_TREE, diff --git a/gcc/genmatch.c b/gcc/genmatch.c index ce964fa80be..2b666ddd6f7 100644 --- a/gcc/genmatch.c +++ b/gcc/genmatch.c @@ -3556,7 +3556,7 @@ write_predicate (FILE *f, predicate_id *p, decision_tree &dt, bool gimple) "%s%s (tree t%s%s)\n" "{\n", gimple ? "gimple_" : "tree_", p->id, p->nargs > 0 ? ", tree *res_ops" : "", - gimple ? ", tree (*valueize)(tree)" : ""); + gimple ? ", tree (*valueize)(tree) ATTRIBUTE_UNUSED" : ""); /* Conveniently make 'type' available. */ fprintf_indent (f, 2, "tree type = TREE_TYPE (t);\n"); diff --git a/gcc/match.pd b/gcc/match.pd index 08db842989d..5f22b13b690 100644 --- a/gcc/match.pd +++ b/gcc/match.pd @@ -1628,11 +1628,13 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) (if (!TREE_OVERFLOW (tem) || !flag_trapping_math) (minus @0 { tem; }))))) -/* Convert x+x into x*2.0. */ +/* Convert x+x into x*2. */ (simplify (plus @0 @0) (if (SCALAR_FLOAT_TYPE_P (type)) - (mult @0 { build_real (type, dconst2); }))) + (mult @0 { build_real (type, dconst2); }) + (if (INTEGRAL_TYPE_P (type)) + (mult @0 { build_int_cst (type, 2); })))) (simplify (minus integer_zerop @1) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 61bbcc50cd6..2144b142528 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2016-04-26 Marc Glisse + + * gcc.dg/fold-plusmult.c: Adjust. + * gcc.dg/no-strict-overflow-6.c: Adjust. + * gcc.dg/gomp/loop-1.c: Xfail some tests. + 2016-04-26 Bernd Schmidt * gcc.target/i386/avx512bw-vptestmb-1.c: Correct [xyz]mm register diff --git a/gcc/testsuite/gcc.dg/fold-plusmult.c b/gcc/testsuite/gcc.dg/fold-plusmult.c index 1781552081a..cd28fa6751b 100644 --- a/gcc/testsuite/gcc.dg/fold-plusmult.c +++ b/gcc/testsuite/gcc.dg/fold-plusmult.c @@ -11,4 +11,4 @@ int test2 (int a) return (a + a)*2; } -/* { dg-final { scan-tree-dump-times " \\\* 4" 2 "original" } } */ +/* { dg-final { scan-tree-dump-times "a \\\* 4" 2 "original" } } */ diff --git a/gcc/testsuite/gcc.dg/gomp/loop-1.c b/gcc/testsuite/gcc.dg/gomp/loop-1.c index 450a1ed9bea..527d3192923 100644 --- a/gcc/testsuite/gcc.dg/gomp/loop-1.c +++ b/gcc/testsuite/gcc.dg/gomp/loop-1.c @@ -44,14 +44,14 @@ f1 (int x) #pragma omp for for (i = 5; i <= i; i++) /* { dg-error "invalid controlling predicate|condition expression refers to iteration variable" } */ ; - #pragma omp for /* { dg-error "increment expression refers to iteration variable" } */ - for (i = 5; i < 16; i += i) + #pragma omp for /* { dg-error "increment expression refers to iteration variable" "" { xfail *-*-* } } */ + for (i = 5; i < 16; i += i) /* { dg-bogus "invalid increment expression" "" { xfail *-*-* } } */ ; #pragma omp for for (i = 5; i < 16; i = i + 2 * i) /* { dg-error "invalid increment expression|increment expression refers to iteration variable" } */ ; - #pragma omp for /* { dg-error "increment expression refers to iteration variable" } */ - for (i = 5; i < 16; i = i + i) + #pragma omp for /* { dg-error "increment expression refers to iteration variable" "" { xfail *-*-* } } */ + for (i = 5; i < 16; i = i + i) /* { dg-bogus "invalid increment expression" "" { xfail *-*-* } } */ ; #pragma omp for for (i = 5; i < 16; i = i + bar (i)) /* { dg-error "increment expression refers to iteration variable" } */ @@ -181,14 +181,14 @@ f2 (int x) #pragma omp for for (int i = 5; i <= i; i++) /* { dg-error "invalid controlling predicate|condition expression refers to iteration variable" } */ ; - #pragma omp for /* { dg-error "increment expression refers to iteration variable" } */ - for (int i = 5; i < 16; i += i) + #pragma omp for /* { dg-error "increment expression refers to iteration variable" "" { xfail *-*-* } } */ + for (int i = 5; i < 16; i += i) /* { dg-bogus "invalid increment expression" "" { xfail *-*-* } } */ ; #pragma omp for for (int i = 5; i < 16; i = i + 2 * i) /* { dg-error "invalid increment expression|increment expression refers to iteration variable" } */ ; - #pragma omp for /* { dg-error "increment expression refers to iteration variable" } */ - for (int i = 5; i < 16; i = i + i) + #pragma omp for /* { dg-error "increment expression refers to iteration variable" "" { xfail *-*-* } } */ + for (int i = 5; i < 16; i = i + i) /* { dg-bogus "invalid increment expression" "" { xfail *-*-* } } */ ; #pragma omp for for (int i = 5; i < 16; i = i + bar (i)) /* { dg-error "increment expression refers to iteration variable" } */ diff --git a/gcc/testsuite/gcc.dg/no-strict-overflow-6.c b/gcc/testsuite/gcc.dg/no-strict-overflow-6.c index c69e9689581..0a881196632 100644 --- a/gcc/testsuite/gcc.dg/no-strict-overflow-6.c +++ b/gcc/testsuite/gcc.dg/no-strict-overflow-6.c @@ -14,7 +14,7 @@ foo () int i, bits; for (i = 1, bits = 1; i > 0; i += i) ++bits; - return bits; + return bits - sizeof(int) * __CHAR_BIT__; } -/* { dg-final { scan-tree-dump "return bits" "optimized" } } */ +/* { dg-final { scan-tree-dump "return 0" "optimized" } } */ -- 2.11.4.GIT