/* Check that execution counts and branch probabilities for various C
   constructs are reported correctly by gcov. */

/* { dg-options "-fprofile-arcs -ftest-coverage" } */
/* { dg-do run { target native } } */

extern "C" 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++)		/* branch(25) */
					/* branch(end) */
    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++)		/* branch(30) */
					/* branch(end) */
    for (j = 0; j < m; j++)		/* branch(32) */
					/* branch(end) */
      for (k = 0; k < o; k++)		/* branch(27) */
					/* branch(end) */
	for_temp++;			/* count(81) */
  return for_temp;			/* count(6) */
}

int
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)
{
					/* branch(50) */
  if (f)				/* count(2) */
					/* branch(end) */
    goto lab1;				/* count(1) */
  return 1;				/* count(1) */
lab1:
  return 2;				/* count(1) */
}

int
test_goto2 (int f)
{
  int i;
					/* branch(7) */
  for (i = 0; i < 10; i++)		/* count(15) */
					/* branch(end) */
    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;
					/* branch(40) */
  if (i)				/* count(5) */
					/* branch(0) */
    if (j)				/* count(3) */
					/* branch(end) */
      result = do_something (4);	/* count(3) */
    else
      result = do_something (1024);
  else
					/* branch(50) */
    if (j)				/* count(2) */
					/* branch(end) */
      result = do_something (1);	/* count(1) */
    else
      result = do_something (2);	/* count(1) */
					/* branch(80) */
  if (i > j)				/* count(5) */
					/* branch(end) */
    result = do_something (result*2);	/* count(1) */
					/* branch(80) */
  if (i > 10)				/* count(5) */
					/* branch(100) */
    if (j > 10)				/* count(1) */
					/* branch(end) */
      result = do_something (result*4);	/* count(1) */
  return result;			/* count(5) */
}

int
test_ifelse2 (int i)
{
  int result = 0;
					/* branch(83) */
  if (!i)				/* count(6) */
					/* branch(end) */
    result = do_something (1);		/* count(1) */
					/* branch(100) */
  if (i == 1)				/* count(6) */
					/* branch(end) */
    result = do_something (1024);
					/* branch(50) */
  if (i == 2)				/* count(6) */
					/* branch(end) */
    result = do_something (2);		/* count(3) */
					/* branch(67) */
  if (i == 3)				/* count(6) */
					/* branch(end) */
    return do_something (8);		/* count(2) */
					/* branch(100) */
  if (i == 4)				/* count(4) */
					/* branch(end) */
    return do_something (2048);
  return result;			/* count(4) */
}

int
test_ifelse3 (int i, int j)
{
  int result = 1;
					/* branch(27 50 75) */
  if (i > 10 && j > i && j < 20)	/* count(11) */
					/* branch(end) */
    result = do_something (16);		/* count(1) */
					/* branch(55) */
  if (i > 20)				/* count(11) */
					/* branch(60) */
    if (j > i)				/* count(5) */
					/* branch(50) */
      if (j < 30)			/* count(2) */
					/* branch(end) */
	result = do_something (32);	/* count(1) */
					/* branch(9 10 89) */
  if (i == 3 || j == 47 || i == j)	/* count(11) */
					/* branch(end) */
    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) */

					/* branch(20 0 60 20) */
  switch (i)				/* count(5) */
					/* branch(end) */
    {
      case 1:
        result = do_something (2);	/* count(1) */
        break;
      case 2:
        result = do_something (1024);
        break;
      case 3:
      case 4:
					/* branch(67) */
        if (j == 2)			/* count(3) */
					/* branch(end) */
          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;
}

/* { dg-final { run-gcov branches { -b gcov-1.C } } } */
