Commit 0036218b by Marc Glisse Committed by Marc Glisse

((X /[ex] A) +- B) * A --> X +- A * B

2018-10-02  Marc Glisse  <marc.glisse@inria.fr>

gcc/
	* match.pd (((X /[ex] A) +- B) * A): New transformation.

gcc/testsuite/
	* gcc.dg/tree-ssa/muldiv-1.c: New file.
	* gcc.dg/tree-ssa/muldiv-2.c: Likewise.

From-SVN: r264792
parent 86920074
2018-10-02 Marc Glisse <marc.glisse@inria.fr> 2018-10-02 Marc Glisse <marc.glisse@inria.fr>
* match.pd (((X /[ex] A) +- B) * A): New transformation.
2018-10-02 Marc Glisse <marc.glisse@inria.fr>
PR middle-end/87319 PR middle-end/87319
* fold-const.c (fold_plusminus_mult_expr): Handle complex and vectors. * fold-const.c (fold_plusminus_mult_expr): Handle complex and vectors.
* tree.c (signed_or_unsigned_type_for): Handle complex. * tree.c (signed_or_unsigned_type_for): Handle complex.
...@@ -2669,6 +2669,25 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) ...@@ -2669,6 +2669,25 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
(mult (convert1? (exact_div @0 @@1)) (convert2? @1)) (mult (convert1? (exact_div @0 @@1)) (convert2? @1))
(convert @0)) (convert @0))
/* ((X /[ex] A) +- B) * A --> X +- A * B. */
(for op (plus minus)
(simplify
(mult (convert1? (op (convert2? (exact_div @0 INTEGER_CST@@1)) INTEGER_CST@2)) @1)
(if (tree_nop_conversion_p (type, TREE_TYPE (@2))
&& tree_nop_conversion_p (TREE_TYPE (@0), TREE_TYPE (@2)))
(with
{
wi::overflow_type overflow;
wide_int mul = wi::mul (wi::to_wide (@1), wi::to_wide (@2),
TYPE_SIGN (type), &overflow);
}
(if (types_match (type, TREE_TYPE (@2))
&& types_match (TREE_TYPE (@0), TREE_TYPE (@2)) && !overflow)
(op @0 { wide_int_to_tree (type, mul); })
(with { tree utype = unsigned_type_for (type); }
(convert (op (convert:utype @0)
(mult (convert:utype @1) (convert:utype @2))))))))))
/* Canonicalization of binary operations. */ /* Canonicalization of binary operations. */
/* Convert X + -C into X - C. */ /* Convert X + -C into X - C. */
......
2018-10-02 Marc Glisse <marc.glisse@inria.fr>
* gcc.dg/tree-ssa/muldiv-1.c: New file.
* gcc.dg/tree-ssa/muldiv-2.c: Likewise.
2018-10-02 Segher Boessenkool <segher@kernel.crashing.org> 2018-10-02 Segher Boessenkool <segher@kernel.crashing.org>
PR target/87081 PR target/87081
......
/* { dg-do compile } */
/* { dg-options "-O3 -fdump-tree-optimized-raw" } */
// ldist produces (((q-p-4)/4)&...+1)*4
// Make sure we remove at least the division
// Eventually this should just be n*4
void foo(int*p, __SIZE_TYPE__ n){
for(int*q=p+n;p!=q;++p)*p=0;
}
/* { dg-final { scan-tree-dump "builtin_memset" "optimized" } } */
/* { dg-final { scan-tree-dump-not "div" "optimized" } } */
/* { dg-do compile } */
/* { dg-options "-O1 -fdump-tree-optimized-raw" } */
// 'a' should disappear, but we are not there yet
int* f(int* a, int* b, int* c){
__PTRDIFF_TYPE__ d = b - a;
d += 1;
return a + d;
}
/* { dg-final { scan-tree-dump-not "div" "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