aboutsummaryrefslogtreecommitdiffhomepage
path: root/lib
diff options
context:
space:
mode:
authorLukáš Zaoral <lzaoral@redhat.com>2022-04-17 12:35:47 +0200
committerMartinNowack <2443641+MartinNowack@users.noreply.github.com>2023-03-20 16:05:38 +0000
commitd9da9eadbc0aacf61b336231560abb67bcba91ad (patch)
treedb9bf8f3a6ead078f8eaa32a308f8134230663fd /lib
parentd79d048bfa21b432e1e9e97db9fca9924118b678 (diff)
downloadklee-d9da9eadbc0aacf61b336231560abb67bcba91ad.tar.gz
ConstantArrayExprVisitor: Deduplicate `visitConcat` and `visitRead`
Diffstat (limited to 'lib')
-rw-r--r--lib/Expr/ArrayExprVisitor.cpp36
1 files changed, 2 insertions, 34 deletions
diff --git a/lib/Expr/ArrayExprVisitor.cpp b/lib/Expr/ArrayExprVisitor.cpp
index c12689b3..0965308a 100644
--- a/lib/Expr/ArrayExprVisitor.cpp
+++ b/lib/Expr/ArrayExprVisitor.cpp
@@ -58,41 +58,9 @@ ReadExpr *ArrayExprHelper::hasOrderedReads(const ConcatExpr &ce) {
ExprVisitor::Action
ConstantArrayExprVisitor::visitConcat(const ConcatExpr &ce) {
ReadExpr *base = ArrayExprHelper::hasOrderedReads(ce);
- if (base) {
- // It is an interesting ReadExpr if it contains a concrete array
- // that is read at a symbolic index
- if (base->updates.root->isConstantArray() &&
- !isa<ConstantExpr>(base->index)) {
- for (const auto *un = base->updates.head.get(); un; un = un->next.get()) {
- if (!isa<ConstantExpr>(un->index) || !isa<ConstantExpr>(un->value)) {
- incompatible = true;
- return Action::skipChildren();
- }
- }
- IndexCompatibilityExprVisitor compatible;
- compatible.visit(base->index);
- if (compatible.isCompatible() &&
- addedIndexes.find(base->index.get()->hash()) == addedIndexes.end()) {
- if (arrays.find(base->updates.root) == arrays.end()) {
- arrays.insert(
- std::make_pair(base->updates.root, std::vector<ref<Expr> >()));
- } else {
- // Another possible index to resolve, currently unsupported
- incompatible = true;
- return Action::skipChildren();
- }
- arrays.find(base->updates.root)->second.push_back(base->index);
- addedIndexes.insert(base->index.get()->hash());
- } else if (compatible.hasInnerReads()) {
- // This Read has an inner Read, we want to optimize the inner one
- // to create a cascading effect during assignment evaluation
- return Action::doChildren();
- }
- return Action::skipChildren();
- }
- }
- return Action::doChildren();
+ return base ? visitRead(*base) : Action::doChildren();
}
+
ExprVisitor::Action ConstantArrayExprVisitor::visitRead(const ReadExpr &re) {
// It is an interesting ReadExpr if it contains a concrete array
// that is read at a symbolic index