| /* PR tree-optimization/102738 */ |
| /* { dg-options "-O2 -fdump-tree-evrp" } */ |
| /* { dg-do compile { target int128 } } */ |
| |
| /* Remove arithmetic shift right when the LHS is known to be 0 or -1. */ |
| |
| int a1(__int128 f, int g) |
| { |
| /* Leaves f >> 127. */ |
| return (f >> 127) >> g; |
| } |
| |
| int a2(int f, int g) |
| { |
| /* Leaves f >> 31. */ |
| return (f >> 31) >> g; |
| } |
| |
| int a3(int f, int g) |
| { |
| if (f == 0 || f == -1) |
| return f >> g; |
| __builtin_unreachable(); |
| } |
| |
| int a4(int f, int g) |
| { |
| if (f == 0 || f == 1) |
| return (-f) >> g; |
| __builtin_unreachable(); |
| } |
| |
| int a5(int f, int g) |
| { |
| if (f == 0 || f == 1) |
| return (f-1) >> g; |
| return 0; |
| } |
| |
| int a6(int f, int g) |
| { |
| if (f == 6 || f == 7) |
| return (f-7) >> g; |
| __builtin_unreachable(); |
| } |
| |
| /* { dg-final { scan-tree-dump-times " >> 127" 1 "evrp" } } */ |
| /* { dg-final { scan-tree-dump-times " >> 31" 1 "evrp" } } */ |
| /* { dg-final { scan-tree-dump-times " >> " 2 "evrp" } } */ |