diff options
author | Dan Gohman <dan433584@gmail.com> | 2015-09-16 16:51:30 +0000 |
---|---|---|
committer | Dan Gohman <dan433584@gmail.com> | 2015-09-16 16:51:30 +0000 |
commit | 950a13cfa371503281f91eecdaac6286aca274f7 (patch) | |
tree | 577bee2ca86d87c3386463e8f163bbeb30885c46 /llvm/lib/Target/WebAssembly/WebAssemblyInstrControl.td | |
parent | b02a320f5e141339b16348107f33a2bd5f40ad4d (diff) | |
download | bcm5719-llvm-950a13cfa371503281f91eecdaac6286aca274f7.tar.gz bcm5719-llvm-950a13cfa371503281f91eecdaac6286aca274f7.zip |
[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
Diffstat (limited to 'llvm/lib/Target/WebAssembly/WebAssemblyInstrControl.td')
-rw-r--r-- | llvm/lib/Target/WebAssembly/WebAssemblyInstrControl.td | 23 |
1 files changed, 23 insertions, 0 deletions
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<WebAssemblyRegClass vt> { def RETURN_#vt : I<(outs), (ins vt:$val), [(WebAssemblyreturn vt:$val)]>; } |