[LLVMdev] Another missed optimization opportunity?
Duncan Sands
baldrick at free.fr
Wed Apr 24 13:14:49 PDT 2013
Hi Scott,
On 24/04/13 19:40, Scott Pakin wrote:
> I was suprised to find that some bitcode I'm generating isn't getting
> optimized. Here, I'm doing the equivalent of "myarray[5]++" (on an
> "extern int *myarray"), repeated three times:
does your bitcode contain data layout information?
Ciao, Duncan.
>
> @myarray = external global i32*
>
> define void @update_array() #0 {
> %1 = load i32** @myarray, align 8
> %2 = getelementptr inbounds i32* %1, i64 5
> %3 = load i32* %2, align 4
> %4 = add nsw i32 %3, 1
> store i32 %4, i32* %2, align 4
> %5 = load i32** @myarray, align 8
> %6 = getelementptr inbounds i32* %5, i64 5
> %7 = load i32* %6, align 4
> %8 = add nsw i32 %7, 1
> store i32 %8, i32* %6, align 4
> %9 = load i32** @myarray, align 8
> %10 = getelementptr inbounds i32* %9, i64 5
> %11 = load i32* %10, align 4
> %12 = add nsw i32 %11, 1
> store i32 %12, i32* %10, align 4
> ret void
> }
>
> Running "opt -std-compile-opts" or even "opt -O3" doesn't seem to
> change the bitcode any. I had expected the three increments by 1 to
> be collapsed into a single increment by 3:
>
> @myarray = external global i32*
>
> define void @update_array() #0 {
> %1 = load i32** @myarray, align 8
> %2 = load i32* %1, align 4
> %3 = add nsw i32 %2, 3
> store i32 %3, i32* %1, align 4
> ret void
> }
>
> Even the (x86-64) code generator doesn't do any last-minute
> optimizations:
>
> movq myarray(%rip), %rax
> incl 20(%rax)
> movq myarray(%rip), %rax
> incl 20(%rax)
> movq myarray(%rip), %rax
> incl 20(%rax)
>
> This is with LLVM revision 180116.
>
> Is there some semantic reason that the increments aren't allowed to be
> combined, or is this a missed optimization opportunity in LLVM?
>
> Thanks,
> -- Scott
> _______________________________________________
> 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