Detect undefined liveins.
This commit is contained in:
@@ -1163,7 +1163,7 @@ impl<'a, F: Function> Env<'a, F> {
|
|||||||
self.liveins[block.index()].get(vreg.index())
|
self.liveins[block.index()].get(vreg.index())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn compute_liveness(&mut self) {
|
fn compute_liveness(&mut self) -> Result<(), RegAllocError> {
|
||||||
// Create initial LiveIn and LiveOut bitsets.
|
// Create initial LiveIn and LiveOut bitsets.
|
||||||
for _ in 0..self.func.blocks() {
|
for _ in 0..self.func.blocks() {
|
||||||
self.liveins.push(BitVec::new());
|
self.liveins.push(BitVec::new());
|
||||||
@@ -1226,6 +1226,17 @@ impl<'a, F: Function> Env<'a, F> {
|
|||||||
self.liveins[block.index()] = live;
|
self.liveins[block.index()] = live;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Check that there are no liveins to the entry block. (The
|
||||||
|
// client should create a virtual intsruction that defines any
|
||||||
|
// PReg liveins if necessary.)
|
||||||
|
if self.liveins[self.func.entry_block().index()]
|
||||||
|
.iter()
|
||||||
|
.next()
|
||||||
|
.is_some()
|
||||||
|
{
|
||||||
|
return Err(RegAllocError::EntryLivein);
|
||||||
|
}
|
||||||
|
|
||||||
let mut num_ranges = 0;
|
let mut num_ranges = 0;
|
||||||
|
|
||||||
for &vreg in self.func.reftype_vregs() {
|
for &vreg in self.func.reftype_vregs() {
|
||||||
@@ -1827,6 +1838,8 @@ impl<'a, F: Function> Env<'a, F> {
|
|||||||
self.stats.initial_liverange_count = self.ranges.len();
|
self.stats.initial_liverange_count = self.ranges.len();
|
||||||
self.stats.blockparam_ins_count = self.blockparam_ins.len();
|
self.stats.blockparam_ins_count = self.blockparam_ins.len();
|
||||||
self.stats.blockparam_outs_count = self.blockparam_outs.len();
|
self.stats.blockparam_outs_count = self.blockparam_outs.len();
|
||||||
|
|
||||||
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn compute_hot_code(&mut self) {
|
fn compute_hot_code(&mut self) {
|
||||||
@@ -4549,7 +4562,7 @@ impl<'a, F: Function> Env<'a, F> {
|
|||||||
pub(crate) fn init(&mut self) -> Result<(), RegAllocError> {
|
pub(crate) fn init(&mut self) -> Result<(), RegAllocError> {
|
||||||
self.create_pregs_and_vregs();
|
self.create_pregs_and_vregs();
|
||||||
self.compute_hot_code();
|
self.compute_hot_code();
|
||||||
self.compute_liveness();
|
self.compute_liveness()?;
|
||||||
self.merge_vreg_bundles();
|
self.merge_vreg_bundles();
|
||||||
self.queue_bundles();
|
self.queue_bundles();
|
||||||
if log::log_enabled!(log::Level::Debug) {
|
if log::log_enabled!(log::Level::Debug) {
|
||||||
|
|||||||
@@ -981,6 +981,8 @@ pub enum RegAllocError {
|
|||||||
/// Invalid branch: operand count does not match sum of block
|
/// Invalid branch: operand count does not match sum of block
|
||||||
/// params of successor blocks.
|
/// params of successor blocks.
|
||||||
Branch(Inst),
|
Branch(Inst),
|
||||||
|
/// A VReg is live-in on entry; this is not allowed.
|
||||||
|
EntryLivein,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl std::fmt::Display for RegAllocError {
|
impl std::fmt::Display for RegAllocError {
|
||||||
|
|||||||
Reference in New Issue
Block a user