https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63184

Andrew Pinski <pinskia at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Assignee|rguenth at gcc dot gnu.org         |pinskia at gcc dot 
gnu.org

--- Comment #26 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
So what is interesting is for aarch64, GCC is able to figure out the two values
are equal but only after register allocation (note LLVM has a similar issue
too).

Anyways at forwprop4 we have:
  _5 = &a[1] + _4;
  _13 = _3 + 8;
  _7 = &a + _13;
  if (_5 != _7)

I think I have a patch (I need to format it correctly though):
(for neeq (ne eq)
 (simplify
  (neeq (pointer_plus ADDR_EXPR@0 @1) (pointer_plus ADDR_EXPR@2 @3))
   (with { poly_int64 diff; }
    (if (ptr_difference_const (@0, @2, &diff))
     (neeq (plus { build_int_cst_type (type, diff); }
            (convert (minus @1 @3)))
      {build_zero_cst (type); })))))


I also added this one too as I saw that was not being folded either:
(simplify
 (pointer_diff (pointer_plus ADDR_EXPR@0 @1) (pointer_plus ADDR_EXPR@2 @3))
 (with { poly_int64 diff; }
   (if (ptr_difference_const (@0, @2, &diff))
    (plus { build_int_cst_type (type, diff); } (convert (minus @1 @3))))))

Reply via email to