summaryrefslogtreecommitdiff
path: root/src/passes/MemoryPacking.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/passes/MemoryPacking.cpp')
-rw-r--r--src/passes/MemoryPacking.cpp11
1 files changed, 8 insertions, 3 deletions
diff --git a/src/passes/MemoryPacking.cpp b/src/passes/MemoryPacking.cpp
index 7848118b8..b5d317f67 100644
--- a/src/passes/MemoryPacking.cpp
+++ b/src/passes/MemoryPacking.cpp
@@ -228,7 +228,7 @@ bool MemoryPacking::canOptimize(const Memory& memory,
}
// Note the maximum address so far.
maxAddress = std::max(
- maxAddress, Address(c->value.getInteger() + segment.data.size()));
+ maxAddress, Address(c->value.getUnsigned() + segment.data.size()));
}
}
// All active segments have constant offsets, known at this time, so we may be
@@ -239,7 +239,7 @@ bool MemoryPacking::canOptimize(const Memory& memory,
for (auto& segment : segments) {
if (!segment.isPassive) {
auto* c = segment.offset->cast<Const>();
- Address start = c->value.getInteger();
+ Address start = c->value.getUnsigned();
DisjointSpans::Span span{start, start + segment.data.size()};
if (space.addAndCheckOverlap(span)) {
std::cerr << "warning: active memory segments have overlap, which "
@@ -523,7 +523,12 @@ void MemoryPacking::createSplitSegments(Builder& builder,
Expression* offset = nullptr;
if (!segment.isPassive) {
if (auto* c = segment.offset->dynCast<Const>()) {
- offset = builder.makeConst(int32_t(c->value.geti32() + range.start));
+ if (c->value.type == Type::i32) {
+ offset = builder.makeConst(int32_t(c->value.geti32() + range.start));
+ } else {
+ assert(c->value.type == Type::i64);
+ offset = builder.makeConst(int64_t(c->value.geti64() + range.start));
+ }
} else {
assert(ranges.size() == 1);
offset = segment.offset;