From cb19d679076724a86b62a1821e422ad69ab3d9c5 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Sat, 17 Jul 2004 07:40:34 +0000 Subject: [PATCH] Fix incorrect computation of mod/ref sets. Do not ask for mod/ref information for objects of size 0. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@14908 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Analysis/AliasAnalysisEvaluator.cpp | 50 ++++++++++++++----------- 1 file changed, 29 insertions(+), 21 deletions(-) diff --git a/lib/Analysis/AliasAnalysisEvaluator.cpp b/lib/Analysis/AliasAnalysisEvaluator.cpp index f3b4ebae9c5..2794fef33d1 100644 --- a/lib/Analysis/AliasAnalysisEvaluator.cpp +++ b/lib/Analysis/AliasAnalysisEvaluator.cpp @@ -21,7 +21,7 @@ #include "llvm/iOther.h" #include "llvm/iTerminators.h" #include "llvm/Pass.h" -#include "llvm/Type.h" +#include "llvm/DerivedTypes.h" #include "llvm/Analysis/AliasAnalysis.h" #include "llvm/Assembly/Writer.h" #include "llvm/Support/InstIterator.h" @@ -137,27 +137,35 @@ bool AAEval::runOnFunction(Function &F) { // Mod/ref alias analysis: compare all pairs of calls and values for (std::set::iterator V = Pointers.begin(), Ve = Pointers.end(); - V != Ve; ++V) - for (std::set::iterator C = CallSites.begin(), - Ce = CallSites.end(); C != Ce; ++C) { - Instruction *I = C->getInstruction(); - switch (AA.getModRefInfo(*C, *V, (*V)->getType()->getPrimitiveSize())) { - case AliasAnalysis::NoModRef: - PrintModRefResults("NoModRef", PrintNoModRef, I, *V, F.getParent()); - ++NoModRef; break; - case AliasAnalysis::Mod: - PrintModRefResults(" Mod", PrintMod, I, *V, F.getParent()); - ++Mod; break; - case AliasAnalysis::Ref: - PrintModRefResults(" Ref", PrintRef, I, *V, F.getParent()); - ++Ref; break; - case AliasAnalysis::ModRef: - PrintModRefResults(" ModRef", PrintModRef, I, *V, F.getParent()); - ++ModRef; break; - default: - std::cerr << "Unknown alias query result!\n"; + V != Ve; ++V) { + unsigned Size = 0; + if (const PointerType *PTy = dyn_cast((*V)->getType())) + if (!(Size = PTy->getElementType()->getPrimitiveSize())) + if (isa(PTy->getElementType())) + Size = 4; // This is a hack, but it's good enough for eval. + + if (Size) + for (std::set::iterator C = CallSites.begin(), + Ce = CallSites.end(); C != Ce; ++C) { + Instruction *I = C->getInstruction(); + switch (AA.getModRefInfo(*C, *V, Size)) { + case AliasAnalysis::NoModRef: + PrintModRefResults("NoModRef", PrintNoModRef, I, *V, F.getParent()); + ++NoModRef; break; + case AliasAnalysis::Mod: + PrintModRefResults(" Mod", PrintMod, I, *V, F.getParent()); + ++Mod; break; + case AliasAnalysis::Ref: + PrintModRefResults(" Ref", PrintRef, I, *V, F.getParent()); + ++Ref; break; + case AliasAnalysis::ModRef: + PrintModRefResults(" ModRef", PrintModRef, I, *V, F.getParent()); + ++ModRef; break; + default: + std::cerr << "Unknown alias query result!\n"; + } } - } + } return false; } -- 2.34.1