aboutsummaryrefslogtreecommitdiffstats
path: root/gcc-4.9/gcc/testsuite/gcc.dg/torture/pr62031.c
blob: f0dcef44b1da93322eb971f071327f8c062032d9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
/* { dg-do run } */

#include <stdlib.h>

#define NUM_OF_STATES 4
typedef unsigned int entry_t[2];
typedef struct entries_item { entry_t metricEntries_[0]; } entries_item_t;

void __attribute__((noinline,noclone))
test_00(size_t numOfStates, entries_item_t* p_bm,
	const unsigned int* polyArray,
	size_t polyArraySize)
{
  size_t idx;
  unsigned int hlp0, hlp1;
  for (idx = 0; idx < numOfStates; ++idx)
    {
      size_t idy;

      hlp0 = (idx << 1) | 0x00;
      hlp1 = (idx << 1) | 0x01;
      p_bm->metricEntries_[idx][0] = 0;
      p_bm->metricEntries_[idx][1] = 0;
      for (idy = 0; idy < polyArraySize; ++idy)
	{
	  p_bm->metricEntries_[idx][0]
	      |= __builtin_parity(hlp0 & polyArray[idy]) << idy;
	  p_bm->metricEntries_[idx][1]
	      |= __builtin_parity(hlp1 & polyArray[idy]) << idy;
	}
    }
}

int main()
{
  unsigned int polyArray[] = { 0x07, 0x05 };
  entries_item_t* pBranchMetrics;
  pBranchMetrics = malloc(sizeof(entry_t) * NUM_OF_STATES);
  test_00(NUM_OF_STATES, pBranchMetrics, polyArray,
	  sizeof(polyArray) / sizeof(polyArray[0]));
  if (pBranchMetrics->metricEntries_[0][0] != 0
      || pBranchMetrics->metricEntries_[0][1] != 3
      || pBranchMetrics->metricEntries_[1][0] != 1
      || pBranchMetrics->metricEntries_[1][1] != 2
      || pBranchMetrics->metricEntries_[2][0] != 3
      || pBranchMetrics->metricEntries_[2][1] != 0
      || pBranchMetrics->metricEntries_[3][0] != 2
      || pBranchMetrics->metricEntries_[3][1] != 1)
    abort ();
  free(pBranchMetrics);
  return 0;
}