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:
Dan Gohman
2017-10-19 13:11:33 -07:00
parent cc0bb70c5d
commit 7c9b9e3d27
2 changed files with 17 additions and 2 deletions

View File

@@ -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
}

View File

@@ -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)