[LLVMdev] Missed optimization on array initialization
Duncan Sands
baldrick at free.fr
Sat Feb 25 04:17:30 PST 2012
Hi Carlo, for what it's worth, gcc-4.7 doesn't get this either.
Ciao, Duncan.
On 25/02/12 12:17, Carlo Alberto Ferraris wrote:
> Prompted by a SO post
> (http://stackoverflow.com/questions/9441882/compiler-instruction-reordering-optimizations-in-c-and-what-inhibits-them/9442363)
> I checked and found that LLVM yields the same (seemingly) suboptimal code as MSVC.
> Consider the following, simplified, C snippet:
>
> extern void bar(int*);
>
> void foo(int a)
> {
> int ar[100] = {a};
> if (a)
> return;
> bar(ar);
> }
>
> Ideally, the array initialization should be sank after the return, but in
> Clang/LLVM 3.0 this doesn't happen:
>
> ; ModuleID ='/tmp/webcompile/_11079_0.bc'
> target datalayout ="e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
> target triple ="x86_64-unknown-linux-gnu"
>
> define void @_Z3fooi(i32 %a) uwtable {
> %ar =alloca [100 xi32],align 16
> %1 =bitcast [100 xi32]* %arto i8*
> call void @llvm.memset.p0i8.i64(i8* %1,i8 0,i64 400,i32 16,i1 false)
> %2 =getelementptr inbounds [100 xi32]* %ar,i64 0,i64 0
> store i32 %a,i32* %2,align 16, !tbaa !0
> %3 =icmp eq i32 %a, 0
> br i1 %3,label %4,label %5
>
> ;<label>:4 ; preds = %0
> call void @_Z3barPi(i32* %2)
> br label %5
>
> ;<label>:5 ; preds = %4, %0
> ret void
> }
>
> declare void @llvm.memset.p0i8.i64(i8*nocapture,i8,i64,i32,i1)nounwind
>
> declare void @_Z3barPi(i32*)
>
> !0 = metadata !{metadata !"int", metadata !1}
> !1 = metadata !{metadata !"omnipotent char", metadata !2}
> !2 = metadata !{metadata !"Simple C/C++ TBAA",null}
>
> and this gets emitted as (for x64, but x86 is similar):
>
> # BB#0:
> pushq %rbx
> .Ltmp3:
> .cfi_def_cfa_offset 16
> subq $400, %rsp # imm = 0x190
> .Ltmp4:
> .cfi_def_cfa_offset 416
> .Ltmp5:
> .cfi_offset %rbx, -16
> movl %edi, %ebx
> leaq (%rsp), %rdi
> xorl %esi, %esi
> movl $400, %edx # imm = 0x190
> callq memset
> movl %ebx, (%rsp)
> testl %ebx, %ebx
> jne .LBB0_2
> # BB#1:
> leaq (%rsp), %rdi
> callq _Z3barPi
> .LBB0_2:
> addq $400, %rsp # imm = 0x190
> popq %rbx
> ret
>
> I don't have ToT at hand, so I don't know if this is still the case. Any idea
> why this might be happening?
>
>
>
> _______________________________________________
> 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