Mark spill and fill as can_store and can_load.
This allows GVN to avoid hoisting them. These will be to coarse for things that want more precise dependence information, however we can work that out when we build such things.
This commit is contained in:
@@ -39,3 +39,18 @@ ebb0:
|
|||||||
; check: v5 = trueif eq v4
|
; check: v5 = trueif eq v4
|
||||||
return v6
|
return v6
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function %spill() -> i32 {
|
||||||
|
ebb0:
|
||||||
|
v0 = iconst.i32 7
|
||||||
|
v1 = spill v0
|
||||||
|
v2 = fill v1
|
||||||
|
v3 = spill v0
|
||||||
|
v4 = fill v1
|
||||||
|
v5 = bor v2, v4
|
||||||
|
; check: v1 = spill v0
|
||||||
|
; check: v2 = fill v1
|
||||||
|
; check: v3 = spill v0
|
||||||
|
; check: v4 = fill v1
|
||||||
|
return v5
|
||||||
|
}
|
||||||
|
|||||||
@@ -501,7 +501,7 @@ spill = Instruction(
|
|||||||
This instruction behaves exactly like :inst:`copy`, but the result
|
This instruction behaves exactly like :inst:`copy`, but the result
|
||||||
value is assigned to a spill slot.
|
value is assigned to a spill slot.
|
||||||
""",
|
""",
|
||||||
ins=x, outs=a)
|
ins=x, outs=a, can_store=True)
|
||||||
|
|
||||||
fill = Instruction(
|
fill = Instruction(
|
||||||
'fill', r"""
|
'fill', r"""
|
||||||
@@ -510,7 +510,7 @@ fill = Instruction(
|
|||||||
This instruction behaves exactly like :inst:`copy`, but creates a new
|
This instruction behaves exactly like :inst:`copy`, but creates a new
|
||||||
SSA value for the spilled input value.
|
SSA value for the spilled input value.
|
||||||
""",
|
""",
|
||||||
ins=x, outs=a)
|
ins=x, outs=a, can_load=True)
|
||||||
|
|
||||||
src = Operand('src', regunit)
|
src = Operand('src', regunit)
|
||||||
dst = Operand('dst', regunit)
|
dst = Operand('dst', regunit)
|
||||||
|
|||||||
Reference in New Issue
Block a user