diff options
Diffstat (limited to 'src/ir')
-rw-r--r-- | src/ir/ExpressionAnalyzer.cpp | 46 | ||||
-rw-r--r-- | src/ir/ExpressionManipulator.cpp | 14 | ||||
-rw-r--r-- | src/ir/ReFinalize.cpp | 4 | ||||
-rw-r--r-- | src/ir/utils.h | 8 |
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(); } |