Skip to content

RemoveUnusedBrs causes ineffective code #7661

@xuruiyang2002

Description

@xuruiyang2002

Given the following code:

(module
  (import "External" "external_function" (func $external_function))
  (func $_start (param $0 i32) (param $1 i32)
    (local $2 i32) (local $3 i32)
    i32.const 587
    i32.load8_u
    local.set $0
    i32.const 24
    local.set $1
    local.get $0
    local.get $1
    i32.shl
    local.get $1
    i32.shr_s
    local.set $0
    i32.const 587
    i32.load8_u
    local.set $1
    i32.const 24
    local.set $2
    local.get $1
    local.get $2
    i32.shl
    local.get $2
    i32.shr_s
    local.set $1
    i32.const 587
    i32.load8_u
    local.set $2
    i32.const 24
    local.set $3
    local.get $2
    local.get $3
    i32.shl
    local.get $3
    i32.shr_s
    local.set $2
    local.get $1
    local.get $2
    i32.ge_s
    local.set $1
    block  ;; label = @1
      local.get $1
      br_if 0 (;@1;)
      call $external_function
    end
    local.get $0
    i32.const 0
    call $foo
    drop
    unreachable)
  (func $foo (param $0 i32) (param $1 i32) (result i32)
    unreachable)
  (memory $0 258 258)
  (export "_start" (func $_start)))

For wasm-opt (c91c052), -O3 -sp=remove-unused-brs produces:

 (func $_start (param $0 i32) (param $1 i32)
  (drop
   (i32.load8_u
    (i32.const 587)
   )
  )
  (unreachable)
 )

while -O3 produces counter-intuitive code:

 (func $_start (param $0 i32) (param $1 i32)
  (if
   (i32.lt_s
    (local.tee $1
     (i32.extend8_s
      (i32.load8_s
       (i32.const 587)
      )
     )
    )
    (local.get $1)
   )
   (then
    (call $external_function)
   )
  )
  (unreachable)
 )

The RemoveUnusedBrs takes lots efforts to optimize the control flow. However, it causes poor code, which defies our expectations.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions