Hacktoberfest 2026: los issues que los mantenedores marcaron para octubre, abiertos y aptos para principiantes. Explorar issues de Hacktoberfest

RemoveUnusedBrs fails to optimize control flow based dead code

Abierto
#7,652 2 comentarios 0 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

Evaluación

Dificultad
4/5
Tiempo estimado
3-5 días
Aptitud para principiantes
38/100
Tipo de issue
Error
Claridad
Bastante claro
Estado de actividad
Estancado
Stack tecnológico
wasm
Área
compilers

Línea de trabajo

Comienza con la optimización RemoveUnusedBrs y reproduce el caso de WebAssembly proporcionado usando wasm-opt versión 2b989ae en O2 y O3. Compara el flujo de control resultante con la salida esperada de O2; se considera completado cuando O3 también elimina el cuerpo de la rama inalcanzable y las llamadas muertas posteriores, como se muestra.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

Given the following code:

(module
  (import "env" "dead" (func $dead))
  (func $_start (param $0 i32)
    i32.const 0
    i32.const 0
    call $main)
  (func $main (param $0 i32) (param $1 i32)
    block  ;; label = @1
      i32.const 0
      i32.const 0
      i32.store
      i32.const 0
      i32.load
      local.set $1
      i32.const 1
      local.set $0
      local.get $1
      br_if 0 (;@1;)
      i32.const 0
      i32.const 0
      i32.store
      i32.const 1
      local.set $0
      local.get $0
      br_if 0 (;@1;)
      i32.const 0
      local.set $0
    end
    local.get $0
    if  ;; label = @1
      unreachable
    end
    call $dead
    call $dead
    call $dead
    )
  (memory 1)
  (export "_start" (func $_start)))

wasm-opt version: 2b989ae

O2 can eliminate the dead code because it identifies the statements of if unreachable:

 (func $_start (param $0 i32)
  (i32.store
   (i32.const 0)
   (i32.const 0)
  )
  (if
   (i32.eqz
    (i32.load
     (i32.const 0)
    )
   )
   (then
    (i32.store
     (i32.const 0)
     (i32.const 0)
    )
   )
  )
  (unreachable)
 )

O3 cannot:

 (func $_start (param $0 i32)
  (if
   (block $block (result i32)
    (i32.store
     (i32.const 0)
     (i32.const 0)
    )
    (drop
     (br_if $block
      (i32.const 1)
      (i32.load
       (i32.const 0)
      )
     )
    )
    (i32.store
     (i32.const 0)
     (i32.const 0)
    )
    (i32.const 1)
   )
   (then
    (unreachable)
   )
  )
  (call $dead)
  (call $dead)
  (call $dead)
 )
Lenguaje dominante
WebAssembly
Estrellas
8.6k
Forks
885
Merge medio
2 d 4 h
PR fusionados (30 d)
77

Guía de contribución

Abrir la guía de contribución

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de WebAssembly/binaryen

Todos los issues de WebAssembly/binaryen

Issues similares

Más issues de Compilers

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.