| /* { dg-options "-O2 -fno-devirtualize --param=profile-func-internal-id=0 -fdump-ipa-profile-optimized -fdump-ipa-afdo-optimized -Wno-coverage-mismatch -Wno-attributes" } */ |
| |
| #ifdef _PROFILE_USE |
| #include "reorder_class1.h" |
| #include "reorder_class2.h" |
| #else |
| #include "reorder_class2.h" |
| #include "reorder_class1.h" |
| #endif |
| |
| int g; |
| static __attribute__((always_inline)) |
| void test1 (A *tc) |
| { |
| int i; |
| for (i = 0; i < 10000000; i++) |
| g += tc->foo(); |
| if (g<100) g++; |
| } |
| |
| static __attribute__((always_inline)) |
| void test2 (B *tc) |
| { |
| int i; |
| for (i = 0; i < 10000000; i++) |
| g += tc->foo(); |
| } |
| |
| |
| #ifdef _PROFILE_USE |
| __attribute__((noinline)) void test_a(A *ap) { test1 (ap); } |
| __attribute__((noinline)) void test_b(B *bp) { test2 (bp); } |
| #else |
| __attribute__((noinline)) void test_b(B *bp) { test2 (bp); } |
| __attribute__((noinline)) void test_a(A *ap) { test1 (ap); } |
| #endif |
| |
| int main() |
| { |
| A* ap = new A(); |
| B* bp = new B(); |
| |
| test_a(ap); |
| test_b(bp); |
| } |
| |
| /* { dg-final-use-not-autofdo { scan-ipa-dump-times "Indirect call -> direct call" 2 "profile" } } */ |
| /* { dg-final-use-autofdo { scan-ipa-dump-times "Indirect call -> direct call" 2 "afdo" } } */ |