blob: dce54ddffe8020b0d358c6cb933a89707088da23 [file] [log] [blame]
/* PR tree-optimization/98304 */
/* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-optimized" } */
/* Signed test function. */
__attribute__((noipa)) int foo(int n) {
return n - (((n > 63) ? n : 63) & -64);
}
/* Unsigned test function. */
__attribute__((noipa)) unsigned int bar(unsigned int n) {
return n - (((n > 63) ? n : 63) & -64);
}
/* Different power of 2. */
__attribute__((noipa)) int goo(int n) {
return n - (((n > 31) ? n : 31) & -32);
}
/* Commutative property (should be identical to foo) */
__attribute__((noipa)) int baz(int n) {
return n - (((64 > n) ? 63 : n) & -64);
}
/* < instead of >. */
__attribute__((noipa)) int fred(int n) {
return n - (((63 < n) ? n : 63) & -64);
}
/* Constant is not a power of 2 so should not simplify. */
__attribute__((noipa)) int qux(int n) {
return n - (((n > 62) ? n : 62) & -63);
}
/* Constant is not a power of 2 so should not simplify. */
__attribute__((noipa)) unsigned int quux(unsigned int n) {
return n - (((n > 62) ? n : 62) & -63);
}
/* Constant is a variable so should not simplify. */
__attribute__((noipa)) int waldo(int n, int x) {
return n - (((n > 63) ? n : 63) & x);
}
/* Difference between constants is not -1. */
__attribute__((noipa)) int corge(int n) {
return n - (((n > 1) ? n : 1) & -64);
}
/* Difference between constants is not -1. */
__attribute__((noipa)) unsigned int thud(unsigned int n)
{
return n - (((n > 1) ? n : 1) & -64);
}
/* { dg-final { scan-tree-dump-times " - " 5 "optimized" } } */
/* { dg-final { scan-tree-dump-times " <= " 4 "optimized" } } */