[LLVMdev] Aliasing confusion
Eli Friedman
eli.friedman at gmail.com
Fri Oct 7 14:43:20 PDT 2011
On Fri, Oct 7, 2011 at 2:15 PM, andrew adams <andrew.b.adams at gmail.com> wrote:
> Hi all,
>
> I'm having trouble understanding how llvm determines if pointers
> alias. Consider the following two functions that each do a redundant
> load:
>
> define float @A(float * noalias %ptr1) {
> %ptr2 = getelementptr float* %ptr1, i32 1024
> %val1a = load float* %ptr1
> store float %val1a, float* %ptr2
> %val1b = load float* %ptr1
> ret float %val1b
> }
>
>
> define float @B(float * noalias %ptr1, float * noalias %ptr2) {
> %val1a = load float* %ptr1
> store float %val1a, float* %ptr2
> %val1b = load float* %ptr1
> ret float %val1b
> }
>
> When I throw this code into test_alias.ll and run:
>
> opt test_alias.ll -basicaa -print-alias-sets > /dev/null
>
> it tells me that in the first function, ptr1 and ptr2 may alias, and
> in the second function they do not. The source of
> BasicAliasAnalysis.cpp seems more than intelligent enough to detect
> both of these cases as not aliasing.
>
> More to the point, the X86 assembly I get from compiling this is:
>
> opt -O3 test_alias.ll | llc -filetype=asm
> ...
> _A: ## @A
> movss (%rdi), %xmm0
> movss %xmm0, 4096(%rdi)
> movss (%rdi), %xmm0
> ret
>
> ...
> _B: ## @B
> movss (%rdi), %xmm0
> movss %xmm0, (%rsi)
> ret
> ...
>
> Note the redundant movss in A.
>
> Any idea what I'm doing wrong?
Are you providing target data? AA skips a bunch of calculations when
the the size of a pointer isn't specified.
-Eli
More information about the llvm-dev
mailing list