[LLVMbugs] [Bug 494] NEW: [llvmgcc] Signed divide generated for pointer difference

bugzilla-daemon at cs.uiuc.edu bugzilla-daemon at cs.uiuc.edu
Thu Dec 30 23:39:17 PST 2004


http://llvm.cs.uiuc.edu/bugs/show_bug.cgi?id=494

           Summary: [llvmgcc] Signed divide generated for pointer difference
           Product: tools
           Version: 1.0
          Platform: All
        OS/Version: All
            Status: NEW
          Severity: enhancement
          Priority: P2
         Component: llvm-gcc
        AssignedTo: unassignedbugs at nondot.org
        ReportedBy: sabre at nondot.org


Consider this function:

int ptrdiff(int *X, int *Y) { return X-Y; }

llvmgcc currently compiles this to:

int %ptrdiff(int* %X, int* %Y) {
        %tmp.1 = cast int* %X to int
        %tmp.3 = cast int* %Y to int
        %tmp.4 = sub int %tmp.1, %tmp.3
        %tmp.5 = div int %tmp.4, 4
        ret int %tmp.5
}

If llvmgcc compiled the divide to an unsigned divide, this could be optimized to
a right shift.  Note that C and C++ guarantee that pointers used in pointer
arithmetic are into the same array.  This means that an unsigned divide is fine,
and, further, that the remainder is guaranteed to be zero.  Because of this
property, some cute code generation tricks can be used to generate slightly
better code.

In the future it might be worthwhile to consider adding a ptrdiff instruction to
LLVM.  GCC includes the notion of an "exact divide" (a divide that is known to
have a remainder of zero) for this purpose.  Maybe that would be a better way to go.

Note that the STL std::vector class (among others) use pointer differences
extensively, so it's worthwhile to generate decent code for this.

-Chris



------- You are receiving this mail because: -------
You are on the CC list for the bug, or are watching someone who is.




More information about the llvm-bugs mailing list