Reusable virtual-register machine IR
///|
test "build a virtual-register copy" {
let builder = FunctionBuilder::FunctionBuilder("copy")
let src = builder.add_param(Int)
let dst = builder.new_vreg(Int)
builder.append(Move, uses=[Virtual(src)], defs=[{ reg: Virtual(dst) }])
|> ignore
builder.terminate(Return([Virtual(dst)]))
let func = builder.finish()
inspect(func.blocks.length(), content="1")
inspect(func.blocks[0].insts.length(), content="1")
inspect(func.blocks[0].terminator is Some(Return(_)), content="true")
}///|
test "build a branch" {
let builder = FunctionBuilder::FunctionBuilder("branch")
let cond = builder.add_param(Int)
let then_block = builder.create_block()
let else_block = builder.create_block()
builder.terminate(Branch(Virtual(cond), then_block, else_block))
builder.switch_to_block(then_block)
builder.terminate(Return([]))
builder.switch_to_block(else_block)
builder.terminate(Return([]))
let func = builder.finish()
inspect(func.blocks.length(), content="3")
inspect(func.blocks[0].terminator is Some(Branch(_, _, _)), content="true")
}fn Function::calls_multi_value_function_for_call_conv(self : Function, call_conv : CallConventionLayout) -> Boolfn Function::needs_extra_results_ptr_for_call_conv(self : Function, call_conv : CallConventionLayout) -> Boolfn FunctionBuilder::append(self : FunctionBuilder, opcode : Opcode, uses? : Array[Reg], defs? : Array[Writable], use_constraints? : Array[OperandConstraint], def_constraints? : Array[OperandConstraint]) -> Int