| /* PR optimization/10955 */ |
| /* Originator: <heinrich.brand@fujitsu-siemens.com> */ |
| |
| /* This used to fail on SPARC32 at -O3 because the loop unroller |
| wrongly thought it could eliminate a pseudo in a loop, while |
| the pseudo was used outside the loop. */ |
| |
| extern void abort(void); |
| |
| #define COMPLEX struct CS |
| |
| COMPLEX { |
| long x; |
| long y; |
| }; |
| |
| |
| static COMPLEX CCID (COMPLEX x) |
| { |
| COMPLEX a; |
| |
| a.x = x.x; |
| a.y = x.y; |
| |
| return a; |
| } |
| |
| |
| static COMPLEX CPOW (COMPLEX x, int y) |
| { |
| COMPLEX a; |
| a = x; |
| |
| while (--y > 0) |
| a=CCID(a); |
| |
| return a; |
| } |
| |
| |
| static int c5p (COMPLEX x) |
| { |
| COMPLEX a,b; |
| a = CPOW (x, 2); |
| b = CCID( CPOW(a,2) ); |
| |
| return (b.x == b.y); |
| } |
| |
| |
| int main (void) |
| { |
| COMPLEX x; |
| |
| x.x = -7; |
| x.y = -7; |
| |
| if (!c5p(x)) |
| abort(); |
| |
| return 0; |
| } |