This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug middle-end/33199] [4.3 Regression] tr1/2_general_utilities/shared_ptr/assign/auto_ptr.cc
- From: "dberlin at dberlin dot org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 29 Aug 2007 18:30:33 -0000
- Subject: [Bug middle-end/33199] [4.3 Regression] tr1/2_general_utilities/shared_ptr/assign/auto_ptr.cc
- References: <bug-33199-682@http.gcc.gnu.org/bugzilla/>
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
------- Comment #22 from dberlin at gcc dot gnu dot org 2007-08-29 18:30 -------
Subject: Re: [4.3 Regression]
tr1/2_general_utilities/shared_ptr/assign/auto_ptr.cc
On 29 Aug 2007 15:19:10 -0000, rguenth at gcc dot gnu dot org
<gcc-bugzilla@gcc.gnu.org> wrote:
>
>
> ------- 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);
> + }
> + }
This is right for !in_ipa_mode. You may want to encapsulate it into a
new "handle_lhs_of_call" though :)
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=33199