| Index: src/wasm/ast-decoder.cc
|
| diff --git a/src/wasm/ast-decoder.cc b/src/wasm/ast-decoder.cc
|
| index 5fe75badd43d7da4e291b3afda8146e87b959b80..cef1051981022d711e12f60467069fa7409ccdbe 100644
|
| --- a/src/wasm/ast-decoder.cc
|
| +++ b/src/wasm/ast-decoder.cc
|
| @@ -1354,6 +1354,7 @@ class SR_WasmDecoder : public WasmDecoder {
|
| }
|
|
|
| void SetEnv(const char* reason, SsaEnv* env) {
|
| +#if DEBUG
|
| TRACE(" env = %p, block depth = %d, reason = %s", static_cast<void*>(env),
|
| static_cast<int>(blocks_.size()), reason);
|
| if (FLAG_trace_wasm_decoder && env && env->control) {
|
| @@ -1361,6 +1362,7 @@ class SR_WasmDecoder : public WasmDecoder {
|
| compiler::WasmGraphBuilder::PrintDebugName(env->control);
|
| }
|
| TRACE("\n");
|
| +#endif
|
| ssa_env_ = env;
|
| if (builder_) {
|
| builder_->set_control_ptr(&env->control);
|
| @@ -1466,6 +1468,19 @@ class SR_WasmDecoder : public WasmDecoder {
|
| env->control = builder_->Loop(env->control);
|
| env->effect = builder_->EffectPhi(1, &env->effect, env->control);
|
| builder_->Terminate(env->effect, env->control);
|
| + if (FLAG_wasm_loop_assignment_analysis) {
|
| + BitVector* assigned = AnalyzeLoopAssignment(pc);
|
| + if (assigned != nullptr) {
|
| + // Only introduce phis for variables assigned in this loop.
|
| + for (int i = EnvironmentCount() - 1; i >= 0; i--) {
|
| + if (!assigned->Contains(i)) continue;
|
| + env->locals[i] = builder_->Phi(local_type_vec_[i], 1, &env->locals[i],
|
| + env->control);
|
| + }
|
| + return;
|
| + }
|
| + }
|
| +
|
| // Conservatively introduce phis for all local variables.
|
| for (int i = EnvironmentCount() - 1; i >= 0; i--) {
|
| env->locals[i] =
|
| @@ -1574,12 +1589,15 @@ class SR_WasmDecoder : public WasmDecoder {
|
| WasmOpcode opcode = static_cast<WasmOpcode>(*pc);
|
| int arity = 0;
|
| int length = 1;
|
| + int assigned_index = -1;
|
| if (opcode == kExprSetLocal) {
|
| LocalIndexOperand operand(this, pc);
|
| if (assigned->length() > 0 &&
|
| static_cast<int>(operand.index) < assigned->length()) {
|
| // Unverified code might have an out-of-bounds index.
|
| + // Ignore out-of-bounds indices, as the main verification will fail.
|
| assigned->Add(operand.index);
|
| + assigned_index = operand.index;
|
| }
|
| arity = 1;
|
| length = 1 + operand.length;
|
| @@ -1588,9 +1606,16 @@ class SR_WasmDecoder : public WasmDecoder {
|
| length = OpcodeLength(pc);
|
| }
|
|
|
| - TRACE("loop-assign module+%-6d %s func+%d: 0x%02x %s (len=%d)\n",
|
| - baserel(pc), indentation(), startrel(pc), opcode,
|
| - WasmOpcodes::OpcodeName(opcode), length);
|
| + TRACE("loop-assign module+%-6d %s func+%d: 0x%02x %s", baserel(pc),
|
| + indentation(), startrel(pc), opcode,
|
| + WasmOpcodes::OpcodeName(opcode));
|
| +
|
| + if (assigned_index >= 0) {
|
| + TRACE(" (assigned local #%d)\n", assigned_index);
|
| + } else {
|
| + TRACE("\n");
|
| + }
|
| +
|
| pc += length;
|
| arity_stack.push_back(arity);
|
| while (arity_stack.back() == 0) {
|
|
|