From 950a13cfa371503281f91eecdaac6286aca274f7 Mon Sep 17 00:00:00 2001 From: Dan Gohman Date: Wed, 16 Sep 2015 16:51:30 +0000 Subject: [WebAssembly] Check in an initial CFG Stackifier pass This pass implements a simple algorithm for conversion from CFG to wasm's structured control flow. It doesn't yet handle multiple-entry loops; that will be added in a future patch. It also adds initial support for switch statements. Differential Revision: http://reviews.llvm.org/D12735 llvm-svn: 247818 --- .../Target/WebAssembly/WebAssemblyInstrControl.td | 23 ++++++++++++++++++++++ 1 file changed, 23 insertions(+) (limited to 'llvm/lib/Target/WebAssembly/WebAssemblyInstrControl.td') diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyInstrControl.td b/llvm/lib/Target/WebAssembly/WebAssemblyInstrControl.td index 5f53e4a00d4..a349da6b971 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblyInstrControl.td +++ b/llvm/lib/Target/WebAssembly/WebAssemblyInstrControl.td @@ -25,6 +25,29 @@ * switch: switch statement with fallthrough */ +let isBranch = 1, isTerminator = 1, hasCtrlDep = 1 in { +def BRIF : I<(outs), (ins bb_op:$dst, Int32:$a), + [(brcond Int32:$a, bb:$dst)]>; +let isBarrier = 1 in { +def BR : I<(outs), (ins bb_op:$dst), + [(br bb:$dst)]>; +} // isBarrier = 1 +} // isBranch = 1, isTerminator = 1, hasCtrlDep = 1 + +// TODO: SelectionDAG's lowering insists on using a pointer as the index for +// jump tables, so in practice we don't ever use SWITCH_I64 in wasm32 mode +// currently. +let isTerminator = 1, hasCtrlDep = 1, isBarrier = 1 in { +def SWITCH_I32 : I<(outs), (ins Int32:$index, variable_ops), + [(WebAssemblyswitch Int32:$index)]>; +def SWITCH_I64 : I<(outs), (ins Int64:$index, variable_ops), + [(WebAssemblyswitch Int64:$index)]>; +} // isTerminator = 1, hasCtrlDep = 1, isBarrier = 1 + +// Placemarkers to indicate the start of a block or loop scope. +def BLOCK : I<(outs), (ins bb_op:$dst), []>; +def LOOP : I<(outs), (ins bb_op:$dst), []>; + multiclass RETURN { def RETURN_#vt : I<(outs), (ins vt:$val), [(WebAssemblyreturn vt:$val)]>; } -- cgit v1.2.3