| /* { dg-do compile } */ |
| /* -mlongcall will cause us to place &foo in the CTR register. */ |
| /* { dg-skip-if "" { powerpc*-*-* } { "-mlongcall" } { "" } } */ |
| /* { dg-options "-O1 -ftree-loop-ivcanon -funroll-loops -fdump-tree-ivcanon-details -fdump-tree-cunroll-details -fdump-tree-optimized" } */ |
| /* { dg-options "-O1 -ftree-loop-ivcanon -funroll-loops -fdump-tree-ivcanon-details -fdump-tree-cunroll-details -fdump-tree-optimized -mshort-calls" {target epiphany-*-*} } */ |
| |
| |
| /* On 31-bit S/390 the function address will be stored (once) in the literal pool, |
| so scan-assembler-times "foo" will return 1 even if the loop is fully unrolled. |
| -msmall-exec avoids this by enabling a call instruction with immediate operand. */ |
| /* { dg-options "-O1 -ftree-loop-ivcanon -funroll-loops -fdump-tree-ivcanon-details -fdump-tree-cunroll-details -fdump-tree-optimized -msmall-exec" { target s390-*-* } } */ |
| |
| /* On Darwin, we call extern functions via a stub in PIC mode which is default and |
| the stub is named after the function. To avoid this we use -static to go out |
| of PIC mode. */ |
| /* { dg-options "-O1 -ftree-loop-ivcanon -funroll-loops -fdump-tree-ivcanon-details -fdump-tree-cunroll-details -fdump-tree-optimized -static" { target *-*-darwin* } } */ |
| |
| /* On MIPS, disable generating hints (R_MIPS_JALR) for PIC calls. In addition |
| to the load from the GOT this also contains the name of the function so for |
| each call the function name would appear twice. */ |
| /* { dg-options "-O1 -ftree-loop-ivcanon -funroll-loops -fdump-tree-ivcanon-details -fdump-tree-cunroll-details -fdump-tree-optimized -mno-relax-pic-calls" { target mips*-*-* } } */ |
| __attribute__ ((pure)) |
| int foo (int x); |
| int xxx(void) |
| { |
| int x = 45; |
| int sum = 0; |
| |
| while (x >>= 1) |
| sum += foo (x) * 2; |
| return sum; |
| } |
| |
| /* We should be able to find out that the loop iterates four times and unroll it completely. */ |
| |
| /* { dg-final { scan-tree-dump-times "Added canonical iv to loop 1, 4 iterations" 1 "ivcanon"} } */ |
| /* { dg-final { scan-tree-dump-times "loop with 4 iterations completely unrolled" 1 "cunroll"} } */ |
| /* { dg-final { scan-tree-dump-times "foo" 5 "optimized"} } */ |
| |
| /* Because hppa, ia64 and Windows targets include an external declaration |
| for foo as well as the calls we need to look for something more specific |
| than just foo in order to count only the calls and not the declaration. */ |
| /* The SH targets always use separate instructions to load the address |
| and to do the actual call - bsr is only generated by link time |
| relaxation. */ |
| /* CRIS and MSP430 keep the address in a register. */ |
| /* m68k sometimes puts the address in a register, depending on CPU and PIC. */ |
| |
| /* { dg-final { scan-assembler-times "foo" 5 { xfail hppa*-*-* ia64*-*-* sh*-*-* cris-*-* fido-*-* m68k-*-* i?86-*-mingw* i?86-*-cygwin* x86_64-*-mingw* visium-*-* nvptx*-*-* pdp11*-*-* msp430-*-* amdgcn*-*-* } } } */ |
| /* { dg-final { scan-assembler-times "foo,%r" 5 { target hppa*-*-* } } } */ |
| /* { dg-final { scan-assembler-times "= foo" 5 { target ia64*-*-* } } } */ |
| /* { dg-final { scan-assembler-times "call\[ \t\]*_foo" 5 { target i?86-*-mingw* i?86-*-cygwin* } } } */ |
| /* { dg-final { scan-assembler-times "call\[ \t\]*foo" 5 { target x86_64-*-mingw* } } } */ |
| /* { dg-final { scan-assembler-times "jsr|bsrf|blink\ttr?,r18" 5 { target sh*-*-* } } } */ |
| /* { dg-final { scan-assembler-times "Jsr \\\$r" 5 { target cris-*-* } } } */ |
| /* { dg-final { scan-assembler-times "\[jb\]sr" 5 { target fido-*-* m68k-*-* pdp11-*-* } } } */ |
| /* { dg-final { scan-assembler-times "bra *tr,r\[1-9\]*,r21" 5 { target visium-*-* } } } */ |
| /* { dg-final { scan-assembler-times "(?n)\[ \t\]call\[ \t\].*\[ \t\]foo," 5 { target nvptx*-*-* } } } */ |
| /* { dg-final { scan-assembler-times "s_swappc_b64" 5 { target { amdgcn*-*-* } } } } */ |