match.pd: Add bitwise and pattern [PR106243]
This patch adds a new optimization to match.pd. The pattern, -x & 1, now gets simplified to x & 1, reducing the number of instructions produced. This patch also adds tests for the optimization rule. Bootstrapped/regtested on x86_64-pc-linux-gnu. PR tree-optimization/106243 gcc/ChangeLog: * match.pd (-x & 1): New simplification. gcc/testsuite/ChangeLog: * gcc.dg/pr106243-1.c: New test. * gcc.dg/pr106243.c: New test.
This commit is contained in:
parent
d8552eaddc
commit
39579ba8de
3 changed files with 66 additions and 0 deletions
|
@ -8061,3 +8061,8 @@ and,
|
|||
(if (TYPE_UNSIGNED (TREE_TYPE (@0)))
|
||||
(bit_and @0 @1)
|
||||
(cond (le @0 @1) @0 (bit_and @0 @1))))))
|
||||
|
||||
/* -x & 1 -> x & 1. */
|
||||
(simplify
|
||||
(bit_and (negate @0) integer_onep@1)
|
||||
(bit_and @0 @1))
|
||||
|
|
18
gcc/testsuite/gcc.dg/pr106243-1.c
Normal file
18
gcc/testsuite/gcc.dg/pr106243-1.c
Normal file
|
@ -0,0 +1,18 @@
|
|||
/* PR tree-optimization/106243 */
|
||||
/* { dg-do run } */
|
||||
/* { dg-options "-O2" } */
|
||||
|
||||
#include "pr106243.c"
|
||||
|
||||
int main () {
|
||||
|
||||
if (foo(3) != 1
|
||||
|| bar(-6) != 0
|
||||
|| baz(17) != 1
|
||||
|| qux(-128) != 0
|
||||
|| foo(127) != 1) {
|
||||
__builtin_abort();
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
43
gcc/testsuite/gcc.dg/pr106243.c
Normal file
43
gcc/testsuite/gcc.dg/pr106243.c
Normal file
|
@ -0,0 +1,43 @@
|
|||
/* PR tree-optimization/106243 */
|
||||
/* { dg-do compile } */
|
||||
/* { dg-options "-O2 -fdump-tree-optimized" } */
|
||||
|
||||
#define vector __attribute__((vector_size(4*sizeof(int))))
|
||||
|
||||
/* Test from PR. */
|
||||
__attribute__((noipa)) int foo (int x) {
|
||||
return -x & 1;
|
||||
}
|
||||
|
||||
/* Other test from PR. */
|
||||
__attribute__((noipa)) int bar (int x) {
|
||||
return (0 - x) & 1;
|
||||
}
|
||||
|
||||
/* Forward propogation. */
|
||||
__attribute__((noipa)) int baz (int x) {
|
||||
x = -x;
|
||||
return x & 1;
|
||||
}
|
||||
|
||||
/* Commutative property. */
|
||||
__attribute__((noipa)) int qux (int x) {
|
||||
return 1 & -x;
|
||||
}
|
||||
|
||||
/* Vector test case. */
|
||||
__attribute__((noipa)) vector int waldo (vector int x) {
|
||||
return -x & 1;
|
||||
}
|
||||
|
||||
/* Should not simplify. */
|
||||
__attribute__((noipa)) int thud (int x) {
|
||||
return -x & 2;
|
||||
}
|
||||
|
||||
/* Should not simplify. */
|
||||
__attribute__((noipa)) int corge (int x) {
|
||||
return -x & -1;
|
||||
}
|
||||
|
||||
/* { dg-final {scan-tree-dump-times "-" 2 "optimized" } } */
|
Loading…
Add table
Reference in a new issue