aboutsummaryrefslogtreecommitdiffstats
path: root/gcc-4.9/gcc/testsuite/gcc.c-torture/compile/20011130-2.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc-4.9/gcc/testsuite/gcc.c-torture/compile/20011130-2.c')
-rw-r--r--gcc-4.9/gcc/testsuite/gcc.c-torture/compile/20011130-2.c54
1 files changed, 54 insertions, 0 deletions
diff --git a/gcc-4.9/gcc/testsuite/gcc.c-torture/compile/20011130-2.c b/gcc-4.9/gcc/testsuite/gcc.c-torture/compile/20011130-2.c
new file mode 100644
index 000000000..e3cb5f46a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/gcc.c-torture/compile/20011130-2.c
@@ -0,0 +1,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;
+}