| /* { dg-do compile } */ |
| /* { dg-options "-O3 -fdump-ipa-cp-details -fdump-ipa-fnsummary-details --param ipa-max-switch-predicate-bounds=10 -fno-inline" } */ |
| |
| int fn (); |
| |
| int data; |
| |
| int callee (int i) |
| { |
| switch (i % 128) |
| { |
| case -126: return i + 13; |
| case -127: return i + 5; |
| case -8: return i * i; |
| case 0: return i % 9; |
| case 5: |
| case 7: |
| case 6: return 3; |
| default: |
| fn (); |
| fn (); |
| fn (); |
| fn (); |
| fn (); |
| fn (); |
| fn (); |
| fn (); |
| fn (); |
| fn (); |
| fn (); |
| fn (); |
| fn (); |
| fn (); |
| fn (); |
| fn (); |
| fn (); |
| fn (); |
| fn (); |
| } |
| |
| return data += i; |
| } |
| |
| int fn2 (); |
| |
| int callee_complex_predicate (int i) |
| { |
| switch (i) |
| { |
| case 0: |
| fn (); |
| fn (); |
| fn (); |
| case 1: |
| fn (); |
| fn (); |
| case -1: |
| fn (); |
| case -2: |
| fn (); |
| fn (); |
| fn (); |
| fn (); |
| fn (); |
| fn (); |
| fn (); |
| fn (); |
| fn (); |
| fn (); |
| fn (); |
| fn (); |
| fn (); |
| fn (); |
| fn (); |
| fn (); |
| data += i; |
| break; |
| } |
| |
| if (i == 1000) |
| { |
| int j; |
| |
| for (j = 0; j < 100; j++) |
| fn2 (); |
| } |
| return i + 3; |
| } |
| |
| int caller () |
| { |
| return callee (-127) + |
| callee (-126) + |
| callee (-8) + |
| callee (0) + |
| callee (5) + |
| callee (6) + |
| callee (7) + |
| callee (100); |
| } |
| |
| /* { dg-final { scan-ipa-dump-times "Creating a specialized node of callee" 7 "cp" } } */ |
| /* { dg-final { scan-ipa-dump-not "op0,\\(# % 128\\) < -127" "fnsummary" } } */ |
| /* { dg-final { scan-ipa-dump "op0,\\(# % 128\\) > -126" "fnsummary" } } */ |
| /* { dg-final { scan-ipa-dump "op0,\\(# % 128\\) != -8" "fnsummary" } } */ |
| /* { dg-final { scan-ipa-dump "op0,\\(# % 128\\) != 0" "fnsummary" } } */ |
| /* { dg-final { scan-ipa-dump "op0,\\(# % 128\\) < 5" "fnsummary" } } */ |
| /* { dg-final { scan-ipa-dump "op0,\\(# % 128\\) > 7" "fnsummary" } } */ |
| /* { dg-final { scan-ipa-dump "loop depth: 1 .+ time:\[ \]*\[0-9\]+ predicate: \\(op0 == 1000\\)\[\r\n]+" "fnsummary" } } */ |