MCPcopy Create free account
hub / github.com/Amanieu/regalloc3 / arbitrary

Method arbitrary

fuzz/fuzz_targets/parallel_moves.rs:117–235  ·  view source on GitHub ↗
(u: &mut Unstructured)

Source from the content-addressed store, hash-verified

115
116impl Arbitrary<'_> for TestCase {
117 fn arbitrary(u: &mut Unstructured) -> Result<Self> {
118 // Ensure the logger is initialized.
119 let _ = pretty_env_logger::try_init();
120
121 let reginfo = reginfo(u)?;
122
123 // Generate values for move sources.
124 let mut src_used_mask = RegUnitSet::new();
125 let mut spillslots = PrimaryMap::new();
126 let mut values = PrimaryMap::new();
127 let mut slots_per_bank: SecondaryMap<RegBank, Vec<SpillSlot>> =
128 SecondaryMap::with_max_index(reginfo.num_banks());
129 for _ in 0..u.int_in_range(1..=20)? {
130 let mut gen_alloc = || {
131 // Try to get a register if it doesn't overlap an existing one.
132 if u.arbitrary()? {
133 let reg = PhysReg::new(u.choose_index(reginfo.num_regs())?);
134 if reginfo
135 .reg_units(reg)
136 .all(|unit| !src_used_mask.contains(unit))
137 {
138 reginfo
139 .reg_units(reg)
140 .for_each(|unit| src_used_mask.insert(unit));
141 let bank = reginfo.bank_for_reg(reg).unwrap();
142 return Ok((Some(Allocation::reg(reg)), bank));
143 }
144 }
145
146 // Otherwise get a spillslot or force a rematerialization.
147 let bank = RegBank::new(u.choose_index(reginfo.num_banks())?);
148 if u.arbitrary()? {
149 Ok((None, bank))
150 } else {
151 let spillslot = spillslots.push(reginfo.spillslot_size(bank));
152 slots_per_bank[bank].push(spillslot);
153 Ok((Some(Allocation::spillslot(spillslot)), bank))
154 }
155 };
156
157 let (alloc, bank) = gen_alloc()?;
158 let remat = if alloc.is_none() || u.arbitrary()? {
159 let cost = if u.arbitrary()? {
160 RematCost::CheaperThanMove
161 } else {
162 RematCost::CheaperThanLoad
163 };
164 let remat_classes: Vec<_> = reginfo
165 .classes()
166 .filter(|&class| {
167 reginfo.bank_for_class(class) == bank
168 && reginfo.class_group_size(class) == 1
169 && (reginfo.class_includes_spillslots(class)
170 || reginfo
171 .class_members(class)
172 .into_iter()
173 .all(|reg| !reginfo.is_memory(reg)))
174 })

Callers 1

reginfoFunction · 0.45

Calls 15

reginfoFunction · 0.85
num_banksMethod · 0.80
num_regsMethod · 0.80
reg_unitsMethod · 0.80
unwrapMethod · 0.80
bank_for_regMethod · 0.80
pushMethod · 0.80
is_noneMethod · 0.80
classesMethod · 0.80
bank_for_classMethod · 0.80
class_group_sizeMethod · 0.80

Tested by

no test coverage detected