@@ -4,7 +4,7 @@ use crate::transform::MirPass;
4
4
use rustc_hir:: Mutability ;
5
5
use rustc_middle:: mir:: {
6
6
BinOp , Body , Constant , LocalDecls , Operand , Place , ProjectionElem , Rvalue , SourceInfo ,
7
- StatementKind ,
7
+ StatementKind , UnOp ,
8
8
} ;
9
9
use rustc_middle:: ty:: { self , TyCtxt } ;
10
10
@@ -47,28 +47,35 @@ impl<'tcx, 'a> InstCombineContext<'tcx, 'a> {
47
47
Rvalue :: BinaryOp ( op @ ( BinOp :: Eq | BinOp :: Ne ) , box ( a, b) ) => {
48
48
let new = match ( op, self . try_eval_bool ( a) , self . try_eval_bool ( b) ) {
49
49
// Transform "Eq(a, true)" ==> "a"
50
- ( BinOp :: Eq , _, Some ( true ) ) => Some ( a. clone ( ) ) ,
50
+ ( BinOp :: Eq , _, Some ( true ) ) => Some ( Rvalue :: Use ( a. clone ( ) ) ) ,
51
51
52
52
// Transform "Ne(a, false)" ==> "a"
53
- ( BinOp :: Ne , _, Some ( false ) ) => Some ( a. clone ( ) ) ,
53
+ ( BinOp :: Ne , _, Some ( false ) ) => Some ( Rvalue :: Use ( a. clone ( ) ) ) ,
54
54
55
55
// Transform "Eq(true, b)" ==> "b"
56
- ( BinOp :: Eq , Some ( true ) , _) => Some ( b. clone ( ) ) ,
56
+ ( BinOp :: Eq , Some ( true ) , _) => Some ( Rvalue :: Use ( b. clone ( ) ) ) ,
57
57
58
58
// Transform "Ne(false, b)" ==> "b"
59
- ( BinOp :: Ne , Some ( false ) , _) => Some ( b. clone ( ) ) ,
59
+ ( BinOp :: Ne , Some ( false ) , _) => Some ( Rvalue :: Use ( b. clone ( ) ) ) ,
60
60
61
- // FIXME: Consider combining remaining comparisons into logical operations:
62
61
// Transform "Eq(false, b)" ==> "Not(b)"
62
+ ( BinOp :: Eq , Some ( false ) , _) => Some ( Rvalue :: UnaryOp ( UnOp :: Not , b. clone ( ) ) ) ,
63
+
63
64
// Transform "Ne(true, b)" ==> "Not(b)"
65
+ ( BinOp :: Ne , Some ( true ) , _) => Some ( Rvalue :: UnaryOp ( UnOp :: Not , b. clone ( ) ) ) ,
66
+
64
67
// Transform "Eq(a, false)" ==> "Not(a)"
68
+ ( BinOp :: Eq , _, Some ( false ) ) => Some ( Rvalue :: UnaryOp ( UnOp :: Not , a. clone ( ) ) ) ,
69
+
65
70
// Transform "Ne(a, true)" ==> "Not(a)"
71
+ ( BinOp :: Ne , _, Some ( true ) ) => Some ( Rvalue :: UnaryOp ( UnOp :: Not , a. clone ( ) ) ) ,
72
+
66
73
_ => None ,
67
74
} ;
68
75
69
76
if let Some ( new) = new {
70
77
if self . should_combine ( source_info, rvalue) {
71
- * rvalue = Rvalue :: Use ( new) ;
78
+ * rvalue = new;
72
79
}
73
80
}
74
81
}
0 commit comments