(u: &mut Unstructured)
| 115 | |
| 116 | impl 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 | }) |
no test coverage detected