summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorglisse <glisse@138bc75d-0d04-0410-961f-82ee72b054a4>2016-04-26 14:02:09 +0000
committerglisse <glisse@138bc75d-0d04-0410-961f-82ee72b054a4>2016-04-26 14:02:09 +0000
commitbff407f263189c94b0f369a5a5cc1f9490373fa8 (patch)
treec9d8cd56bc07eff23e7a6bbb4f64796773adab46
parenta9ad7efd6e2b255aee374c6a652180cfdaed963a (diff)
downloadgcc-bff407f263189c94b0f369a5a5cc1f9490373fa8.tar.gz
match.pd: X + X --> X * 2 for integers
2016-04-26 Marc Glisse <marc.glisse@inria.fr> 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@235444 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/fold-const.c19
-rw-r--r--gcc/genmatch.c2
-rw-r--r--gcc/match.pd6
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/gcc.dg/fold-plusmult.c2
-rw-r--r--gcc/testsuite/gcc.dg/gomp/loop-1.c16
-rw-r--r--gcc/testsuite/gcc.dg/no-strict-overflow-6.c4
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 <marc.glisse@inria.fr>
+
+ * 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 <bschmidt@redhat.com>
* 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 <marc.glisse@inria.fr>
+
+ * 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 <bschmidt@redhat.com>
* 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 "<a> \\\* 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" } } */