summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2008-12-01 01:31:36 +0000
committerChris Lattner <sabre@nondot.org>2008-12-01 01:31:36 +0000
commit9ce8995d24422e84c82ace336072a9e33fa8f67c (patch)
tree09790849f93512a60b2e9b89a05eb7fb66aee3bb /llvm/lib/Transforms
parent7e61dafc95be8e484bfc9f71de5a4137aeaad129 (diff)
downloadbcm5719-llvm-9ce8995d24422e84c82ace336072a9e33fa8f67c.tar.gz
bcm5719-llvm-9ce8995d24422e84c82ace336072a9e33fa8f67c.zip
Make GVN be more intelligent about redundant load
elimination: when finding dependent load/stores, realize that they are the same if aliasing claims must alias instead of relying on the pointers to be exactly equal. This makes load elimination more aggressive. For example, on 403.gcc, we had: < 68 gvn - Number of instructions PRE'd < 152718 gvn - Number of instructions deleted < 49699 gvn - Number of loads deleted < 6153 memdep - Number of dirty cached non-local responses < 169336 memdep - Number of fully cached non-local responses < 162428 memdep - Number of uncached non-local responses now we have: > 64 gvn - Number of instructions PRE'd > 153623 gvn - Number of instructions deleted > 49856 gvn - Number of loads deleted > 5022 memdep - Number of dirty cached non-local responses > 159030 memdep - Number of fully cached non-local responses > 162443 memdep - Number of uncached non-local responses That's an extra 157 loads deleted and extra 905 other instructions nuked. This slows down GVN very slightly, from 3.91 to 3.96s. llvm-svn: 60314
Diffstat (limited to 'llvm/lib/Transforms')
-rw-r--r--llvm/lib/Transforms/Scalar/GVN.cpp21
1 files changed, 19 insertions, 2 deletions
diff --git a/llvm/lib/Transforms/Scalar/GVN.cpp b/llvm/lib/Transforms/Scalar/GVN.cpp
index 292a97e392a..9189f41c19c 100644
--- a/llvm/lib/Transforms/Scalar/GVN.cpp
+++ b/llvm/lib/Transforms/Scalar/GVN.cpp
@@ -915,11 +915,28 @@ bool GVN::processNonLocalLoad(LoadInst* L,
}
if (StoreInst* S = dyn_cast<StoreInst>(DepInfo.getInst())) {
- if (S->getPointerOperand() != L->getPointerOperand())
+ // Reject loads and stores that are to the same address but are of
+ // different types.
+ // NOTE: 403.gcc does have this case (e.g. in readonly_fields_p) because
+ // of bitfield access, it would be interesting to optimize for it at some
+ // point.
+ if (S->getOperand(0)->getType() != L->getType())
+ return false;
+
+ if (S->getPointerOperand() != L->getPointerOperand() &&
+ VN.getAliasAnalysis()->alias(S->getPointerOperand(), 1,
+ L->getPointerOperand(), 1)
+ != AliasAnalysis::MustAlias)
return false;
repl[DepBB] = S->getOperand(0);
} else if (LoadInst* LD = dyn_cast<LoadInst>(DepInfo.getInst())) {
- if (LD->getPointerOperand() != L->getPointerOperand())
+ if (LD->getType() != L->getType())
+ return false;
+
+ if (LD->getPointerOperand() != L->getPointerOperand() &&
+ VN.getAliasAnalysis()->alias(LD->getPointerOperand(), 1,
+ L->getPointerOperand(), 1)
+ != AliasAnalysis::MustAlias)
return false;
repl[DepBB] = LD;
} else {
OpenPOWER on IntegriCloud