mirror of
https://github.com/rust-lang/rust.git
synced 2026-05-07 17:18:32 +03:00
Rollup merge of #107085 - tmiasko:custom-mir-operators, r=oli-obk
Custom MIR: Support binary and unary operations Lower binary and unary operations directly to corresponding unchecked MIR operations. Ultimately this might not be syntax we want, but it allows for experimentation in the meantime. r? ````@oli-obk```` ````@JakobDegen````
This commit is contained in:
@@ -147,6 +147,12 @@ fn parse_rvalue(&self, expr_id: ExprId) -> PResult<Rvalue<'tcx>> {
|
||||
ExprKind::AddressOf { mutability, arg } => Ok(
|
||||
Rvalue::AddressOf(*mutability, self.parse_place(*arg)?)
|
||||
),
|
||||
ExprKind::Binary { op, lhs, rhs } => Ok(
|
||||
Rvalue::BinaryOp(*op, Box::new((self.parse_operand(*lhs)?, self.parse_operand(*rhs)?)))
|
||||
),
|
||||
ExprKind::Unary { op, arg } => Ok(
|
||||
Rvalue::UnaryOp(*op, self.parse_operand(*arg)?)
|
||||
),
|
||||
_ => self.parse_operand(expr_id).map(Rvalue::Use),
|
||||
)
|
||||
}
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
// MIR for `f` after built
|
||||
|
||||
fn f(_1: i32, _2: bool) -> i32 {
|
||||
let mut _0: i32; // return place in scope 0 at $DIR/operators.rs:+0:30: +0:33
|
||||
|
||||
bb0: {
|
||||
_1 = Neg(_1); // scope 0 at $DIR/operators.rs:+2:9: +2:15
|
||||
_2 = Not(_2); // scope 0 at $DIR/operators.rs:+3:9: +3:15
|
||||
_1 = Add(_1, _1); // scope 0 at $DIR/operators.rs:+4:9: +4:18
|
||||
_1 = Sub(_1, _1); // scope 0 at $DIR/operators.rs:+5:9: +5:18
|
||||
_1 = Mul(_1, _1); // scope 0 at $DIR/operators.rs:+6:9: +6:18
|
||||
_1 = Div(_1, _1); // scope 0 at $DIR/operators.rs:+7:9: +7:18
|
||||
_1 = Rem(_1, _1); // scope 0 at $DIR/operators.rs:+8:9: +8:18
|
||||
_1 = BitXor(_1, _1); // scope 0 at $DIR/operators.rs:+9:9: +9:18
|
||||
_1 = BitAnd(_1, _1); // scope 0 at $DIR/operators.rs:+10:9: +10:18
|
||||
_1 = Shl(_1, _1); // scope 0 at $DIR/operators.rs:+11:9: +11:19
|
||||
_1 = Shr(_1, _1); // scope 0 at $DIR/operators.rs:+12:9: +12:19
|
||||
_2 = Eq(_1, _1); // scope 0 at $DIR/operators.rs:+13:9: +13:19
|
||||
_2 = Lt(_1, _1); // scope 0 at $DIR/operators.rs:+14:9: +14:18
|
||||
_2 = Le(_1, _1); // scope 0 at $DIR/operators.rs:+15:9: +15:19
|
||||
_2 = Ge(_1, _1); // scope 0 at $DIR/operators.rs:+16:9: +16:19
|
||||
_2 = Gt(_1, _1); // scope 0 at $DIR/operators.rs:+17:9: +17:18
|
||||
_0 = _1; // scope 0 at $DIR/operators.rs:+18:9: +18:16
|
||||
return; // scope 0 at $DIR/operators.rs:+19:9: +19:17
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
// compile-flags: --crate-type=lib
|
||||
#![feature(custom_mir, core_intrinsics, inline_const)]
|
||||
use std::intrinsics::mir::*;
|
||||
|
||||
// EMIT_MIR operators.f.built.after.mir
|
||||
#[custom_mir(dialect = "built")]
|
||||
pub fn f(a: i32, b: bool) -> i32 {
|
||||
mir!({
|
||||
a = -a;
|
||||
b = !b;
|
||||
a = a + a;
|
||||
a = a - a;
|
||||
a = a * a;
|
||||
a = a / a;
|
||||
a = a % a;
|
||||
a = a ^ a;
|
||||
a = a & a;
|
||||
a = a << a;
|
||||
a = a >> a;
|
||||
b = a == a;
|
||||
b = a < a;
|
||||
b = a <= a;
|
||||
b = a >= a;
|
||||
b = a > a;
|
||||
RET = a;
|
||||
Return()
|
||||
})
|
||||
}
|
||||
Reference in New Issue
Block a user