This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Aliasing: look through pointer's def stmt


On Thu, Oct 31, 2013 at 6:11 PM, Marc Glisse <marc.glisse@inria.fr> wrote:
> On Wed, 30 Oct 2013, Richard Biener wrote:
>
>>> --- gcc/tree-ssa-alias.c        (revision 204188)
>>> +++ gcc/tree-ssa-alias.c        (working copy)
>>> @@ -567,20 +567,29 @@ void
>>>  ao_ref_init_from_ptr_and_size (ao_ref *ref, tree ptr, tree size)
>>>  {
>>>    HOST_WIDE_INT t1, t2;
>>>    ref->ref = NULL_TREE;
>>>    if (TREE_CODE (ptr) == SSA_NAME)
>>>      {
>>>        gimple stmt = SSA_NAME_DEF_STMT (ptr);
>>>        if (gimple_assign_single_p (stmt)
>>>           && gimple_assign_rhs_code (stmt) == ADDR_EXPR)
>>>         ptr = gimple_assign_rhs1 (stmt);
>>> +      else if (is_gimple_assign (stmt)
>>> +              && gimple_assign_rhs_code (stmt) == POINTER_PLUS_EXPR
>>> +              && host_integerp (gimple_assign_rhs2 (stmt), 0)
>>> +              && (t1 = int_cst_value (gimple_assign_rhs2 (stmt))) >= 0)
>>
>>
>> No need to restrict this to positive offsets I think.
>
>
> Here is the follow-up patch to remove this restriction (bootstrap+testsuite
> on x86_64-unknown-linux-gnu).
> I don't really know how safe it is.
>
> I couldn't use host_integerp(,1) since it returns false for (size_t)(-1) on
> x86_64, and host_integerp(,0) seemed strange, but I could use it if you
> want.

Well, host_integer_p (, 0) looks correct to me.  But ...

> Index: gcc/tree-ssa-alias.h
> ===================================================================
> --- gcc/tree-ssa-alias.h        (revision 204267)
> +++ gcc/tree-ssa-alias.h        (working copy)
> @@ -139,30 +139,30 @@ extern void pt_solution_set_var (struct
>
>  extern void dump_pta_stats (FILE *);
>
>  extern GTY(()) struct pt_solution ipa_escaped_pt;
>
>  /* Return true, if the two ranges [POS1, SIZE1] and [POS2, SIZE2]
>     overlap.  SIZE1 and/or SIZE2 can be (unsigned)-1 in which case the
>     range is open-ended.  Otherwise return false.  */
>
>  static inline bool
> -ranges_overlap_p (unsigned HOST_WIDE_INT pos1,
> -                 unsigned HOST_WIDE_INT size1,
> -                 unsigned HOST_WIDE_INT pos2,
> -                 unsigned HOST_WIDE_INT size2)
> +ranges_overlap_p (HOST_WIDE_INT pos1,
> +                 HOST_WIDE_INT size1,
> +                 HOST_WIDE_INT pos2,
> +                 HOST_WIDE_INT size2)

I think size[12] should still be unsigned (we don't allow negative
sizes but only the special value -1U which we special-case only to
avoid pos + size to wrap)

Otherwise ok.

Thanks,
Richard.

>  {
>    if (pos1 >= pos2
> -      && (size2 == (unsigned HOST_WIDE_INT)-1
> +      && (size2 == -1
>           || pos1 < (pos2 + size2)))
>      return true;
>    if (pos2 >= pos1
> -      && (size1 == (unsigned HOST_WIDE_INT)-1
> +      && (size1 == -1
>           || pos2 < (pos1 + size1)))
>      return true;
>
>    return false;
>  }



>
>
>  #endif /* TREE_SSA_ALIAS_H  */
>


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]