85 lines
1.8 KiB
C
85 lines
1.8 KiB
C
/* PR tree-optimization/61839. */
|
|
/* { dg-do compile } */
|
|
/* { dg-options "-O2 -fdump-tree-evrp" } */
|
|
/* { dg-require-effective-target int32plus } */
|
|
|
|
__attribute__ ((noinline))
|
|
int foo ()
|
|
{
|
|
int a = -1;
|
|
volatile unsigned b = 1U;
|
|
int c = 1;
|
|
c = (a + 972195718) / (b ? 2 : 0);
|
|
if (c == 486097858)
|
|
;
|
|
else
|
|
__builtin_abort ();
|
|
return 0;
|
|
}
|
|
|
|
__attribute__ ((noinline))
|
|
int bar ()
|
|
{
|
|
int a = -1;
|
|
volatile unsigned b = 1U;
|
|
int c = 1;
|
|
c = (a + 972195718) % (b ? 2 : 0);
|
|
if (c == 1)
|
|
;
|
|
else
|
|
__builtin_abort ();
|
|
return 0;
|
|
}
|
|
|
|
__attribute__ ((noinline))
|
|
int bar2 ()
|
|
{
|
|
int a = -1;
|
|
volatile unsigned b = 1U;
|
|
int c = 1;
|
|
c = (a + 972195716) % (b ? 1 : 2);
|
|
if (c == 0)
|
|
;
|
|
else
|
|
__builtin_abort ();
|
|
return 0;
|
|
}
|
|
|
|
/* Ensure we are folding modulus sub-ranges properly. */
|
|
__attribute__ ((noinline))
|
|
int mod (int a, int b)
|
|
{
|
|
int v1, v2;
|
|
v1 = (a < 10) ? 12 : 24;
|
|
v2 = (b > 20) ? 3 : 6;
|
|
|
|
if (a > 20)
|
|
v1 = v1 * 2;
|
|
if (b > 20)
|
|
v2 = v2 * 2;
|
|
|
|
if (a == b)
|
|
v2 = 0;
|
|
|
|
/* v1 == 12, 24, or 48. v2 == 0, 3, 6, or 12. */
|
|
int c = v1 % v2;
|
|
if (c == 0)
|
|
;
|
|
else
|
|
__builtin_abort ();
|
|
return 0;
|
|
}
|
|
|
|
/* EVRP now makes transformations in all functions, leaving a single
|
|
* builtin_abort call in bar2. */
|
|
/* { dg-final { scan-tree-dump-times "__builtin_abort" 1 "evrp" } } */
|
|
|
|
/* Make sure to optimize 972195717 / 0 in function foo. */
|
|
/* { dg-final { scan-tree-dump-times "972195717 / " 0 "evrp" } } */
|
|
/* Make sure to optimize 972195717 % 0 in function bar. */
|
|
/* { dg-final { scan-tree-dump-times "972195717 % " 0 "evrp" } } */
|
|
/* Make sure to optimize 972195717 % [1,2] function bar2. */
|
|
/* { dg-final { scan-tree-dump-times "972195715 % " 0 "evrp" } } */
|
|
/* [12,12][24,24][48,48] % [0,0][3,3][6,6][12,12] == [0,0] */
|
|
/* { dg-final { scan-tree-dump-times "%" 0 "evrp" } } */
|