When an EBB argument value is used only as a return value, it still needs to be given a register affinity. Otherwise it would appear as a ghost value with no affinity. Do the same to call arguments.
66 lines
1.2 KiB
Plaintext
66 lines
1.2 KiB
Plaintext
test regalloc
|
|
|
|
; We can add more ISAs once they have defined encodings.
|
|
isa riscv
|
|
|
|
; regex: RX=%x\d+
|
|
|
|
function %add(i32, i32) {
|
|
ebb0(v1: i32, v2: i32):
|
|
v3 = iadd v1, v2
|
|
; check: [R#0c,%x5]
|
|
; sameln: iadd
|
|
return
|
|
}
|
|
|
|
; Function with a dead argument.
|
|
function %dead_arg(i32, i32) -> i32{
|
|
ebb0(v1: i32, v2: i32):
|
|
; not: regmove
|
|
; check: return $v1
|
|
return v1
|
|
}
|
|
|
|
; Return a value from a different register.
|
|
function %move1(i32, i32) -> i32 {
|
|
ebb0(v1: i32, v2: i32):
|
|
; not: regmove
|
|
; check: regmove $v2, %x11 -> %x10
|
|
; nextln: return $v2
|
|
return v2
|
|
}
|
|
|
|
; Swap two registers.
|
|
function %swap(i32, i32) -> i32, i32 {
|
|
ebb0(v1: i32, v2: i32):
|
|
; not: regmove
|
|
; check: regmove $v2, %x11 -> $(tmp=$RX)
|
|
; nextln: regmove $v1, %x10 -> %x11
|
|
; nextln: regmove $v2, $tmp -> %x10
|
|
; nextln: return $v2, $v1
|
|
return v2, v1
|
|
}
|
|
|
|
; Return an EBB argument.
|
|
function %retebb(i32, i32) -> i32 {
|
|
ebb0(v1: i32, v2: i32):
|
|
brnz v1, ebb1(v1)
|
|
jump ebb1(v2)
|
|
|
|
ebb1(v10: i32):
|
|
return v10
|
|
}
|
|
|
|
; Pass an EBB argument as a function argument.
|
|
function %callebb(i32, i32) -> i32 {
|
|
fn0 = function %foo(i32) -> i32
|
|
|
|
ebb0(v1: i32, v2: i32):
|
|
brnz v1, ebb1(v1)
|
|
jump ebb1(v2)
|
|
|
|
ebb1(v10: i32):
|
|
v11 = call fn0(v10)
|
|
return v11
|
|
}
|