Auto merge of #112238 - scottmcm:mir-add-unchecked, r=cjgillot
Promote unchecked integer math to MIR `BinOp`s So slice indexing by a range gets down to one basic block, for example. r? cjgillot
This commit is contained in:
commit
4051305389
40 changed files with 546 additions and 358 deletions
|
@ -1267,10 +1267,16 @@ pub enum UnOp {
|
|||
pub enum BinOp {
|
||||
/// The `+` operator (addition)
|
||||
Add,
|
||||
/// Like `Add`, but with UB on overflow. (Integers only.)
|
||||
AddUnchecked,
|
||||
/// The `-` operator (subtraction)
|
||||
Sub,
|
||||
/// Like `Sub`, but with UB on overflow. (Integers only.)
|
||||
SubUnchecked,
|
||||
/// The `*` operator (multiplication)
|
||||
Mul,
|
||||
/// Like `Mul`, but with UB on overflow. (Integers only.)
|
||||
MulUnchecked,
|
||||
/// The `/` operator (division)
|
||||
///
|
||||
/// For integer types, division by zero is UB, as is `MIN / -1` for signed.
|
||||
|
@ -1296,10 +1302,17 @@ pub enum BinOp {
|
|||
///
|
||||
/// The offset is truncated to the size of the first operand before shifting.
|
||||
Shl,
|
||||
/// Like `Shl`, but is UB if the RHS >= LHS::BITS
|
||||
ShlUnchecked,
|
||||
/// The `>>` operator (shift right)
|
||||
///
|
||||
/// The offset is truncated to the size of the first operand before shifting.
|
||||
///
|
||||
/// This is an arithmetic shift if the LHS is signed
|
||||
/// and a logical shift if the LHS is unsigned.
|
||||
Shr,
|
||||
/// Like `Shl`, but is UB if the RHS >= LHS::BITS
|
||||
ShrUnchecked,
|
||||
/// The `==` operator (equality)
|
||||
Eq,
|
||||
/// The `<` operator (less than)
|
||||
|
|
|
@ -235,8 +235,11 @@ impl<'tcx> BinOp {
|
|||
// FIXME: handle SIMD correctly
|
||||
match self {
|
||||
&BinOp::Add
|
||||
| &BinOp::AddUnchecked
|
||||
| &BinOp::Sub
|
||||
| &BinOp::SubUnchecked
|
||||
| &BinOp::Mul
|
||||
| &BinOp::MulUnchecked
|
||||
| &BinOp::Div
|
||||
| &BinOp::Rem
|
||||
| &BinOp::BitXor
|
||||
|
@ -246,7 +249,11 @@ impl<'tcx> BinOp {
|
|||
assert_eq!(lhs_ty, rhs_ty);
|
||||
lhs_ty
|
||||
}
|
||||
&BinOp::Shl | &BinOp::Shr | &BinOp::Offset => {
|
||||
&BinOp::Shl
|
||||
| &BinOp::ShlUnchecked
|
||||
| &BinOp::Shr
|
||||
| &BinOp::ShrUnchecked
|
||||
| &BinOp::Offset => {
|
||||
lhs_ty // lhs_ty can be != rhs_ty
|
||||
}
|
||||
&BinOp::Eq | &BinOp::Lt | &BinOp::Le | &BinOp::Ne | &BinOp::Ge | &BinOp::Gt => {
|
||||
|
@ -293,7 +300,14 @@ impl BinOp {
|
|||
BinOp::Gt => hir::BinOpKind::Gt,
|
||||
BinOp::Le => hir::BinOpKind::Le,
|
||||
BinOp::Ge => hir::BinOpKind::Ge,
|
||||
BinOp::Offset => unreachable!(),
|
||||
BinOp::AddUnchecked
|
||||
| BinOp::SubUnchecked
|
||||
| BinOp::MulUnchecked
|
||||
| BinOp::ShlUnchecked
|
||||
| BinOp::ShrUnchecked
|
||||
| BinOp::Offset => {
|
||||
unreachable!()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue