Enhance MemDep: When alias analysis returns a partial alias result,
authorChris Lattner <sabre@nondot.org>
Tue, 26 Apr 2011 01:21:15 +0000 (01:21 +0000)
committerChris Lattner <sabre@nondot.org>
Tue, 26 Apr 2011 01:21:15 +0000 (01:21 +0000)
commit1f821512fc1441480b3355305e0da5267073fe1c
tree6bba91bc3f9b51387c675e6663d88edee1ddbf48
parent0c99861836741911300587c579d4f9d3fe1d2a39
Enhance MemDep: When alias analysis returns a partial alias result,
return it as a clobber.  This allows GVN to do smart things.

Enhance GVN to be smart about the case when a small load is clobbered
by a larger overlapping load.  In this case, forward the value.  This
allows us to compile stuff like this:

int test(void *P) {
  int tmp = *(unsigned int*)P;
  return tmp+*((unsigned char*)P+1);
}

into:

_test:                                  ## @test
movl (%rdi), %ecx
movzbl %ch, %eax
addl %ecx, %eax
ret

which has one load.  We already handled the case where the smaller
load was from a must-aliased base pointer.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@130180 91177308-0d34-0410-b5e6-96231b3b80d8
include/llvm/Analysis/MemoryDependenceAnalysis.h
lib/Analysis/MemoryDependenceAnalysis.cpp
lib/Transforms/Scalar/GVN.cpp
test/Transforms/GVN/rle.ll