| /* 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; |
| } |