pub enum AnalysisError {
CriticalEdge {
from: BlockIx,
to: BlockIx,
},
EntryLiveinValues(Vec<Reg>),
IllegalRealReg(RealReg),
UnreachableBlocks,
ImplementationLimitsExceeded,
LsraCriticalEdge {
block: BlockIx,
inst: InstIx,
},
}Variants§
CriticalEdge
A critical edge from “from” to “to” has been found, and should have been removed by the caller in the first place.
EntryLiveinValues(Vec<Reg>)
Some values in the entry block are live in to the function, but are not declared as such.
IllegalRealReg(RealReg)
The incoming code has an explicit or implicit mention (use, def or mod)
of a real register, which either (1) isn’t listed in the universe at
all, or (2) is one of the suggested_scratch registers in the universe.
(1) isn’t allowed because the client must mention all real registers
in the universe. (2) isn’t allowed because the client promises to us
that the suggested_scratch registers really are completely unused in
the incoming code, so that the allocator can use them at literally any
point it wants.
UnreachableBlocks
At least one block is dead.
ImplementationLimitsExceeded
Implementation limits exceeded. The incoming function is too big. It may contain at most 1 million basic blocks and 16 million instructions.
LsraCriticalEdge
Linear scan requires that if a block ends with a control flow instruction that has at least one register mention (use, mod or def), then the successor blocks must have a single predecessor.
In practice, this means that users should consider associated edges to be “critical” and split them (and maybe remove dead blocks afterwards).
For details, see the comment in linear_scan::analysis generating this error.
Trait Implementations§
Source§impl Clone for AnalysisError
impl Clone for AnalysisError
Source§fn clone(&self) -> AnalysisError
fn clone(&self) -> AnalysisError
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read more