From 1f176efa5916bf541fff04798f44adc69d0d3ec8 Mon Sep 17 00:00:00 2001 From: dcode Date: Fri, 14 Feb 2020 15:53:24 +0100 Subject: [PATCH 1/2] Fix temp local confusion in field assignment --- src/compiler.ts | 21 +- .../retain-release-sanity.optimized.wat | 106 +-- .../retain-release-sanity.untouched.wat | 80 +- tests/compiler/std/map.untouched.wat | 684 +++++++++--------- tests/compiler/std/set.untouched.wat | 360 ++++----- tests/compiler/std/symbol.untouched.wat | 72 +- 6 files changed, 666 insertions(+), 657 deletions(-) diff --git a/src/compiler.ts b/src/compiler.ts index 313a9d934d..fc21184697 100644 --- a/src/compiler.ts +++ b/src/compiler.ts @@ -5871,8 +5871,8 @@ export class Compiler extends DiagnosticEmitter { let alreadyRetained = this.skippedAutoreleases.has(valueExpr); if (flow.isAnyLocalFlag(localIndex, LocalFlags.ANY_RETAINED)) { valueExpr = this.makeReplace( - module.local_get(localIndex, type.toNativeType()), valueExpr, + module.local_get(localIndex, type.toNativeType()), alreadyRetained ); if (tee) { // local = REPLACE(local, value) @@ -5927,8 +5927,8 @@ export class Compiler extends DiagnosticEmitter { let alreadyRetained = this.skippedAutoreleases.has(valueExpr); valueExpr = module.global_set(global.internalName, this.makeReplace( - module.global_get(global.internalName, nativeType), // oldRef - valueExpr, // newRef + valueExpr, + module.global_get(global.internalName, nativeType), alreadyRetained ) ); @@ -5979,7 +5979,8 @@ export class Compiler extends DiagnosticEmitter { var nativeThisType = thisType.toNativeType(); if (fieldType.isManaged && thisType.isManaged) { - let tempThis = flow.getTempLocal(thisType); + let tempThis = flow.getTempLocal(thisType, findUsedLocals(valueExpr)); + // set before and read after valueExpr executes below ^ let alreadyRetained = this.skippedAutoreleases.has(valueExpr); let ret: ExpressionRef; if (tee) { // ((t1 = this).field = REPLACE(t1.field, t2 = value)), t2 @@ -5990,11 +5991,11 @@ export class Compiler extends DiagnosticEmitter { module.store(fieldType.byteSize, module.local_tee(tempThis.index, thisExpr), this.makeReplace( - module.load(fieldType.byteSize, fieldType.is(TypeFlags.SIGNED), // oldRef + module.local_tee(tempValue.index, valueExpr), + module.load(fieldType.byteSize, fieldType.is(TypeFlags.SIGNED), module.local_get(tempThis.index, nativeThisType), nativeFieldType, field.memoryOffset ), - module.local_tee(tempValue.index, valueExpr), // newRef alreadyRetained ), nativeFieldType, field.memoryOffset @@ -6007,11 +6008,11 @@ export class Compiler extends DiagnosticEmitter { ret = module.store(fieldType.byteSize, module.local_tee(tempThis.index, thisExpr), this.makeReplace( - module.load(fieldType.byteSize, fieldType.is(TypeFlags.SIGNED), // oldRef + valueExpr, + module.load(fieldType.byteSize, fieldType.is(TypeFlags.SIGNED), module.local_get(tempThis.index, nativeThisType), nativeFieldType, field.memoryOffset ), - valueExpr, // newRef alreadyRetained ), nativeFieldType, field.memoryOffset @@ -6733,10 +6734,10 @@ export class Compiler extends DiagnosticEmitter { /** Makes a replace, retaining the new expression's value and releasing the old expression's value, in this order. */ makeReplace( - /** Old value being replaced. */ - oldExpr: ExpressionRef, /** New value being assigned. */ newExpr: ExpressionRef, + /** Old value being replaced. */ + oldExpr: ExpressionRef, /** Whether the new value is already retained. */ alreadyRetained: bool = false, ): ExpressionRef { diff --git a/tests/compiler/retain-release-sanity.optimized.wat b/tests/compiler/retain-release-sanity.optimized.wat index 7148aac301..5597a09b0e 100644 --- a/tests/compiler/retain-release-sanity.optimized.wat +++ b/tests/compiler/retain-release-sanity.optimized.wat @@ -1965,19 +1965,19 @@ call $~lib/rt/pure/__retain i32.const 3 call $~lib/arraybuffer/ArrayBufferView#constructor - local.tee $1 + local.tee $0 i32.const 0 i32.store offset=12 - local.get $1 + local.get $0 i32.const 3 i32.store offset=12 - local.get $1 + local.get $0 call $~lib/array/Array#push - local.get $1 + local.get $0 call $~lib/array/Array#push - local.get $1 + local.get $0 call $~lib/array/Array#pop - local.get $1 + local.get $0 call $~lib/rt/pure/__release i32.const 16 i32.const 5 @@ -1985,14 +1985,14 @@ call $~lib/rt/pure/__retain i32.const 0 call $~lib/arraybuffer/ArrayBufferView#constructor - local.tee $1 + local.tee $0 i32.const 0 i32.store offset=12 - local.get $1 + local.get $0 i32.const 0 i32.store offset=12 loop $for-loop|0 - local.get $0 + local.get $2 i32.const 10 i32.lt_s if @@ -2009,31 +2009,31 @@ i32.const 0 i32.store offset=12 i32.const 0 - local.set $2 + local.set $1 loop $for-loop|1 - local.get $2 + local.get $1 i32.const 10 i32.lt_s if local.get $3 call $~lib/array/Array<~lib/string/String>#push - local.get $2 + local.get $1 i32.const 1 i32.add - local.set $2 + local.set $1 br $for-loop|1 end end local.get $3 call $~lib/rt/pure/__release - local.get $0 + local.get $2 i32.const 1 i32.add - local.set $0 + local.set $2 br $for-loop|0 end end - local.get $1 + local.get $0 call $~lib/rt/pure/__release i32.const 416 i32.const 448 @@ -2048,10 +2048,10 @@ i32.const 6 call $~lib/rt/tlsf/__alloc call $~lib/rt/pure/__retain - local.tee $1 + local.tee $0 i32.const 0 i32.store - local.get $1 + local.get $0 i32.const 4 i32.const 7 call $~lib/rt/tlsf/__alloc @@ -2060,24 +2060,27 @@ i32.const 0 i32.store local.get $3 - local.tee $0 - local.get $1 + local.set $1 + local.get $3 + local.get $0 i32.load local.tee $2 i32.ne if - local.get $0 + local.get $1 call $~lib/rt/pure/__retain - local.set $0 + local.set $1 local.get $2 call $~lib/rt/pure/__release end - local.get $0 + local.get $1 i32.store + local.get $0 + local.set $1 local.get $3 - local.tee $2 - local.get $1 - local.tee $0 + local.set $2 + local.get $3 + local.get $0 i32.load local.tee $4 i32.ne @@ -2088,73 +2091,78 @@ local.get $4 call $~lib/rt/pure/__release end - local.get $0 + local.get $1 local.get $2 i32.store - local.get $1 local.get $3 - local.tee $2 + local.set $2 + local.get $0 + local.get $3 i32.load local.tee $4 i32.ne if - local.get $0 + local.get $1 call $~lib/rt/pure/__retain - local.set $0 + local.set $1 local.get $4 call $~lib/rt/pure/__release end local.get $2 - local.get $0 - i32.store local.get $1 - local.tee $0 + i32.store + local.get $0 + local.set $1 + local.get $0 local.get $2 i32.load local.tee $4 i32.ne if - local.get $0 + local.get $1 call $~lib/rt/pure/__retain - local.set $0 + local.set $1 local.get $4 call $~lib/rt/pure/__release end local.get $2 - local.get $0 + local.get $1 i32.store + local.get $2 + local.set $1 + local.get $0 + local.set $2 local.get $3 - local.get $1 - local.tee $0 + local.get $0 i32.load local.tee $4 i32.ne if - local.get $2 + local.get $1 call $~lib/rt/pure/__retain - local.set $2 + local.set $1 local.get $4 call $~lib/rt/pure/__release end - local.get $0 local.get $2 - i32.store local.get $1 + i32.store + local.get $0 local.get $3 i32.load - local.tee $2 + local.tee $1 i32.ne if - local.get $0 - call $~lib/rt/pure/__retain - local.set $0 local.get $2 + call $~lib/rt/pure/__retain + local.set $2 + local.get $1 call $~lib/rt/pure/__release end local.get $3 - local.get $0 + local.get $2 i32.store - local.get $1 + local.get $0 call $~lib/rt/pure/__release local.get $3 call $~lib/rt/pure/__release diff --git a/tests/compiler/retain-release-sanity.untouched.wat b/tests/compiler/retain-release-sanity.untouched.wat index 7256d7be45..0bc41adb22 100644 --- a/tests/compiler/retain-release-sanity.untouched.wat +++ b/tests/compiler/retain-release-sanity.untouched.wat @@ -3709,106 +3709,106 @@ call $retain-release-sanity/B#constructor local.set $2 local.get $3 - local.tee $1 - local.get $2 local.tee $5 - local.get $1 + local.get $2 + local.tee $4 + local.get $5 i32.load - local.tee $0 + local.tee $1 i32.ne if - local.get $5 + local.get $4 call $~lib/rt/pure/__retain - local.set $5 - local.get $0 + local.set $4 + local.get $1 call $~lib/rt/pure/__release end - local.get $5 + local.get $4 i32.store local.get $3 - local.tee $1 + local.tee $0 local.get $2 - local.tee $4 - local.get $1 + local.tee $1 + local.get $0 i32.load local.tee $5 i32.ne if - local.get $4 + local.get $1 call $~lib/rt/pure/__retain - local.set $4 + local.set $1 local.get $5 call $~lib/rt/pure/__release end - local.get $4 + local.get $1 i32.store local.get $2 - local.tee $1 + local.tee $4 local.get $3 - local.tee $0 - local.get $1 + local.tee $5 + local.get $4 i32.load - local.tee $4 + local.tee $0 i32.ne if - local.get $0 + local.get $5 call $~lib/rt/pure/__retain - local.set $0 - local.get $4 + local.set $5 + local.get $0 call $~lib/rt/pure/__release end - local.get $0 + local.get $5 i32.store local.get $2 local.tee $1 local.get $3 - local.tee $5 + local.tee $0 local.get $1 i32.load - local.tee $0 + local.tee $4 i32.ne if - local.get $5 - call $~lib/rt/pure/__retain - local.set $5 local.get $0 + call $~lib/rt/pure/__retain + local.set $0 + local.get $4 call $~lib/rt/pure/__release end - local.get $5 + local.get $0 i32.store local.get $3 - local.tee $1 + local.tee $5 local.get $2 local.tee $4 - local.get $1 + local.get $5 i32.load - local.tee $5 + local.tee $1 i32.ne if local.get $4 call $~lib/rt/pure/__retain local.set $4 - local.get $5 + local.get $1 call $~lib/rt/pure/__release end local.get $4 i32.store local.get $2 - local.tee $1 - local.get $3 local.tee $0 - local.get $1 + local.get $3 + local.tee $1 + local.get $0 i32.load - local.tee $4 + local.tee $5 i32.ne if - local.get $0 + local.get $1 call $~lib/rt/pure/__retain - local.set $0 - local.get $4 + local.set $1 + local.get $5 call $~lib/rt/pure/__release end - local.get $0 + local.get $1 i32.store local.get $3 call $~lib/rt/pure/__release diff --git a/tests/compiler/std/map.untouched.wat b/tests/compiler/std/map.untouched.wat index bf14613aa7..39a7e482ff 100644 --- a/tests/compiler/std/map.untouched.wat +++ b/tests/compiler/std/map.untouched.wat @@ -1793,15 +1793,15 @@ i32.sub i32.store offset=4 local.get $0 - local.tee $1 + local.tee $2 i32.const 0 i32.const 48 call $~lib/arraybuffer/ArrayBuffer#constructor - local.set $2 - local.get $1 + local.set $1 + local.get $2 i32.load offset=8 call $~lib/rt/pure/__release - local.get $2 + local.get $1 i32.store offset=8 local.get $0 i32.const 4 @@ -2032,41 +2032,41 @@ end end local.get $0 - local.tee $9 - local.get $3 local.tee $11 - local.get $9 + local.get $3 + local.tee $12 + local.get $11 i32.load - local.tee $13 + local.tee $9 i32.ne if - local.get $11 + local.get $12 call $~lib/rt/pure/__retain - local.set $11 - local.get $13 + local.set $12 + local.get $9 call $~lib/rt/pure/__release end - local.get $11 + local.get $12 i32.store local.get $0 local.get $1 i32.store offset=4 local.get $0 - local.tee $9 + local.tee $13 local.get $5 - local.tee $12 - local.get $9 + local.tee $9 + local.get $13 i32.load offset=8 local.tee $11 i32.ne if - local.get $12 + local.get $9 call $~lib/rt/pure/__retain - local.set $12 + local.set $9 local.get $11 call $~lib/rt/pure/__release end - local.get $12 + local.get $9 i32.store offset=8 local.get $0 local.get $4 @@ -4100,15 +4100,15 @@ i32.sub i32.store offset=4 local.get $0 - local.tee $1 + local.tee $2 i32.const 0 i32.const 32 call $~lib/arraybuffer/ArrayBuffer#constructor - local.set $2 - local.get $1 + local.set $1 + local.get $2 i32.load offset=8 call $~lib/rt/pure/__release - local.get $2 + local.get $1 i32.store offset=8 local.get $0 i32.const 4 @@ -4172,15 +4172,15 @@ i32.sub i32.store offset=4 local.get $0 - local.tee $1 + local.tee $2 i32.const 0 i32.const 48 call $~lib/arraybuffer/ArrayBuffer#constructor - local.set $2 - local.get $1 + local.set $1 + local.get $2 i32.load offset=8 call $~lib/rt/pure/__release - local.get $2 + local.get $1 i32.store offset=8 local.get $0 i32.const 4 @@ -4447,41 +4447,41 @@ end end local.get $0 - local.tee $9 - local.get $3 local.tee $11 - local.get $9 + local.get $3 + local.tee $12 + local.get $11 i32.load - local.tee $13 + local.tee $9 i32.ne if - local.get $11 + local.get $12 call $~lib/rt/pure/__retain - local.set $11 - local.get $13 + local.set $12 + local.get $9 call $~lib/rt/pure/__release end - local.get $11 + local.get $12 i32.store local.get $0 local.get $1 i32.store offset=4 local.get $0 - local.tee $9 + local.tee $13 local.get $5 - local.tee $12 - local.get $9 + local.tee $9 + local.get $13 i32.load offset=8 local.tee $11 i32.ne if - local.get $12 + local.get $9 call $~lib/rt/pure/__retain - local.set $12 + local.set $9 local.get $11 call $~lib/rt/pure/__release end - local.get $12 + local.get $9 i32.store offset=8 local.get $0 local.get $4 @@ -4803,41 +4803,41 @@ end end local.get $0 - local.tee $9 - local.get $3 local.tee $11 - local.get $9 + local.get $3 + local.tee $12 + local.get $11 i32.load - local.tee $13 + local.tee $9 i32.ne if - local.get $11 + local.get $12 call $~lib/rt/pure/__retain - local.set $11 - local.get $13 + local.set $12 + local.get $9 call $~lib/rt/pure/__release end - local.get $11 + local.get $12 i32.store local.get $0 local.get $1 i32.store offset=4 local.get $0 - local.tee $9 + local.tee $13 local.get $5 - local.tee $12 - local.get $9 + local.tee $9 + local.get $13 i32.load offset=8 local.tee $11 i32.ne if - local.get $12 + local.get $9 call $~lib/rt/pure/__retain - local.set $12 + local.set $9 local.get $11 call $~lib/rt/pure/__release end - local.get $12 + local.get $9 i32.store offset=8 local.get $0 local.get $4 @@ -5569,15 +5569,15 @@ i32.sub i32.store offset=4 local.get $0 - local.tee $1 + local.tee $2 i32.const 0 i32.const 48 call $~lib/arraybuffer/ArrayBuffer#constructor - local.set $2 - local.get $1 + local.set $1 + local.get $2 i32.load offset=8 call $~lib/rt/pure/__release - local.get $2 + local.get $1 i32.store offset=8 local.get $0 i32.const 4 @@ -5797,41 +5797,41 @@ end end local.get $0 - local.tee $9 - local.get $3 local.tee $11 - local.get $9 + local.get $3 + local.tee $12 + local.get $11 i32.load - local.tee $13 + local.tee $9 i32.ne if - local.get $11 + local.get $12 call $~lib/rt/pure/__retain - local.set $11 - local.get $13 + local.set $12 + local.get $9 call $~lib/rt/pure/__release end - local.get $11 + local.get $12 i32.store local.get $0 local.get $1 i32.store offset=4 local.get $0 - local.tee $9 + local.tee $13 local.get $5 - local.tee $12 - local.get $9 + local.tee $9 + local.get $13 i32.load offset=8 local.tee $11 i32.ne if - local.get $12 + local.get $9 call $~lib/rt/pure/__retain - local.set $12 + local.set $9 local.get $11 call $~lib/rt/pure/__release end - local.get $12 + local.get $9 i32.store offset=8 local.get $0 local.get $4 @@ -6214,15 +6214,15 @@ i32.sub i32.store offset=4 local.get $0 - local.tee $1 + local.tee $2 i32.const 0 i32.const 32 call $~lib/arraybuffer/ArrayBuffer#constructor - local.set $2 - local.get $1 + local.set $1 + local.get $2 i32.load offset=8 call $~lib/rt/pure/__release - local.get $2 + local.get $1 i32.store offset=8 local.get $0 i32.const 4 @@ -6458,41 +6458,41 @@ end end local.get $0 - local.tee $9 - local.get $3 local.tee $11 - local.get $9 + local.get $3 + local.tee $12 + local.get $11 i32.load - local.tee $13 + local.tee $9 i32.ne if - local.get $11 + local.get $12 call $~lib/rt/pure/__retain - local.set $11 - local.get $13 + local.set $12 + local.get $9 call $~lib/rt/pure/__release end - local.get $11 + local.get $12 i32.store local.get $0 local.get $1 i32.store offset=4 local.get $0 - local.tee $9 + local.tee $13 local.get $5 - local.tee $12 - local.get $9 + local.tee $9 + local.get $13 i32.load offset=8 local.tee $11 i32.ne if - local.get $12 + local.get $9 call $~lib/rt/pure/__retain - local.set $12 + local.set $9 local.get $11 call $~lib/rt/pure/__release end - local.get $12 + local.get $9 i32.store offset=8 local.get $0 local.get $4 @@ -7198,15 +7198,15 @@ i32.sub i32.store offset=4 local.get $0 - local.tee $1 + local.tee $2 i32.const 0 i32.const 48 call $~lib/arraybuffer/ArrayBuffer#constructor - local.set $2 - local.get $1 + local.set $1 + local.get $2 i32.load offset=8 call $~lib/rt/pure/__release - local.get $2 + local.get $1 i32.store offset=8 local.get $0 i32.const 4 @@ -7452,41 +7452,41 @@ end end local.get $0 - local.tee $9 - local.get $3 local.tee $11 - local.get $9 + local.get $3 + local.tee $12 + local.get $11 i32.load - local.tee $13 + local.tee $9 i32.ne if - local.get $11 + local.get $12 call $~lib/rt/pure/__retain - local.set $11 - local.get $13 + local.set $12 + local.get $9 call $~lib/rt/pure/__release end - local.get $11 + local.get $12 i32.store local.get $0 local.get $1 i32.store offset=4 local.get $0 - local.tee $9 + local.tee $13 local.get $5 - local.tee $12 - local.get $9 + local.tee $9 + local.get $13 i32.load offset=8 local.tee $11 i32.ne if - local.get $12 + local.get $9 call $~lib/rt/pure/__retain - local.set $12 + local.set $9 local.get $11 call $~lib/rt/pure/__release end - local.get $12 + local.get $9 i32.store offset=8 local.get $0 local.get $4 @@ -7873,15 +7873,15 @@ i32.sub i32.store offset=4 local.get $0 - local.tee $1 + local.tee $2 i32.const 0 i32.const 32 call $~lib/arraybuffer/ArrayBuffer#constructor - local.set $2 - local.get $1 + local.set $1 + local.get $2 i32.load offset=8 call $~lib/rt/pure/__release - local.get $2 + local.get $1 i32.store offset=8 local.get $0 i32.const 4 @@ -8119,41 +8119,41 @@ end end local.get $0 - local.tee $9 - local.get $3 local.tee $11 - local.get $9 + local.get $3 + local.tee $12 + local.get $11 i32.load - local.tee $13 + local.tee $9 i32.ne if - local.get $11 + local.get $12 call $~lib/rt/pure/__retain - local.set $11 - local.get $13 + local.set $12 + local.get $9 call $~lib/rt/pure/__release end - local.get $11 + local.get $12 i32.store local.get $0 local.get $1 i32.store offset=4 local.get $0 - local.tee $9 + local.tee $13 local.get $5 - local.tee $12 - local.get $9 + local.tee $9 + local.get $13 i32.load offset=8 local.tee $11 i32.ne if - local.get $12 + local.get $9 call $~lib/rt/pure/__retain - local.set $12 + local.set $9 local.get $11 call $~lib/rt/pure/__release end - local.get $12 + local.get $9 i32.store offset=8 local.get $0 local.get $4 @@ -8885,15 +8885,15 @@ i32.sub i32.store offset=4 local.get $0 - local.tee $1 + local.tee $2 i32.const 0 i32.const 48 call $~lib/arraybuffer/ArrayBuffer#constructor - local.set $2 - local.get $1 + local.set $1 + local.get $2 i32.load offset=8 call $~lib/rt/pure/__release - local.get $2 + local.get $1 i32.store offset=8 local.get $0 i32.const 4 @@ -9113,41 +9113,41 @@ end end local.get $0 - local.tee $9 - local.get $3 local.tee $11 - local.get $9 + local.get $3 + local.tee $12 + local.get $11 i32.load - local.tee $13 + local.tee $9 i32.ne if - local.get $11 + local.get $12 call $~lib/rt/pure/__retain - local.set $11 - local.get $13 + local.set $12 + local.get $9 call $~lib/rt/pure/__release end - local.get $11 + local.get $12 i32.store local.get $0 local.get $1 i32.store offset=4 local.get $0 - local.tee $9 + local.tee $13 local.get $5 - local.tee $12 - local.get $9 + local.tee $9 + local.get $13 i32.load offset=8 local.tee $11 i32.ne if - local.get $12 + local.get $9 call $~lib/rt/pure/__retain - local.set $12 + local.set $9 local.get $11 call $~lib/rt/pure/__release end - local.get $12 + local.get $9 i32.store offset=8 local.get $0 local.get $4 @@ -9530,15 +9530,15 @@ i32.sub i32.store offset=4 local.get $0 - local.tee $1 + local.tee $2 i32.const 0 i32.const 32 call $~lib/arraybuffer/ArrayBuffer#constructor - local.set $2 - local.get $1 + local.set $1 + local.get $2 i32.load offset=8 call $~lib/rt/pure/__release - local.get $2 + local.get $1 i32.store offset=8 local.get $0 i32.const 4 @@ -9774,41 +9774,41 @@ end end local.get $0 - local.tee $9 - local.get $3 local.tee $11 - local.get $9 + local.get $3 + local.tee $12 + local.get $11 i32.load - local.tee $13 + local.tee $9 i32.ne if - local.get $11 + local.get $12 call $~lib/rt/pure/__retain - local.set $11 - local.get $13 + local.set $12 + local.get $9 call $~lib/rt/pure/__release end - local.get $11 + local.get $12 i32.store local.get $0 local.get $1 i32.store offset=4 local.get $0 - local.tee $9 + local.tee $13 local.get $5 - local.tee $12 - local.get $9 + local.tee $9 + local.get $13 i32.load offset=8 local.tee $11 i32.ne if - local.get $12 + local.get $9 call $~lib/rt/pure/__retain - local.set $12 + local.set $9 local.get $11 call $~lib/rt/pure/__release end - local.get $12 + local.get $9 i32.store offset=8 local.get $0 local.get $4 @@ -11225,15 +11225,15 @@ i32.sub i32.store offset=4 local.get $0 - local.tee $1 + local.tee $2 i32.const 0 i32.const 48 call $~lib/arraybuffer/ArrayBuffer#constructor - local.set $2 - local.get $1 + local.set $1 + local.get $2 i32.load offset=8 call $~lib/rt/pure/__release - local.get $2 + local.get $1 i32.store offset=8 local.get $0 i32.const 4 @@ -11449,41 +11449,41 @@ end end local.get $0 - local.tee $9 - local.get $3 local.tee $11 - local.get $9 + local.get $3 + local.tee $12 + local.get $11 i32.load - local.tee $13 + local.tee $9 i32.ne if - local.get $11 + local.get $12 call $~lib/rt/pure/__retain - local.set $11 - local.get $13 + local.set $12 + local.get $9 call $~lib/rt/pure/__release end - local.get $11 + local.get $12 i32.store local.get $0 local.get $1 i32.store offset=4 local.get $0 - local.tee $9 + local.tee $13 local.get $5 - local.tee $12 - local.get $9 + local.tee $9 + local.get $13 i32.load offset=8 local.tee $11 i32.ne if - local.get $12 + local.get $9 call $~lib/rt/pure/__retain - local.set $12 + local.set $9 local.get $11 call $~lib/rt/pure/__release end - local.get $12 + local.get $9 i32.store offset=8 local.get $0 local.get $4 @@ -11862,15 +11862,15 @@ i32.sub i32.store offset=4 local.get $0 - local.tee $1 + local.tee $2 i32.const 0 i32.const 48 call $~lib/arraybuffer/ArrayBuffer#constructor - local.set $2 - local.get $1 + local.set $1 + local.get $2 i32.load offset=8 call $~lib/rt/pure/__release - local.get $2 + local.get $1 i32.store offset=8 local.get $0 i32.const 4 @@ -12104,41 +12104,41 @@ end end local.get $0 - local.tee $9 - local.get $3 local.tee $11 - local.get $9 + local.get $3 + local.tee $12 + local.get $11 i32.load - local.tee $13 + local.tee $9 i32.ne if - local.get $11 + local.get $12 call $~lib/rt/pure/__retain - local.set $11 - local.get $13 + local.set $12 + local.get $9 call $~lib/rt/pure/__release end - local.get $11 + local.get $12 i32.store local.get $0 local.get $1 i32.store offset=4 local.get $0 - local.tee $9 + local.tee $13 local.get $5 - local.tee $12 - local.get $9 + local.tee $9 + local.get $13 i32.load offset=8 local.tee $11 i32.ne if - local.get $12 + local.get $9 call $~lib/rt/pure/__retain - local.set $12 + local.set $9 local.get $11 call $~lib/rt/pure/__release end - local.get $12 + local.get $9 i32.store offset=8 local.get $0 local.get $4 @@ -12816,15 +12816,15 @@ i32.sub i32.store offset=4 local.get $0 - local.tee $1 + local.tee $2 i32.const 0 i32.const 64 call $~lib/arraybuffer/ArrayBuffer#constructor - local.set $2 - local.get $1 + local.set $1 + local.get $2 i32.load offset=8 call $~lib/rt/pure/__release - local.get $2 + local.get $1 i32.store offset=8 local.get $0 i32.const 4 @@ -13129,41 +13129,41 @@ end end local.get $0 - local.tee $9 - local.get $3 local.tee $11 - local.get $9 + local.get $3 + local.tee $13 + local.get $11 i32.load - local.tee $14 + local.tee $9 i32.ne if - local.get $11 + local.get $13 call $~lib/rt/pure/__retain - local.set $11 - local.get $14 + local.set $13 + local.get $9 call $~lib/rt/pure/__release end - local.get $11 + local.get $13 i32.store local.get $0 local.get $1 i32.store offset=4 local.get $0 - local.tee $9 + local.tee $14 local.get $5 - local.tee $13 - local.get $9 + local.tee $9 + local.get $14 i32.load offset=8 local.tee $11 i32.ne if - local.get $13 + local.get $9 call $~lib/rt/pure/__retain - local.set $13 + local.set $9 local.get $11 call $~lib/rt/pure/__release end - local.get $13 + local.get $9 i32.store offset=8 local.get $0 local.get $4 @@ -13543,15 +13543,15 @@ i32.sub i32.store offset=4 local.get $0 - local.tee $1 + local.tee $2 i32.const 0 i32.const 96 call $~lib/arraybuffer/ArrayBuffer#constructor - local.set $2 - local.get $1 + local.set $1 + local.get $2 i32.load offset=8 call $~lib/rt/pure/__release - local.get $2 + local.get $1 i32.store offset=8 local.get $0 i32.const 4 @@ -13786,41 +13786,41 @@ end end local.get $0 - local.tee $9 - local.get $3 local.tee $11 - local.get $9 + local.get $3 + local.tee $13 + local.get $11 i32.load - local.tee $14 + local.tee $9 i32.ne if - local.get $11 + local.get $13 call $~lib/rt/pure/__retain - local.set $11 - local.get $14 + local.set $13 + local.get $9 call $~lib/rt/pure/__release end - local.get $11 + local.get $13 i32.store local.get $0 local.get $1 i32.store offset=4 local.get $0 - local.tee $9 + local.tee $14 local.get $5 - local.tee $13 - local.get $9 + local.tee $9 + local.get $14 i32.load offset=8 local.tee $11 i32.ne if - local.get $13 + local.get $9 call $~lib/rt/pure/__retain - local.set $13 + local.set $9 local.get $11 call $~lib/rt/pure/__release end - local.get $13 + local.get $9 i32.store offset=8 local.get $0 local.get $4 @@ -14508,15 +14508,15 @@ i32.sub i32.store offset=4 local.get $0 - local.tee $1 + local.tee $2 i32.const 0 i32.const 64 call $~lib/arraybuffer/ArrayBuffer#constructor - local.set $2 - local.get $1 + local.set $1 + local.get $2 i32.load offset=8 call $~lib/rt/pure/__release - local.get $2 + local.get $1 i32.store offset=8 local.get $0 i32.const 4 @@ -14733,41 +14733,41 @@ end end local.get $0 - local.tee $9 - local.get $3 local.tee $11 - local.get $9 + local.get $3 + local.tee $13 + local.get $11 i32.load - local.tee $14 + local.tee $9 i32.ne if - local.get $11 + local.get $13 call $~lib/rt/pure/__retain - local.set $11 - local.get $14 + local.set $13 + local.get $9 call $~lib/rt/pure/__release end - local.get $11 + local.get $13 i32.store local.get $0 local.get $1 i32.store offset=4 local.get $0 - local.tee $9 + local.tee $14 local.get $5 - local.tee $13 - local.get $9 + local.tee $9 + local.get $14 i32.load offset=8 local.tee $11 i32.ne if - local.get $13 + local.get $9 call $~lib/rt/pure/__retain - local.set $13 + local.set $9 local.get $11 call $~lib/rt/pure/__release end - local.get $13 + local.get $9 i32.store offset=8 local.get $0 local.get $4 @@ -15147,15 +15147,15 @@ i32.sub i32.store offset=4 local.get $0 - local.tee $1 + local.tee $2 i32.const 0 i32.const 96 call $~lib/arraybuffer/ArrayBuffer#constructor - local.set $2 - local.get $1 + local.set $1 + local.get $2 i32.load offset=8 call $~lib/rt/pure/__release - local.get $2 + local.get $1 i32.store offset=8 local.get $0 i32.const 4 @@ -15390,41 +15390,41 @@ end end local.get $0 - local.tee $9 - local.get $3 local.tee $11 - local.get $9 + local.get $3 + local.tee $13 + local.get $11 i32.load - local.tee $14 + local.tee $9 i32.ne if - local.get $11 + local.get $13 call $~lib/rt/pure/__retain - local.set $11 - local.get $14 + local.set $13 + local.get $9 call $~lib/rt/pure/__release end - local.get $11 + local.get $13 i32.store local.get $0 local.get $1 i32.store offset=4 local.get $0 - local.tee $9 + local.tee $14 local.get $5 - local.tee $13 - local.get $9 + local.tee $9 + local.get $14 i32.load offset=8 local.tee $11 i32.ne if - local.get $13 + local.get $9 call $~lib/rt/pure/__retain - local.set $13 + local.set $9 local.get $11 call $~lib/rt/pure/__release end - local.get $13 + local.get $9 i32.store offset=8 local.get $0 local.get $4 @@ -16112,15 +16112,15 @@ i32.sub i32.store offset=4 local.get $0 - local.tee $1 + local.tee $2 i32.const 0 i32.const 48 call $~lib/arraybuffer/ArrayBuffer#constructor - local.set $2 - local.get $1 + local.set $1 + local.get $2 i32.load offset=8 call $~lib/rt/pure/__release - local.get $2 + local.get $1 i32.store offset=8 local.get $0 i32.const 4 @@ -16339,41 +16339,41 @@ end end local.get $0 - local.tee $9 - local.get $3 local.tee $11 - local.get $9 + local.get $3 + local.tee $13 + local.get $11 i32.load - local.tee $14 + local.tee $9 i32.ne if - local.get $11 + local.get $13 call $~lib/rt/pure/__retain - local.set $11 - local.get $14 + local.set $13 + local.get $9 call $~lib/rt/pure/__release end - local.get $11 + local.get $13 i32.store local.get $0 local.get $1 i32.store offset=4 local.get $0 - local.tee $9 + local.tee $14 local.get $5 - local.tee $13 - local.get $9 + local.tee $9 + local.get $14 i32.load offset=8 local.tee $11 i32.ne if - local.get $13 + local.get $9 call $~lib/rt/pure/__retain - local.set $13 + local.set $9 local.get $11 call $~lib/rt/pure/__release end - local.get $13 + local.get $9 i32.store offset=8 local.get $0 local.get $4 @@ -16755,15 +16755,15 @@ i32.sub i32.store offset=4 local.get $0 - local.tee $1 + local.tee $2 i32.const 0 i32.const 48 call $~lib/arraybuffer/ArrayBuffer#constructor - local.set $2 - local.get $1 + local.set $1 + local.get $2 i32.load offset=8 call $~lib/rt/pure/__release - local.get $2 + local.get $1 i32.store offset=8 local.get $0 i32.const 4 @@ -16999,41 +16999,41 @@ end end local.get $0 - local.tee $9 - local.get $3 local.tee $11 - local.get $9 + local.get $3 + local.tee $13 + local.get $11 i32.load - local.tee $14 + local.tee $9 i32.ne if - local.get $11 + local.get $13 call $~lib/rt/pure/__retain - local.set $11 - local.get $14 + local.set $13 + local.get $9 call $~lib/rt/pure/__release end - local.get $11 + local.get $13 i32.store local.get $0 local.get $1 i32.store offset=4 local.get $0 - local.tee $9 + local.tee $14 local.get $5 - local.tee $13 - local.get $9 + local.tee $9 + local.get $14 i32.load offset=8 local.tee $11 i32.ne if - local.get $13 + local.get $9 call $~lib/rt/pure/__retain - local.set $13 + local.set $9 local.get $11 call $~lib/rt/pure/__release end - local.get $13 + local.get $9 i32.store offset=8 local.get $0 local.get $4 @@ -17723,15 +17723,15 @@ i32.sub i32.store offset=4 local.get $0 - local.tee $1 + local.tee $2 i32.const 0 i32.const 64 call $~lib/arraybuffer/ArrayBuffer#constructor - local.set $2 - local.get $1 + local.set $1 + local.get $2 i32.load offset=8 call $~lib/rt/pure/__release - local.get $2 + local.get $1 i32.store offset=8 local.get $0 i32.const 4 @@ -17950,41 +17950,41 @@ end end local.get $0 - local.tee $9 - local.get $3 local.tee $11 - local.get $9 + local.get $3 + local.tee $13 + local.get $11 i32.load - local.tee $14 + local.tee $9 i32.ne if - local.get $11 + local.get $13 call $~lib/rt/pure/__retain - local.set $11 - local.get $14 + local.set $13 + local.get $9 call $~lib/rt/pure/__release end - local.get $11 + local.get $13 i32.store local.get $0 local.get $1 i32.store offset=4 local.get $0 - local.tee $9 + local.tee $14 local.get $5 - local.tee $13 - local.get $9 + local.tee $9 + local.get $14 i32.load offset=8 local.tee $11 i32.ne if - local.get $13 + local.get $9 call $~lib/rt/pure/__retain - local.set $13 + local.set $9 local.get $11 call $~lib/rt/pure/__release end - local.get $13 + local.get $9 i32.store offset=8 local.get $0 local.get $4 @@ -18366,15 +18366,15 @@ i32.sub i32.store offset=4 local.get $0 - local.tee $1 + local.tee $2 i32.const 0 i32.const 96 call $~lib/arraybuffer/ArrayBuffer#constructor - local.set $2 - local.get $1 + local.set $1 + local.get $2 i32.load offset=8 call $~lib/rt/pure/__release - local.get $2 + local.get $1 i32.store offset=8 local.get $0 i32.const 4 @@ -18610,41 +18610,41 @@ end end local.get $0 - local.tee $9 - local.get $3 local.tee $11 - local.get $9 + local.get $3 + local.tee $13 + local.get $11 i32.load - local.tee $14 + local.tee $9 i32.ne if - local.get $11 + local.get $13 call $~lib/rt/pure/__retain - local.set $11 - local.get $14 + local.set $13 + local.get $9 call $~lib/rt/pure/__release end - local.get $11 + local.get $13 i32.store local.get $0 local.get $1 i32.store offset=4 local.get $0 - local.tee $9 + local.tee $14 local.get $5 - local.tee $13 - local.get $9 + local.tee $9 + local.get $14 i32.load offset=8 local.tee $11 i32.ne if - local.get $13 + local.get $9 call $~lib/rt/pure/__retain - local.set $13 + local.set $9 local.get $11 call $~lib/rt/pure/__release end - local.get $13 + local.get $9 i32.store offset=8 local.get $0 local.get $4 diff --git a/tests/compiler/std/set.untouched.wat b/tests/compiler/std/set.untouched.wat index abd9db320b..53d2732bd0 100644 --- a/tests/compiler/std/set.untouched.wat +++ b/tests/compiler/std/set.untouched.wat @@ -1788,15 +1788,15 @@ i32.sub i32.store offset=4 local.get $0 - local.tee $1 + local.tee $2 i32.const 0 i32.const 32 call $~lib/arraybuffer/ArrayBuffer#constructor - local.set $2 - local.get $1 + local.set $1 + local.get $2 i32.load offset=8 call $~lib/rt/pure/__release - local.get $2 + local.get $1 i32.store offset=8 local.get $0 i32.const 4 @@ -2023,41 +2023,41 @@ end end local.get $0 - local.tee $9 - local.get $3 local.tee $11 - local.get $9 + local.get $3 + local.tee $12 + local.get $11 i32.load - local.tee $13 + local.tee $9 i32.ne if - local.get $11 + local.get $12 call $~lib/rt/pure/__retain - local.set $11 - local.get $13 + local.set $12 + local.get $9 call $~lib/rt/pure/__release end - local.get $11 + local.get $12 i32.store local.get $0 local.get $1 i32.store offset=4 local.get $0 - local.tee $9 + local.tee $13 local.get $5 - local.tee $12 - local.get $9 + local.tee $9 + local.get $13 i32.load offset=8 local.tee $11 i32.ne if - local.get $12 + local.get $9 call $~lib/rt/pure/__retain - local.set $12 + local.set $9 local.get $11 call $~lib/rt/pure/__release end - local.get $12 + local.get $9 i32.store offset=8 local.get $0 local.get $4 @@ -4353,15 +4353,15 @@ i32.sub i32.store offset=4 local.get $0 - local.tee $1 + local.tee $2 i32.const 0 i32.const 32 call $~lib/arraybuffer/ArrayBuffer#constructor - local.set $2 - local.get $1 + local.set $1 + local.get $2 i32.load offset=8 call $~lib/rt/pure/__release - local.get $2 + local.get $1 i32.store offset=8 local.get $0 i32.const 4 @@ -4577,41 +4577,41 @@ end end local.get $0 - local.tee $9 - local.get $3 local.tee $11 - local.get $9 + local.get $3 + local.tee $12 + local.get $11 i32.load - local.tee $13 + local.tee $9 i32.ne if - local.get $11 + local.get $12 call $~lib/rt/pure/__retain - local.set $11 - local.get $13 + local.set $12 + local.get $9 call $~lib/rt/pure/__release end - local.get $11 + local.get $12 i32.store local.get $0 local.get $1 i32.store offset=4 local.get $0 - local.tee $9 + local.tee $13 local.get $5 - local.tee $12 - local.get $9 + local.tee $9 + local.get $13 i32.load offset=8 local.tee $11 i32.ne if - local.get $12 + local.get $9 call $~lib/rt/pure/__retain - local.set $12 + local.set $9 local.get $11 call $~lib/rt/pure/__release end - local.get $12 + local.get $9 i32.store offset=8 local.get $0 local.get $4 @@ -5327,15 +5327,15 @@ i32.sub i32.store offset=4 local.get $0 - local.tee $1 + local.tee $2 i32.const 0 i32.const 32 call $~lib/arraybuffer/ArrayBuffer#constructor - local.set $2 - local.get $1 + local.set $1 + local.get $2 i32.load offset=8 call $~lib/rt/pure/__release - local.get $2 + local.get $1 i32.store offset=8 local.get $0 i32.const 4 @@ -5577,41 +5577,41 @@ end end local.get $0 - local.tee $9 - local.get $3 local.tee $11 - local.get $9 + local.get $3 + local.tee $12 + local.get $11 i32.load - local.tee $13 + local.tee $9 i32.ne if - local.get $11 + local.get $12 call $~lib/rt/pure/__retain - local.set $11 - local.get $13 + local.set $12 + local.get $9 call $~lib/rt/pure/__release end - local.get $11 + local.get $12 i32.store local.get $0 local.get $1 i32.store offset=4 local.get $0 - local.tee $9 + local.tee $13 local.get $5 - local.tee $12 - local.get $9 + local.tee $9 + local.get $13 i32.load offset=8 local.tee $11 i32.ne if - local.get $12 + local.get $9 call $~lib/rt/pure/__retain - local.set $12 + local.set $9 local.get $11 call $~lib/rt/pure/__release end - local.get $12 + local.get $9 i32.store offset=8 local.get $0 local.get $4 @@ -6339,15 +6339,15 @@ i32.sub i32.store offset=4 local.get $0 - local.tee $1 + local.tee $2 i32.const 0 i32.const 32 call $~lib/arraybuffer/ArrayBuffer#constructor - local.set $2 - local.get $1 + local.set $1 + local.get $2 i32.load offset=8 call $~lib/rt/pure/__release - local.get $2 + local.get $1 i32.store offset=8 local.get $0 i32.const 4 @@ -6563,41 +6563,41 @@ end end local.get $0 - local.tee $9 - local.get $3 local.tee $11 - local.get $9 + local.get $3 + local.tee $12 + local.get $11 i32.load - local.tee $13 + local.tee $9 i32.ne if - local.get $11 + local.get $12 call $~lib/rt/pure/__retain - local.set $11 - local.get $13 + local.set $12 + local.get $9 call $~lib/rt/pure/__release end - local.get $11 + local.get $12 i32.store local.get $0 local.get $1 i32.store offset=4 local.get $0 - local.tee $9 + local.tee $13 local.get $5 - local.tee $12 - local.get $9 + local.tee $9 + local.get $13 i32.load offset=8 local.tee $11 i32.ne if - local.get $12 + local.get $9 call $~lib/rt/pure/__retain - local.set $12 + local.set $9 local.get $11 call $~lib/rt/pure/__release end - local.get $12 + local.get $9 i32.store offset=8 local.get $0 local.get $4 @@ -7313,15 +7313,15 @@ i32.sub i32.store offset=4 local.get $0 - local.tee $1 + local.tee $2 i32.const 0 i32.const 32 call $~lib/arraybuffer/ArrayBuffer#constructor - local.set $2 - local.get $1 + local.set $1 + local.get $2 i32.load offset=8 call $~lib/rt/pure/__release - local.get $2 + local.get $1 i32.store offset=8 local.get $0 i32.const 4 @@ -7575,41 +7575,41 @@ end end local.get $0 - local.tee $9 - local.get $3 local.tee $11 - local.get $9 + local.get $3 + local.tee $12 + local.get $11 i32.load - local.tee $13 + local.tee $9 i32.ne if - local.get $11 + local.get $12 call $~lib/rt/pure/__retain - local.set $11 - local.get $13 + local.set $12 + local.get $9 call $~lib/rt/pure/__release end - local.get $11 + local.get $12 i32.store local.get $0 local.get $1 i32.store offset=4 local.get $0 - local.tee $9 + local.tee $13 local.get $5 - local.tee $12 - local.get $9 + local.tee $9 + local.get $13 i32.load offset=8 local.tee $11 i32.ne if - local.get $12 + local.get $9 call $~lib/rt/pure/__retain - local.set $12 + local.set $9 local.get $11 call $~lib/rt/pure/__release end - local.get $12 + local.get $9 i32.store offset=8 local.get $0 local.get $4 @@ -8309,15 +8309,15 @@ i32.sub i32.store offset=4 local.get $0 - local.tee $1 + local.tee $2 i32.const 0 i32.const 32 call $~lib/arraybuffer/ArrayBuffer#constructor - local.set $2 - local.get $1 + local.set $1 + local.get $2 i32.load offset=8 call $~lib/rt/pure/__release - local.get $2 + local.get $1 i32.store offset=8 local.get $0 i32.const 4 @@ -8529,41 +8529,41 @@ end end local.get $0 - local.tee $9 - local.get $3 local.tee $11 - local.get $9 + local.get $3 + local.tee $12 + local.get $11 i32.load - local.tee $13 + local.tee $9 i32.ne if - local.get $11 + local.get $12 call $~lib/rt/pure/__retain - local.set $11 - local.get $13 + local.set $12 + local.get $9 call $~lib/rt/pure/__release end - local.get $11 + local.get $12 i32.store local.get $0 local.get $1 i32.store offset=4 local.get $0 - local.tee $9 + local.tee $13 local.get $5 - local.tee $12 - local.get $9 + local.tee $9 + local.get $13 i32.load offset=8 local.tee $11 i32.ne if - local.get $12 + local.get $9 call $~lib/rt/pure/__retain - local.set $12 + local.set $9 local.get $11 call $~lib/rt/pure/__release end - local.get $12 + local.get $9 i32.store offset=8 local.get $0 local.get $4 @@ -9263,15 +9263,15 @@ i32.sub i32.store offset=4 local.get $0 - local.tee $1 + local.tee $2 i32.const 0 i32.const 64 call $~lib/arraybuffer/ArrayBuffer#constructor - local.set $2 - local.get $1 + local.set $1 + local.get $2 i32.load offset=8 call $~lib/rt/pure/__release - local.get $2 + local.get $1 i32.store offset=8 local.get $0 i32.const 4 @@ -9572,41 +9572,41 @@ end end local.get $0 - local.tee $9 - local.get $3 local.tee $11 - local.get $9 + local.get $3 + local.tee $13 + local.get $11 i32.load - local.tee $14 + local.tee $9 i32.ne if - local.get $11 + local.get $13 call $~lib/rt/pure/__retain - local.set $11 - local.get $14 + local.set $13 + local.get $9 call $~lib/rt/pure/__release end - local.get $11 + local.get $13 i32.store local.get $0 local.get $1 i32.store offset=4 local.get $0 - local.tee $9 + local.tee $14 local.get $5 - local.tee $13 - local.get $9 + local.tee $9 + local.get $14 i32.load offset=8 local.tee $11 i32.ne if - local.get $13 + local.get $9 call $~lib/rt/pure/__retain - local.set $13 + local.set $9 local.get $11 call $~lib/rt/pure/__release end - local.get $13 + local.get $9 i32.store offset=8 local.get $0 local.get $4 @@ -10309,15 +10309,15 @@ i32.sub i32.store offset=4 local.get $0 - local.tee $1 + local.tee $2 i32.const 0 i32.const 64 call $~lib/arraybuffer/ArrayBuffer#constructor - local.set $2 - local.get $1 + local.set $1 + local.get $2 i32.load offset=8 call $~lib/rt/pure/__release - local.get $2 + local.get $1 i32.store offset=8 local.get $0 i32.const 4 @@ -10530,41 +10530,41 @@ end end local.get $0 - local.tee $9 - local.get $3 local.tee $11 - local.get $9 + local.get $3 + local.tee $13 + local.get $11 i32.load - local.tee $14 + local.tee $9 i32.ne if - local.get $11 + local.get $13 call $~lib/rt/pure/__retain - local.set $11 - local.get $14 + local.set $13 + local.get $9 call $~lib/rt/pure/__release end - local.get $11 + local.get $13 i32.store local.get $0 local.get $1 i32.store offset=4 local.get $0 - local.tee $9 + local.tee $14 local.get $5 - local.tee $13 - local.get $9 + local.tee $9 + local.get $14 i32.load offset=8 local.tee $11 i32.ne if - local.get $13 + local.get $9 call $~lib/rt/pure/__retain - local.set $13 + local.set $9 local.get $11 call $~lib/rt/pure/__release end - local.get $13 + local.get $9 i32.store offset=8 local.get $0 local.get $4 @@ -11267,15 +11267,15 @@ i32.sub i32.store offset=4 local.get $0 - local.tee $1 + local.tee $2 i32.const 0 i32.const 32 call $~lib/arraybuffer/ArrayBuffer#constructor - local.set $2 - local.get $1 + local.set $1 + local.get $2 i32.load offset=8 call $~lib/rt/pure/__release - local.get $2 + local.get $1 i32.store offset=8 local.get $0 i32.const 4 @@ -11490,41 +11490,41 @@ end end local.get $0 - local.tee $9 - local.get $3 local.tee $11 - local.get $9 + local.get $3 + local.tee $13 + local.get $11 i32.load - local.tee $14 + local.tee $9 i32.ne if - local.get $11 + local.get $13 call $~lib/rt/pure/__retain - local.set $11 - local.get $14 + local.set $13 + local.get $9 call $~lib/rt/pure/__release end - local.get $11 + local.get $13 i32.store local.get $0 local.get $1 i32.store offset=4 local.get $0 - local.tee $9 + local.tee $14 local.get $5 - local.tee $13 - local.get $9 + local.tee $9 + local.get $14 i32.load offset=8 local.tee $11 i32.ne if - local.get $13 + local.get $9 call $~lib/rt/pure/__retain - local.set $13 + local.set $9 local.get $11 call $~lib/rt/pure/__release end - local.get $13 + local.get $9 i32.store offset=8 local.get $0 local.get $4 @@ -12229,15 +12229,15 @@ i32.sub i32.store offset=4 local.get $0 - local.tee $1 + local.tee $2 i32.const 0 i32.const 64 call $~lib/arraybuffer/ArrayBuffer#constructor - local.set $2 - local.get $1 + local.set $1 + local.get $2 i32.load offset=8 call $~lib/rt/pure/__release - local.get $2 + local.get $1 i32.store offset=8 local.get $0 i32.const 4 @@ -12452,41 +12452,41 @@ end end local.get $0 - local.tee $9 - local.get $3 local.tee $11 - local.get $9 + local.get $3 + local.tee $13 + local.get $11 i32.load - local.tee $14 + local.tee $9 i32.ne if - local.get $11 + local.get $13 call $~lib/rt/pure/__retain - local.set $11 - local.get $14 + local.set $13 + local.get $9 call $~lib/rt/pure/__release end - local.get $11 + local.get $13 i32.store local.get $0 local.get $1 i32.store offset=4 local.get $0 - local.tee $9 + local.tee $14 local.get $5 - local.tee $13 - local.get $9 + local.tee $9 + local.get $14 i32.load offset=8 local.tee $11 i32.ne if - local.get $13 + local.get $9 call $~lib/rt/pure/__retain - local.set $13 + local.set $9 local.get $11 call $~lib/rt/pure/__release end - local.get $13 + local.get $9 i32.store offset=8 local.get $0 local.get $4 diff --git a/tests/compiler/std/symbol.untouched.wat b/tests/compiler/std/symbol.untouched.wat index 341895a2af..5752a839c6 100644 --- a/tests/compiler/std/symbol.untouched.wat +++ b/tests/compiler/std/symbol.untouched.wat @@ -502,15 +502,15 @@ i32.sub i32.store offset=4 local.get $0 - local.tee $1 + local.tee $2 i32.const 0 i32.const 48 call $~lib/arraybuffer/ArrayBuffer#constructor - local.set $2 - local.get $1 + local.set $1 + local.get $2 i32.load offset=8 call $~lib/rt/stub/__release - local.get $2 + local.get $1 i32.store offset=8 local.get $0 i32.const 4 @@ -574,15 +574,15 @@ i32.sub i32.store offset=4 local.get $0 - local.tee $1 + local.tee $2 i32.const 0 i32.const 48 call $~lib/arraybuffer/ArrayBuffer#constructor - local.set $2 - local.get $1 + local.set $1 + local.get $2 i32.load offset=8 call $~lib/rt/stub/__release - local.get $2 + local.get $1 i32.store offset=8 local.get $0 i32.const 4 @@ -1124,41 +1124,41 @@ end end local.get $0 - local.tee $9 - local.get $3 local.tee $11 - local.get $9 + local.get $3 + local.tee $12 + local.get $11 i32.load - local.tee $13 + local.tee $9 i32.ne if - local.get $11 + local.get $12 call $~lib/rt/stub/__retain - local.set $11 - local.get $13 + local.set $12 + local.get $9 call $~lib/rt/stub/__release end - local.get $11 + local.get $12 i32.store local.get $0 local.get $1 i32.store offset=4 local.get $0 - local.tee $9 + local.tee $13 local.get $5 - local.tee $12 - local.get $9 + local.tee $9 + local.get $13 i32.load offset=8 local.tee $11 i32.ne if - local.get $12 + local.get $9 call $~lib/rt/stub/__retain - local.set $12 + local.set $9 local.get $11 call $~lib/rt/stub/__release end - local.get $12 + local.get $9 i32.store offset=8 local.get $0 local.get $4 @@ -1489,41 +1489,41 @@ end end local.get $0 - local.tee $9 - local.get $3 local.tee $11 - local.get $9 + local.get $3 + local.tee $12 + local.get $11 i32.load - local.tee $13 + local.tee $9 i32.ne if - local.get $11 + local.get $12 call $~lib/rt/stub/__retain - local.set $11 - local.get $13 + local.set $12 + local.get $9 call $~lib/rt/stub/__release end - local.get $11 + local.get $12 i32.store local.get $0 local.get $1 i32.store offset=4 local.get $0 - local.tee $9 + local.tee $13 local.get $5 - local.tee $12 - local.get $9 + local.tee $9 + local.get $13 i32.load offset=8 local.tee $11 i32.ne if - local.get $12 + local.get $9 call $~lib/rt/stub/__retain - local.set $12 + local.set $9 local.get $11 call $~lib/rt/stub/__release end - local.get $12 + local.get $9 i32.store offset=8 local.get $0 local.get $4 From c560304c104dfa1c35e11371f0446e933830ed74 Mon Sep 17 00:00:00 2001 From: dcode Date: Fri, 14 Feb 2020 18:54:25 +0100 Subject: [PATCH 2/2] add regression test --- tests/compiler/issues/1095.json | 6 + tests/compiler/issues/1095.optimized.wat | 1130 +++++++++++++++ tests/compiler/issues/1095.ts | 11 + tests/compiler/issues/1095.untouched.wat | 1676 ++++++++++++++++++++++ 4 files changed, 2823 insertions(+) create mode 100644 tests/compiler/issues/1095.json create mode 100644 tests/compiler/issues/1095.optimized.wat create mode 100644 tests/compiler/issues/1095.ts create mode 100644 tests/compiler/issues/1095.untouched.wat diff --git a/tests/compiler/issues/1095.json b/tests/compiler/issues/1095.json new file mode 100644 index 0000000000..9f7878d475 --- /dev/null +++ b/tests/compiler/issues/1095.json @@ -0,0 +1,6 @@ +{ + "asc_flags": [ + "--runtime half", + "--use ASC_RTRACE=1" + ] +} \ No newline at end of file diff --git a/tests/compiler/issues/1095.optimized.wat b/tests/compiler/issues/1095.optimized.wat new file mode 100644 index 0000000000..8dd35edbb7 --- /dev/null +++ b/tests/compiler/issues/1095.optimized.wat @@ -0,0 +1,1130 @@ +(module + (type $i32_=>_none (func (param i32))) + (type $i32_i32_=>_none (func (param i32 i32))) + (type $i32_=>_i32 (func (param i32) (result i32))) + (type $none_=>_none (func)) + (type $i32_i32_i32_=>_none (func (param i32 i32 i32))) + (type $i32_i32_i32_i32_=>_none (func (param i32 i32 i32 i32))) + (type $none_=>_i32 (func (result i32))) + (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) + (import "rtrace" "onalloc" (func $~lib/rt/rtrace/onalloc (param i32))) + (import "rtrace" "onincrement" (func $~lib/rt/rtrace/onincrement (param i32))) + (import "rtrace" "ondecrement" (func $~lib/rt/rtrace/ondecrement (param i32))) + (import "rtrace" "onfree" (func $~lib/rt/rtrace/onfree (param i32))) + (memory $0 1) + (data (i32.const 16) "\1e\00\00\00\01\00\00\00\01\00\00\00\1e\00\00\00~\00l\00i\00b\00/\00r\00t\00/\00t\00l\00s\00f\00.\00t\00s") + (data (i32.const 64) "(\00\00\00\01\00\00\00\01\00\00\00(\00\00\00a\00l\00l\00o\00c\00a\00t\00i\00o\00n\00 \00t\00o\00o\00 \00l\00a\00r\00g\00e") + (data (i32.const 128) "\1e\00\00\00\01\00\00\00\01\00\00\00\1e\00\00\00~\00l\00i\00b\00/\00r\00t\00/\00p\00u\00r\00e\00.\00t\00s") + (data (i32.const 176) "\08\00\00\00\01\00\00\00\01\00\00\00\08\00\00\00t\00e\00s\00t") + (data (i32.const 208) "\1c\00\00\00\01\00\00\00\01\00\00\00\1c\00\00\00i\00s\00s\00u\00e\00s\00/\001\000\009\005\00.\00t\00s") + (global $~lib/rt/tlsf/ROOT (mut i32) (i32.const 0)) + (global $~lib/rt/tlsf/collectLock (mut i32) (i32.const 0)) + (export "memory" (memory $0)) + (start $~start) + (func $~lib/rt/tlsf/removeBlock (; 5 ;) (param $0 i32) (param $1 i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + local.get $1 + i32.load + local.tee $3 + i32.const 1 + i32.and + i32.eqz + if + i32.const 0 + i32.const 32 + i32.const 277 + i32.const 13 + call $~lib/builtins/abort + unreachable + end + local.get $3 + i32.const -4 + i32.and + local.tee $2 + i32.const 16 + i32.ge_u + if (result i32) + local.get $2 + i32.const 1073741808 + i32.lt_u + else + i32.const 0 + end + i32.eqz + if + i32.const 0 + i32.const 32 + i32.const 279 + i32.const 13 + call $~lib/builtins/abort + unreachable + end + local.get $2 + i32.const 256 + i32.lt_u + if (result i32) + local.get $2 + i32.const 4 + i32.shr_u + local.set $2 + i32.const 0 + else + local.get $2 + i32.const 31 + local.get $2 + i32.clz + i32.sub + local.tee $3 + i32.const 4 + i32.sub + i32.shr_u + i32.const 16 + i32.xor + local.set $2 + local.get $3 + i32.const 7 + i32.sub + end + local.tee $3 + i32.const 23 + i32.lt_u + if (result i32) + local.get $2 + i32.const 16 + i32.lt_u + else + i32.const 0 + end + i32.eqz + if + i32.const 0 + i32.const 32 + i32.const 292 + i32.const 13 + call $~lib/builtins/abort + unreachable + end + local.get $1 + i32.load offset=20 + local.set $4 + local.get $1 + i32.load offset=16 + local.tee $5 + if + local.get $5 + local.get $4 + i32.store offset=20 + end + local.get $4 + if + local.get $4 + local.get $5 + i32.store offset=16 + end + local.get $1 + local.get $0 + local.get $2 + local.get $3 + i32.const 4 + i32.shl + i32.add + i32.const 2 + i32.shl + i32.add + i32.load offset=96 + i32.eq + if + local.get $0 + local.get $2 + local.get $3 + i32.const 4 + i32.shl + i32.add + i32.const 2 + i32.shl + i32.add + local.get $4 + i32.store offset=96 + local.get $4 + i32.eqz + if + local.get $0 + local.get $3 + i32.const 2 + i32.shl + i32.add + local.get $0 + local.get $3 + i32.const 2 + i32.shl + i32.add + i32.load offset=4 + i32.const 1 + local.get $2 + i32.shl + i32.const -1 + i32.xor + i32.and + local.tee $1 + i32.store offset=4 + local.get $1 + i32.eqz + if + local.get $0 + local.get $0 + i32.load + i32.const 1 + local.get $3 + i32.shl + i32.const -1 + i32.xor + i32.and + i32.store + end + end + end + ) + (func $~lib/rt/tlsf/insertBlock (; 6 ;) (param $0 i32) (param $1 i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + (local $6 i32) + (local $7 i32) + local.get $1 + i32.eqz + if + i32.const 0 + i32.const 32 + i32.const 205 + i32.const 13 + call $~lib/builtins/abort + unreachable + end + local.get $1 + i32.load + local.tee $3 + i32.const 1 + i32.and + i32.eqz + if + i32.const 0 + i32.const 32 + i32.const 207 + i32.const 13 + call $~lib/builtins/abort + unreachable + end + local.get $1 + i32.const 16 + i32.add + local.get $1 + i32.load + i32.const -4 + i32.and + i32.add + local.tee $4 + i32.load + local.tee $5 + i32.const 1 + i32.and + if + local.get $3 + i32.const -4 + i32.and + i32.const 16 + i32.add + local.get $5 + i32.const -4 + i32.and + i32.add + local.tee $2 + i32.const 1073741808 + i32.lt_u + if + local.get $0 + local.get $4 + call $~lib/rt/tlsf/removeBlock + local.get $1 + local.get $2 + local.get $3 + i32.const 3 + i32.and + i32.or + local.tee $3 + i32.store + local.get $1 + i32.const 16 + i32.add + local.get $1 + i32.load + i32.const -4 + i32.and + i32.add + local.tee $4 + i32.load + local.set $5 + end + end + local.get $3 + i32.const 2 + i32.and + if + local.get $1 + i32.const 4 + i32.sub + i32.load + local.tee $2 + i32.load + local.tee $6 + i32.const 1 + i32.and + i32.eqz + if + i32.const 0 + i32.const 32 + i32.const 228 + i32.const 15 + call $~lib/builtins/abort + unreachable + end + local.get $6 + i32.const -4 + i32.and + i32.const 16 + i32.add + local.get $3 + i32.const -4 + i32.and + i32.add + local.tee $7 + i32.const 1073741808 + i32.lt_u + if + local.get $0 + local.get $2 + call $~lib/rt/tlsf/removeBlock + local.get $2 + local.get $7 + local.get $6 + i32.const 3 + i32.and + i32.or + local.tee $3 + i32.store + local.get $2 + local.set $1 + end + end + local.get $4 + local.get $5 + i32.const 2 + i32.or + i32.store + local.get $3 + i32.const -4 + i32.and + local.tee $2 + i32.const 16 + i32.ge_u + if (result i32) + local.get $2 + i32.const 1073741808 + i32.lt_u + else + i32.const 0 + end + i32.eqz + if + i32.const 0 + i32.const 32 + i32.const 243 + i32.const 13 + call $~lib/builtins/abort + unreachable + end + local.get $2 + local.get $1 + i32.const 16 + i32.add + i32.add + local.get $4 + i32.ne + if + i32.const 0 + i32.const 32 + i32.const 244 + i32.const 13 + call $~lib/builtins/abort + unreachable + end + local.get $4 + i32.const 4 + i32.sub + local.get $1 + i32.store + local.get $2 + i32.const 256 + i32.lt_u + if (result i32) + local.get $2 + i32.const 4 + i32.shr_u + local.set $4 + i32.const 0 + else + local.get $2 + i32.const 31 + local.get $2 + i32.clz + i32.sub + local.tee $2 + i32.const 4 + i32.sub + i32.shr_u + i32.const 16 + i32.xor + local.set $4 + local.get $2 + i32.const 7 + i32.sub + end + local.tee $3 + i32.const 23 + i32.lt_u + if (result i32) + local.get $4 + i32.const 16 + i32.lt_u + else + i32.const 0 + end + i32.eqz + if + i32.const 0 + i32.const 32 + i32.const 260 + i32.const 13 + call $~lib/builtins/abort + unreachable + end + local.get $0 + local.get $4 + local.get $3 + i32.const 4 + i32.shl + i32.add + i32.const 2 + i32.shl + i32.add + i32.load offset=96 + local.set $2 + local.get $1 + i32.const 0 + i32.store offset=16 + local.get $1 + local.get $2 + i32.store offset=20 + local.get $2 + if + local.get $2 + local.get $1 + i32.store offset=16 + end + local.get $0 + local.get $4 + local.get $3 + i32.const 4 + i32.shl + i32.add + i32.const 2 + i32.shl + i32.add + local.get $1 + i32.store offset=96 + local.get $0 + local.get $0 + i32.load + i32.const 1 + local.get $3 + i32.shl + i32.or + i32.store + local.get $0 + local.get $3 + i32.const 2 + i32.shl + i32.add + local.get $0 + local.get $3 + i32.const 2 + i32.shl + i32.add + i32.load offset=4 + i32.const 1 + local.get $4 + i32.shl + i32.or + i32.store offset=4 + ) + (func $~lib/rt/tlsf/addMemory (; 7 ;) (param $0 i32) (param $1 i32) (param $2 i32) + (local $3 i32) + (local $4 i32) + local.get $2 + i32.const 15 + i32.and + i32.eqz + i32.const 0 + local.get $1 + i32.const 15 + i32.and + i32.eqz + i32.const 0 + local.get $1 + local.get $2 + i32.le_u + select + select + i32.eqz + if + i32.const 0 + i32.const 32 + i32.const 386 + i32.const 4 + call $~lib/builtins/abort + unreachable + end + local.get $0 + i32.load offset=1568 + local.tee $3 + if + local.get $1 + local.get $3 + i32.const 16 + i32.add + i32.lt_u + if + i32.const 0 + i32.const 32 + i32.const 396 + i32.const 15 + call $~lib/builtins/abort + unreachable + end + local.get $3 + local.get $1 + i32.const 16 + i32.sub + i32.eq + if + local.get $3 + i32.load + local.set $4 + local.get $1 + i32.const 16 + i32.sub + local.set $1 + end + else + local.get $1 + local.get $0 + i32.const 1572 + i32.add + i32.lt_u + if + i32.const 0 + i32.const 32 + i32.const 408 + i32.const 4 + call $~lib/builtins/abort + unreachable + end + end + local.get $2 + local.get $1 + i32.sub + local.tee $2 + i32.const 48 + i32.lt_u + if + return + end + local.get $1 + local.get $4 + i32.const 2 + i32.and + local.get $2 + i32.const 32 + i32.sub + i32.const 1 + i32.or + i32.or + i32.store + local.get $1 + i32.const 0 + i32.store offset=16 + local.get $1 + i32.const 0 + i32.store offset=20 + local.get $1 + local.get $2 + i32.add + i32.const 16 + i32.sub + local.tee $2 + i32.const 2 + i32.store + local.get $0 + local.get $2 + i32.store offset=1568 + local.get $0 + local.get $1 + call $~lib/rt/tlsf/insertBlock + ) + (func $~lib/rt/tlsf/maybeInitialize (; 8 ;) (result i32) + (local $0 i32) + (local $1 i32) + (local $2 i32) + global.get $~lib/rt/tlsf/ROOT + local.tee $0 + i32.eqz + if + i32.const 1 + memory.size + local.tee $0 + i32.gt_s + if (result i32) + i32.const 1 + local.get $0 + i32.sub + memory.grow + i32.const 0 + i32.lt_s + else + i32.const 0 + end + if + unreachable + end + i32.const 256 + local.tee $0 + i32.const 0 + i32.store + i32.const 1824 + i32.const 0 + i32.store + loop $for-loop|0 + local.get $1 + i32.const 23 + i32.lt_u + if + local.get $1 + i32.const 2 + i32.shl + i32.const 256 + i32.add + i32.const 0 + i32.store offset=4 + i32.const 0 + local.set $2 + loop $for-loop|1 + local.get $2 + i32.const 16 + i32.lt_u + if + local.get $1 + i32.const 4 + i32.shl + local.get $2 + i32.add + i32.const 2 + i32.shl + i32.const 256 + i32.add + i32.const 0 + i32.store offset=96 + local.get $2 + i32.const 1 + i32.add + local.set $2 + br $for-loop|1 + end + end + local.get $1 + i32.const 1 + i32.add + local.set $1 + br $for-loop|0 + end + end + i32.const 256 + i32.const 1840 + memory.size + i32.const 16 + i32.shl + call $~lib/rt/tlsf/addMemory + i32.const 256 + global.set $~lib/rt/tlsf/ROOT + end + local.get $0 + ) + (func $~lib/rt/tlsf/searchBlock (; 9 ;) (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + local.get $0 + i32.load offset=4 + i32.const -2 + i32.and + local.tee $1 + if (result i32) + local.get $0 + local.get $1 + i32.ctz + i32.const 2 + i32.shl + i32.add + i32.load offset=96 + else + local.get $0 + i32.load + i32.const -2 + i32.and + local.tee $2 + if (result i32) + local.get $0 + local.get $2 + i32.ctz + local.tee $1 + i32.const 2 + i32.shl + i32.add + i32.load offset=4 + local.tee $2 + i32.eqz + if + i32.const 0 + i32.const 32 + i32.const 351 + i32.const 17 + call $~lib/builtins/abort + unreachable + end + local.get $0 + local.get $2 + i32.ctz + local.get $1 + i32.const 4 + i32.shl + i32.add + i32.const 2 + i32.shl + i32.add + i32.load offset=96 + else + i32.const 0 + end + end + ) + (func $~lib/rt/tlsf/growMemory (; 10 ;) (param $0 i32) + (local $1 i32) + (local $2 i32) + memory.size + local.tee $1 + i32.const 16 + local.get $0 + i32.load offset=1568 + local.get $1 + i32.const 16 + i32.shl + i32.const 16 + i32.sub + i32.ne + i32.shl + i32.const 65551 + i32.add + i32.const -65536 + i32.and + i32.const 16 + i32.shr_u + local.tee $2 + local.get $1 + local.get $2 + i32.gt_s + select + memory.grow + i32.const 0 + i32.lt_s + if + local.get $2 + memory.grow + i32.const 0 + i32.lt_s + if + unreachable + end + end + local.get $0 + local.get $1 + i32.const 16 + i32.shl + memory.size + i32.const 16 + i32.shl + call $~lib/rt/tlsf/addMemory + ) + (func $~lib/rt/tlsf/prepareBlock (; 11 ;) (param $0 i32) (param $1 i32) + (local $2 i32) + (local $3 i32) + local.get $1 + i32.load + local.tee $2 + i32.const -4 + i32.and + i32.const 16 + i32.sub + local.tee $3 + i32.const 32 + i32.ge_u + if + local.get $1 + local.get $2 + i32.const 2 + i32.and + i32.const 16 + i32.or + i32.store + local.get $1 + i32.const 32 + i32.add + local.tee $1 + local.get $3 + i32.const 16 + i32.sub + i32.const 1 + i32.or + i32.store + local.get $0 + local.get $1 + call $~lib/rt/tlsf/insertBlock + else + local.get $1 + local.get $2 + i32.const -2 + i32.and + i32.store + local.get $1 + i32.const 16 + i32.add + local.tee $0 + local.get $1 + i32.load + i32.const -4 + i32.and + i32.add + local.get $0 + local.get $1 + i32.load + i32.const -4 + i32.and + i32.add + i32.load + i32.const -3 + i32.and + i32.store + end + ) + (func $~lib/rt/tlsf/allocateBlock (; 12 ;) (param $0 i32) (result i32) + (local $1 i32) + global.get $~lib/rt/tlsf/collectLock + if + i32.const 0 + i32.const 32 + i32.const 490 + i32.const 13 + call $~lib/builtins/abort + unreachable + end + local.get $0 + call $~lib/rt/tlsf/searchBlock + local.tee $1 + i32.eqz + if + i32.const 1 + global.set $~lib/rt/tlsf/collectLock + i32.const 0 + global.set $~lib/rt/tlsf/collectLock + local.get $0 + call $~lib/rt/tlsf/searchBlock + local.tee $1 + i32.eqz + if + local.get $0 + call $~lib/rt/tlsf/growMemory + local.get $0 + call $~lib/rt/tlsf/searchBlock + local.tee $1 + i32.eqz + if + i32.const 0 + i32.const 32 + i32.const 502 + i32.const 19 + call $~lib/builtins/abort + unreachable + end + end + end + local.get $1 + i32.load + i32.const -4 + i32.and + i32.const 16 + i32.lt_u + if + i32.const 0 + i32.const 32 + i32.const 510 + i32.const 13 + call $~lib/builtins/abort + unreachable + end + local.get $1 + i32.const 0 + i32.store offset=4 + local.get $1 + i32.const 3 + i32.store offset=8 + local.get $1 + i32.const 4 + i32.store offset=12 + local.get $0 + local.get $1 + call $~lib/rt/tlsf/removeBlock + local.get $0 + local.get $1 + call $~lib/rt/tlsf/prepareBlock + local.get $1 + call $~lib/rt/rtrace/onalloc + local.get $1 + ) + (func $~lib/rt/pure/increment (; 13 ;) (param $0 i32) + (local $1 i32) + local.get $0 + i32.load offset=4 + local.tee $1 + i32.const -268435456 + i32.and + local.get $1 + i32.const 1 + i32.add + i32.const -268435456 + i32.and + i32.ne + if + i32.const 0 + i32.const 144 + i32.const 109 + i32.const 2 + call $~lib/builtins/abort + unreachable + end + local.get $0 + local.get $1 + i32.const 1 + i32.add + i32.store offset=4 + local.get $0 + call $~lib/rt/rtrace/onincrement + local.get $0 + i32.load + i32.const 1 + i32.and + if + i32.const 0 + i32.const 144 + i32.const 112 + i32.const 13 + call $~lib/builtins/abort + unreachable + end + ) + (func $~lib/rt/pure/__retain (; 14 ;) (param $0 i32) (result i32) + local.get $0 + i32.const 252 + i32.gt_u + if + local.get $0 + i32.const 16 + i32.sub + call $~lib/rt/pure/increment + end + local.get $0 + ) + (func $~lib/rt/pure/__release (; 15 ;) (param $0 i32) + local.get $0 + i32.const 252 + i32.gt_u + if + local.get $0 + i32.const 16 + i32.sub + call $~lib/rt/pure/decrement + end + ) + (func $issues/1095/test (; 16 ;) (param $0 i32) + (local $1 i32) + (local $2 i32) + local.get $0 + local.tee $1 + local.get $0 + i32.load + local.tee $0 + i32.eqz + if + i32.const 0 + i32.const 224 + i32.const 8 + i32.const 12 + call $~lib/builtins/abort + unreachable + end + local.get $0 + local.get $1 + i32.load + local.tee $1 + i32.ne + if + local.get $0 + call $~lib/rt/pure/__retain + local.set $0 + local.get $1 + call $~lib/rt/pure/__release + end + local.get $0 + i32.store + ) + (func $~start (; 17 ;) + (local $0 i32) + call $~lib/rt/tlsf/maybeInitialize + call $~lib/rt/tlsf/allocateBlock + i32.const 16 + i32.add + call $~lib/rt/pure/__retain + local.tee $0 + i32.const 192 + i32.store + local.get $0 + call $issues/1095/test + local.get $0 + call $~lib/rt/pure/__release + ) + (func $~lib/rt/pure/decrement (; 18 ;) (param $0 i32) + (local $1 i32) + (local $2 i32) + local.get $0 + i32.load offset=4 + local.tee $2 + i32.const 268435455 + i32.and + local.set $1 + local.get $0 + call $~lib/rt/rtrace/ondecrement + local.get $0 + i32.load + i32.const 1 + i32.and + if + i32.const 0 + i32.const 144 + i32.const 122 + i32.const 13 + call $~lib/builtins/abort + unreachable + end + local.get $1 + i32.const 1 + i32.eq + if + local.get $0 + i32.const 16 + i32.add + call $~lib/rt/__visit_members + local.get $2 + i32.const -2147483648 + i32.and + if + i32.const 0 + i32.const 144 + i32.const 126 + i32.const 17 + call $~lib/builtins/abort + unreachable + end + local.get $0 + local.get $0 + i32.load + i32.const 1 + i32.or + i32.store + global.get $~lib/rt/tlsf/ROOT + local.get $0 + call $~lib/rt/tlsf/insertBlock + local.get $0 + call $~lib/rt/rtrace/onfree + else + local.get $1 + i32.const 0 + i32.le_u + if + i32.const 0 + i32.const 144 + i32.const 136 + i32.const 15 + call $~lib/builtins/abort + unreachable + end + local.get $0 + local.get $1 + i32.const 1 + i32.sub + local.get $2 + i32.const -268435456 + i32.and + i32.or + i32.store offset=4 + end + ) + (func $~lib/rt/__visit_members (; 19 ;) (param $0 i32) + block $switch$1$default + block $switch$1$case$4 + block $switch$1$case$2 + local.get $0 + i32.const 8 + i32.sub + i32.load + br_table $switch$1$case$2 $switch$1$case$2 $switch$1$case$4 $switch$1$case$4 $switch$1$default + end + return + end + local.get $0 + i32.load + local.tee $0 + if + local.get $0 + i32.const 252 + i32.ge_u + if + local.get $0 + i32.const 16 + i32.sub + call $~lib/rt/pure/decrement + end + end + return + end + unreachable + ) +) diff --git a/tests/compiler/issues/1095.ts b/tests/compiler/issues/1095.ts new file mode 100644 index 0000000000..a4fe4a6875 --- /dev/null +++ b/tests/compiler/issues/1095.ts @@ -0,0 +1,11 @@ +class Foo { + bar: string | null = "test"; +} + +function test(foo: Foo): void { + // Make sure that the temp obtained for `foo` (`.bar` is loaded AND stored) + // does not conflict with temps obtained and freed in the RHS expression. + foo.bar = foo.bar!; +} + +test(new Foo()); diff --git a/tests/compiler/issues/1095.untouched.wat b/tests/compiler/issues/1095.untouched.wat new file mode 100644 index 0000000000..e7da477318 --- /dev/null +++ b/tests/compiler/issues/1095.untouched.wat @@ -0,0 +1,1676 @@ +(module + (type $i32_=>_none (func (param i32))) + (type $i32_i32_=>_none (func (param i32 i32))) + (type $none_=>_none (func)) + (type $i32_=>_i32 (func (param i32) (result i32))) + (type $i32_i32_=>_i32 (func (param i32 i32) (result i32))) + (type $i32_i32_i32_=>_i32 (func (param i32 i32 i32) (result i32))) + (type $i32_i32_i32_=>_none (func (param i32 i32 i32))) + (type $i32_i32_i32_i32_=>_none (func (param i32 i32 i32 i32))) + (type $none_=>_i32 (func (result i32))) + (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) + (import "rtrace" "onalloc" (func $~lib/rt/rtrace/onalloc (param i32))) + (import "rtrace" "onincrement" (func $~lib/rt/rtrace/onincrement (param i32))) + (import "rtrace" "ondecrement" (func $~lib/rt/rtrace/ondecrement (param i32))) + (import "rtrace" "onfree" (func $~lib/rt/rtrace/onfree (param i32))) + (memory $0 1) + (data (i32.const 16) "\1e\00\00\00\01\00\00\00\01\00\00\00\1e\00\00\00~\00l\00i\00b\00/\00r\00t\00/\00t\00l\00s\00f\00.\00t\00s\00") + (data (i32.const 64) "(\00\00\00\01\00\00\00\01\00\00\00(\00\00\00a\00l\00l\00o\00c\00a\00t\00i\00o\00n\00 \00t\00o\00o\00 \00l\00a\00r\00g\00e\00") + (data (i32.const 128) "\1e\00\00\00\01\00\00\00\01\00\00\00\1e\00\00\00~\00l\00i\00b\00/\00r\00t\00/\00p\00u\00r\00e\00.\00t\00s\00") + (data (i32.const 176) "\08\00\00\00\01\00\00\00\01\00\00\00\08\00\00\00t\00e\00s\00t\00") + (data (i32.const 208) "\1c\00\00\00\01\00\00\00\01\00\00\00\1c\00\00\00i\00s\00s\00u\00e\00s\00/\001\000\009\005\00.\00t\00s\00") + (table $0 1 funcref) + (global $~lib/rt/tlsf/ROOT (mut i32) (i32.const 0)) + (global $~lib/rt/tlsf/collectLock (mut i32) (i32.const 0)) + (global $~lib/gc/gc.auto (mut i32) (i32.const 1)) + (global $~lib/heap/__heap_base i32 (i32.const 252)) + (export "memory" (memory $0)) + (start $~start) + (func $~lib/rt/tlsf/removeBlock (; 5 ;) (param $0 i32) (param $1 i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + (local $6 i32) + (local $7 i32) + (local $8 i32) + (local $9 i32) + (local $10 i32) + (local $11 i32) + local.get $1 + i32.load + local.set $2 + local.get $2 + i32.const 1 + i32.and + i32.eqz + if + i32.const 0 + i32.const 32 + i32.const 277 + i32.const 13 + call $~lib/builtins/abort + unreachable + end + local.get $2 + i32.const 3 + i32.const -1 + i32.xor + i32.and + local.set $3 + local.get $3 + i32.const 16 + i32.ge_u + if (result i32) + local.get $3 + i32.const 1073741808 + i32.lt_u + else + i32.const 0 + end + i32.eqz + if + i32.const 0 + i32.const 32 + i32.const 279 + i32.const 13 + call $~lib/builtins/abort + unreachable + end + local.get $3 + i32.const 256 + i32.lt_u + if + i32.const 0 + local.set $4 + local.get $3 + i32.const 4 + i32.shr_u + local.set $5 + else + i32.const 31 + local.get $3 + i32.clz + i32.sub + local.set $4 + local.get $3 + local.get $4 + i32.const 4 + i32.sub + i32.shr_u + i32.const 1 + i32.const 4 + i32.shl + i32.xor + local.set $5 + local.get $4 + i32.const 8 + i32.const 1 + i32.sub + i32.sub + local.set $4 + end + local.get $4 + i32.const 23 + i32.lt_u + if (result i32) + local.get $5 + i32.const 16 + i32.lt_u + else + i32.const 0 + end + i32.eqz + if + i32.const 0 + i32.const 32 + i32.const 292 + i32.const 13 + call $~lib/builtins/abort + unreachable + end + local.get $1 + i32.load offset=16 + local.set $6 + local.get $1 + i32.load offset=20 + local.set $7 + local.get $6 + if + local.get $6 + local.get $7 + i32.store offset=20 + end + local.get $7 + if + local.get $7 + local.get $6 + i32.store offset=16 + end + local.get $1 + local.get $0 + local.set $10 + local.get $4 + local.set $9 + local.get $5 + local.set $8 + local.get $10 + local.get $9 + i32.const 4 + i32.shl + local.get $8 + i32.add + i32.const 2 + i32.shl + i32.add + i32.load offset=96 + i32.eq + if + local.get $0 + local.set $11 + local.get $4 + local.set $10 + local.get $5 + local.set $9 + local.get $7 + local.set $8 + local.get $11 + local.get $10 + i32.const 4 + i32.shl + local.get $9 + i32.add + i32.const 2 + i32.shl + i32.add + local.get $8 + i32.store offset=96 + local.get $7 + i32.eqz + if + local.get $0 + local.set $9 + local.get $4 + local.set $8 + local.get $9 + local.get $8 + i32.const 2 + i32.shl + i32.add + i32.load offset=4 + local.set $9 + local.get $0 + local.set $8 + local.get $4 + local.set $11 + local.get $9 + i32.const 1 + local.get $5 + i32.shl + i32.const -1 + i32.xor + i32.and + local.tee $9 + local.set $10 + local.get $8 + local.get $11 + i32.const 2 + i32.shl + i32.add + local.get $10 + i32.store offset=4 + local.get $9 + i32.eqz + if + local.get $0 + local.get $0 + i32.load + i32.const 1 + local.get $4 + i32.shl + i32.const -1 + i32.xor + i32.and + i32.store + end + end + end + ) + (func $~lib/rt/tlsf/insertBlock (; 6 ;) (param $0 i32) (param $1 i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + (local $6 i32) + (local $7 i32) + (local $8 i32) + (local $9 i32) + (local $10 i32) + (local $11 i32) + (local $12 i32) + (local $13 i32) + local.get $1 + i32.eqz + if + i32.const 0 + i32.const 32 + i32.const 205 + i32.const 13 + call $~lib/builtins/abort + unreachable + end + local.get $1 + i32.load + local.set $2 + local.get $2 + i32.const 1 + i32.and + i32.eqz + if + i32.const 0 + i32.const 32 + i32.const 207 + i32.const 13 + call $~lib/builtins/abort + unreachable + end + local.get $1 + local.set $3 + local.get $3 + i32.const 16 + i32.add + local.get $3 + i32.load + i32.const 3 + i32.const -1 + i32.xor + i32.and + i32.add + local.set $4 + local.get $4 + i32.load + local.set $5 + local.get $5 + i32.const 1 + i32.and + if + local.get $2 + i32.const 3 + i32.const -1 + i32.xor + i32.and + i32.const 16 + i32.add + local.get $5 + i32.const 3 + i32.const -1 + i32.xor + i32.and + i32.add + local.set $3 + local.get $3 + i32.const 1073741808 + i32.lt_u + if + local.get $0 + local.get $4 + call $~lib/rt/tlsf/removeBlock + local.get $1 + local.get $2 + i32.const 3 + i32.and + local.get $3 + i32.or + local.tee $2 + i32.store + local.get $1 + local.set $6 + local.get $6 + i32.const 16 + i32.add + local.get $6 + i32.load + i32.const 3 + i32.const -1 + i32.xor + i32.and + i32.add + local.set $4 + local.get $4 + i32.load + local.set $5 + end + end + local.get $2 + i32.const 2 + i32.and + if + local.get $1 + local.set $6 + local.get $6 + i32.const 4 + i32.sub + i32.load + local.set $6 + local.get $6 + i32.load + local.set $3 + local.get $3 + i32.const 1 + i32.and + i32.eqz + if + i32.const 0 + i32.const 32 + i32.const 228 + i32.const 15 + call $~lib/builtins/abort + unreachable + end + local.get $3 + i32.const 3 + i32.const -1 + i32.xor + i32.and + i32.const 16 + i32.add + local.get $2 + i32.const 3 + i32.const -1 + i32.xor + i32.and + i32.add + local.set $7 + local.get $7 + i32.const 1073741808 + i32.lt_u + if + local.get $0 + local.get $6 + call $~lib/rt/tlsf/removeBlock + local.get $6 + local.get $3 + i32.const 3 + i32.and + local.get $7 + i32.or + local.tee $2 + i32.store + local.get $6 + local.set $1 + end + end + local.get $4 + local.get $5 + i32.const 2 + i32.or + i32.store + local.get $2 + i32.const 3 + i32.const -1 + i32.xor + i32.and + local.set $8 + local.get $8 + i32.const 16 + i32.ge_u + if (result i32) + local.get $8 + i32.const 1073741808 + i32.lt_u + else + i32.const 0 + end + i32.eqz + if + i32.const 0 + i32.const 32 + i32.const 243 + i32.const 13 + call $~lib/builtins/abort + unreachable + end + local.get $1 + i32.const 16 + i32.add + local.get $8 + i32.add + local.get $4 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 32 + i32.const 244 + i32.const 13 + call $~lib/builtins/abort + unreachable + end + local.get $4 + i32.const 4 + i32.sub + local.get $1 + i32.store + local.get $8 + i32.const 256 + i32.lt_u + if + i32.const 0 + local.set $9 + local.get $8 + i32.const 4 + i32.shr_u + local.set $10 + else + i32.const 31 + local.get $8 + i32.clz + i32.sub + local.set $9 + local.get $8 + local.get $9 + i32.const 4 + i32.sub + i32.shr_u + i32.const 1 + i32.const 4 + i32.shl + i32.xor + local.set $10 + local.get $9 + i32.const 8 + i32.const 1 + i32.sub + i32.sub + local.set $9 + end + local.get $9 + i32.const 23 + i32.lt_u + if (result i32) + local.get $10 + i32.const 16 + i32.lt_u + else + i32.const 0 + end + i32.eqz + if + i32.const 0 + i32.const 32 + i32.const 260 + i32.const 13 + call $~lib/builtins/abort + unreachable + end + local.get $0 + local.set $7 + local.get $9 + local.set $3 + local.get $10 + local.set $6 + local.get $7 + local.get $3 + i32.const 4 + i32.shl + local.get $6 + i32.add + i32.const 2 + i32.shl + i32.add + i32.load offset=96 + local.set $11 + local.get $1 + i32.const 0 + i32.store offset=16 + local.get $1 + local.get $11 + i32.store offset=20 + local.get $11 + if + local.get $11 + local.get $1 + i32.store offset=16 + end + local.get $0 + local.set $12 + local.get $9 + local.set $7 + local.get $10 + local.set $3 + local.get $1 + local.set $6 + local.get $12 + local.get $7 + i32.const 4 + i32.shl + local.get $3 + i32.add + i32.const 2 + i32.shl + i32.add + local.get $6 + i32.store offset=96 + local.get $0 + local.get $0 + i32.load + i32.const 1 + local.get $9 + i32.shl + i32.or + i32.store + local.get $0 + local.set $13 + local.get $9 + local.set $12 + local.get $0 + local.set $3 + local.get $9 + local.set $6 + local.get $3 + local.get $6 + i32.const 2 + i32.shl + i32.add + i32.load offset=4 + i32.const 1 + local.get $10 + i32.shl + i32.or + local.set $7 + local.get $13 + local.get $12 + i32.const 2 + i32.shl + i32.add + local.get $7 + i32.store offset=4 + ) + (func $~lib/rt/tlsf/addMemory (; 7 ;) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + (local $6 i32) + (local $7 i32) + (local $8 i32) + (local $9 i32) + local.get $1 + local.get $2 + i32.le_u + if (result i32) + local.get $1 + i32.const 15 + i32.and + i32.eqz + else + i32.const 0 + end + if (result i32) + local.get $2 + i32.const 15 + i32.and + i32.eqz + else + i32.const 0 + end + i32.eqz + if + i32.const 0 + i32.const 32 + i32.const 386 + i32.const 4 + call $~lib/builtins/abort + unreachable + end + local.get $0 + local.set $3 + local.get $3 + i32.load offset=1568 + local.set $4 + i32.const 0 + local.set $5 + local.get $4 + if + local.get $1 + local.get $4 + i32.const 16 + i32.add + i32.ge_u + i32.eqz + if + i32.const 0 + i32.const 32 + i32.const 396 + i32.const 15 + call $~lib/builtins/abort + unreachable + end + local.get $1 + i32.const 16 + i32.sub + local.get $4 + i32.eq + if + local.get $1 + i32.const 16 + i32.sub + local.set $1 + local.get $4 + i32.load + local.set $5 + else + nop + end + else + local.get $1 + local.get $0 + i32.const 1572 + i32.add + i32.ge_u + i32.eqz + if + i32.const 0 + i32.const 32 + i32.const 408 + i32.const 4 + call $~lib/builtins/abort + unreachable + end + end + local.get $2 + local.get $1 + i32.sub + local.set $6 + local.get $6 + i32.const 48 + i32.lt_u + if + i32.const 0 + return + end + local.get $6 + i32.const 16 + i32.const 1 + i32.shl + i32.sub + local.set $7 + local.get $1 + local.set $8 + local.get $8 + local.get $7 + i32.const 1 + i32.or + local.get $5 + i32.const 2 + i32.and + i32.or + i32.store + local.get $8 + i32.const 0 + i32.store offset=16 + local.get $8 + i32.const 0 + i32.store offset=20 + local.get $1 + local.get $6 + i32.add + i32.const 16 + i32.sub + local.set $4 + local.get $4 + i32.const 0 + i32.const 2 + i32.or + i32.store + local.get $0 + local.set $9 + local.get $4 + local.set $3 + local.get $9 + local.get $3 + i32.store offset=1568 + local.get $0 + local.get $8 + call $~lib/rt/tlsf/insertBlock + i32.const 1 + ) + (func $~lib/rt/tlsf/maybeInitialize (; 8 ;) (result i32) + (local $0 i32) + (local $1 i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + (local $6 i32) + (local $7 i32) + (local $8 i32) + (local $9 i32) + (local $10 i32) + (local $11 i32) + global.get $~lib/rt/tlsf/ROOT + local.set $0 + local.get $0 + i32.eqz + if + global.get $~lib/heap/__heap_base + i32.const 15 + i32.add + i32.const -16 + i32.and + local.set $1 + memory.size + local.set $2 + local.get $1 + i32.const 1572 + i32.add + i32.const 65535 + i32.add + i32.const 65535 + i32.const -1 + i32.xor + i32.and + i32.const 16 + i32.shr_u + local.set $3 + local.get $3 + local.get $2 + i32.gt_s + if (result i32) + local.get $3 + local.get $2 + i32.sub + memory.grow + i32.const 0 + i32.lt_s + else + i32.const 0 + end + if + unreachable + end + local.get $1 + local.set $0 + local.get $0 + i32.const 0 + i32.store + local.get $0 + local.set $5 + i32.const 0 + local.set $4 + local.get $5 + local.get $4 + i32.store offset=1568 + i32.const 0 + local.set $5 + loop $for-loop|0 + local.get $5 + i32.const 23 + i32.lt_u + local.set $4 + local.get $4 + if + local.get $0 + local.set $8 + local.get $5 + local.set $7 + i32.const 0 + local.set $6 + local.get $8 + local.get $7 + i32.const 2 + i32.shl + i32.add + local.get $6 + i32.store offset=4 + i32.const 0 + local.set $8 + loop $for-loop|1 + local.get $8 + i32.const 16 + i32.lt_u + local.set $7 + local.get $7 + if + local.get $0 + local.set $11 + local.get $5 + local.set $10 + local.get $8 + local.set $9 + i32.const 0 + local.set $6 + local.get $11 + local.get $10 + i32.const 4 + i32.shl + local.get $9 + i32.add + i32.const 2 + i32.shl + i32.add + local.get $6 + i32.store offset=96 + local.get $8 + i32.const 1 + i32.add + local.set $8 + br $for-loop|1 + end + end + local.get $5 + i32.const 1 + i32.add + local.set $5 + br $for-loop|0 + end + end + local.get $0 + local.get $1 + i32.const 1572 + i32.add + i32.const 15 + i32.add + i32.const 15 + i32.const -1 + i32.xor + i32.and + memory.size + i32.const 16 + i32.shl + call $~lib/rt/tlsf/addMemory + drop + local.get $0 + global.set $~lib/rt/tlsf/ROOT + end + local.get $0 + ) + (func $~lib/rt/tlsf/prepareSize (; 9 ;) (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + local.get $0 + i32.const 1073741808 + i32.ge_u + if + i32.const 80 + i32.const 32 + i32.const 457 + i32.const 29 + call $~lib/builtins/abort + unreachable + end + local.get $0 + i32.const 15 + i32.add + i32.const 15 + i32.const -1 + i32.xor + i32.and + local.tee $1 + i32.const 16 + local.tee $2 + local.get $1 + local.get $2 + i32.gt_u + select + ) + (func $~lib/rt/tlsf/searchBlock (; 10 ;) (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + (local $6 i32) + (local $7 i32) + (local $8 i32) + (local $9 i32) + local.get $1 + i32.const 256 + i32.lt_u + if + i32.const 0 + local.set $2 + local.get $1 + i32.const 4 + i32.shr_u + local.set $3 + else + local.get $1 + i32.const 536870904 + i32.lt_u + if (result i32) + local.get $1 + i32.const 1 + i32.const 27 + local.get $1 + i32.clz + i32.sub + i32.shl + i32.add + i32.const 1 + i32.sub + else + local.get $1 + end + local.set $4 + i32.const 31 + local.get $4 + i32.clz + i32.sub + local.set $2 + local.get $4 + local.get $2 + i32.const 4 + i32.sub + i32.shr_u + i32.const 1 + i32.const 4 + i32.shl + i32.xor + local.set $3 + local.get $2 + i32.const 8 + i32.const 1 + i32.sub + i32.sub + local.set $2 + end + local.get $2 + i32.const 23 + i32.lt_u + if (result i32) + local.get $3 + i32.const 16 + i32.lt_u + else + i32.const 0 + end + i32.eqz + if + i32.const 0 + i32.const 32 + i32.const 338 + i32.const 13 + call $~lib/builtins/abort + unreachable + end + local.get $0 + local.set $5 + local.get $2 + local.set $4 + local.get $5 + local.get $4 + i32.const 2 + i32.shl + i32.add + i32.load offset=4 + i32.const 0 + i32.const -1 + i32.xor + local.get $3 + i32.shl + i32.and + local.set $6 + i32.const 0 + local.set $7 + local.get $6 + i32.eqz + if + local.get $0 + i32.load + i32.const 0 + i32.const -1 + i32.xor + local.get $2 + i32.const 1 + i32.add + i32.shl + i32.and + local.set $5 + local.get $5 + i32.eqz + if + i32.const 0 + local.set $7 + else + local.get $5 + i32.ctz + local.set $2 + local.get $0 + local.set $8 + local.get $2 + local.set $4 + local.get $8 + local.get $4 + i32.const 2 + i32.shl + i32.add + i32.load offset=4 + local.set $6 + local.get $6 + i32.eqz + if + i32.const 0 + i32.const 32 + i32.const 351 + i32.const 17 + call $~lib/builtins/abort + unreachable + end + local.get $0 + local.set $9 + local.get $2 + local.set $8 + local.get $6 + i32.ctz + local.set $4 + local.get $9 + local.get $8 + i32.const 4 + i32.shl + local.get $4 + i32.add + i32.const 2 + i32.shl + i32.add + i32.load offset=96 + local.set $7 + end + else + local.get $0 + local.set $9 + local.get $2 + local.set $8 + local.get $6 + i32.ctz + local.set $4 + local.get $9 + local.get $8 + i32.const 4 + i32.shl + local.get $4 + i32.add + i32.const 2 + i32.shl + i32.add + i32.load offset=96 + local.set $7 + end + local.get $7 + ) + (func $~lib/rt/tlsf/growMemory (; 11 ;) (param $0 i32) (param $1 i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + (local $6 i32) + (local $7 i32) + local.get $1 + i32.const 536870904 + i32.lt_u + if + local.get $1 + i32.const 1 + i32.const 27 + local.get $1 + i32.clz + i32.sub + i32.shl + i32.const 1 + i32.sub + i32.add + local.set $1 + end + memory.size + local.set $2 + local.get $1 + i32.const 16 + local.get $2 + i32.const 16 + i32.shl + i32.const 16 + i32.sub + local.get $0 + local.set $3 + local.get $3 + i32.load offset=1568 + i32.ne + i32.shl + i32.add + local.set $1 + local.get $1 + i32.const 65535 + i32.add + i32.const 65535 + i32.const -1 + i32.xor + i32.and + i32.const 16 + i32.shr_u + local.set $4 + local.get $2 + local.tee $3 + local.get $4 + local.tee $5 + local.get $3 + local.get $5 + i32.gt_s + select + local.set $6 + local.get $6 + memory.grow + i32.const 0 + i32.lt_s + if + local.get $4 + memory.grow + i32.const 0 + i32.lt_s + if + unreachable + end + end + memory.size + local.set $7 + local.get $0 + local.get $2 + i32.const 16 + i32.shl + local.get $7 + i32.const 16 + i32.shl + call $~lib/rt/tlsf/addMemory + drop + ) + (func $~lib/rt/tlsf/prepareBlock (; 12 ;) (param $0 i32) (param $1 i32) (param $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + local.get $1 + i32.load + local.set $3 + local.get $2 + i32.const 15 + i32.and + i32.eqz + i32.eqz + if + i32.const 0 + i32.const 32 + i32.const 365 + i32.const 13 + call $~lib/builtins/abort + unreachable + end + local.get $3 + i32.const 3 + i32.const -1 + i32.xor + i32.and + local.get $2 + i32.sub + local.set $4 + local.get $4 + i32.const 32 + i32.ge_u + if + local.get $1 + local.get $2 + local.get $3 + i32.const 2 + i32.and + i32.or + i32.store + local.get $1 + i32.const 16 + i32.add + local.get $2 + i32.add + local.set $5 + local.get $5 + local.get $4 + i32.const 16 + i32.sub + i32.const 1 + i32.or + i32.store + local.get $0 + local.get $5 + call $~lib/rt/tlsf/insertBlock + else + local.get $1 + local.get $3 + i32.const 1 + i32.const -1 + i32.xor + i32.and + i32.store + local.get $1 + local.set $5 + local.get $5 + i32.const 16 + i32.add + local.get $5 + i32.load + i32.const 3 + i32.const -1 + i32.xor + i32.and + i32.add + local.get $1 + local.set $5 + local.get $5 + i32.const 16 + i32.add + local.get $5 + i32.load + i32.const 3 + i32.const -1 + i32.xor + i32.and + i32.add + i32.load + i32.const 2 + i32.const -1 + i32.xor + i32.and + i32.store + end + ) + (func $~lib/rt/tlsf/allocateBlock (; 13 ;) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + (local $3 i32) + (local $4 i32) + global.get $~lib/rt/tlsf/collectLock + i32.eqz + i32.eqz + if + i32.const 0 + i32.const 32 + i32.const 490 + i32.const 13 + call $~lib/builtins/abort + unreachable + end + local.get $1 + call $~lib/rt/tlsf/prepareSize + local.set $3 + local.get $0 + local.get $3 + call $~lib/rt/tlsf/searchBlock + local.set $4 + local.get $4 + i32.eqz + if + global.get $~lib/gc/gc.auto + if + i32.const 1 + global.set $~lib/rt/tlsf/collectLock + call $~lib/rt/pure/__collect + i32.const 0 + global.set $~lib/rt/tlsf/collectLock + local.get $0 + local.get $3 + call $~lib/rt/tlsf/searchBlock + local.set $4 + local.get $4 + i32.eqz + if + local.get $0 + local.get $3 + call $~lib/rt/tlsf/growMemory + local.get $0 + local.get $3 + call $~lib/rt/tlsf/searchBlock + local.set $4 + local.get $4 + i32.eqz + if + i32.const 0 + i32.const 32 + i32.const 502 + i32.const 19 + call $~lib/builtins/abort + unreachable + end + end + else + local.get $0 + local.get $3 + call $~lib/rt/tlsf/growMemory + local.get $0 + local.get $3 + call $~lib/rt/tlsf/searchBlock + local.set $4 + local.get $4 + i32.eqz + if + i32.const 0 + i32.const 32 + i32.const 507 + i32.const 17 + call $~lib/builtins/abort + unreachable + end + end + end + local.get $4 + i32.load + i32.const -4 + i32.and + local.get $3 + i32.ge_u + i32.eqz + if + i32.const 0 + i32.const 32 + i32.const 510 + i32.const 13 + call $~lib/builtins/abort + unreachable + end + local.get $4 + i32.const 0 + i32.store offset=4 + local.get $4 + local.get $2 + i32.store offset=8 + local.get $4 + local.get $1 + i32.store offset=12 + local.get $0 + local.get $4 + call $~lib/rt/tlsf/removeBlock + local.get $0 + local.get $4 + local.get $3 + call $~lib/rt/tlsf/prepareBlock + local.get $4 + call $~lib/rt/rtrace/onalloc + local.get $4 + ) + (func $~lib/rt/tlsf/__alloc (; 14 ;) (param $0 i32) (param $1 i32) (result i32) + call $~lib/rt/tlsf/maybeInitialize + local.get $0 + local.get $1 + call $~lib/rt/tlsf/allocateBlock + i32.const 16 + i32.add + ) + (func $~lib/rt/pure/increment (; 15 ;) (param $0 i32) + (local $1 i32) + local.get $0 + i32.load offset=4 + local.set $1 + local.get $1 + i32.const -268435456 + i32.and + local.get $1 + i32.const 1 + i32.add + i32.const -268435456 + i32.and + i32.eq + i32.eqz + if + i32.const 0 + i32.const 144 + i32.const 109 + i32.const 2 + call $~lib/builtins/abort + unreachable + end + local.get $0 + local.get $1 + i32.const 1 + i32.add + i32.store offset=4 + local.get $0 + call $~lib/rt/rtrace/onincrement + local.get $0 + i32.load + i32.const 1 + i32.and + i32.eqz + i32.eqz + if + i32.const 0 + i32.const 144 + i32.const 112 + i32.const 13 + call $~lib/builtins/abort + unreachable + end + ) + (func $~lib/rt/pure/__retain (; 16 ;) (param $0 i32) (result i32) + local.get $0 + global.get $~lib/heap/__heap_base + i32.gt_u + if + local.get $0 + i32.const 16 + i32.sub + call $~lib/rt/pure/increment + end + local.get $0 + ) + (func $issues/1095/Foo#constructor (; 17 ;) (param $0 i32) (result i32) + local.get $0 + i32.eqz + if + i32.const 4 + i32.const 3 + call $~lib/rt/tlsf/__alloc + call $~lib/rt/pure/__retain + local.set $0 + end + local.get $0 + i32.const 192 + i32.store + local.get $0 + ) + (func $~lib/rt/pure/__release (; 18 ;) (param $0 i32) + local.get $0 + global.get $~lib/heap/__heap_base + i32.gt_u + if + local.get $0 + i32.const 16 + i32.sub + call $~lib/rt/pure/decrement + end + ) + (func $issues/1095/test (; 19 ;) (param $0 i32) + (local $1 i32) + (local $2 i32) + (local $3 i32) + local.get $0 + call $~lib/rt/pure/__retain + local.set $0 + local.get $0 + local.tee $2 + local.get $0 + i32.load + local.tee $1 + if (result i32) + local.get $1 + else + i32.const 0 + i32.const 224 + i32.const 8 + i32.const 12 + call $~lib/builtins/abort + unreachable + end + local.tee $1 + local.get $2 + i32.load + local.tee $3 + i32.ne + if + local.get $1 + call $~lib/rt/pure/__retain + local.set $1 + local.get $3 + call $~lib/rt/pure/__release + end + local.get $1 + i32.store + local.get $0 + call $~lib/rt/pure/__release + ) + (func $start:issues/1095 (; 20 ;) + (local $0 i32) + i32.const 0 + call $issues/1095/Foo#constructor + local.tee $0 + call $issues/1095/test + local.get $0 + call $~lib/rt/pure/__release + ) + (func $~start (; 21 ;) + call $start:issues/1095 + ) + (func $~lib/rt/pure/__collect (; 22 ;) + return + ) + (func $~lib/rt/tlsf/freeBlock (; 23 ;) (param $0 i32) (param $1 i32) + (local $2 i32) + local.get $1 + i32.load + local.set $2 + local.get $1 + local.get $2 + i32.const 1 + i32.or + i32.store + local.get $0 + local.get $1 + call $~lib/rt/tlsf/insertBlock + local.get $1 + call $~lib/rt/rtrace/onfree + ) + (func $~lib/rt/pure/decrement (; 24 ;) (param $0 i32) + (local $1 i32) + (local $2 i32) + local.get $0 + i32.load offset=4 + local.set $1 + local.get $1 + i32.const 268435455 + i32.and + local.set $2 + local.get $0 + call $~lib/rt/rtrace/ondecrement + local.get $0 + i32.load + i32.const 1 + i32.and + i32.eqz + i32.eqz + if + i32.const 0 + i32.const 144 + i32.const 122 + i32.const 13 + call $~lib/builtins/abort + unreachable + end + local.get $2 + i32.const 1 + i32.eq + if + local.get $0 + i32.const 16 + i32.add + i32.const 1 + call $~lib/rt/__visit_members + local.get $1 + i32.const -2147483648 + i32.and + i32.eqz + i32.eqz + if + i32.const 0 + i32.const 144 + i32.const 126 + i32.const 17 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/rt/tlsf/ROOT + local.get $0 + call $~lib/rt/tlsf/freeBlock + else + local.get $2 + i32.const 0 + i32.gt_u + i32.eqz + if + i32.const 0 + i32.const 144 + i32.const 136 + i32.const 15 + call $~lib/builtins/abort + unreachable + end + local.get $0 + local.get $1 + i32.const 268435455 + i32.const -1 + i32.xor + i32.and + local.get $2 + i32.const 1 + i32.sub + i32.or + i32.store offset=4 + end + ) + (func $~lib/rt/pure/__visit (; 25 ;) (param $0 i32) (param $1 i32) + local.get $0 + global.get $~lib/heap/__heap_base + i32.lt_u + if + return + end + local.get $1 + i32.const 1 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 144 + i32.const 69 + i32.const 15 + call $~lib/builtins/abort + unreachable + end + local.get $0 + i32.const 16 + i32.sub + call $~lib/rt/pure/decrement + ) + (func $~lib/rt/__visit_members (; 26 ;) (param $0 i32) (param $1 i32) + (local $2 i32) + block $switch$1$default + block $switch$1$case$4 + block $switch$1$case$2 + local.get $0 + i32.const 8 + i32.sub + i32.load + br_table $switch$1$case$2 $switch$1$case$2 $switch$1$case$4 $switch$1$case$4 $switch$1$default + end + return + end + local.get $0 + i32.load + local.tee $2 + if + local.get $2 + local.get $1 + call $~lib/rt/pure/__visit + end + return + end + unreachable + ) +)