Aliasing confusion

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?

I am using what I believe is the most recent svn version (llvm version
3.0svn, revision 141415).

- Andrew

Are you providing target data? AA skips a bunch of calculations when
the the size of a pointer isn't specified.

-Eli

Thanks, that was it.

- Andrew