231 lines
4.0 KiB
Diff
231 lines
4.0 KiB
Diff
|
2007-10-15 Jakub Jelinek <jakub@redhat.com>
|
||
|
|
||
|
PR tree-optimization/33136
|
||
|
* opts.c (decode_options): Don't enable flag_ipa_type_escape.
|
||
|
|
||
|
* gcc.c-torture/execute/20070824-1.c: New test.
|
||
|
* gcc.dg/pr33136-1.c: New test.
|
||
|
* gcc.dg/pr33136-2.c: New test.
|
||
|
* gcc.dg/pr33136-3.c: New test.
|
||
|
|
||
|
--- gcc/opts.c (revision 129365)
|
||
|
+++ gcc/opts.c (revision 129366)
|
||
|
@@ -473,7 +473,6 @@ decode_options (unsigned int argc, const
|
||
|
flag_cse_skip_blocks = 1;
|
||
|
flag_gcse = 1;
|
||
|
flag_expensive_optimizations = 1;
|
||
|
- flag_ipa_type_escape = 1;
|
||
|
flag_strength_reduce = 1;
|
||
|
flag_rerun_cse_after_loop = 1;
|
||
|
flag_rerun_loop_opt = 1;
|
||
|
--- gcc/testsuite/gcc.c-torture/execute/20070824-1.c (revision 0)
|
||
|
+++ gcc/testsuite/gcc.c-torture/execute/20070824-1.c (revision 129366)
|
||
|
@@ -0,0 +1,24 @@
|
||
|
+/* PR tree-optimization/33136 */
|
||
|
+
|
||
|
+extern void abort (void);
|
||
|
+
|
||
|
+struct S
|
||
|
+{
|
||
|
+ struct S *a;
|
||
|
+ int b;
|
||
|
+};
|
||
|
+
|
||
|
+int
|
||
|
+main (void)
|
||
|
+{
|
||
|
+ struct S *s = (struct S *) 0, **p, *n;
|
||
|
+ for (p = &s; *p; p = &(*p)->a);
|
||
|
+ n = (struct S *) __builtin_alloca (sizeof (*n));
|
||
|
+ n->a = *p;
|
||
|
+ n->b = 1;
|
||
|
+ *p = n;
|
||
|
+
|
||
|
+ if (!s)
|
||
|
+ abort ();
|
||
|
+ return 0;
|
||
|
+}
|
||
|
--- gcc/testsuite/gcc.dg/pr33136-1.c (revision 0)
|
||
|
+++ gcc/testsuite/gcc.dg/pr33136-1.c (revision 129366)
|
||
|
@@ -0,0 +1,54 @@
|
||
|
+/* PR tree-optimization/33136 */
|
||
|
+/* { dg-do run } */
|
||
|
+/* { dg-options "-O2" } */
|
||
|
+
|
||
|
+extern void abort (void);
|
||
|
+
|
||
|
+struct S
|
||
|
+{
|
||
|
+ struct S *a;
|
||
|
+ int b;
|
||
|
+ float f;
|
||
|
+};
|
||
|
+
|
||
|
+static struct S s;
|
||
|
+
|
||
|
+static int *
|
||
|
+__attribute__((noinline, const))
|
||
|
+foo (void)
|
||
|
+{
|
||
|
+ return &s.b;
|
||
|
+}
|
||
|
+
|
||
|
+float
|
||
|
+__attribute__((noinline))
|
||
|
+bar (float *f)
|
||
|
+{
|
||
|
+ s.f = 1.0;
|
||
|
+ *f = 4.0;
|
||
|
+ return s.f;
|
||
|
+}
|
||
|
+
|
||
|
+int
|
||
|
+__attribute__((noinline))
|
||
|
+baz (int *x)
|
||
|
+{
|
||
|
+ s.b = 1;
|
||
|
+ *x = 4;
|
||
|
+ return s.b;
|
||
|
+}
|
||
|
+
|
||
|
+int
|
||
|
+t (void)
|
||
|
+{
|
||
|
+ float f = 8.0;
|
||
|
+ return bar (&f) + baz (foo ());
|
||
|
+}
|
||
|
+
|
||
|
+int
|
||
|
+main (void)
|
||
|
+{
|
||
|
+ if (t () != 5)
|
||
|
+ abort ();
|
||
|
+ return 0;
|
||
|
+}
|
||
|
--- gcc/testsuite/gcc.dg/pr33136-3.c (revision 0)
|
||
|
+++ gcc/testsuite/gcc.dg/pr33136-3.c (revision 129366)
|
||
|
@@ -0,0 +1,60 @@
|
||
|
+/* PR tree-optimization/33136 */
|
||
|
+/* { dg-do run } */
|
||
|
+/* { dg-options "-O2" } */
|
||
|
+
|
||
|
+extern void abort (void);
|
||
|
+
|
||
|
+struct S
|
||
|
+{
|
||
|
+ void *a;
|
||
|
+ int b[3];
|
||
|
+ double *c;
|
||
|
+};
|
||
|
+static double d, e;
|
||
|
+
|
||
|
+static struct S s;
|
||
|
+
|
||
|
+static int *
|
||
|
+__attribute__((noinline, const))
|
||
|
+foo (void)
|
||
|
+{
|
||
|
+ return (int *) &s.b;
|
||
|
+}
|
||
|
+
|
||
|
+double *
|
||
|
+__attribute__((noinline))
|
||
|
+bar (double **f)
|
||
|
+{
|
||
|
+ s.c = &d;
|
||
|
+ *f = &e;
|
||
|
+ /* As nothing ever takes the address of any double * field in struct S,
|
||
|
+ the write to *f can't alias with the s.c field. */
|
||
|
+ return s.c;
|
||
|
+}
|
||
|
+
|
||
|
+int
|
||
|
+__attribute__((noinline))
|
||
|
+baz (int *x)
|
||
|
+{
|
||
|
+ s.b[0] = 1;
|
||
|
+ *x = 4;
|
||
|
+ /* Function foo takes address of an int array field in struct S,
|
||
|
+ so *x can alias with the s.b field (and it does in this testcase). */
|
||
|
+ return s.b[0];
|
||
|
+}
|
||
|
+
|
||
|
+int
|
||
|
+__attribute__((noinline))
|
||
|
+t (void)
|
||
|
+{
|
||
|
+ double *f = (double *) 0;
|
||
|
+ return 10 * (bar (&f) != &d) + baz (foo ());
|
||
|
+}
|
||
|
+
|
||
|
+int
|
||
|
+main (void)
|
||
|
+{
|
||
|
+ if (t () != 4)
|
||
|
+ abort ();
|
||
|
+ return 0;
|
||
|
+}
|
||
|
--- gcc/testsuite/gcc.dg/pr33136-2.c (revision 0)
|
||
|
+++ gcc/testsuite/gcc.dg/pr33136-2.c (revision 129366)
|
||
|
@@ -0,0 +1,60 @@
|
||
|
+/* PR tree-optimization/33136 */
|
||
|
+/* { dg-do run } */
|
||
|
+/* { dg-options "-O2" } */
|
||
|
+
|
||
|
+extern void abort (void);
|
||
|
+
|
||
|
+struct S
|
||
|
+{
|
||
|
+ void *a;
|
||
|
+ int b;
|
||
|
+ int *c;
|
||
|
+};
|
||
|
+static int d, e;
|
||
|
+
|
||
|
+static struct S s;
|
||
|
+
|
||
|
+static int *
|
||
|
+__attribute__((noinline, const))
|
||
|
+foo (void)
|
||
|
+{
|
||
|
+ return &s.b;
|
||
|
+}
|
||
|
+
|
||
|
+int *
|
||
|
+__attribute__((noinline))
|
||
|
+bar (int **f)
|
||
|
+{
|
||
|
+ s.c = &d;
|
||
|
+ *f = &e;
|
||
|
+ /* As nothing ever takes the address of any int * field in struct S,
|
||
|
+ the write to *f can't alias with the s.c field. */
|
||
|
+ return s.c;
|
||
|
+}
|
||
|
+
|
||
|
+int
|
||
|
+__attribute__((noinline))
|
||
|
+baz (int *x)
|
||
|
+{
|
||
|
+ s.b = 1;
|
||
|
+ *x = 4;
|
||
|
+ /* Function foo takes address of an int field in struct S,
|
||
|
+ so *x can alias with the s.b field (and it does in this testcase). */
|
||
|
+ return s.b;
|
||
|
+}
|
||
|
+
|
||
|
+int
|
||
|
+__attribute__((noinline))
|
||
|
+t (void)
|
||
|
+{
|
||
|
+ int *f = (int *) 0;
|
||
|
+ return 10 * (bar (&f) != &d) + baz (foo ());
|
||
|
+}
|
||
|
+
|
||
|
+int
|
||
|
+main (void)
|
||
|
+{
|
||
|
+ if (t () != 4)
|
||
|
+ abort ();
|
||
|
+ return 0;
|
||
|
+}
|