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

Joshua Green <jvg1981 at aim dot com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |jvg1981 at aim dot com

--- Comment #17 from Joshua Green <jvg1981 at aim dot com> ---
"But if we don't know which pointer is greater, it gets more complicated: ..."

I'm not sure that this is true.  For types that are larger than 1 byte, it
seems that one can do the subtraction after any division(s), hence only costing
an additional division (or shift):

    T * p;
    T * q;

    .
    .
    .

    intptr_t pVal = ((uintptr_t) p)/(sizeof *p);
    intptr_t qVal = ((uintptr_t) q)/(sizeof *q);

    ptrdiff_t p_q = pVal - qVal;

This should work in well-defined cases, for if p and q are pointers into the
same array then (presumably) ((uintptr_t) p) and ((uintptr_t) q) must have the
same remainder modulo sizeof(T).

Of course, even an additional shift may be too expensive in some cases, so it's
not entirely clear that this change should be made.

Reply via email to