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

Method gen_groups

src/debug_utils/generic_reginfo/arbitrary.rs:262–291  ·  view source on GitHub ↗

Creates register groups from the given registers.

(&mut self, group_size: usize, members: &[PhysReg])

Source from the content-addressed store, hash-verified

260
261 /// Creates register groups from the given registers.
262 fn gen_groups(&mut self, group_size: usize, members: &[PhysReg]) -> Result<Vec<RegGroup>> {
263 // Start with all members at every group index.
264 let mut all = vec![members.to_vec(); group_size];
265
266 // Fix up lists to ensure that the same register is not used multiple
267 // times in a group.
268 let mut temp = vec![];
269 for group_idx in 1..group_size {
270 for idx in 0..members.len() {
271 while (0..group_idx)
272 .map(|i| all[i][idx])
273 .any(|r| r == all[group_idx][idx])
274 {
275 temp.push(all[group_idx].swap_remove(idx));
276 }
277 all[group_idx].append(&mut temp);
278 }
279 }
280
281 // Create the register groups
282 let mut out = vec![];
283 #[allow(clippy::needless_range_loop)]
284 for i in 0..all.len() {
285 let regs = (0..group_size).map(|group_idx| all[group_idx][i]).collect();
286 let group = self.reginfo.groups.push(RegGroupData { regs });
287 out.push(group);
288 }
289
290 Ok(out)
291 }
292
293 /// Creates a new register in a bank, making sure it doesn't share a unit
294 /// with an existing register in the bank.

Callers 1

gen_subclassMethod · 0.80

Calls 4

mapMethod · 0.80
pushMethod · 0.80
swap_removeMethod · 0.80
lenMethod · 0.45

Tested by

no test coverage detected