summaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.c-torture/compile/20011130-2.c
blob: e3cb5f46a88771aa74a65295aefd081593b7ea31 (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
53
54
/* This testcase caused infinite loop in life info computation
   after if conversion on IA-64.  Conditional register dead for
   pseudo holding sign-extended k was improperly computed,
   resulting in this pseudo being live at start of bb if it was
   dead at the end and vice versa; as it was a bb which had edge
   to itself, this resulted in alternative propagating this basic
   block forever.  */

typedef struct {
  unsigned char a;
  unsigned char b;
} S0;

typedef struct {
  S0 *c;
  int d;
  unsigned int e;
  unsigned char *f[3];
  void *g;
} S1;

int bar (int, void *);

int foo (S1 *x, float y)
{
  S0 *h;
  int i, j, k, l, m;
  float n, o, p;
  unsigned char *q, *r[3];

  h = x->c;
  m = h->a;
  l = h->b;
  n = y;
  o = 0.0;
  if (x->d == 8)
    for (j = 0; j < x->e; j++)
      for (k = 0; k < 3; k++)
	{
	  n = y;
	  o = 0.0;
	  if (m)
	    q = x->f[k] + x->e - 1 - j;
	  else
	    q = x->f[k] + j;
	  p = (*q - o) * y / (n - o);
	  p = 0.0 > p ? 0.0 : p;
	  p = y < p ? y : p;
	  if (l)
	    p = r[k][(int) p];
	  bar (p, x->g);
	}
  return 1;
}