[LLVMdev] code generation removes duplicated instructions
D S Khudia
daya.khudia at gmail.com
Thu Jul 7 11:15:27 PDT 2011
Ok. Let me describe the problem again in some detail.
The following is the original bitcode from a real testcase:
bb7:
%46 = load i32* %j, align 4
%47 = add nsw i32 %46, 1
store i32 %47, i32* %j, align 4
br label %bb8
To protect the operand of the store I duplicate the input chain of operands
and insert a comparison to check whether the operand of the stores are
correct. As a result of this modification the code looks as follows. Here
instructions with HV in there name are extra inserted instructions and
relExit BB contains a printf message which is executed if the
comparison fails. This is the final code which is supposed to execute on a
simulator or real hardware.
bb7:
%46 = load i32* %j, align 4
%47 = add nsw i32 %46, 1
%HV7_ = add nsw i32 %46, 1
%HVCmp13 = icmp ne i32 %47, %HV7_
br i1 %HVCmp13, label %relExit, label %bb7.split
bb7.split:
store i32 %47, i32* %j, align 4
br label %bb8
The following is the arm code generated for the above block (llc with -O0):
.LBB0_26: @ %bb7
@ in Loop: Header=BB0_28 Depth=2
ldr r0, [sp, #440]
add r0, r0, #1
cmp r0, r0
str r0, [sp, #288]
bne .LBB0_88
b .LBB0_27
.LBB0_27: @ %bb7.split
@ in Loop: Header=BB0_28 Depth=2
ldr r0, [sp, #288]
str r0, [sp, #440]
The code generated for x86 for the same two blocks looks like as follows
(again llc with -O0):
.LBB0_26: # %bb7
# in Loop: Header=BB0_28
Depth=2
movl 564(%esp), %eax
movl %eax, 400(%esp) # 4-byte Spill
addl $1, %eax
movl 400(%esp), %ecx # 4-byte Reload
addl $1, %ecx
cmpl %ecx, %eax
movl %eax, 396(%esp) # 4-byte Spill
jne .LBB0_88
# BB#27: # %bb7.split
# in Loop: Header=BB0_28
Depth=2
movl 396(%esp), %eax # 4-byte Reload
movl %eax, 564(%esp)
The problem here is in case of ARM code generation the backend has
effectively removed the comparison (its comparing same register) of
different computations. I want to have that comparison in the final code.
The final code would be running on a hardware or simulator so that whenever
a transient error occurs I can detect that and trigger a recovery. My goal
here is to achieve the duplicated computation (same as visible in x86 asm
e.g. adding the one twice) for ARM. Is there a way I can achieve it?
Does the problem make more sense now? Thank you for your help.
Thanks
Daya
On Thu, Jul 7, 2011 at 4:05 AM, Renato Golin <renato.golin at arm.com> wrote:
> On 7 July 2011 00:02, D S Khudia <daya.khudia at gmail.com> wrote:
> > I am trying to add a intrinsic call between the similar two instructions
> > which either I'll remove or convert to nop in codegen.
>
> If the two instructions are only similar in your real example, than
> you need to make them similar in your test, not identical. Different
> offsets, different array...
>
> If them two are identical in the real example as it is in your test,
> than you don't need to worry about it, because the back-end will
> remove them anyway.
>
>
> > Does that kind of seem appropriate for the purpose here?
>
> If you're adding the builtin call just to mark the code in some way, I
> suggest you using metadata. If that builtin has some function that is
> necessary in between two similar instructions, than it looks ok.
>
> Sorry if I'm being vague, I'm not fully getting the original problem...
>
> cheers,
> --renato
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20110707/11ac10f2/attachment.html>
More information about the llvm-dev
mailing list