projects
/
oota-llvm.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Regression tests for PR258 and PR259.
[oota-llvm.git]
/
lib
/
Analysis
/
AliasAnalysisEvaluator.cpp
diff --git
a/lib/Analysis/AliasAnalysisEvaluator.cpp
b/lib/Analysis/AliasAnalysisEvaluator.cpp
index 4366ab8509ad7b8b9cc8a6a57dd1c35a1e6b0b9d..073300c502470bb512042cc7a0b9bd4030ffe575 100644
(file)
--- a/
lib/Analysis/AliasAnalysisEvaluator.cpp
+++ b/
lib/Analysis/AliasAnalysisEvaluator.cpp
@@
-1,4
+1,11
@@
//===- AliasAnalysisEvaluator.cpp - Alias Analysis Accuracy Evaluator -----===//
//===- AliasAnalysisEvaluator.cpp - Alias Analysis Accuracy Evaluator -----===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file was developed by the LLVM research group and is distributed under
+// the University of Illinois Open Source License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
//
// This file implements a simple N^2 alias analysis accuracy evaluator.
// Basically, for each function in the program, it simply queries to see how the
//
// This file implements a simple N^2 alias analysis accuracy evaluator.
// Basically, for each function in the program, it simply queries to see how the
@@
-17,6
+24,8
@@
#include "llvm/Support/InstIterator.h"
#include "llvm/Assembly/Writer.h"
#include "Support/CommandLine.h"
#include "llvm/Support/InstIterator.h"
#include "llvm/Assembly/Writer.h"
#include "Support/CommandLine.h"
+#include <set>
+using namespace llvm;
namespace {
cl::opt<bool> PrintNo ("print-no-aliases", cl::ReallyHidden);
namespace {
cl::opt<bool> PrintNo ("print-no-aliases", cl::ReallyHidden);
@@
-41,43
+50,48
@@
namespace {
X("aa-eval", "Exhaustive Alias Analysis Precision Evaluator");
}
X("aa-eval", "Exhaustive Alias Analysis Precision Evaluator");
}
-static inline void PrintResults(const char *Msg, bool P, Value *V1, Value *V2) {
+static inline void PrintResults(const char *Msg, bool P, Value *V1, Value *V2,
+ Module *M) {
if (P) {
std::cerr << " " << Msg << ":\t";
if (P) {
std::cerr << " " << Msg << ":\t";
- WriteAsOperand(std::cerr, V1) << ", ";
- WriteAsOperand(std::cerr, V2) << "\n";
+ WriteAsOperand(std::cerr, V1
, true, true, M
) << ", ";
+ WriteAsOperand(std::cerr, V2
, true, true, M
) << "\n";
}
}
bool AAEval::runOnFunction(Function &F) {
AliasAnalysis &AA = getAnalysis<AliasAnalysis>();
}
}
bool AAEval::runOnFunction(Function &F) {
AliasAnalysis &AA = getAnalysis<AliasAnalysis>();
- std::
vector
<Value *> Pointers;
+ std::
set
<Value *> Pointers;
for (Function::aiterator I = F.abegin(), E = F.aend(); I != E; ++I)
if (isa<PointerType>(I->getType())) // Add all pointer arguments
for (Function::aiterator I = F.abegin(), E = F.aend(); I != E; ++I)
if (isa<PointerType>(I->getType())) // Add all pointer arguments
- Pointers.
push_back
(I);
+ Pointers.
insert
(I);
- for (inst_iterator I = inst_begin(F), E = inst_end(F); I != E; ++I)
+ for (inst_iterator I = inst_begin(F), E = inst_end(F); I != E; ++I)
{
if (isa<PointerType>((*I)->getType())) // Add all pointer instructions
if (isa<PointerType>((*I)->getType())) // Add all pointer instructions
- Pointers.push_back(*I);
+ Pointers.insert(*I);
+ for (User::op_iterator OI = (*I)->op_begin(); OI != (*I)->op_end(); ++OI)
+ if (isa<PointerType>((*OI)->getType()))
+ Pointers.insert(*OI);
+ }
if (PrintNo || PrintMay || PrintMust)
std::cerr << "Function: " << F.getName() << "\n";
// iterate over the worklist, and run the full (n^2)/2 disambiguations
if (PrintNo || PrintMay || PrintMust)
std::cerr << "Function: " << F.getName() << "\n";
// iterate over the worklist, and run the full (n^2)/2 disambiguations
- for (std::
vector
<Value *>::iterator I1 = Pointers.begin(), E = Pointers.end();
+ for (std::
set
<Value *>::iterator I1 = Pointers.begin(), E = Pointers.end();
I1 != E; ++I1)
I1 != E; ++I1)
- for (std::
vector
<Value *>::iterator I2 = Pointers.begin(); I2 != I1; ++I2)
+ for (std::
set
<Value *>::iterator I2 = Pointers.begin(); I2 != I1; ++I2)
switch (AA.alias(*I1, 0, *I2, 0)) {
case AliasAnalysis::NoAlias:
switch (AA.alias(*I1, 0, *I2, 0)) {
case AliasAnalysis::NoAlias:
- PrintResults("No", PrintNo, *I1, *I2);
+ PrintResults("No", PrintNo, *I1, *I2
, F.getParent()
);
++No; break;
case AliasAnalysis::MayAlias:
++No; break;
case AliasAnalysis::MayAlias:
- PrintResults("May", PrintMay, *I1, *I2);
+ PrintResults("May", PrintMay, *I1, *I2
, F.getParent()
);
++May; break;
case AliasAnalysis::MustAlias:
++May; break;
case AliasAnalysis::MustAlias:
- PrintResults("Must", PrintMust, *I1, *I2);
+ PrintResults("Must", PrintMust, *I1, *I2
, F.getParent()
);
++Must; break;
default:
std::cerr << "Unknown alias query result!\n";
++Must; break;
default:
std::cerr << "Unknown alias query result!\n";