From 91513382135c4076835ff0c1a6cfb18b340cecce Mon Sep 17 00:00:00 2001 From: dcode Date: Thu, 24 Jun 2021 00:12:09 +0200 Subject: [PATCH 1/3] Fix invalid codegen on small to long int cast --- src/compiler.ts | 4 +- tests/compiler/cast.json | 4 + tests/compiler/cast.optimized.wat | 4 + tests/compiler/cast.ts | 88 +++ tests/compiler/cast.untouched.wat | 1144 +++++++++++++++++++++++++++++ 5 files changed, 1242 insertions(+), 2 deletions(-) create mode 100644 tests/compiler/cast.json create mode 100644 tests/compiler/cast.optimized.wat create mode 100644 tests/compiler/cast.ts create mode 100644 tests/compiler/cast.untouched.wat diff --git a/src/compiler.ts b/src/compiler.ts index 79b5bd5144..0123c30bea 100644 --- a/src/compiler.ts +++ b/src/compiler.ts @@ -3521,10 +3521,10 @@ export class Compiler extends DiagnosticEmitter { if (currentType != contextualType.nonNullableType) { // allow assigning non-nullable to nullable if (constraints & Constraints.CONV_EXPLICIT) { expr = this.convertExpression(expr, currentType, contextualType, true, expression); - this.currentType = contextualType; + this.currentType = currentType = contextualType; } else if (constraints & Constraints.CONV_IMPLICIT) { expr = this.convertExpression(expr, currentType, contextualType, false, expression); - this.currentType = contextualType; + this.currentType = currentType = contextualType; } } if (wrap) expr = this.ensureSmallIntegerWrap(expr, currentType); diff --git a/tests/compiler/cast.json b/tests/compiler/cast.json new file mode 100644 index 0000000000..1bdd02b1be --- /dev/null +++ b/tests/compiler/cast.json @@ -0,0 +1,4 @@ +{ + "asc_flags": [ + ] +} diff --git a/tests/compiler/cast.optimized.wat b/tests/compiler/cast.optimized.wat new file mode 100644 index 0000000000..23da3862e2 --- /dev/null +++ b/tests/compiler/cast.optimized.wat @@ -0,0 +1,4 @@ +(module + (memory $0 0) + (export "memory" (memory $0)) +) diff --git a/tests/compiler/cast.ts b/tests/compiler/cast.ts new file mode 100644 index 0000000000..1cd7616307 --- /dev/null +++ b/tests/compiler/cast.ts @@ -0,0 +1,88 @@ +function test(x: T): U { + // @ts-ignore + var y1 = x as U; + // @ts-ignore + var y2 = x; + // @ts-ignore + return y1 + y2; +} + +test(0); +test(0); +test(0); +test(0); +test(0); +test(0); +test(0); +test(0); +test(0); + +test(0); +test(0); +test(0); +test(0); +test(0); +test(0); +test(0); +test(0); +test(0); + +test(0); +test(0); +test(0); +test(0); +test(0); +test(0); +test(0); +test(0); +test(0); + +test(0); +test(0); +test(0); +test(0); +test(0); +test(0); +test(0); +test(0); +test(0); + +test(0); +test(0); +test(0); +test(0); +test(0); +test(0); +test(0); +test(0); +test(0); + +test(0); +test(0); +test(0); +test(0); +test(0); +test(0); +test(0); +test(0); +test(0); + +test(0); +test(0); +test(0); +test(0); +test(0); +test(0); +test(0); +test(0); +test(0); + +test(0); +test(0); +test(0); +test(0); +test(0); +test(0); +test(0); +test(0); +test(0); diff --git a/tests/compiler/cast.untouched.wat b/tests/compiler/cast.untouched.wat new file mode 100644 index 0000000000..e064518320 --- /dev/null +++ b/tests/compiler/cast.untouched.wat @@ -0,0 +1,1144 @@ +(module + (type $i32_=>_i32 (func (param i32) (result i32))) + (type $i64_=>_i32 (func (param i64) (result i32))) + (type $i32_=>_i64 (func (param i32) (result i64))) + (type $i64_=>_i64 (func (param i64) (result i64))) + (type $none_=>_none (func)) + (global $~lib/memory/__data_end i32 (i32.const 8)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 16392)) + (global $~lib/memory/__heap_base i32 (i32.const 16392)) + (memory $0 0) + (table $0 1 funcref) + (elem $0 (i32.const 1)) + (export "memory" (memory $0)) + (start $~start) + (func $cast/test (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + local.get $0 + local.set $1 + local.get $0 + local.set $2 + local.get $1 + local.get $2 + i32.add + ) + (func $cast/test (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + local.get $0 + local.set $1 + local.get $0 + local.set $2 + local.get $1 + local.get $2 + i32.add + ) + (func $cast/test (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + local.get $0 + i32.extend8_s + local.set $1 + local.get $0 + i32.extend8_s + local.set $2 + local.get $1 + local.get $2 + i32.add + ) + (func $cast/test (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + local.get $0 + i32.extend8_s + local.set $1 + local.get $0 + i32.extend8_s + local.set $2 + local.get $1 + local.get $2 + i32.add + ) + (func $cast/test (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + local.get $0 + i32.extend8_s + local.set $1 + local.get $0 + i32.extend8_s + local.set $2 + local.get $1 + local.get $2 + i32.add + ) + (func $cast/test (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + local.get $0 + i32.extend8_s + local.set $1 + local.get $0 + i32.extend8_s + local.set $2 + local.get $1 + local.get $2 + i32.add + ) + (func $cast/test (param $0 i32) (result i64) + (local $1 i64) + (local $2 i64) + local.get $0 + i32.extend8_s + i64.extend_i32_s + local.set $1 + local.get $0 + i32.extend8_s + i64.extend_i32_s + local.set $2 + local.get $1 + local.get $2 + i64.add + ) + (func $cast/test (param $0 i32) (result i64) + (local $1 i64) + (local $2 i64) + local.get $0 + i32.extend8_s + i64.extend_i32_s + local.set $1 + local.get $0 + i32.extend8_s + i64.extend_i32_s + local.set $2 + local.get $1 + local.get $2 + i64.add + ) + (func $cast/test (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + local.get $0 + local.set $1 + local.get $0 + local.set $2 + local.get $1 + local.get $2 + i32.add + ) + (func $cast/test (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + local.get $0 + local.set $1 + local.get $0 + local.set $2 + local.get $1 + local.get $2 + i32.add + ) + (func $cast/test (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + local.get $0 + local.set $1 + local.get $0 + local.set $2 + local.get $1 + local.get $2 + i32.add + ) + (func $cast/test (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + local.get $0 + i32.const 255 + i32.and + local.set $1 + local.get $0 + i32.const 255 + i32.and + local.set $2 + local.get $1 + local.get $2 + i32.add + ) + (func $cast/test (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + local.get $0 + i32.const 255 + i32.and + local.set $1 + local.get $0 + i32.const 255 + i32.and + local.set $2 + local.get $1 + local.get $2 + i32.add + ) + (func $cast/test (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + local.get $0 + i32.const 255 + i32.and + local.set $1 + local.get $0 + i32.const 255 + i32.and + local.set $2 + local.get $1 + local.get $2 + i32.add + ) + (func $cast/test (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + local.get $0 + i32.const 255 + i32.and + local.set $1 + local.get $0 + i32.const 255 + i32.and + local.set $2 + local.get $1 + local.get $2 + i32.add + ) + (func $cast/test (param $0 i32) (result i64) + (local $1 i64) + (local $2 i64) + local.get $0 + i32.const 255 + i32.and + i64.extend_i32_u + local.set $1 + local.get $0 + i32.const 255 + i32.and + i64.extend_i32_u + local.set $2 + local.get $1 + local.get $2 + i64.add + ) + (func $cast/test (param $0 i32) (result i64) + (local $1 i64) + (local $2 i64) + local.get $0 + i32.const 255 + i32.and + i64.extend_i32_u + local.set $1 + local.get $0 + i32.const 255 + i32.and + i64.extend_i32_u + local.set $2 + local.get $1 + local.get $2 + i64.add + ) + (func $cast/test (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + local.get $0 + local.set $1 + local.get $0 + local.set $2 + local.get $1 + local.get $2 + i32.add + ) + (func $cast/test (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + local.get $0 + local.set $1 + local.get $0 + local.set $2 + local.get $1 + local.get $2 + i32.add + ) + (func $cast/test (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + local.get $0 + local.set $1 + local.get $0 + local.set $2 + local.get $1 + local.get $2 + i32.add + ) + (func $cast/test (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + local.get $0 + local.set $1 + local.get $0 + local.set $2 + local.get $1 + local.get $2 + i32.add + ) + (func $cast/test (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + local.get $0 + local.set $1 + local.get $0 + local.set $2 + local.get $1 + local.get $2 + i32.add + ) + (func $cast/test (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + local.get $0 + i32.extend16_s + local.set $1 + local.get $0 + i32.extend16_s + local.set $2 + local.get $1 + local.get $2 + i32.add + ) + (func $cast/test (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + local.get $0 + i32.extend16_s + local.set $1 + local.get $0 + i32.extend16_s + local.set $2 + local.get $1 + local.get $2 + i32.add + ) + (func $cast/test (param $0 i32) (result i64) + (local $1 i64) + (local $2 i64) + local.get $0 + i32.extend16_s + i64.extend_i32_s + local.set $1 + local.get $0 + i32.extend16_s + i64.extend_i32_s + local.set $2 + local.get $1 + local.get $2 + i64.add + ) + (func $cast/test (param $0 i32) (result i64) + (local $1 i64) + (local $2 i64) + local.get $0 + i32.extend16_s + i64.extend_i32_s + local.set $1 + local.get $0 + i32.extend16_s + i64.extend_i32_s + local.set $2 + local.get $1 + local.get $2 + i64.add + ) + (func $cast/test (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + local.get $0 + local.set $1 + local.get $0 + local.set $2 + local.get $1 + local.get $2 + i32.add + ) + (func $cast/test (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + local.get $0 + local.set $1 + local.get $0 + local.set $2 + local.get $1 + local.get $2 + i32.add + ) + (func $cast/test (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + local.get $0 + local.set $1 + local.get $0 + local.set $2 + local.get $1 + local.get $2 + i32.add + ) + (func $cast/test (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + local.get $0 + local.set $1 + local.get $0 + local.set $2 + local.get $1 + local.get $2 + i32.add + ) + (func $cast/test (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + local.get $0 + local.set $1 + local.get $0 + local.set $2 + local.get $1 + local.get $2 + i32.add + ) + (func $cast/test (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + local.get $0 + i32.const 65535 + i32.and + local.set $1 + local.get $0 + i32.const 65535 + i32.and + local.set $2 + local.get $1 + local.get $2 + i32.add + ) + (func $cast/test (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + local.get $0 + i32.const 65535 + i32.and + local.set $1 + local.get $0 + i32.const 65535 + i32.and + local.set $2 + local.get $1 + local.get $2 + i32.add + ) + (func $cast/test (param $0 i32) (result i64) + (local $1 i64) + (local $2 i64) + local.get $0 + i32.const 65535 + i32.and + i64.extend_i32_u + local.set $1 + local.get $0 + i32.const 65535 + i32.and + i64.extend_i32_u + local.set $2 + local.get $1 + local.get $2 + i64.add + ) + (func $cast/test (param $0 i32) (result i64) + (local $1 i64) + (local $2 i64) + local.get $0 + i32.const 65535 + i32.and + i64.extend_i32_u + local.set $1 + local.get $0 + i32.const 65535 + i32.and + i64.extend_i32_u + local.set $2 + local.get $1 + local.get $2 + i64.add + ) + (func $cast/test (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + local.get $0 + local.set $1 + local.get $0 + local.set $2 + local.get $1 + local.get $2 + i32.add + ) + (func $cast/test (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + local.get $0 + local.set $1 + local.get $0 + local.set $2 + local.get $1 + local.get $2 + i32.add + ) + (func $cast/test (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + local.get $0 + local.set $1 + local.get $0 + local.set $2 + local.get $1 + local.get $2 + i32.add + ) + (func $cast/test (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + local.get $0 + local.set $1 + local.get $0 + local.set $2 + local.get $1 + local.get $2 + i32.add + ) + (func $cast/test (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + local.get $0 + local.set $1 + local.get $0 + local.set $2 + local.get $1 + local.get $2 + i32.add + ) + (func $cast/test (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + local.get $0 + local.set $1 + local.get $0 + local.set $2 + local.get $1 + local.get $2 + i32.add + ) + (func $cast/test (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + local.get $0 + local.set $1 + local.get $0 + local.set $2 + local.get $1 + local.get $2 + i32.add + ) + (func $cast/test (param $0 i32) (result i64) + (local $1 i64) + (local $2 i64) + local.get $0 + i64.extend_i32_s + local.set $1 + local.get $0 + i64.extend_i32_s + local.set $2 + local.get $1 + local.get $2 + i64.add + ) + (func $cast/test (param $0 i32) (result i64) + (local $1 i64) + (local $2 i64) + local.get $0 + i64.extend_i32_s + local.set $1 + local.get $0 + i64.extend_i32_s + local.set $2 + local.get $1 + local.get $2 + i64.add + ) + (func $cast/test (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + local.get $0 + local.set $1 + local.get $0 + local.set $2 + local.get $1 + local.get $2 + i32.add + ) + (func $cast/test (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + local.get $0 + local.set $1 + local.get $0 + local.set $2 + local.get $1 + local.get $2 + i32.add + ) + (func $cast/test (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + local.get $0 + local.set $1 + local.get $0 + local.set $2 + local.get $1 + local.get $2 + i32.add + ) + (func $cast/test (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + local.get $0 + local.set $1 + local.get $0 + local.set $2 + local.get $1 + local.get $2 + i32.add + ) + (func $cast/test (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + local.get $0 + local.set $1 + local.get $0 + local.set $2 + local.get $1 + local.get $2 + i32.add + ) + (func $cast/test (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + local.get $0 + local.set $1 + local.get $0 + local.set $2 + local.get $1 + local.get $2 + i32.add + ) + (func $cast/test (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + local.get $0 + local.set $1 + local.get $0 + local.set $2 + local.get $1 + local.get $2 + i32.add + ) + (func $cast/test (param $0 i32) (result i64) + (local $1 i64) + (local $2 i64) + local.get $0 + i64.extend_i32_u + local.set $1 + local.get $0 + i64.extend_i32_u + local.set $2 + local.get $1 + local.get $2 + i64.add + ) + (func $cast/test (param $0 i32) (result i64) + (local $1 i64) + (local $2 i64) + local.get $0 + i64.extend_i32_u + local.set $1 + local.get $0 + i64.extend_i32_u + local.set $2 + local.get $1 + local.get $2 + i64.add + ) + (func $cast/test (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + local.get $0 + local.set $1 + local.get $0 + local.set $2 + local.get $1 + local.get $2 + i32.add + ) + (func $cast/test (param $0 i64) (result i32) + (local $1 i32) + (local $2 i32) + local.get $0 + i32.wrap_i64 + local.set $1 + local.get $0 + i32.wrap_i64 + local.set $2 + local.get $1 + local.get $2 + i32.add + ) + (func $cast/test (param $0 i64) (result i32) + (local $1 i32) + (local $2 i32) + local.get $0 + i32.wrap_i64 + local.set $1 + local.get $0 + i32.wrap_i64 + local.set $2 + local.get $1 + local.get $2 + i32.add + ) + (func $cast/test (param $0 i64) (result i32) + (local $1 i32) + (local $2 i32) + local.get $0 + i32.wrap_i64 + local.set $1 + local.get $0 + i32.wrap_i64 + local.set $2 + local.get $1 + local.get $2 + i32.add + ) + (func $cast/test (param $0 i64) (result i32) + (local $1 i32) + (local $2 i32) + local.get $0 + i32.wrap_i64 + local.set $1 + local.get $0 + i32.wrap_i64 + local.set $2 + local.get $1 + local.get $2 + i32.add + ) + (func $cast/test (param $0 i64) (result i32) + (local $1 i32) + (local $2 i32) + local.get $0 + i32.wrap_i64 + local.set $1 + local.get $0 + i32.wrap_i64 + local.set $2 + local.get $1 + local.get $2 + i32.add + ) + (func $cast/test (param $0 i64) (result i32) + (local $1 i32) + (local $2 i32) + local.get $0 + i32.wrap_i64 + local.set $1 + local.get $0 + i32.wrap_i64 + local.set $2 + local.get $1 + local.get $2 + i32.add + ) + (func $cast/test (param $0 i64) (result i64) + (local $1 i64) + (local $2 i64) + local.get $0 + local.set $1 + local.get $0 + local.set $2 + local.get $1 + local.get $2 + i64.add + ) + (func $cast/test (param $0 i64) (result i64) + (local $1 i64) + (local $2 i64) + local.get $0 + local.set $1 + local.get $0 + local.set $2 + local.get $1 + local.get $2 + i64.add + ) + (func $cast/test (param $0 i64) (result i32) + (local $1 i32) + (local $2 i32) + local.get $0 + i64.const 0 + i64.ne + local.set $1 + local.get $0 + i64.const 0 + i64.ne + local.set $2 + local.get $1 + local.get $2 + i32.add + ) + (func $cast/test (param $0 i64) (result i32) + (local $1 i32) + (local $2 i32) + local.get $0 + i32.wrap_i64 + local.set $1 + local.get $0 + i32.wrap_i64 + local.set $2 + local.get $1 + local.get $2 + i32.add + ) + (func $cast/test (param $0 i64) (result i32) + (local $1 i32) + (local $2 i32) + local.get $0 + i32.wrap_i64 + local.set $1 + local.get $0 + i32.wrap_i64 + local.set $2 + local.get $1 + local.get $2 + i32.add + ) + (func $cast/test (param $0 i64) (result i32) + (local $1 i32) + (local $2 i32) + local.get $0 + i32.wrap_i64 + local.set $1 + local.get $0 + i32.wrap_i64 + local.set $2 + local.get $1 + local.get $2 + i32.add + ) + (func $cast/test (param $0 i64) (result i32) + (local $1 i32) + (local $2 i32) + local.get $0 + i32.wrap_i64 + local.set $1 + local.get $0 + i32.wrap_i64 + local.set $2 + local.get $1 + local.get $2 + i32.add + ) + (func $cast/test (param $0 i64) (result i32) + (local $1 i32) + (local $2 i32) + local.get $0 + i32.wrap_i64 + local.set $1 + local.get $0 + i32.wrap_i64 + local.set $2 + local.get $1 + local.get $2 + i32.add + ) + (func $cast/test (param $0 i64) (result i32) + (local $1 i32) + (local $2 i32) + local.get $0 + i32.wrap_i64 + local.set $1 + local.get $0 + i32.wrap_i64 + local.set $2 + local.get $1 + local.get $2 + i32.add + ) + (func $cast/test (param $0 i64) (result i64) + (local $1 i64) + (local $2 i64) + local.get $0 + local.set $1 + local.get $0 + local.set $2 + local.get $1 + local.get $2 + i64.add + ) + (func $cast/test (param $0 i64) (result i64) + (local $1 i64) + (local $2 i64) + local.get $0 + local.set $1 + local.get $0 + local.set $2 + local.get $1 + local.get $2 + i64.add + ) + (func $cast/test (param $0 i64) (result i32) + (local $1 i32) + (local $2 i32) + local.get $0 + i64.const 0 + i64.ne + local.set $1 + local.get $0 + i64.const 0 + i64.ne + local.set $2 + local.get $1 + local.get $2 + i32.add + ) + (func $start:cast + i32.const 0 + call $cast/test + drop + i32.const 0 + call $cast/test + drop + i32.const 0 + call $cast/test + drop + i32.const 0 + call $cast/test + drop + i32.const 0 + call $cast/test + drop + i32.const 0 + call $cast/test + drop + i32.const 0 + call $cast/test + drop + i32.const 0 + call $cast/test + drop + i32.const 0 + call $cast/test + drop + i32.const 0 + call $cast/test + drop + i32.const 0 + call $cast/test + drop + i32.const 0 + call $cast/test + drop + i32.const 0 + call $cast/test + drop + i32.const 0 + call $cast/test + drop + i32.const 0 + call $cast/test + drop + i32.const 0 + call $cast/test + drop + i32.const 0 + call $cast/test + drop + i32.const 0 + call $cast/test + drop + i32.const 0 + call $cast/test + drop + i32.const 0 + call $cast/test + drop + i32.const 0 + call $cast/test + drop + i32.const 0 + call $cast/test + drop + i32.const 0 + call $cast/test + drop + i32.const 0 + call $cast/test + drop + i32.const 0 + call $cast/test + drop + i32.const 0 + call $cast/test + drop + i32.const 0 + call $cast/test + drop + i32.const 0 + call $cast/test + drop + i32.const 0 + call $cast/test + drop + i32.const 0 + call $cast/test + drop + i32.const 0 + call $cast/test + drop + i32.const 0 + call $cast/test + drop + i32.const 0 + call $cast/test + drop + i32.const 0 + call $cast/test + drop + i32.const 0 + call $cast/test + drop + i32.const 0 + call $cast/test + drop + i32.const 0 + call $cast/test + drop + i32.const 0 + call $cast/test + drop + i32.const 0 + call $cast/test + drop + i32.const 0 + call $cast/test + drop + i32.const 0 + call $cast/test + drop + i32.const 0 + call $cast/test + drop + i32.const 0 + call $cast/test + drop + i32.const 0 + call $cast/test + drop + i32.const 0 + call $cast/test + drop + i32.const 0 + call $cast/test + drop + i32.const 0 + call $cast/test + drop + i32.const 0 + call $cast/test + drop + i32.const 0 + call $cast/test + drop + i32.const 0 + call $cast/test + drop + i32.const 0 + call $cast/test + drop + i32.const 0 + call $cast/test + drop + i32.const 0 + call $cast/test + drop + i32.const 0 + call $cast/test + drop + i64.const 0 + call $cast/test + drop + i64.const 0 + call $cast/test + drop + i64.const 0 + call $cast/test + drop + i64.const 0 + call $cast/test + drop + i64.const 0 + call $cast/test + drop + i64.const 0 + call $cast/test + drop + i64.const 0 + call $cast/test + drop + i64.const 0 + call $cast/test + drop + i64.const 0 + call $cast/test + drop + i64.const 0 + call $cast/test + drop + i64.const 0 + call $cast/test + drop + i64.const 0 + call $cast/test + drop + i64.const 0 + call $cast/test + drop + i64.const 0 + call $cast/test + drop + i64.const 0 + call $cast/test + drop + i64.const 0 + call $cast/test + drop + i64.const 0 + call $cast/test + drop + i64.const 0 + call $cast/test + drop + ) + (func $~start + call $start:cast + ) +) From c5376a039dd4f8dbc3b2f465d38106f6ae47e1e2 Mon Sep 17 00:00:00 2001 From: dcode Date: Thu, 24 Jun 2021 00:17:27 +0200 Subject: [PATCH 2/3] fix --- src/compiler.ts | 1 + tests/compiler/cast.ts | 10 ++ tests/compiler/cast.untouched.wat | 164 +++++++++++++++++++++++++++++- 3 files changed, 174 insertions(+), 1 deletion(-) diff --git a/src/compiler.ts b/src/compiler.ts index 0123c30bea..575c96a2d6 100644 --- a/src/compiler.ts +++ b/src/compiler.ts @@ -3522,6 +3522,7 @@ export class Compiler extends DiagnosticEmitter { if (constraints & Constraints.CONV_EXPLICIT) { expr = this.convertExpression(expr, currentType, contextualType, true, expression); this.currentType = currentType = contextualType; + wrap = false; } else if (constraints & Constraints.CONV_IMPLICIT) { expr = this.convertExpression(expr, currentType, contextualType, false, expression); this.currentType = currentType = contextualType; diff --git a/tests/compiler/cast.ts b/tests/compiler/cast.ts index 1cd7616307..4047a85067 100644 --- a/tests/compiler/cast.ts +++ b/tests/compiler/cast.ts @@ -86,3 +86,13 @@ test(0); test(0); test(0); test(0); + +test(0); +test(0); +test(0); +test(0); +test(0); +test(0); +test(0); +test(0); +test(0); diff --git a/tests/compiler/cast.untouched.wat b/tests/compiler/cast.untouched.wat index e064518320..a33db9ccd3 100644 --- a/tests/compiler/cast.untouched.wat +++ b/tests/compiler/cast.untouched.wat @@ -1,7 +1,7 @@ (module (type $i32_=>_i32 (func (param i32) (result i32))) - (type $i64_=>_i32 (func (param i64) (result i32))) (type $i32_=>_i64 (func (param i32) (result i64))) + (type $i64_=>_i32 (func (param i64) (result i32))) (type $i64_=>_i64 (func (param i64) (result i64))) (type $none_=>_none (func)) (global $~lib/memory/__data_end i32 (i32.const 8)) @@ -920,6 +920,141 @@ local.get $2 i32.add ) + (func $cast/test (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + local.get $0 + i32.const 0 + i32.ne + local.set $1 + local.get $0 + i32.const 0 + i32.ne + local.set $2 + local.get $1 + local.get $2 + i32.add + ) + (func $cast/test (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + local.get $0 + i32.const 0 + i32.ne + local.set $1 + local.get $0 + i32.const 0 + i32.ne + local.set $2 + local.get $1 + local.get $2 + i32.add + ) + (func $cast/test (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + local.get $0 + i32.const 0 + i32.ne + local.set $1 + local.get $0 + i32.const 0 + i32.ne + local.set $2 + local.get $1 + local.get $2 + i32.add + ) + (func $cast/test (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + local.get $0 + i32.const 0 + i32.ne + local.set $1 + local.get $0 + i32.const 0 + i32.ne + local.set $2 + local.get $1 + local.get $2 + i32.add + ) + (func $cast/test (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + local.get $0 + i32.const 0 + i32.ne + local.set $1 + local.get $0 + i32.const 0 + i32.ne + local.set $2 + local.get $1 + local.get $2 + i32.add + ) + (func $cast/test (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + local.get $0 + i32.const 0 + i32.ne + local.set $1 + local.get $0 + i32.const 0 + i32.ne + local.set $2 + local.get $1 + local.get $2 + i32.add + ) + (func $cast/test (param $0 i32) (result i64) + (local $1 i64) + (local $2 i64) + local.get $0 + i32.const 0 + i32.ne + i64.extend_i32_u + local.set $1 + local.get $0 + i32.const 0 + i32.ne + i64.extend_i32_u + local.set $2 + local.get $1 + local.get $2 + i64.add + ) + (func $cast/test (param $0 i32) (result i64) + (local $1 i64) + (local $2 i64) + local.get $0 + i32.const 0 + i32.ne + i64.extend_i32_u + local.set $1 + local.get $0 + i32.const 0 + i32.ne + i64.extend_i32_u + local.set $2 + local.get $1 + local.get $2 + i64.add + ) + (func $cast/test (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + local.get $0 + local.set $1 + local.get $0 + local.set $2 + local.get $1 + local.get $2 + i32.add + ) (func $start:cast i32.const 0 call $cast/test @@ -1137,6 +1272,33 @@ i64.const 0 call $cast/test drop + i32.const 0 + call $cast/test + drop + i32.const 0 + call $cast/test + drop + i32.const 0 + call $cast/test + drop + i32.const 0 + call $cast/test + drop + i32.const 0 + call $cast/test + drop + i32.const 0 + call $cast/test + drop + i32.const 0 + call $cast/test + drop + i32.const 0 + call $cast/test + drop + i32.const 0 + call $cast/test + drop ) (func $~start call $start:cast From c134a2b100a3c31375a6798f543416443371391c Mon Sep 17 00:00:00 2001 From: dcode Date: Thu, 24 Jun 2021 01:06:03 +0200 Subject: [PATCH 3/3] fix --- src/compiler.ts | 1 - src/flow.ts | 7 + tests/compiler/abi.untouched.wat | 2 - tests/compiler/cast.ts | 6 +- tests/compiler/cast.untouched.wat | 481 -------------------- tests/compiler/many-locals.untouched.wat | 1 - tests/compiler/std/typedarray.optimized.wat | 8 +- tests/compiler/std/typedarray.untouched.wat | 2 - 8 files changed, 11 insertions(+), 497 deletions(-) diff --git a/src/compiler.ts b/src/compiler.ts index 575c96a2d6..0123c30bea 100644 --- a/src/compiler.ts +++ b/src/compiler.ts @@ -3522,7 +3522,6 @@ export class Compiler extends DiagnosticEmitter { if (constraints & Constraints.CONV_EXPLICIT) { expr = this.convertExpression(expr, currentType, contextualType, true, expression); this.currentType = currentType = contextualType; - wrap = false; } else if (constraints & Constraints.CONV_IMPLICIT) { expr = this.convertExpression(expr, currentType, contextualType, false, expression); this.currentType = currentType = contextualType; diff --git a/src/flow.ts b/src/flow.ts index 998e9e191d..91e64789df 100644 --- a/src/flow.ts +++ b/src/flow.ts @@ -1351,6 +1351,13 @@ export class Flow { case UnaryOp.ClzI32: case UnaryOp.CtzI32: case UnaryOp.PopcntI32: return type.size < 7; + + // sign extensions overflow if result can have high garbage bits in the target type + case UnaryOp.Extend8I32: return type.size < (type.isUnsignedIntegerValue ? 32 : 8); + case UnaryOp.Extend8I64: return type.size < (type.isUnsignedIntegerValue ? 64 : 8); + case UnaryOp.Extend16I32: return type.size < (type.isUnsignedIntegerValue ? 32 : 16); + case UnaryOp.Extend16I64: return type.size < (type.isUnsignedIntegerValue ? 64 : 16); + case UnaryOp.Extend32I64: return type.size < (type.isUnsignedIntegerValue ? 64 : 32); } break; } diff --git a/tests/compiler/abi.untouched.wat b/tests/compiler/abi.untouched.wat index 06e2ca21e8..dd4b94e38b 100644 --- a/tests/compiler/abi.untouched.wat +++ b/tests/compiler/abi.untouched.wat @@ -88,7 +88,6 @@ local.set $0 end local.get $0 - i32.extend8_s i32.eqz i32.eqz if @@ -176,7 +175,6 @@ ) (func $abi/exportedExported (result i32) call $abi/exported - i32.extend8_s ) (func $abi/exportedInternal (result i32) call $abi/internal diff --git a/tests/compiler/cast.ts b/tests/compiler/cast.ts index 4047a85067..cd81a6dac2 100644 --- a/tests/compiler/cast.ts +++ b/tests/compiler/cast.ts @@ -1,10 +1,8 @@ function test(x: T): U { // @ts-ignore - var y1 = x as U; + var y = x as U; // @ts-ignore - var y2 = x; - // @ts-ignore - return y1 + y2; + return y; } test(0); diff --git a/tests/compiler/cast.untouched.wat b/tests/compiler/cast.untouched.wat index a33db9ccd3..62ab3dba02 100644 --- a/tests/compiler/cast.untouched.wat +++ b/tests/compiler/cast.untouched.wat @@ -14,1046 +14,565 @@ (start $~start) (func $cast/test (param $0 i32) (result i32) (local $1 i32) - (local $2 i32) local.get $0 local.set $1 - local.get $0 - local.set $2 local.get $1 - local.get $2 - i32.add ) (func $cast/test (param $0 i32) (result i32) (local $1 i32) - (local $2 i32) local.get $0 local.set $1 - local.get $0 - local.set $2 local.get $1 - local.get $2 - i32.add ) (func $cast/test (param $0 i32) (result i32) (local $1 i32) - (local $2 i32) local.get $0 i32.extend8_s local.set $1 - local.get $0 - i32.extend8_s - local.set $2 local.get $1 - local.get $2 - i32.add ) (func $cast/test (param $0 i32) (result i32) (local $1 i32) - (local $2 i32) local.get $0 i32.extend8_s local.set $1 - local.get $0 - i32.extend8_s - local.set $2 local.get $1 - local.get $2 - i32.add ) (func $cast/test (param $0 i32) (result i32) (local $1 i32) - (local $2 i32) local.get $0 i32.extend8_s local.set $1 - local.get $0 - i32.extend8_s - local.set $2 local.get $1 - local.get $2 - i32.add ) (func $cast/test (param $0 i32) (result i32) (local $1 i32) - (local $2 i32) local.get $0 i32.extend8_s local.set $1 - local.get $0 - i32.extend8_s - local.set $2 local.get $1 - local.get $2 - i32.add ) (func $cast/test (param $0 i32) (result i64) (local $1 i64) - (local $2 i64) local.get $0 i32.extend8_s i64.extend_i32_s local.set $1 - local.get $0 - i32.extend8_s - i64.extend_i32_s - local.set $2 local.get $1 - local.get $2 - i64.add ) (func $cast/test (param $0 i32) (result i64) (local $1 i64) - (local $2 i64) local.get $0 i32.extend8_s i64.extend_i32_s local.set $1 - local.get $0 - i32.extend8_s - i64.extend_i32_s - local.set $2 local.get $1 - local.get $2 - i64.add ) (func $cast/test (param $0 i32) (result i32) (local $1 i32) - (local $2 i32) local.get $0 local.set $1 - local.get $0 - local.set $2 local.get $1 - local.get $2 - i32.add ) (func $cast/test (param $0 i32) (result i32) (local $1 i32) - (local $2 i32) local.get $0 local.set $1 - local.get $0 - local.set $2 local.get $1 - local.get $2 - i32.add ) (func $cast/test (param $0 i32) (result i32) (local $1 i32) - (local $2 i32) local.get $0 local.set $1 - local.get $0 - local.set $2 local.get $1 - local.get $2 - i32.add ) (func $cast/test (param $0 i32) (result i32) (local $1 i32) - (local $2 i32) local.get $0 i32.const 255 i32.and local.set $1 - local.get $0 - i32.const 255 - i32.and - local.set $2 local.get $1 - local.get $2 - i32.add ) (func $cast/test (param $0 i32) (result i32) (local $1 i32) - (local $2 i32) local.get $0 i32.const 255 i32.and local.set $1 - local.get $0 - i32.const 255 - i32.and - local.set $2 local.get $1 - local.get $2 - i32.add ) (func $cast/test (param $0 i32) (result i32) (local $1 i32) - (local $2 i32) local.get $0 i32.const 255 i32.and local.set $1 - local.get $0 - i32.const 255 - i32.and - local.set $2 local.get $1 - local.get $2 - i32.add ) (func $cast/test (param $0 i32) (result i32) (local $1 i32) - (local $2 i32) local.get $0 i32.const 255 i32.and local.set $1 - local.get $0 - i32.const 255 - i32.and - local.set $2 local.get $1 - local.get $2 - i32.add ) (func $cast/test (param $0 i32) (result i64) (local $1 i64) - (local $2 i64) local.get $0 i32.const 255 i32.and i64.extend_i32_u local.set $1 - local.get $0 - i32.const 255 - i32.and - i64.extend_i32_u - local.set $2 local.get $1 - local.get $2 - i64.add ) (func $cast/test (param $0 i32) (result i64) (local $1 i64) - (local $2 i64) local.get $0 i32.const 255 i32.and i64.extend_i32_u local.set $1 - local.get $0 - i32.const 255 - i32.and - i64.extend_i32_u - local.set $2 local.get $1 - local.get $2 - i64.add ) (func $cast/test (param $0 i32) (result i32) (local $1 i32) - (local $2 i32) local.get $0 local.set $1 - local.get $0 - local.set $2 local.get $1 - local.get $2 - i32.add ) (func $cast/test (param $0 i32) (result i32) (local $1 i32) - (local $2 i32) local.get $0 local.set $1 - local.get $0 - local.set $2 local.get $1 - local.get $2 - i32.add ) (func $cast/test (param $0 i32) (result i32) (local $1 i32) - (local $2 i32) local.get $0 local.set $1 - local.get $0 - local.set $2 local.get $1 - local.get $2 - i32.add ) (func $cast/test (param $0 i32) (result i32) (local $1 i32) - (local $2 i32) local.get $0 local.set $1 - local.get $0 - local.set $2 local.get $1 - local.get $2 - i32.add ) (func $cast/test (param $0 i32) (result i32) (local $1 i32) - (local $2 i32) local.get $0 local.set $1 - local.get $0 - local.set $2 local.get $1 - local.get $2 - i32.add ) (func $cast/test (param $0 i32) (result i32) (local $1 i32) - (local $2 i32) local.get $0 i32.extend16_s local.set $1 - local.get $0 - i32.extend16_s - local.set $2 local.get $1 - local.get $2 - i32.add ) (func $cast/test (param $0 i32) (result i32) (local $1 i32) - (local $2 i32) local.get $0 i32.extend16_s local.set $1 - local.get $0 - i32.extend16_s - local.set $2 local.get $1 - local.get $2 - i32.add ) (func $cast/test (param $0 i32) (result i64) (local $1 i64) - (local $2 i64) local.get $0 i32.extend16_s i64.extend_i32_s local.set $1 - local.get $0 - i32.extend16_s - i64.extend_i32_s - local.set $2 local.get $1 - local.get $2 - i64.add ) (func $cast/test (param $0 i32) (result i64) (local $1 i64) - (local $2 i64) local.get $0 i32.extend16_s i64.extend_i32_s local.set $1 - local.get $0 - i32.extend16_s - i64.extend_i32_s - local.set $2 local.get $1 - local.get $2 - i64.add ) (func $cast/test (param $0 i32) (result i32) (local $1 i32) - (local $2 i32) local.get $0 local.set $1 - local.get $0 - local.set $2 local.get $1 - local.get $2 - i32.add ) (func $cast/test (param $0 i32) (result i32) (local $1 i32) - (local $2 i32) local.get $0 local.set $1 - local.get $0 - local.set $2 local.get $1 - local.get $2 - i32.add ) (func $cast/test (param $0 i32) (result i32) (local $1 i32) - (local $2 i32) local.get $0 local.set $1 - local.get $0 - local.set $2 local.get $1 - local.get $2 - i32.add ) (func $cast/test (param $0 i32) (result i32) (local $1 i32) - (local $2 i32) local.get $0 local.set $1 - local.get $0 - local.set $2 local.get $1 - local.get $2 - i32.add ) (func $cast/test (param $0 i32) (result i32) (local $1 i32) - (local $2 i32) local.get $0 local.set $1 - local.get $0 - local.set $2 local.get $1 - local.get $2 - i32.add ) (func $cast/test (param $0 i32) (result i32) (local $1 i32) - (local $2 i32) local.get $0 i32.const 65535 i32.and local.set $1 - local.get $0 - i32.const 65535 - i32.and - local.set $2 local.get $1 - local.get $2 - i32.add ) (func $cast/test (param $0 i32) (result i32) (local $1 i32) - (local $2 i32) local.get $0 i32.const 65535 i32.and local.set $1 - local.get $0 - i32.const 65535 - i32.and - local.set $2 local.get $1 - local.get $2 - i32.add ) (func $cast/test (param $0 i32) (result i64) (local $1 i64) - (local $2 i64) local.get $0 i32.const 65535 i32.and i64.extend_i32_u local.set $1 - local.get $0 - i32.const 65535 - i32.and - i64.extend_i32_u - local.set $2 local.get $1 - local.get $2 - i64.add ) (func $cast/test (param $0 i32) (result i64) (local $1 i64) - (local $2 i64) local.get $0 i32.const 65535 i32.and i64.extend_i32_u local.set $1 - local.get $0 - i32.const 65535 - i32.and - i64.extend_i32_u - local.set $2 local.get $1 - local.get $2 - i64.add ) (func $cast/test (param $0 i32) (result i32) (local $1 i32) - (local $2 i32) local.get $0 local.set $1 - local.get $0 - local.set $2 local.get $1 - local.get $2 - i32.add ) (func $cast/test (param $0 i32) (result i32) (local $1 i32) - (local $2 i32) local.get $0 local.set $1 - local.get $0 - local.set $2 local.get $1 - local.get $2 - i32.add ) (func $cast/test (param $0 i32) (result i32) (local $1 i32) - (local $2 i32) local.get $0 local.set $1 - local.get $0 - local.set $2 local.get $1 - local.get $2 - i32.add ) (func $cast/test (param $0 i32) (result i32) (local $1 i32) - (local $2 i32) local.get $0 local.set $1 - local.get $0 - local.set $2 local.get $1 - local.get $2 - i32.add ) (func $cast/test (param $0 i32) (result i32) (local $1 i32) - (local $2 i32) local.get $0 local.set $1 - local.get $0 - local.set $2 local.get $1 - local.get $2 - i32.add ) (func $cast/test (param $0 i32) (result i32) (local $1 i32) - (local $2 i32) local.get $0 local.set $1 - local.get $0 - local.set $2 local.get $1 - local.get $2 - i32.add ) (func $cast/test (param $0 i32) (result i32) (local $1 i32) - (local $2 i32) local.get $0 local.set $1 - local.get $0 - local.set $2 local.get $1 - local.get $2 - i32.add ) (func $cast/test (param $0 i32) (result i64) (local $1 i64) - (local $2 i64) local.get $0 i64.extend_i32_s local.set $1 - local.get $0 - i64.extend_i32_s - local.set $2 local.get $1 - local.get $2 - i64.add ) (func $cast/test (param $0 i32) (result i64) (local $1 i64) - (local $2 i64) local.get $0 i64.extend_i32_s local.set $1 - local.get $0 - i64.extend_i32_s - local.set $2 local.get $1 - local.get $2 - i64.add ) (func $cast/test (param $0 i32) (result i32) (local $1 i32) - (local $2 i32) local.get $0 local.set $1 - local.get $0 - local.set $2 local.get $1 - local.get $2 - i32.add ) (func $cast/test (param $0 i32) (result i32) (local $1 i32) - (local $2 i32) local.get $0 local.set $1 - local.get $0 - local.set $2 local.get $1 - local.get $2 - i32.add ) (func $cast/test (param $0 i32) (result i32) (local $1 i32) - (local $2 i32) local.get $0 local.set $1 - local.get $0 - local.set $2 local.get $1 - local.get $2 - i32.add ) (func $cast/test (param $0 i32) (result i32) (local $1 i32) - (local $2 i32) local.get $0 local.set $1 - local.get $0 - local.set $2 local.get $1 - local.get $2 - i32.add ) (func $cast/test (param $0 i32) (result i32) (local $1 i32) - (local $2 i32) local.get $0 local.set $1 - local.get $0 - local.set $2 local.get $1 - local.get $2 - i32.add ) (func $cast/test (param $0 i32) (result i32) (local $1 i32) - (local $2 i32) local.get $0 local.set $1 - local.get $0 - local.set $2 local.get $1 - local.get $2 - i32.add ) (func $cast/test (param $0 i32) (result i32) (local $1 i32) - (local $2 i32) local.get $0 local.set $1 - local.get $0 - local.set $2 local.get $1 - local.get $2 - i32.add ) (func $cast/test (param $0 i32) (result i64) (local $1 i64) - (local $2 i64) local.get $0 i64.extend_i32_u local.set $1 - local.get $0 - i64.extend_i32_u - local.set $2 local.get $1 - local.get $2 - i64.add ) (func $cast/test (param $0 i32) (result i64) (local $1 i64) - (local $2 i64) local.get $0 i64.extend_i32_u local.set $1 - local.get $0 - i64.extend_i32_u - local.set $2 local.get $1 - local.get $2 - i64.add ) (func $cast/test (param $0 i32) (result i32) (local $1 i32) - (local $2 i32) local.get $0 local.set $1 - local.get $0 - local.set $2 local.get $1 - local.get $2 - i32.add ) (func $cast/test (param $0 i64) (result i32) (local $1 i32) - (local $2 i32) local.get $0 i32.wrap_i64 local.set $1 - local.get $0 - i32.wrap_i64 - local.set $2 local.get $1 - local.get $2 - i32.add ) (func $cast/test (param $0 i64) (result i32) (local $1 i32) - (local $2 i32) local.get $0 i32.wrap_i64 local.set $1 - local.get $0 - i32.wrap_i64 - local.set $2 local.get $1 - local.get $2 - i32.add ) (func $cast/test (param $0 i64) (result i32) (local $1 i32) - (local $2 i32) local.get $0 i32.wrap_i64 local.set $1 - local.get $0 - i32.wrap_i64 - local.set $2 local.get $1 - local.get $2 - i32.add ) (func $cast/test (param $0 i64) (result i32) (local $1 i32) - (local $2 i32) local.get $0 i32.wrap_i64 local.set $1 - local.get $0 - i32.wrap_i64 - local.set $2 local.get $1 - local.get $2 - i32.add ) (func $cast/test (param $0 i64) (result i32) (local $1 i32) - (local $2 i32) local.get $0 i32.wrap_i64 local.set $1 - local.get $0 - i32.wrap_i64 - local.set $2 local.get $1 - local.get $2 - i32.add ) (func $cast/test (param $0 i64) (result i32) (local $1 i32) - (local $2 i32) local.get $0 i32.wrap_i64 local.set $1 - local.get $0 - i32.wrap_i64 - local.set $2 local.get $1 - local.get $2 - i32.add ) (func $cast/test (param $0 i64) (result i64) (local $1 i64) - (local $2 i64) local.get $0 local.set $1 - local.get $0 - local.set $2 local.get $1 - local.get $2 - i64.add ) (func $cast/test (param $0 i64) (result i64) (local $1 i64) - (local $2 i64) local.get $0 local.set $1 - local.get $0 - local.set $2 local.get $1 - local.get $2 - i64.add ) (func $cast/test (param $0 i64) (result i32) (local $1 i32) - (local $2 i32) local.get $0 i64.const 0 i64.ne local.set $1 - local.get $0 - i64.const 0 - i64.ne - local.set $2 local.get $1 - local.get $2 - i32.add ) (func $cast/test (param $0 i64) (result i32) (local $1 i32) - (local $2 i32) local.get $0 i32.wrap_i64 local.set $1 - local.get $0 - i32.wrap_i64 - local.set $2 local.get $1 - local.get $2 - i32.add ) (func $cast/test (param $0 i64) (result i32) (local $1 i32) - (local $2 i32) local.get $0 i32.wrap_i64 local.set $1 - local.get $0 - i32.wrap_i64 - local.set $2 local.get $1 - local.get $2 - i32.add ) (func $cast/test (param $0 i64) (result i32) (local $1 i32) - (local $2 i32) local.get $0 i32.wrap_i64 local.set $1 - local.get $0 - i32.wrap_i64 - local.set $2 local.get $1 - local.get $2 - i32.add ) (func $cast/test (param $0 i64) (result i32) (local $1 i32) - (local $2 i32) local.get $0 i32.wrap_i64 local.set $1 - local.get $0 - i32.wrap_i64 - local.set $2 local.get $1 - local.get $2 - i32.add ) (func $cast/test (param $0 i64) (result i32) (local $1 i32) - (local $2 i32) local.get $0 i32.wrap_i64 local.set $1 - local.get $0 - i32.wrap_i64 - local.set $2 local.get $1 - local.get $2 - i32.add ) (func $cast/test (param $0 i64) (result i32) (local $1 i32) - (local $2 i32) local.get $0 i32.wrap_i64 local.set $1 - local.get $0 - i32.wrap_i64 - local.set $2 local.get $1 - local.get $2 - i32.add ) (func $cast/test (param $0 i64) (result i64) (local $1 i64) - (local $2 i64) local.get $0 local.set $1 - local.get $0 - local.set $2 local.get $1 - local.get $2 - i64.add ) (func $cast/test (param $0 i64) (result i64) (local $1 i64) - (local $2 i64) local.get $0 local.set $1 - local.get $0 - local.set $2 local.get $1 - local.get $2 - i64.add ) (func $cast/test (param $0 i64) (result i32) (local $1 i32) - (local $2 i32) local.get $0 i64.const 0 i64.ne local.set $1 - local.get $0 - i64.const 0 - i64.ne - local.set $2 local.get $1 - local.get $2 - i32.add ) (func $cast/test (param $0 i32) (result i32) (local $1 i32) - (local $2 i32) local.get $0 i32.const 0 i32.ne local.set $1 - local.get $0 - i32.const 0 - i32.ne - local.set $2 local.get $1 - local.get $2 - i32.add ) (func $cast/test (param $0 i32) (result i32) (local $1 i32) - (local $2 i32) local.get $0 i32.const 0 i32.ne local.set $1 - local.get $0 - i32.const 0 - i32.ne - local.set $2 local.get $1 - local.get $2 - i32.add ) (func $cast/test (param $0 i32) (result i32) (local $1 i32) - (local $2 i32) local.get $0 i32.const 0 i32.ne local.set $1 - local.get $0 - i32.const 0 - i32.ne - local.set $2 local.get $1 - local.get $2 - i32.add ) (func $cast/test (param $0 i32) (result i32) (local $1 i32) - (local $2 i32) local.get $0 i32.const 0 i32.ne local.set $1 - local.get $0 - i32.const 0 - i32.ne - local.set $2 local.get $1 - local.get $2 - i32.add ) (func $cast/test (param $0 i32) (result i32) (local $1 i32) - (local $2 i32) local.get $0 i32.const 0 i32.ne local.set $1 - local.get $0 - i32.const 0 - i32.ne - local.set $2 local.get $1 - local.get $2 - i32.add ) (func $cast/test (param $0 i32) (result i32) (local $1 i32) - (local $2 i32) local.get $0 i32.const 0 i32.ne local.set $1 - local.get $0 - i32.const 0 - i32.ne - local.set $2 local.get $1 - local.get $2 - i32.add ) (func $cast/test (param $0 i32) (result i64) (local $1 i64) - (local $2 i64) local.get $0 i32.const 0 i32.ne i64.extend_i32_u local.set $1 - local.get $0 - i32.const 0 - i32.ne - i64.extend_i32_u - local.set $2 local.get $1 - local.get $2 - i64.add ) (func $cast/test (param $0 i32) (result i64) (local $1 i64) - (local $2 i64) local.get $0 i32.const 0 i32.ne i64.extend_i32_u local.set $1 - local.get $0 - i32.const 0 - i32.ne - i64.extend_i32_u - local.set $2 local.get $1 - local.get $2 - i64.add ) (func $cast/test (param $0 i32) (result i32) (local $1 i32) - (local $2 i32) local.get $0 local.set $1 - local.get $0 - local.set $2 local.get $1 - local.get $2 - i32.add ) (func $start:cast i32.const 0 diff --git a/tests/compiler/many-locals.untouched.wat b/tests/compiler/many-locals.untouched.wat index 8a263436ce..4b5c0c39ff 100644 --- a/tests/compiler/many-locals.untouched.wat +++ b/tests/compiler/many-locals.untouched.wat @@ -805,7 +805,6 @@ end i32.const 42 call $many-locals/testI8 - i32.extend8_s i32.const 42 i32.eq i32.eqz diff --git a/tests/compiler/std/typedarray.optimized.wat b/tests/compiler/std/typedarray.optimized.wat index 2ed4585d84..4c5b236587 100644 --- a/tests/compiler/std/typedarray.optimized.wat +++ b/tests/compiler/std/typedarray.optimized.wat @@ -5713,9 +5713,7 @@ (func $std/typedarray/testArrayEvery<~lib/typedarray/Int8Array,i8>~anonymous|0 (param $0 i32) (param $1 i32) (param $2 i32) (result i32) local.get $0 i32.extend8_s - i32.const 2 - i32.rem_s - i32.const 255 + i32.const 1 i32.and i32.eqz ) @@ -5728,9 +5726,7 @@ (func $std/typedarray/testArrayEvery<~lib/typedarray/Int16Array,i16>~anonymous|0 (param $0 i32) (param $1 i32) (param $2 i32) (result i32) local.get $0 i32.extend16_s - i32.const 2 - i32.rem_s - i32.const 65535 + i32.const 1 i32.and i32.eqz ) diff --git a/tests/compiler/std/typedarray.untouched.wat b/tests/compiler/std/typedarray.untouched.wat index e137c9bc55..89a3c2a52f 100644 --- a/tests/compiler/std/typedarray.untouched.wat +++ b/tests/compiler/std/typedarray.untouched.wat @@ -10222,7 +10222,6 @@ i32.extend8_s i32.const 2 i32.rem_s - i32.extend8_s i32.const 0 i32.eq ) @@ -10440,7 +10439,6 @@ i32.extend16_s i32.const 2 i32.rem_s - i32.extend16_s i32.const 0 i32.eq )