diff options
-rw-r--r-- | src/wasm-interpreter.h | 31 | ||||
-rw-r--r-- | test/lit/passes/precompute-strings.wast | 10 |
2 files changed, 40 insertions, 1 deletions
diff --git a/src/wasm-interpreter.h b/src/wasm-interpreter.h index 31039cf28..c35920802 100644 --- a/src/wasm-interpreter.h +++ b/src/wasm-interpreter.h @@ -1919,6 +1919,36 @@ public: } return Literal(int32_t(data->values.size())); } + Flow visitStringConcat(StringConcat* curr) { + NOTE_ENTER("StringConcat"); + Flow flow = visit(curr->left); + if (flow.breaking()) { + return flow; + } + auto left = flow.getSingleValue(); + flow = visit(curr->right); + if (flow.breaking()) { + return flow; + } + auto right = flow.getSingleValue(); + NOTE_EVAL2(left, right); + auto leftData = left.getGCData(); + auto rightData = right.getGCData(); + if (!leftData || !rightData) { + trap("null ref"); + } + + Literals contents; + contents.reserve(leftData->values.size() + rightData->values.size()); + for (Literal l : leftData->values) { + contents.push_back(l); + } + for (Literal l : rightData->values) { + contents.push_back(l); + } + + return makeGCData(contents, curr->type); + } Flow visitStringEncode(StringEncode* curr) { // For now we only support JS-style strings into arrays. if (curr->op != StringEncodeWTF16Array) { @@ -1956,7 +1986,6 @@ public: return Literal(int32_t(refData->values.size())); } - Flow visitStringConcat(StringConcat* curr) { return Flow(NONCONSTANT_FLOW); } Flow visitStringEq(StringEq* curr) { NOTE_ENTER("StringEq"); Flow flow = visit(curr->left); diff --git a/test/lit/passes/precompute-strings.wast b/test/lit/passes/precompute-strings.wast index 3436e0069..f5b1660bc 100644 --- a/test/lit/passes/precompute-strings.wast +++ b/test/lit/passes/precompute-strings.wast @@ -22,5 +22,15 @@ (string.const "ab") ) ) + + ;; CHECK: (func $concat (type $0) (result i32) + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + (func $concat (export "concat") (result i32) + (string.eq + (string.concat (string.const "a") (string.const "b")) + (string.const "ab") + ) + ) ) |