[LLVMdev] Trunc Load

Duncan Sands baldrick at free.fr
Thu Oct 27 08:32:56 PDT 2011


Hi Johannes, what processor are you targeting?  Is it little-endian or
big-endian?

Ciao, Duncan.

> I have the following simple IR:
>
> ==================================
> @l = common global i64 0, align 8
>
> define void @hello() nounwind {
> entry:
>     store i64 -4919131755279862989, i64* @l
>     ret void
> }
>
> define i32 @main(i32 %argc, i8** %argv) nounwind {
> entry:
>     call void @hello()
>     %tmp = load i64* @l
>     %conv = trunc i64 %tmp to i32
>     ret i32 %conv
> }
> ==================================
>
> Of interest are the lines
>     %tmp = load i64* @l
>     %conv = trunc i64 %tmp to i32
>
> ... which LLVM automatically translates to "load singleword" from
> memory, instead of "load doubleword; then truncate". However, this
> (simply load a singleword) gives an erroneous result. On my
> architecture, this results in the high bits being loaded into the return
> register, instead of the low bits, as should happen with truncate.
>
> Details: i64 's are stored in two adjacent 32 bit registers. So the
> store happens like this:
> "stddw 0xBBBBBBBB33333333, *$ptr"
> and the load should happen like this:
> "lddw *$ptr, A5:A4"
> . It is easy to see that if
> "ldw *$ptr, A4"
> is printed, then the high bits will be loaded into A4. Something like
> this would be correct just like the lddw variant:
> "ldw *-$ptr(4), A4"
>
> Is there a way to change this behavior (that (trunc (load doubleword))
> is replaced by (load word))?
> Or if you think the fault lies on my side, where is the right point to
> begin debugging?
>
> Thanks for any kind of hint!
> Johannes
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev




More information about the llvm-dev mailing list