Eliminate a virtual method call
authorChris Lattner <sabre@nondot.org>
Wed, 15 Dec 2004 18:14:04 +0000 (18:14 +0000)
committerChris Lattner <sabre@nondot.org>
Wed, 15 Dec 2004 18:14:04 +0000 (18:14 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@18964 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/LoadValueNumbering.cpp

index a8c9d5f231cdf7af2e98dc064ab8efa9e5cfde77..67d675f40bc869816fcb6faf5af16d037531be5b 100644 (file)
@@ -144,7 +144,10 @@ void LoadVN::getCallEqualNumberNodes(CallInst *CI,
   Function *CF = CI->getCalledFunction();
   if (CF == 0) return;  // Indirect call.
   AliasAnalysis &AA = getAnalysis<AliasAnalysis>();
-  if (!AA.onlyReadsMemory(CF)) return;  // Nothing we can do.
+  AliasAnalysis::ModRefBehavior MRB = AA.getModRefBehavior(CF, CI);
+  if (MRB != AliasAnalysis::DoesNotAccessMemory &&
+      MRB != AliasAnalysis::OnlyReadsMemory)
+    return;  // Nothing we can do for now.
 
   // Scan all of the arguments of the function, looking for one that is not
   // global.  In particular, we would prefer to have an argument or instruction
@@ -193,7 +196,7 @@ void LoadVN::getCallEqualNumberNodes(CallInst *CI,
   // whether an intervening instruction could modify memory that is read, not
   // ANY memory.
   //
-  if (!AA.doesNotAccessMemory(CF)) {
+  if (MRB == AliasAnalysis::OnlyReadsMemory) {
     DominatorSet &DomSetInfo = getAnalysis<DominatorSet>();
     BasicBlock *CIBB = CI->getParent();
     for (unsigned i = 0; i != IdenticalCalls.size(); ++i) {