Skip to content

Commit 443cfe9

Browse files
authored
Re-reloop pass (#1009)
This adds a pass that converts to a CFG, runs the relooper, and re-generates wasm from that. This depends on flatten-control-flow being run before. The main goal here is to help code generators other than asm2wasm (which already receives relooped code from fastcomp).
1 parent 6331e09 commit 443cfe9

12 files changed

+1651
-24
lines changed

CMakeLists.txt

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,7 @@ ENDIF()
168168
# Static libraries
169169
ADD_SUBDIRECTORY(src/ast)
170170
ADD_SUBDIRECTORY(src/asmjs)
171+
ADD_SUBDIRECTORY(src/cfg)
171172
ADD_SUBDIRECTORY(src/emscripten-optimizer)
172173
ADD_SUBDIRECTORY(src/passes)
173174
ADD_SUBDIRECTORY(src/support)
@@ -178,14 +179,13 @@ ADD_SUBDIRECTORY(src/wasm)
178179

179180
SET(binaryen_SOURCES
180181
src/binaryen-c.cpp
181-
src/cfg/Relooper.cpp
182182
)
183183
IF(BUILD_STATIC_LIB)
184184
ADD_LIBRARY(binaryen STATIC ${binaryen_SOURCES})
185185
ELSE()
186186
ADD_LIBRARY(binaryen SHARED ${binaryen_SOURCES})
187187
ENDIF()
188-
TARGET_LINK_LIBRARIES(binaryen ${all_passes} wasm asmjs ast support)
188+
TARGET_LINK_LIBRARIES(binaryen ${all_passes} wasm asmjs ast cfg support)
189189
INSTALL(TARGETS binaryen DESTINATION ${CMAKE_INSTALL_LIBDIR})
190190

191191
INSTALL(FILES src/binaryen-c.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
@@ -198,7 +198,7 @@ SET(wasm-shell_SOURCES
198198
)
199199
ADD_EXECUTABLE(wasm-shell
200200
${wasm-shell_SOURCES})
201-
TARGET_LINK_LIBRARIES(wasm-shell wasm asmjs emscripten-optimizer ${all_passes} ast support)
201+
TARGET_LINK_LIBRARIES(wasm-shell wasm asmjs emscripten-optimizer ${all_passes} ast cfg support)
202202
SET_PROPERTY(TARGET wasm-shell PROPERTY CXX_STANDARD 11)
203203
SET_PROPERTY(TARGET wasm-shell PROPERTY CXX_STANDARD_REQUIRED ON)
204204
INSTALL(TARGETS wasm-shell DESTINATION ${CMAKE_INSTALL_BINDIR})
@@ -208,7 +208,7 @@ SET(wasm-opt_SOURCES
208208
)
209209
ADD_EXECUTABLE(wasm-opt
210210
${wasm-opt_SOURCES})
211-
TARGET_LINK_LIBRARIES(wasm-opt wasm asmjs emscripten-optimizer ${all_passes} ast support)
211+
TARGET_LINK_LIBRARIES(wasm-opt wasm asmjs emscripten-optimizer ${all_passes} ast cfg support)
212212
SET_PROPERTY(TARGET wasm-opt PROPERTY CXX_STANDARD 11)
213213
SET_PROPERTY(TARGET wasm-opt PROPERTY CXX_STANDARD_REQUIRED ON)
214214
INSTALL(TARGETS wasm-opt DESTINATION ${CMAKE_INSTALL_BINDIR})
@@ -218,7 +218,7 @@ SET(wasm-merge_SOURCES
218218
)
219219
ADD_EXECUTABLE(wasm-merge
220220
${wasm-merge_SOURCES})
221-
TARGET_LINK_LIBRARIES(wasm-merge wasm asmjs emscripten-optimizer ${all_passes} ast support)
221+
TARGET_LINK_LIBRARIES(wasm-merge wasm asmjs emscripten-optimizer ${all_passes} ast cfg support)
222222
SET_PROPERTY(TARGET wasm-merge PROPERTY CXX_STANDARD 11)
223223
SET_PROPERTY(TARGET wasm-merge PROPERTY CXX_STANDARD_REQUIRED ON)
224224
INSTALL(TARGETS wasm-merge DESTINATION bin)
@@ -229,7 +229,7 @@ SET(asm2wasm_SOURCES
229229
)
230230
ADD_EXECUTABLE(asm2wasm
231231
${asm2wasm_SOURCES})
232-
TARGET_LINK_LIBRARIES(asm2wasm emscripten-optimizer ${all_passes} wasm asmjs ast support)
232+
TARGET_LINK_LIBRARIES(asm2wasm emscripten-optimizer ${all_passes} wasm asmjs ast cfg support)
233233
SET_PROPERTY(TARGET asm2wasm PROPERTY CXX_STANDARD 11)
234234
SET_PROPERTY(TARGET asm2wasm PROPERTY CXX_STANDARD_REQUIRED ON)
235235
INSTALL(TARGETS asm2wasm DESTINATION ${CMAKE_INSTALL_BINDIR})
@@ -241,7 +241,7 @@ SET(s2wasm_SOURCES
241241
)
242242
ADD_EXECUTABLE(s2wasm
243243
${s2wasm_SOURCES})
244-
TARGET_LINK_LIBRARIES(s2wasm passes wasm asmjs ast support)
244+
TARGET_LINK_LIBRARIES(s2wasm passes wasm asmjs ast cfg support)
245245
SET_PROPERTY(TARGET s2wasm PROPERTY CXX_STANDARD 11)
246246
SET_PROPERTY(TARGET s2wasm PROPERTY CXX_STANDARD_REQUIRED ON)
247247
INSTALL(TARGETS s2wasm DESTINATION ${CMAKE_INSTALL_BINDIR})
@@ -251,7 +251,7 @@ SET(wasm_as_SOURCES
251251
)
252252
ADD_EXECUTABLE(wasm-as
253253
${wasm_as_SOURCES})
254-
TARGET_LINK_LIBRARIES(wasm-as wasm asmjs passes ast support)
254+
TARGET_LINK_LIBRARIES(wasm-as wasm asmjs passes ast cfg support)
255255
SET_PROPERTY(TARGET wasm-as PROPERTY CXX_STANDARD 11)
256256
SET_PROPERTY(TARGET wasm-as PROPERTY CXX_STANDARD_REQUIRED ON)
257257
INSTALL(TARGETS wasm-as DESTINATION ${CMAKE_INSTALL_BINDIR})
@@ -261,7 +261,7 @@ SET(wasm_dis_SOURCES
261261
)
262262
ADD_EXECUTABLE(wasm-dis
263263
${wasm_dis_SOURCES})
264-
TARGET_LINK_LIBRARIES(wasm-dis passes wasm asmjs ast support)
264+
TARGET_LINK_LIBRARIES(wasm-dis passes wasm asmjs ast cfg support)
265265
SET_PROPERTY(TARGET wasm-dis PROPERTY CXX_STANDARD 11)
266266
SET_PROPERTY(TARGET wasm-dis PROPERTY CXX_STANDARD_REQUIRED ON)
267267
INSTALL(TARGETS wasm-dis DESTINATION ${CMAKE_INSTALL_BINDIR})
@@ -271,7 +271,7 @@ SET(wasm-ctor-eval_SOURCES
271271
)
272272
ADD_EXECUTABLE(wasm-ctor-eval
273273
${wasm-ctor-eval_SOURCES})
274-
TARGET_LINK_LIBRARIES(wasm-ctor-eval wasm asmjs emscripten-optimizer ${all_passes} ast support)
274+
TARGET_LINK_LIBRARIES(wasm-ctor-eval wasm asmjs emscripten-optimizer ${all_passes} ast cfg support)
275275
SET_PROPERTY(TARGET wasm-ctor-eval PROPERTY CXX_STANDARD 11)
276276
SET_PROPERTY(TARGET wasm-ctor-eval PROPERTY CXX_STANDARD_REQUIRED ON)
277277
INSTALL(TARGETS wasm-ctor-eval DESTINATION bin)

src/cfg/CMakeLists.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
SET(cfg_SOURCES
2+
Relooper.cpp
3+
)
4+
ADD_LIBRARY(cfg STATIC ${cfg_SOURCES})

src/cfg/Relooper.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ static wasm::Expression* HandleFollowupMultiples(wasm::Expression* Ret, Shape* P
5757
int Id = iter.first;
5858
Shape* Body = iter.second;
5959
Curr->name = Builder.getBlockBreakName(Id);
60+
Curr->finalize(); // it may now be reachable, via a break
6061
auto* Outer = Builder.makeBlock(Curr);
6162
Outer->list.push_back(Body->Render(Builder, InLoop));
6263
Outer->finalize(); // TODO: not really necessary

src/pass.h

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -152,11 +152,14 @@ class Pass {
152152
virtual void prepareToRun(PassRunner* runner, Module* module) {}
153153

154154
// Implement this with code to run the pass on the whole module
155-
virtual void run(PassRunner* runner, Module* module) = 0;
155+
virtual void run(PassRunner* runner, Module* module) {
156+
WASM_UNREACHABLE();
157+
}
156158

157-
// Implement this with code to run the pass on a single function
159+
// Implement this with code to run the pass on a single function, for
160+
// a function-parallel pass
158161
virtual void runFunction(PassRunner* runner, Module* module, Function* function) {
159-
WASM_UNREACHABLE(); // by default, passes cannot be run this way
162+
WASM_UNREACHABLE();
160163
}
161164

162165
// Function parallelism. By default, passes are not run in parallel, but you

src/passes/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ SET(passes_SOURCES
2323
Print.cpp
2424
PrintCallGraph.cpp
2525
RelooperJumpThreading.cpp
26+
ReReloop.cpp
2627
RemoveImports.cpp
2728
RemoveMemory.cpp
2829
RemoveUnusedBrs.cpp

0 commit comments

Comments
 (0)