Clobbers: use a more efficient bitmask representation in API. (#58)
* Clobbers: use a more efficient bitmask representation in API. Currently, the `Function` trait requires a `&[PReg]` for the clobber-list for a given instruction. In most cases where clobbers are used, the list may be long: e.g., ABIs specify a fixed set of registers that are clobbered and there may be ~half of all registers in this list. What's more, the list can't be shared for e.g. all calls of a given ABI, because actual return-values (defs) can't be clobbers. So we need to allocate space for long, sometimes-slightly-different lists; this is inefficient for the embedder and for us. It's much more efficient to use a bitmask to represent a set of physical registers. With current data structure bitpacking limitations, we can support at most 128 physical registers; this means we can use a `u128` bitmask. This also allows e.g. an embedder to start with a constant for a given ABI, and mask out bits for actual return-value registers on call instructions. This PR makes that change, for minor but positive performance impact. * Review comments.
This commit is contained in:
@@ -5,7 +5,7 @@
|
||||
|
||||
use crate::{
|
||||
domtree, postorder, Allocation, Block, Function, Inst, InstRange, MachineEnv, Operand,
|
||||
OperandConstraint, OperandKind, OperandPos, PReg, RegClass, VReg,
|
||||
OperandConstraint, OperandKind, OperandPos, PReg, PRegSet, RegClass, VReg,
|
||||
};
|
||||
|
||||
use arbitrary::Result as ArbitraryResult;
|
||||
@@ -132,8 +132,12 @@ impl Function for Func {
|
||||
&self.insts[insn.index()].operands[..]
|
||||
}
|
||||
|
||||
fn inst_clobbers(&self, insn: Inst) -> &[PReg] {
|
||||
&self.insts[insn.index()].clobbers[..]
|
||||
fn inst_clobbers(&self, insn: Inst) -> PRegSet {
|
||||
let mut set = PRegSet::default();
|
||||
for &preg in &self.insts[insn.index()].clobbers {
|
||||
set = set.with(preg);
|
||||
}
|
||||
set
|
||||
}
|
||||
|
||||
fn num_vregs(&self) -> usize {
|
||||
|
||||
Reference in New Issue
Block a user