1/* PR tree-optimization/22026 2 VRP used think that ~[0,0] + ~[0,0] = ~[0,0], which is wrong. The 3 same applies to subtraction and unsigned multiplication. */ 4 5/* { dg-do compile } */ 6/* { dg-options "-O2 -fdump-tree-vrp" } */ 7 8int 9plus (int x, int y) 10{ 11 if (x != 0) 12 if (y != 0) 13 { 14 int z = x + y; 15 if (z != 0) 16 return 1; 17 } 18 return 0; 19} 20 21int 22minus (int x, int y) 23{ 24 if (x != 0) 25 if (y != 0) 26 { 27 int z = x - y; 28 if (z != 0) 29 return 1; 30 } 31 return 0; 32} 33 34int 35mult (unsigned x, unsigned y) 36{ 37 if (x != 0) 38 if (y != 0) 39 { 40 unsigned z = x * y; 41 if (z != 0) 42 return 1; 43 } 44 return 0; 45} 46 47/* None of the predicates can be folded in these functions. */ 48/* { dg-final { scan-tree-dump-times "Folding predicate" 0 "vrp" } } */ 49/* { dg-final { cleanup-tree-dump "vrp" } } */ 50