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

Method do_split

src/internal/allocator/split.rs:842–910  ·  view source on GitHub ↗

Actually perform the split at the given split points. `hint` is applied to the middle portion between `left` and `right`.

(
        &mut self,
        vreg: VirtReg,
        left: Option<Inst>,
        right: Option<Inst>,
        interference_weight: f32,
    )

Source from the content-addressed store, hash-verified

840 ///
841 /// `hint` is applied to the middle portion between `left` and `right`.
842 fn do_split(
843 &mut self,
844 vreg: VirtReg,
845 left: Option<Inst>,
846 right: Option<Inst>,
847 interference_weight: f32,
848 ) {
849 trace!("Splitting {vreg}");
850 stat!(self.stats, split_vregs);
851
852 let splitter = &mut self.allocator.splitter;
853 splitter.new_vregs.clear();
854 splitter.segments.clear();
855 splitter
856 .segments
857 .extend_from_slice(self.virt_regs.segments(vreg));
858
859 // Helper function to create new virtual regsiters and initialize them
860 // to unassigned with the given hint.
861 let set = self.virt_regs[vreg].value_set;
862 let mut create_vregs = |segments: &mut [ValueSegment], uses: &mut Uses| {
863 self.virt_regs.create_vreg_from_segments(
864 segments,
865 self.func,
866 self.reginfo,
867 uses,
868 self.hints,
869 self.virt_reg_builder,
870 self.coalescing,
871 self.stats,
872 self.options,
873 set,
874 &mut splitter.new_vregs,
875 );
876 self.allocator
877 .assignments
878 .grow_to_with(self.virt_regs.num_virt_regs(), || Assignment::Unassigned {
879 evicted_for_preference: false,
880 });
881 };
882
883 let mut segments = &mut splitter.segments[..];
884 if let Some(left) = left {
885 let mut split = ValueSegment::split_segments_at(segments, self.uses, self.hints, left);
886 create_vregs(split.first_half(), self.uses);
887 segments = split.into_second_half();
888 }
889
890 if let Some(right) = right {
891 let mut split2 =
892 ValueSegment::split_segments_at(segments, self.uses, self.hints, right);
893 create_vregs(split2.first_half(), self.uses);
894 create_vregs(split2.into_second_half(), self.uses);
895 } else {
896 create_vregs(segments, self.uses);
897 }
898
899 // At least one of the new virtual registers must be able to evict the

Callers 1

split_or_spillMethod · 0.80

Calls 8

segmentsMethod · 0.80
grow_to_withMethod · 0.80
num_virt_regsMethod · 0.80
first_halfMethod · 0.80
into_second_halfMethod · 0.80
queue_new_vregsMethod · 0.80
clearMethod · 0.45

Tested by

no test coverage detected