------- Comment #21 from rguenth at gcc dot gnu dot org 2007-08-29 15:19
-------
I wonder why D.9380_64, defined as
D.9380_64 = &D.8894_34->_M_use_count;
points to anything and NULL:
D.9380_64, is dereferenced, points-to anything, points-to NULL
where the single dereference site looks like
# ctor_count_403 = VDEF <ctor_count_140>
# ctor_count_404 = VDEF <ctor_count_160>
# dtor_count_405 = VDEF <dtor_count_180>
*D.9380_64 ={v} D.9383_69;
of course because of the constraints:
D.9380_64 = { NULL }
possibly because
# VUSE <SFT.433_337>
D.8894_34 = D.8885._M_refcount._M_pi;
which also
D.8894_34, is dereferenced, its value escapes, points-to anything, points-to
NULL
which is because
D.8885._M_pi = &NULL
but (!?) we have
...
D.7990_3 ={v} operator new (4);
<bb 4>:
D.7950_4 = (struct B *) D.7990_3;
...
# SMT.470_328 = VDEF <SMT.470_325(ab)>
D.7950_4->_vptr.B = &_ZTV1B[2];
...
# SFT.432_331 = VDEF <SFT.432_330(D)>
__ref.80._M_ptr = D.7950_4;
# VUSE <SFT.432_331>
__ref$_M_ptr_14 = __ref.80._M_ptr;
# SFT.425_333 = VDEF <SFT.425_332(D)>
b._M_ptr = __ref$_M_ptr_14;
# VUSE <SFT.425_333>
D.8873_20 = b._M_ptr;
D.8884_21 = (struct A *) D.8873_20;
# SFT.434_335 = VDEF <SFT.434_334(D)>
D.8885._M_ptr = D.8884_21;
so it is at most non-null, because we dereference the pointer.
Note we miss(?) a constraint for D.7990_3 but only have
D.7950_4 = D.7990_3
__ref.80 = D.7950_4
__ref$_M_ptr_14 = __ref.80
b = __ref$_M_ptr_14
D.8873_20 = b
D.8884_21 = D.8873_20
D.8885 = D.8884_21
(and then directly)
D.8885._M_pi = &NULL
shouldn't we have
D.7990_3 = &ANYTHING
?
In find_func_aliases we don't create a constraint for the lhs of a call
at all:
else if (((TREE_CODE (t) == GIMPLE_MODIFY_STMT
&& TREE_CODE (GIMPLE_STMT_OPERAND (t, 1)) == CALL_EXPR
&& !(call_expr_flags (GIMPLE_STMT_OPERAND (t, 1))
& (ECF_MALLOC | ECF_MAY_BE_ALLOCA)))
|| (TREE_CODE (t) == CALL_EXPR
&& !(call_expr_flags (t)
& (ECF_MALLOC | ECF_MAY_BE_ALLOCA)))))
{
if (!in_ipa_mode)
{
if (TREE_CODE (t) == GIMPLE_MODIFY_STMT)
handle_rhs_call (GIMPLE_STMT_OPERAND (t, 1));
else
handle_rhs_call (t);
}
So the following adds this constraint:
Index: tree-ssa-structalias.c
===================================================================
--- tree-ssa-structalias.c (revision 127848)
+++ tree-ssa-structalias.c (working copy)
@@ -3726,7 +3726,23 @@ find_func_aliases (tree origt)
if (!in_ipa_mode)
{
if (TREE_CODE (t) == GIMPLE_MODIFY_STMT)
- handle_rhs_call (GIMPLE_STMT_OPERAND (t, 1));
+ {
+ handle_rhs_call (GIMPLE_STMT_OPERAND (t, 1));
+ if (POINTER_TYPE_P (TREE_TYPE (GIMPLE_STMT_OPERAND (t, 1))))
+ {
+ VEC(ce_s, heap) *lhsc = NULL;
+ struct constraint_expr rhsc;
+ unsigned int j;
+ struct constraint_expr *lhsp;
+ rhsc.var = anything_id;
+ rhsc.offset = 0;
+ rhsc.type = ADDRESSOF;
+ get_constraint_for (GIMPLE_STMT_OPERAND (t, 0), &lhsc);
+ for (j = 0; VEC_iterate (ce_s, lhsc, j, lhsp); j++)
+ process_constraint_1 (new_constraint (*lhsp, rhsc), true);
+ VEC_free (ce_s, heap, lhsc);
+ }
+ }
else
handle_rhs_call (t);
}
but still we end up with
D.8885 = D.8884_21
D.8885._M_pi = &NULL
!?
hm, we have
# SFT.433_314 = VDEF <SFT.433_313(D)>
D.8885._M_refcount._M_pi = 0B;
so that might be ok. The above patch fixes the failure for me, but
this might be pure luck given the fragile aliasing machinery. So, does
the patch look anywhere sane?
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=33199