+2010-04-20 Richard Guenther <rguenther@suse.de>
+
+ * tree-ssa-structalias.c (do_structure_copy): Properly handle
+ DEREF.
+ (dump_sa_points_to_info): Remove asserts.
+ (init_base_vars): nothing_id isn't an escape point nor does it
+ have pointers.
+
2010-04-20 Jakub Jelinek <jakub@redhat.com>
* tree.h (TYPE_REF_IS_RVALUE): Define.
--- /dev/null
+/* { dg-do run } */
+/* { dg-options "-O2 -fipa-pta -fno-tree-sra -fdump-ipa-pta-details" } */
+
+struct X {
+ int i;
+ void *p;
+};
+
+static void * __attribute__((noinline,noclone))
+foo(struct X *q, void *p)
+{
+ struct X b;
+ b.p = p;
+ *q = b;
+ return q->p;
+}
+extern void abort (void);
+int main()
+{
+ struct X a, c;
+ void *p;
+ a.p = (void *)&c;
+ p = foo(&a, &a);
+ /* { dg-final { scan-ipa-dump "foo.result = { NULL a c }" "pta" { xfail *-*-* } } } */
+ /* { dg-final { scan-ipa-dump "foo.result = { NULL a a\[^ \]* c }" "pta" } } */
+ ((struct X *)p)->p = (void *)0;
+ if (a.p != (void *)0)
+ abort ();
+ return 0;
+}
+
+/* { dg-final { cleanup-ipa-dump "pta" } } */
if (lhsp->type == DEREF
|| (lhsp->type == ADDRESSOF && lhsp->var == anything_id)
|| rhsp->type == DEREF)
- process_all_all_constraints (lhsc, rhsc);
+ {
+ if (lhsp->type == DEREF)
+ {
+ gcc_assert (VEC_length (ce_s, lhsc) == 1);
+ lhsp->offset = UNKNOWN_OFFSET;
+ }
+ if (rhsp->type == DEREF)
+ {
+ gcc_assert (VEC_length (ce_s, rhsc) == 1);
+ rhsp->offset = UNKNOWN_OFFSET;
+ }
+ process_all_all_constraints (lhsc, rhsc);
+ }
else if (lhsp->type == SCALAR
&& (rhsp->type == SCALAR
|| rhsp->type == ADDRESSOF))
{
varinfo_t vi = get_varinfo (i);
if (!vi->may_have_pointers)
- {
- gcc_assert (find (i) == i
- || !(vi = get_varinfo (find (i)))->may_have_pointers);
- /* ??? See create_variable_info_for.
- gcc_assert (bitmap_empty_p (vi->solution)); */
- continue;
- }
+ continue;
dump_solution_for_var (outfile, i);
}
}
var_nothing->size = ~0;
var_nothing->fullsize = ~0;
var_nothing->is_special_var = 1;
+ var_nothing->may_have_pointers = 0;
+ var_nothing->is_global_var = 0;
/* Create the ANYTHING variable, used to represent that a variable
points to some unknown piece of memory. */