A priory, an EBB argument value only gets an affinity if it is used directly by a non-ghost instruction. A use by a branch passing arguments to an EBB doesn't count. When an EBB argument value does have an affinity, the values passed by all the predecessors must also have affinities. This can cause EBB argument values to get affinities recursively. - Add a second pass to the liveness computation for propagating EBB argument affinities, possibly recursively. - Verify EBB argument affinities correctly: A value passed to a branch must have an affinity only if the corresponding EBB argument value in the destination has an affinity.
81 lines
1.5 KiB
Plaintext
81 lines
1.5 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
|
|
}
|
|
|
|
; Pass an EBB argument as a jump argument.
|
|
function %jumpebb(i32, i32) -> i32 {
|
|
fn0 = function %foo(i32) -> i32
|
|
|
|
ebb0(v1: i32, v2: i32):
|
|
brnz v1, ebb1(v1, v2)
|
|
jump ebb1(v2, v1)
|
|
|
|
ebb1(v10: i32, v11: i32):
|
|
jump ebb2(v10, v11)
|
|
|
|
ebb2(v20: i32, v21: i32):
|
|
return v21
|
|
}
|