[DAGCombiner] Slice a big load in two loads when the element are next to each
authorQuentin Colombet <qcolombet@apple.com>
Fri, 11 Oct 2013 18:01:14 +0000 (18:01 +0000)
committerQuentin Colombet <qcolombet@apple.com>
Fri, 11 Oct 2013 18:01:14 +0000 (18:01 +0000)
commitc34693f6efc670b71e11f3479844c36d9696b535
treebbb17e341801d36e5109f9224e8aaed3d40c9baf
parent563c18283926b18bbdb6d3ad6cf02594399e2baf
[DAGCombiner] Slice a big load in two loads when the element are next to each
other in memory and the target has paired load and performs post-isel loads
combining.

E.g., this optimization will transform something like this:
 a = load i64* addr
 b = trunc i64 a to i32
 c = lshr i64 a, 32
 d = trunc i64 c to i32

into:
 b = load i32* addr1
 d = load i32* addr2
Where addr1 = addr2 +/- sizeof(i32), if the target supports paired load and
performs post-isel loads combining.

One should overload TargetLowering::hasPairedLoad to provide this information.
The default is false.

<rdar://problem/14477220>

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@192471 91177308-0d34-0410-b5e6-96231b3b80d8
include/llvm/Target/TargetLowering.h
lib/CodeGen/SelectionDAG/DAGCombiner.cpp
test/CodeGen/X86/load-slice.ll [new file with mode: 0644]