summaryrefslogtreecommitdiff
path: root/lib/Target/NVPTX
diff options
context:
space:
mode:
authorEli Bendersky <eliben@google.com>2014-05-01 18:38:36 +0000
committerEli Bendersky <eliben@google.com>2014-05-01 18:38:36 +0000
commit167a57ca452efbb014ebce7ecfa99501b5039611 (patch)
tree6a2b1de596c6e17369a85ab06e8bf0407bc07d83 /lib/Target/NVPTX
parent75bb54dcc55d1c206b37af9a91b8e479f9f75104 (diff)
downloadllvm-167a57ca452efbb014ebce7ecfa99501b5039611.tar.gz
llvm-167a57ca452efbb014ebce7ecfa99501b5039611.tar.bz2
llvm-167a57ca452efbb014ebce7ecfa99501b5039611.tar.xz
Add an optimization that does CSE in a group of similar GEPs.
This optimization merges the common part of a group of GEPs, so we can compute each pointer address by adding a simple offset to the common part. The optimization is currently only enabled for the NVPTX backend, where it has a large payoff on some benchmarks. Review: http://reviews.llvm.org/D3462 Patch by Jingyue Wu. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@207783 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/NVPTX')
-rw-r--r--lib/Target/NVPTX/NVPTXTargetMachine.cpp21
1 files changed, 17 insertions, 4 deletions
diff --git a/lib/Target/NVPTX/NVPTXTargetMachine.cpp b/lib/Target/NVPTX/NVPTXTargetMachine.cpp
index 0cc5c51629..26a4f84052 100644
--- a/lib/Target/NVPTX/NVPTXTargetMachine.cpp
+++ b/lib/Target/NVPTX/NVPTXTargetMachine.cpp
@@ -147,10 +147,23 @@ void NVPTXPassConfig::addIRPasses() {
addPass(createNVPTXAssignValidGlobalNamesPass());
addPass(createGenericToNVVMPass());
addPass(createNVPTXFavorNonGenericAddrSpacesPass());
- // The FavorNonGenericAddrSpaces pass may remove instructions and leave some
- // values unused. Therefore, we run a DCE pass right afterwards. We could
- // remove unused values in an ad-hoc manner, but it requires manual work and
- // might be error-prone.
+ addPass(createSeparateConstOffsetFromGEPPass());
+ // The SeparateConstOffsetFromGEP pass creates variadic bases that can be used
+ // by multiple GEPs. Run GVN or EarlyCSE to really reuse them. GVN generates
+ // significantly better code than EarlyCSE for some of our benchmarks.
+ if (getOptLevel() == CodeGenOpt::Aggressive)
+ addPass(createGVNPass());
+ else
+ addPass(createEarlyCSEPass());
+ // Both FavorNonGenericAddrSpaces and SeparateConstOffsetFromGEP may leave
+ // some dead code. We could remove dead code in an ad-hoc manner, but that
+ // requires manual work and might be error-prone.
+ //
+ // The FavorNonGenericAddrSpaces pass shortcuts unnecessary addrspacecasts,
+ // and leave them unused.
+ //
+ // SeparateConstOffsetFromGEP rebuilds a new index from the old index, and the
+ // old index and some of its intermediate results may become unused.
addPass(createDeadCodeEliminationPass());
}