123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272 |
- /* Check that various C constructs are handled correctly by profile-directed
- block ordering.
-
- This test is the same as gcov-4.c. The "count" comments are left in to
- make comparisons easier; they are ignored for this test. */
- extern void abort (void);
- int do_something (int i)
- {
- return i;
- }
- /* Check static inline functions. */
- int unref_val;
- static inline int
- unreferenced (int i, int j)
- {
- return i - j;
- }
- static inline int
- uncalled (int i, int j)
- {
- return i * j;
- }
- static inline int
- called (int i, int j)
- {
- return i + j; /* count(1) */
- }
- void
- call_unref ()
- {
- if (unref_val) /* count(1) */
- unref_val = uncalled (1, 2);
- unref_val = called (unref_val, 4); /* count(1) */
- }
- /* Check for loops. */
- int for_val1;
- int for_val2;
- int for_temp;
- int
- test_for1 (int n)
- {
- int i;
- for_temp = 1; /* count(3) */
- for (i = 0; i < n; i++)
- for_temp++; /* count(9) */
- return for_temp; /* count(3) */
- }
- int
- test_for2 (int m, int n, int o)
- {
- int i, j, k;
- for_temp = 1; /* count(6) */
- for (i = 0; i < n; i++)
- for (j = 0; j < m; j++)
- for (k = 0; k < o; k++)
- for_temp++; /* count(81) */
- return for_temp; /* count(6) */
- }
- void
- call_for ()
- {
- for_val1 += test_for1 (0);
- for_val1 += test_for1 (2);
- for_val1 += test_for1 (7);
- for_val2 += test_for2 (0, 0, 0);
- for_val2 += test_for2 (1, 0, 0);
- for_val2 += test_for2 (1, 3, 0);
- for_val2 += test_for2 (1, 3, 1);
- for_val2 += test_for2 (3, 1, 5);
- for_val2 += test_for2 (3, 7, 3);
- }
- /* Check the use of goto. */
- int goto_val;
- int
- test_goto1 (int f)
- {
- if (f) /* count(2) */
- goto lab1; /* count(1) */
- return 1; /* count(1) */
- lab1:
- return 2; /* count(1) */
- }
- int
- test_goto2 (int f)
- {
- int i;
- for (i = 0; i < 10; i++) /* count(15) */
- if (i == f) goto lab2; /* count(14) */
- return 4; /* count(1) */
- lab2:
- return 8; /* count(1) */
- }
- void
- call_goto ()
- {
- goto_val += test_goto1 (0);
- goto_val += test_goto1 (1);
- goto_val += test_goto2 (3);
- goto_val += test_goto2 (30);
- }
- /* Check nested if-then-else statements. */
- int ifelse_val1;
- int ifelse_val2;
- int ifelse_val3;
- int
- test_ifelse1 (int i, int j)
- {
- int result = 0;
- if (i) /* count(5) */
- if (j) /* count(3) */
- result = do_something (4); /* count(3) */
- else
- result = do_something (1024);
- else
- if (j) /* count(2) */
- result = do_something (1); /* count(1) */
- else
- result = do_something (2); /* count(1) */
- if (i > j) /* count(5) */
- result = do_something (result*2); /* count(1) */
- if (i > 10) /* count(5) */
- if (j > 10) /* count(1) */
- result = do_something (result*4); /* count(1) */
- return result; /* count(5) */
- }
- int
- test_ifelse2 (int i)
- {
- int result = 0;
- if (!i) /* count(6) */
- result = do_something (1); /* count(1) */
- if (i == 1) /* count(6) */
- result = do_something (1024);
- if (i == 2) /* count(6) */
- result = do_something (2); /* count(3) */
- if (i == 3) /* count(6) */
- return do_something (8); /* count(2) */
- if (i == 4) /* count(4) */
- return do_something (2048);
- return result; /* count(4) */
- }
- int
- test_ifelse3 (int i, int j)
- {
- int result = 1;
- if (i > 10 && j > i && j < 20) /* count(11) */
- result = do_something (16); /* count(1) */
- if (i > 20) /* count(11) */
- if (j > i) /* count(5) */
- if (j < 30) /* count(2) */
- result = do_something (32); /* count(1) */
- if (i == 3 || j == 47 || i == j) /* count(11) */
- result = do_something (64); /* count(3) */
- return result; /* count(11) */
- }
- void
- call_ifelse ()
- {
- ifelse_val1 += test_ifelse1 (0, 2);
- ifelse_val1 += test_ifelse1 (0, 0);
- ifelse_val1 += test_ifelse1 (1, 2);
- ifelse_val1 += test_ifelse1 (10, 2);
- ifelse_val1 += test_ifelse1 (11, 11);
- ifelse_val2 += test_ifelse2 (0);
- ifelse_val2 += test_ifelse2 (2);
- ifelse_val2 += test_ifelse2 (2);
- ifelse_val2 += test_ifelse2 (2);
- ifelse_val2 += test_ifelse2 (3);
- ifelse_val2 += test_ifelse2 (3);
- ifelse_val3 += test_ifelse3 (11, 19);
- ifelse_val3 += test_ifelse3 (25, 27);
- ifelse_val3 += test_ifelse3 (11, 22);
- ifelse_val3 += test_ifelse3 (11, 10);
- ifelse_val3 += test_ifelse3 (21, 32);
- ifelse_val3 += test_ifelse3 (21, 20);
- ifelse_val3 += test_ifelse3 (1, 2);
- ifelse_val3 += test_ifelse3 (32, 31);
- ifelse_val3 += test_ifelse3 (3, 0);
- ifelse_val3 += test_ifelse3 (0, 47);
- ifelse_val3 += test_ifelse3 (65, 65);
- }
- /* Check switch statements. */
- int switch_val, switch_m;
- int
- test_switch (int i, int j)
- {
- int result = 0; /* count(5) */
- switch (i) /* count(5) */
- {
- case 1:
- result = do_something (2); /* count(1) */
- break;
- case 2:
- result = do_something (1024);
- break;
- case 3:
- case 4:
- if (j == 2) /* count(3) */
- return do_something (4); /* count(1) */
- result = do_something (8); /* count(2) */
- break;
- default:
- result = do_something (32); /* count(1) */
- switch_m++; /* count(1) */
- break;
- }
- return result; /* count(4) */
- }
- void
- call_switch ()
- {
- switch_val += test_switch (1, 0);
- switch_val += test_switch (3, 0);
- switch_val += test_switch (3, 2);
- switch_val += test_switch (4, 0);
- switch_val += test_switch (16, 0);
- switch_val += switch_m;
- }
- int
- main()
- {
- call_for ();
- call_goto ();
- call_ifelse ();
- call_switch ();
- call_unref ();
- if ((for_val1 != 12)
- || (for_val2 != 87)
- || (goto_val != 15)
- || (ifelse_val1 != 31)
- || (ifelse_val2 != 23)
- || (ifelse_val3 != 246)
- || (switch_val != 55)
- || (unref_val != 4))
- abort ();
- return 0;
- }
|