summaryrefslogtreecommitdiff
path: root/src/ir
diff options
context:
space:
mode:
Diffstat (limited to 'src/ir')
-rw-r--r--src/ir/ExpressionAnalyzer.cpp46
-rw-r--r--src/ir/ExpressionManipulator.cpp14
-rw-r--r--src/ir/ReFinalize.cpp4
-rw-r--r--src/ir/utils.h8
4 files changed, 71 insertions, 1 deletions
diff --git a/src/ir/ExpressionAnalyzer.cpp b/src/ir/ExpressionAnalyzer.cpp
index dde5774d6..2869f38a8 100644
--- a/src/ir/ExpressionAnalyzer.cpp
+++ b/src/ir/ExpressionAnalyzer.cpp
@@ -233,6 +233,29 @@ bool ExpressionAnalyzer::flexibleEqual(Expression* left, Expression* right, Expr
CHECK(SIMDShift, op);
break;
}
+ case Expression::Id::MemoryInitId: {
+ CHECK(MemoryInit, segment);
+ PUSH(MemoryInit, dest);
+ PUSH(MemoryInit, offset);
+ PUSH(MemoryInit, size);
+ break;
+ }
+ case Expression::Id::DataDropId: {
+ CHECK(DataDrop, segment);
+ break;
+ }
+ case Expression::Id::MemoryCopyId: {
+ PUSH(MemoryCopy, dest);
+ PUSH(MemoryCopy, source);
+ PUSH(MemoryCopy, size);
+ break;
+ }
+ case Expression::Id::MemoryFillId: {
+ PUSH(MemoryFill, dest);
+ PUSH(MemoryFill, value);
+ PUSH(MemoryFill, size);
+ break;
+ }
case Expression::Id::ConstId: {
if (left->cast<Const>()->value != right->cast<Const>()->value) {
return false;
@@ -507,6 +530,29 @@ HashType ExpressionAnalyzer::hash(Expression* curr) {
PUSH(SIMDShift, shift);
break;
}
+ case Expression::Id::MemoryInitId: {
+ HASH(MemoryInit, segment);
+ PUSH(MemoryInit, dest);
+ PUSH(MemoryInit, offset);
+ PUSH(MemoryInit, size);
+ break;
+ }
+ case Expression::Id::DataDropId: {
+ HASH(DataDrop, segment);
+ break;
+ }
+ case Expression::Id::MemoryCopyId: {
+ PUSH(MemoryCopy, dest);
+ PUSH(MemoryCopy, source);
+ PUSH(MemoryCopy, size);
+ break;
+ }
+ case Expression::Id::MemoryFillId: {
+ PUSH(MemoryFill, dest);
+ PUSH(MemoryFill, value);
+ PUSH(MemoryFill, size);
+ break;
+ }
case Expression::Id::ConstId: {
auto* c = curr->cast<Const>();
hash(c->type);
diff --git a/src/ir/ExpressionManipulator.cpp b/src/ir/ExpressionManipulator.cpp
index 700f7fdb8..32ee442b7 100644
--- a/src/ir/ExpressionManipulator.cpp
+++ b/src/ir/ExpressionManipulator.cpp
@@ -129,9 +129,21 @@ Expression* flexibleCopy(Expression* original, Module& wasm, CustomCopier custom
Expression* visitSIMDShift(SIMDShift* curr) {
return builder.makeSIMDShift(curr->op, copy(curr->vec), copy(curr->shift));
}
- Expression* visitConst(Const *curr) {
+ Expression* visitConst(Const* curr) {
return builder.makeConst(curr->value);
}
+ Expression* visitMemoryInit(MemoryInit* curr) {
+ return builder.makeMemoryInit(curr->segment, copy(curr->dest), copy(curr->offset), copy(curr->size));
+ }
+ Expression* visitDataDrop(DataDrop* curr) {
+ return builder.makeDataDrop(curr->segment);
+ }
+ Expression* visitMemoryCopy(MemoryCopy* curr) {
+ return builder.makeMemoryCopy(copy(curr->dest), copy(curr->source), copy(curr->size));
+ }
+ Expression* visitMemoryFill(MemoryFill* curr) {
+ return builder.makeMemoryFill(copy(curr->dest), copy(curr->value), copy(curr->size));
+ }
Expression* visitUnary(Unary *curr) {
return builder.makeUnary(curr->op, copy(curr->value));
}
diff --git a/src/ir/ReFinalize.cpp b/src/ir/ReFinalize.cpp
index 68526678a..3f374265c 100644
--- a/src/ir/ReFinalize.cpp
+++ b/src/ir/ReFinalize.cpp
@@ -142,6 +142,10 @@ void ReFinalize::visitSIMDReplace(SIMDReplace* curr) { curr->finalize(); }
void ReFinalize::visitSIMDShuffle(SIMDShuffle* curr) { curr->finalize(); }
void ReFinalize::visitSIMDBitselect(SIMDBitselect* curr) { curr->finalize(); }
void ReFinalize::visitSIMDShift(SIMDShift* curr) { curr->finalize(); }
+void ReFinalize::visitMemoryInit(MemoryInit* curr) { curr->finalize(); }
+void ReFinalize::visitDataDrop(DataDrop* curr) { curr->finalize(); }
+void ReFinalize::visitMemoryCopy(MemoryCopy* curr) { curr->finalize(); }
+void ReFinalize::visitMemoryFill(MemoryFill* curr) { curr->finalize(); }
void ReFinalize::visitConst(Const* curr) { curr->finalize(); }
void ReFinalize::visitUnary(Unary* curr) { curr->finalize(); }
void ReFinalize::visitBinary(Binary* curr) { curr->finalize(); }
diff --git a/src/ir/utils.h b/src/ir/utils.h
index afb63b01c..85c485552 100644
--- a/src/ir/utils.h
+++ b/src/ir/utils.h
@@ -134,6 +134,10 @@ struct ReFinalize : public WalkerPass<PostWalker<ReFinalize, OverriddenVisitor<R
void visitSIMDShuffle(SIMDShuffle* curr);
void visitSIMDBitselect(SIMDBitselect* curr);
void visitSIMDShift(SIMDShift* curr);
+ void visitMemoryInit(MemoryInit* curr);
+ void visitDataDrop(DataDrop* curr);
+ void visitMemoryCopy(MemoryCopy* curr);
+ void visitMemoryFill(MemoryFill* curr);
void visitConst(Const* curr);
void visitUnary(Unary* curr);
void visitBinary(Binary* curr);
@@ -186,6 +190,10 @@ struct ReFinalizeNode : public OverriddenVisitor<ReFinalizeNode> {
void visitSIMDShuffle(SIMDShuffle* curr) { curr->finalize(); }
void visitSIMDBitselect(SIMDBitselect* curr) { curr->finalize(); }
void visitSIMDShift(SIMDShift* curr) { curr->finalize(); }
+ void visitMemoryInit(MemoryInit* curr) { curr->finalize(); }
+ void visitDataDrop(DataDrop* curr) { curr->finalize(); }
+ void visitMemoryCopy(MemoryCopy* curr) { curr->finalize(); }
+ void visitMemoryFill(MemoryFill* curr) { curr->finalize(); }
void visitConst(Const* curr) { curr->finalize(); }
void visitUnary(Unary* curr) { curr->finalize(); }
void visitBinary(Binary* curr) { curr->finalize(); }