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,
)
| 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 |
no test coverage detected