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:
commit
f3644ca64d
3 changed files with 60 additions and 0 deletions
|
@ -147,6 +147,12 @@ impl<'tcx, 'body> ParseCtxt<'tcx, 'body> {
|
|||
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),
|
||||
)
|
||||
}
|
||||
|
|
26
tests/mir-opt/building/custom/operators.f.built.after.mir
Normal file
26
tests/mir-opt/building/custom/operators.f.built.after.mir
Normal file
|
@ -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
|
||||
}
|
||||
}
|
28
tests/mir-opt/building/custom/operators.rs
Normal file
28
tests/mir-opt/building/custom/operators.rs
Normal file
|
@ -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()
|
||||
})
|
||||
}
|
Loading…
Add table
Reference in a new issue