1
2/* Test of origin tracking through floating point code and in the case
3   where there are large amounts of uninitialised data floating
4   around.  This program creates 3 matrices of 2300x2300 doubles,
5   makes one value in them undefined, does arithmetic, and tests the
6   result, which is then undefined.
7
8   This also tests the secondary otag cache (ocacheL2), since the
9   amount of uninitialised data is somewhat over 43MB and it appears
10   that quite a lot of non-zero-otag lines are pushed into ocacheL2.
11
12   This program needs to be compiled with -O.
13*/
14
15#include <assert.h>
16#include <stdio.h>
17#include <stdlib.h>
18#include "../memcheck.h"
19
20
21double** alloc_square_array ( int nArr )
22{
23  int i;
24  double** vec;
25  assert(nArr >= 1);
26  vec = malloc(nArr * sizeof(double*));
27  assert(vec);
28  for (i = 0; i < nArr; i++) {
29    vec[i] = malloc(nArr * sizeof(double));
30    assert(vec);
31  }
32  return vec;
33}
34
35double** do3x3smooth ( double** arr, int nArr )
36{
37  int i, j;
38  double** out;
39  assert(nArr >= 3);
40  out = alloc_square_array(nArr - 2);
41  assert(out);
42  for (i = 1; i < nArr-1; i++) {
43    for (j = 1; j < nArr-1; j++) {
44      double s =   arr[i-1][j-1] + arr[i-1][j  ] + arr[i-1][j+1]
45                 + arr[i  ][j-1] + arr[i  ][j  ] + arr[i  ][j+1]
46                 + arr[i+1][j-1] + arr[i+1][j  ] + arr[i+1][j+1];
47      out[i-1][j-1] = s / 9.0;
48    }
49  }
50  return out;
51}
52
53double sum ( double** arr, int nArr )
54{
55  int i, j;
56  double s = 0.0;
57  assert(nArr >= 1);
58  for (i = 0; i < nArr; i++) {
59    for (j = 0; j < nArr; j++) {
60      s += arr[i][j];
61    }
62  }
63  return s;
64}
65
66void setup_arr ( /*OUT*/double** arr, int nArr )
67{
68  int i, j;
69  assert(nArr >= 1);
70  for (i = 0; i < nArr; i++) {
71    for (j = 0; j < nArr; j++) {
72      arr[i][j] = (double)(i * j);
73      if (i == nArr/2 && j == nArr/2) {
74         unsigned char* p = (unsigned char*)&arr[i][j];
75         VALGRIND_MAKE_MEM_UNDEFINED(p, 1);
76      }
77    }
78  }
79}
80
81int main ( void )
82{
83  int nArr = 2300;
84  int ri;
85  double r, **arr, **arr2, **arr3;
86  arr = alloc_square_array(nArr);
87  setup_arr( arr, nArr );
88  arr2 = do3x3smooth( arr, nArr );
89  arr3 = do3x3smooth( arr2, nArr-2 );
90  r = sum( arr3, nArr-4 );
91  /* Convert answer to int before testing it, so as to
92     guarantee there's only one conditional branch. */
93  if (0) fprintf(stderr, "r = %g\n", r );
94  r /= 10000.0;
95  ri = (int)r;
96  if (0) fprintf(stderr, "ri = %d\n", ri);
97  if (ri == 696565111) {
98     fprintf(stderr, "Test succeeded.\n");
99  } else {
100     fprintf(stderr, "Test FAILED !\n");
101     assert(0);
102  }
103  return 0;
104}
105