Commit 6b6aa8d3 by Marc Glisse Committed by Marc Glisse

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.

From-SVN: r235444
parent a84454dc
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
......
......@@ -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,
......
......@@ -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");
......
......@@ -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)
......
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
......
......@@ -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" } } */
......@@ -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" } */
......
......@@ -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" } } */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment