Skip to content

compiler-builtins: Int trait functions are not inlined on wasm #73135

Description

@CryZe

I'm currently doing some benchmarks and I've seen that __multi3 is taking a really long time to calculate on wasm. Turns out that none of the helper functions it uses are inlined at all, so it does a ton of unnecessary calls and misses a lot of potential optimizations:

(func $compiler_builtins::int::mul::__multi3::h134a3ac9dcea74e0 (type $t39) (param $p0 i32) (param $p1 i64) (param $p2 i64) (param $p3 i64) (param $p4 i64)
    (local $l5 i32) (local $l6 i64) (local $l7 i64) (local $l8 i64)
    global.get $g0
    i32.const 16
    i32.sub
    local.tee $l5
    global.set $g0
    local.get $p1
    local.get $p2
    call $<i128_as_compiler_builtins::int::LargeInt>::low::h654cf3febd0eecf8
    i64.const 4294967295
    i64.and
    local.get $p3
    local.get $p4
    call $<i128_as_compiler_builtins::int::LargeInt>::low::h654cf3febd0eecf8
    i64.const 4294967295
    i64.and
    call $<i64_as_compiler_builtins::int::Int>::wrapping_mul::h558368f41dd93d09
    local.set $l6
    local.get $p1
    local.get $p2
    call $<i128_as_compiler_builtins::int::LargeInt>::low::h654cf3febd0eecf8
    i64.const 32
    i64.shr_u
    local.get $p3
    local.get $p4
    call $<i128_as_compiler_builtins::int::LargeInt>::low::h654cf3febd0eecf8
    i64.const 4294967295
    i64.and
    call $<i64_as_compiler_builtins::int::Int>::wrapping_mul::h558368f41dd93d09
    local.get $l6
    i64.const 32
    i64.shr_u
    i64.add
    local.tee $l7
    i64.const 32
    i64.shr_u
    call $<i64_as_compiler_builtins::int::Int>::from_unsigned::h7efafe9ef60e0310
    local.set $l8
    local.get $l5
    local.get $p3
    local.get $p4
    call $<i128_as_compiler_builtins::int::LargeInt>::low::h654cf3febd0eecf8
    i64.const 32
    i64.shr_u
    local.get $p1
    local.get $p2
    call $<i128_as_compiler_builtins::int::LargeInt>::low::h654cf3febd0eecf8
    i64.const 4294967295
    i64.and
    call $<i64_as_compiler_builtins::int::Int>::wrapping_mul::h558368f41dd93d09
    local.get $l7
    i64.const 4294967295
    i64.and
    i64.add
    local.tee $l7
    i64.const 32
    i64.shl
    local.get $l6
    i64.const 4294967295
    i64.and
    i64.or
    local.get $l8
    local.get $l7
    i64.const 32
    i64.shr_u
    call $<i64_as_compiler_builtins::int::Int>::from_unsigned::h7efafe9ef60e0310
    i64.add
    local.get $p1
    local.get $p2
    call $<i128_as_compiler_builtins::int::LargeInt>::low::h654cf3febd0eecf8
    i64.const 32
    i64.shr_u
    local.get $p3
    local.get $p4
    call $<i128_as_compiler_builtins::int::LargeInt>::low::h654cf3febd0eecf8
    i64.const 32
    i64.shr_u
    call $<i64_as_compiler_builtins::int::Int>::wrapping_mul::h558368f41dd93d09
    call $<i64_as_compiler_builtins::int::Int>::from_unsigned::h7efafe9ef60e0310
    i64.add
    local.get $p1
    local.get $p2
    call $<i128_as_compiler_builtins::int::LargeInt>::high::hc703bd80007672ce
    local.get $p3
    local.get $p4
    call $<i128_as_compiler_builtins::int::LargeInt>::low::h654cf3febd0eecf8
    call $<i64_as_compiler_builtins::int::Int>::from_unsigned::h7efafe9ef60e0310
    call $<i64_as_compiler_builtins::int::Int>::wrapping_mul::h558368f41dd93d09
    call $<i64_as_compiler_builtins::int::Int>::wrapping_add::h9472fc521f362e13
    local.get $p1
    local.get $p2
    call $<i128_as_compiler_builtins::int::LargeInt>::low::h654cf3febd0eecf8
    call $<i64_as_compiler_builtins::int::Int>::from_unsigned::h7efafe9ef60e0310
    local.get $p3
    local.get $p4
    call $<i128_as_compiler_builtins::int::LargeInt>::high::hc703bd80007672ce
    call $<i64_as_compiler_builtins::int::Int>::wrapping_mul::h558368f41dd93d09
    call $<i64_as_compiler_builtins::int::Int>::wrapping_add::h9472fc521f362e13
    call $<i128_as_compiler_builtins::int::LargeInt>::from_parts::h8ea13ebf67bbf227
    local.get $l5
    i64.load
    local.set $p3
    local.get $p0
    local.get $l5
    i32.const 8
    i32.add
    i64.load
    i64.store offset=8
    local.get $p0
    local.get $p3
    i64.store
    local.get $l5
    i32.const 16
    i32.add
    global.set $g0)

The same is probably true for the Float trait.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    A-codegenArea: Code generationC-enhancementCategory: An issue proposing an enhancement or a PR with one.I-slowIssue: Problems and improvements with respect to performance of generated code.O-wasmTarget: WASM (WebAssembly), http://webassembly.org/P-mediumMedium priorityregression-from-stable-to-stablePerformance or correctness regression from one stable version to another.

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions