Add EntryRegDiversions to record diversions for each block entry.
This commit is contained in:
committed by
Nicolas B. Pierron
parent
9eb1847d80
commit
bb87f1a54a
@@ -14,7 +14,7 @@ use crate::ir::{
|
||||
use crate::ir::{EbbOffsets, InstEncodings, SourceLocs, StackSlots, ValueLocations};
|
||||
use crate::ir::{JumpTableOffsets, JumpTables};
|
||||
use crate::isa::{CallConv, EncInfo, Encoding, Legalize, TargetIsa};
|
||||
use crate::regalloc::RegDiversions;
|
||||
use crate::regalloc::{EntryRegDiversions, RegDiversions};
|
||||
use crate::value_label::ValueLabelsRanges;
|
||||
use crate::write::write_function;
|
||||
use core::fmt;
|
||||
@@ -62,6 +62,12 @@ pub struct Function {
|
||||
/// Location assigned to every value.
|
||||
pub locations: ValueLocations,
|
||||
|
||||
/// Non-default locations assigned to value at the entry of basic blocks.
|
||||
///
|
||||
/// At the entry of each basic block, we might have values which are not in their default
|
||||
/// ValueLocation. This field records these register-to-register moves as Diversions.
|
||||
pub entry_diversions: EntryRegDiversions,
|
||||
|
||||
/// Code offsets of the EBB headers.
|
||||
///
|
||||
/// This information is only transiently available after the `binemit::relax_branches` function
|
||||
@@ -94,6 +100,7 @@ impl Function {
|
||||
layout: Layout::new(),
|
||||
encodings: SecondaryMap::new(),
|
||||
locations: SecondaryMap::new(),
|
||||
entry_diversions: EntryRegDiversions::new(),
|
||||
offsets: SecondaryMap::new(),
|
||||
jt_offsets: SecondaryMap::new(),
|
||||
srclocs: SecondaryMap::new(),
|
||||
@@ -112,6 +119,7 @@ impl Function {
|
||||
self.layout.clear();
|
||||
self.encodings.clear();
|
||||
self.locations.clear();
|
||||
self.entry_diversions.clear();
|
||||
self.offsets.clear();
|
||||
self.jt_offsets.clear();
|
||||
self.srclocs.clear();
|
||||
@@ -198,10 +206,12 @@ impl Function {
|
||||
!self.offsets.is_empty(),
|
||||
"Code layout must be computed first"
|
||||
);
|
||||
let mut divert = RegDiversions::new();
|
||||
divert.at_ebb(&self.entry_diversions, ebb);
|
||||
InstOffsetIter {
|
||||
encinfo: encinfo.clone(),
|
||||
func: self,
|
||||
divert: RegDiversions::new(),
|
||||
divert,
|
||||
encodings: &self.encodings,
|
||||
offset: self.offsets[ebb],
|
||||
iter: self.layout.ebb_insts(ebb),
|
||||
|
||||
Reference in New Issue
Block a user