From 85c22c2486c79b463451aeeba56a33313d4e460d Mon Sep 17 00:00:00 2001 From: Timotej Kapus Date: Wed, 30 Oct 2019 10:48:05 +0000 Subject: [optimize-array] Fix value transformation Value transformation operates on word instead of byte arrays. That means the Read indicies need to be adjusted to reflect that. Previously IndexCleanerVisitor tried to remove the multiplications in the index to covert byte indicies to word indicies. However as the two added test cases show this is not sufficent. Therefore we remove the IndexCleanerVisistor and just divide the index with word size which should always be correct. --- lib/Expr/ArrayExprOptimizer.cpp | 17 +++++------------ lib/Expr/ArrayExprVisitor.cpp | 16 ---------------- lib/Expr/ArrayExprVisitor.h | 14 -------------- 3 files changed, 5 insertions(+), 42 deletions(-) (limited to 'lib/Expr') diff --git a/lib/Expr/ArrayExprOptimizer.cpp b/lib/Expr/ArrayExprOptimizer.cpp index b55974d0..60f2ca6e 100644 --- a/lib/Expr/ArrayExprOptimizer.cpp +++ b/lib/Expr/ArrayExprOptimizer.cpp @@ -313,12 +313,9 @@ ref ExprOptimizer::getSelectOptExpr( arrayValues.push_back(val); } - ref index = read->index; - IndexCleanerVisitor ice; - ice.visit(index); - if (ice.getIndex().get()) { - index = ice.getIndex(); - } + ref index = UDivExpr::create( + read->index, + ConstantExpr::create(bytesPerElement, read->index->getWidth())); ref opt = buildConstantSelectExpr(index, arrayValues, width, elementsInArray); @@ -650,12 +647,8 @@ ref ExprOptimizer::buildMixedSelectExpr( } } - ref new_index = re->index; - IndexCleanerVisitor ice; - ice.visit(new_index); - if (ice.getIndex().get()) { - new_index = ice.getIndex(); - } + ref new_index = UDivExpr::create( + re->index, ConstantExpr::create(width / 8, re->index->getWidth())); int new_index_width = new_index->getWidth(); // Iterate through all the ranges diff --git a/lib/Expr/ArrayExprVisitor.cpp b/lib/Expr/ArrayExprVisitor.cpp index 75604104..cada7867 100644 --- a/lib/Expr/ArrayExprVisitor.cpp +++ b/lib/Expr/ArrayExprVisitor.cpp @@ -256,19 +256,3 @@ ExprVisitor::Action ArrayValueOptReplaceVisitor::visitRead(const ReadExpr &re) { } return Action::doChildren(); } - -ExprVisitor::Action IndexCleanerVisitor::visitMul(const MulExpr &e) { - if (mul) { - if (!isa(e.getKid(0))) - index = e.getKid(0); - else if (!isa(e.getKid(1))) - index = e.getKid(1); - mul = false; - } - return Action::doChildren(); -} - -ExprVisitor::Action IndexCleanerVisitor::visitRead(const ReadExpr &) { - mul = false; - return Action::doChildren(); -} diff --git a/lib/Expr/ArrayExprVisitor.h b/lib/Expr/ArrayExprVisitor.h index 37f14cd1..28f485d9 100644 --- a/lib/Expr/ArrayExprVisitor.h +++ b/lib/Expr/ArrayExprVisitor.h @@ -124,20 +124,6 @@ public: bool recursive = true) : ExprVisitor(recursive), optimized(_optimized) {} }; - -class IndexCleanerVisitor : public ExprVisitor { -private: - bool mul{true}; - ref index; - -protected: - Action visitMul(const MulExpr &) override; - Action visitRead(const ReadExpr &) override; - -public: - IndexCleanerVisitor() : ExprVisitor(true) {} - inline ref getIndex() { return index; } -}; } // namespace klee #endif /* KLEE_ARRAYEXPRVISITOR_H */ -- cgit 1.4.1