summaryrefslogtreecommitdiff
path: root/clang/lib/Analysis
diff options
context:
space:
mode:
Diffstat (limited to 'clang/lib/Analysis')
-rw-r--r--clang/lib/Analysis/Interval.cpp69
1 files changed, 31 insertions, 38 deletions
diff --git a/clang/lib/Analysis/Interval.cpp b/clang/lib/Analysis/Interval.cpp
index ac96107..7096d75 100644
--- a/clang/lib/Analysis/Interval.cpp
+++ b/clang/lib/Analysis/Interval.cpp
@@ -221,11 +221,6 @@ M merge_maps_with(const F& f, const M& left, const M& right) {
return result;
}
-template<>
-Vector minimum(const Vector& l, const Vector& r) {
- return (l < r ? l : r);
- return merge_maps_with(minimum<ZBar>, l, r);
-}
template<class T>
T max(const T& l, const T& r) {
return (l < r ? l : r);
@@ -642,10 +637,16 @@ void runOnBlock(const CFGBlock* block, EqnSys& system, BlockVars& block_vars) {
std::vector<EqnExpr*> plusArgs;
for (int negate = 0; negate < 2; ++negate) {
std::string var_name = negate ? negate_string(variables->first) : variables->first;
- std::vector<EqnExpr*> minArgs;
- minArgs.push_back(vars[var_name]);
- minArgs.push_back(&system.constant(cond[var_name]));
- plusArgs.push_back(&system.expression(new Minimum<ZBar>(), minArgs));
+ if (cond[var_name] == infinity<ZBar>()) {
+ plusArgs.push_back(vars[var_name]);
+ } else if (cond[var_name] == -infinity<ZBar>()) {
+ plusArgs.push_back(&system.constant(-infinity<ZBar>()));
+ } else {
+ std::vector<EqnExpr*> minArgs;
+ minArgs.push_back(vars[var_name]);
+ minArgs.push_back(&system.constant(cond[var_name]));
+ plusArgs.push_back(&system.expression(new Minimum<ZBar>(), minArgs));
+ }
}
std::vector<EqnExpr*> guard_args;
@@ -672,15 +673,31 @@ IntervalAnalysis :: IntervalAnalysis(AnalysisDeclContext &context)
IntervalAnalysis :: ~IntervalAnalysis() {
}
-void IntervalAnalysis::runOnAllBlocks() {
+void IntervalAnalysis::runOnAllBlocks(const Decl& decl) {
const CFG *cfg = this->context->getCFG();
cfg->dump(context->getASTContext().getLangOpts(),
llvm::sys::Process::StandardErrHasColors());
- EqnSys system;
+ EqnSys system;
BlockVars block_vars;
+ std::vector<EqnExpr*> infArg;
+ infArg.push_back(&system.constant(infinity<ZBar>()));
+ std::set<std::string>& function_arguments = block_vars[&cfg->getEntry()];
+ std::string block_id = toString(cfg->getEntry().getBlockID());
+ if (const FunctionDecl* func = dyn_cast<const FunctionDecl>(&decl)) {
+ for (unsigned int i = func->getNumParams(); i > 0; i--) {
+ std::string name = func->getParamDecl(i-1)->getNameAsString();
+
+ function_arguments.insert(name); // add it to the first block's vars
+ function_arguments.insert(negate_string(name)); // add it to the first block's vars
+
+ system[system.variable(name + '-' + block_id + "-pre")] = &system.maxExpression(infArg); // set the vars to infinity in the system here
+ system[system.variable(negate_string(name) + '-' + block_id + "-pre")] = &system.maxExpression(infArg); // set the vars to infinity in the system here
+ }
+ }
+
std::set<const CFGBlock*> seen;
std::deque<const CFGBlock*> todo;
todo.push_back(&cfg->getEntry());
@@ -702,39 +719,15 @@ void IntervalAnalysis::runOnAllBlocks() {
}
}
- std::vector<EqnExpr*> a;
-
- a.push_back(&system.constant(-infinity<ZBar>()));
- a.push_back(&system.constant(0));
- system[system.variable("x")] = &system.maxExpression(a);
- a.clear();
-
- system.variable("y");
-
- a.push_back(&system.variable("x"));
- a.push_back(&system.variable("z"));
- EqnExpr* minExpr = &system.expression(new Maximum<ZBar>(), a);
- a.clear();
-
- a.push_back(&system.constant(-infinity<ZBar>()));
- a.push_back(minExpr);
- system[system.variable("y")] = &system.maxExpression(a);
- a.clear();
-
- a.push_back(&system.constant(-infinity<ZBar>()));
- a.push_back(&system.variable("y"));
- system[system.variable("z")] = &system.maxExpression(a);
-
llvm::errs() << toString(system) << "\n";
system.indexMaxExpressions();
- DynamicMaxStrategy<ZBar> strategy(system);
- DynamicVariableAssignment<ZBar> rho(system, strategy);
- strategy.setRho(rho);
+
+ Solver<ZBar> solver(system);
for (unsigned int i = 0, size = system.variableCount(); i < size; ++i) {
EqnVar& var = system.variable(size - i - 1);
- llvm::errs() << toString(var.name()) << " = " << toString(rho[var]) << "\n";
+ llvm::errs() << toString(var.name()) << " = " << toString(solver.solve(var)) << "\n";
}
}