Custom MIR: Support binary and unary operations
This commit is contained in:
parent
4c83bd03a9
commit
d3cfe97a8a
@ -141,6 +141,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),
|
||||
)
|
||||
}
|
||||
|
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…
Reference in New Issue
Block a user