[LLVMdev] code generation removes duplicated instructions
D S Khudia
daya.khudia at gmail.com
Wed Jul 6 06:55:01 PDT 2011
Thank you for replying. Yes. The remaining part of the BB is in splitted
basic block.
The following is an example code generation for arm and x86 for a same IR
BB. In the x86 code I can see that the same computation is done twice and
result is stored in two different registers and then these two different
registers are used for comparision. By the way I am duplicating instruction
and inserting comparison to catch transient errors.
IR BB:
bb: ; preds = %bb1.split
%0 = load i32* %i, align 4
%HV10_ = getelementptr inbounds [100 x i32]* %a, i32 0, i32 %0
%1 = getelementptr inbounds [100 x i32]* %a, i32 0, i32 %0
%HVCmp15 = icmp ne i32* %1, %HV10_
br i1 %HVCmp15, label %relExit, label %bb.split
x86 asm:
.LBB0_1: # %bb
# in Loop: Header=BB0_5 Depth=1
leal 972(%esp), %eax
movl 568(%esp), %ecx
imull $4, %ecx, %edx
addl %eax, %edx
imull $4, %ecx, %ecx
addl %eax, %ecx
cmpl %edx, %ecx
movl %ecx, 508(%esp) # 4-byte Spill
jne .LBB0_88
arm asm:
.LBB0_1: @ %bb
@ in Loop: Header=BB0_5 Depth=1
ldr r0, [sp, #444]
add r1, sp, #53, 28 @ 848
add r0, r1, r0, lsl #2
cmp r0, r0
str r0, [sp, #384]
bne .LBB0_88
b .LBB0_2
Thanks
Daya
On Wed, Jul 6, 2011 at 6:18 AM, Renato Golin <renato.golin at arm.com> wrote:
> On 6 July 2011 02:31, D S Khudia <daya.khudia at gmail.com> wrote:
> > %0 = load i32* %i, align 4
> > %HV14_ = getelementptr inbounds [100 x i32]* %a, i32 0, i32 %0
> > %1 = getelementptr inbounds [100 x i32]* %a, i32 0, i32 %0
> > %HVCmp7 = icmp ne i32* %1, %HV14_
> > br i1 %HVCmp7, label %relExit, label %bb.split
> >
> > So that HV14_ is a new instruction and I am inserting a comparison to
> jump
> > to a newly created basic block. Somehow the code generation for arm
> removes
> > the duplicated instruction and cmp instruction in arm assembly looks as
> > follows.
> > cmp r0, r0
>
> Hi Daya,
>
> This is perfectly legal, since the two registers have exactly the same
> value (a[i]) and the comparison will always be the same.
>
> I suppose the rest of the original IR (the other array load, the
> stores and the increment) are in the branched basic blocks...
>
>
> > This defeats the purpose of doing the duplication in the first place.
> Does
> > anyone have any insight on this? Can anyone suggest some starting points
> to
> > debug this?
>
> What is the purpose of the duplication?
>
> cheers,
> --renato
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20110706/e5b4fe16/attachment.html>
More information about the llvm-dev
mailing list