local-cse in O3 introduces side-effecting across structurally isolated sub-trees thus prevent const prop & DCE
Los mantenedores suelen responder en 1 día
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Aptitud para principiantes
- 35/100
- Tipo de issue
- Error
- Claridad
- Bastante claro
- Estado de actividad
- Estancado
- Stack tecnológico
- wasm
- Área
- compilers
Línea de trabajo
Comienza reproduciendo el módulo WebAssembly proporcionado con wasm-opt d0d970cb5 usando -all -O2 y -all -O3; después, inspecciona la transformación local-cse y su interacción con constant propagation y dead-code elimination. Compara los árboles de optimización resultantes, centrándote en el local.tee introducido entre subárboles aislados estructuralmente. Se considera terminado cuando O3 puede eliminar la rama muerta sin introducir una dependencia inválida de efectos secundarios.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Given the following code:
(module
(import "External" "external_function" (func $external_function))
(func $_start (param $0 i64) (param $1 i32) (param $2 i32) (param $3 i32)
(local $4 i32) (local $5 i32)
i32.const 0
call $foo
drop
)
(func $foo (param $0 i32) (result i32)
(local $1 i32) (local $2 i32) (local $4 i32) (local $5 i32) (local $scratch i32) (local $3 i64) (local $6 i64)
i32.const 77986
i32.load16_u
i32.const 16
local.tee $2
i32.shl
local.get $2
i32.shr_s
i32.const 65533
i32.eq
i32.const 77986
i32.load16_u
i32.const 16
i32.shl
i32.and
if (result i32) ;; label = @4
call $external_function
i32.const 0
else
i32.const 1
end
)
(memory $0 258 258)
(export "_start" (func $_start)))
wasm-opt (d0d970cb5) eliminates the dead br_if body by -all -O2 but can not do that by -all -O3.
Analysis
Similar but different to #7440, this time wasm-opt in O3 introduces side-effect in more complex structure by local-cse:
The figure below depicts how the local.cse transforms the input:
It introduces the local.tee for less code size, however, it also affects the constant propagation and further blocks the dead code elimination.
Different from #7440, whose solution is simply enhancing the optimization of the binaryOp regardless that the side effects of its children, this issues is more complex because the local-cse does CSE in different depth and sub-tree, is there any code logic which can check or deal with this issue?
- Lenguaje dominante
- WebAssembly
- Estrellas
- 8.6k
- Forks
- 892
- Merge medio
- 1 d 19 h
- PR fusionados (30 d)
- 78
Preparar el entorno
- Sin Dockerfile ni archivo de Docker Compose
- Sin plantilla de pull request
- Leer la guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de WebAssembly/binaryen
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 76/100
WebAssembly/binaryen#9185 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 1/5 Menos de una hora Aptitud para principiantes 88/100
WebAssembly/binaryen#9135 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 Medio día Aptitud para principiantes 76/100
WebAssembly/binaryen#9018 · 3 comentarios ·
Los mantenedores suelen responder en 1 día
-
Dificultad 4/5 3-5 días Aptitud para principiantes 52/100
WebAssembly/binaryen#9186 ·
Los mantenedores suelen responder en 1 día
-
LoopInvariantCodeMotion: `struct.new` is hoisted out of a loop, so all iterations share one objectAbierto
Dificultad 3/5 1-2 días Aptitud para principiantes 68/100
WebAssembly/binaryen#9184 ·
Los mantenedores suelen responder en 1 día
Todos los issues de WebAssembly/binaryen
Issues similares
-
self-host checker: E021 bound check reads an untyped literal at i32, not the type the call bindsAbierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 84/100
JakeChampion/lang#11055 ·
Los mantenedores suelen responder en 1 día
-
codegen: memref.collapse_shape in an mlir! block leaves an affine.apply that is never loweredAbiertobug
Dificultad 2/5 1-3 horas Aptitud para principiantes 74/100
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 88/100
Los mantenedores suelen responder en 1 día
-
bug
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
Los mantenedores suelen responder en 1 día