aboutsummaryrefslogtreecommitdiffstats
path: root/KnownState.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'KnownState.cpp')
-rw-r--r--KnownState.cpp13
1 files changed, 11 insertions, 2 deletions
diff --git a/KnownState.cpp b/KnownState.cpp
index 895778ed..d62dbf17 100644
--- a/KnownState.cpp
+++ b/KnownState.cpp
@@ -92,7 +92,11 @@ KnownState::StoreOperation KnownState::feedItem(AssemblyItem const& _item, bool
else if (_item.type() != Operation)
{
assertThrow(_item.deposit() == 1, InvalidDeposit, "");
- setStackElement(++m_stackHeight, m_expressionClasses->find(_item, {}, _copyItem));
+ if (_item.pushedValue())
+ // only available after assembly stage, should not be used for optimisation
+ setStackElement(++m_stackHeight, m_expressionClasses->find(*_item.pushedValue()));
+ else
+ setStackElement(++m_stackHeight, m_expressionClasses->find(_item, {}, _copyItem));
}
else
{
@@ -230,7 +234,12 @@ ExpressionClasses::Id KnownState::stackElement(int _stackHeight, SourceLocation
return m_stackElements.at(_stackHeight);
// Stack element not found (not assigned yet), create new unknown equivalence class.
return m_stackElements[_stackHeight] =
- m_expressionClasses->find(AssemblyItem(UndefinedItem, _stackHeight, _location));
+ m_expressionClasses->find(AssemblyItem(UndefinedItem, _stackHeight, _location));
+}
+
+KnownState::Id KnownState::relativeStackElement(int _stackOffset, SourceLocation const& _location)
+{
+ return stackElement(m_stackHeight + _stackOffset, _location);
}
void KnownState::clearTagUnions()