http://llvm.org/bugs/show_bug.cgi?id=4589

           Summary: Invalid GEP optimization after bitcast
           Product: new-bugs
           Version: unspecified
          Platform: PC
        OS/Version: Linux
            Status: NEW
          Severity: normal
          Priority: P2
         Component: new bugs
        AssignedTo: [email protected]
        ReportedBy: [email protected]
                CC: [email protected]


A bitcast followed by a getelementptr causes an
optimization in instcombine that only works on
some machines, but is applied generally.

Here is a small test program:

*================================================*
%dt = type {i32, i32 *}

define i32 *...@get_el(i8 *%arg) {
  %der = bitcast i8 *%arg to %dt *
  %ptr = getelementptr %dt *%der, i32 0, i32 1
  ret i32 **%ptr
}
*================================================*

Run it through:
opt -instcombine

And you get:
*================================================*
        %dt = type { i32, i32* }

define i32** @get_el(i8* %arg) {
        %ptr = getelementptr i8* %arg, i64 8            ; <i8*> [#uses=1]
        %1 = bitcast i8* %ptr to i32**          ; <i32**> [#uses=1]
        ret i32** %1
}
*================================================*
This will happen to work on AMD64 where
dt's 2nd member's offset is 8.
However, this optimization is also applied on 32-bit systems,
where the offset should instead be 4.
So, ptr will then point to the wrong place.
Thus, the optimization is invalid.


-- 
Configure bugmail: http://llvm.org/bugs/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are on the CC list for the bug.
_______________________________________________
LLVMbugs mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/llvmbugs

Reply via email to