@@ -4,7 +4,7 @@ use crate::transform::MirPass;
44use rustc_hir:: Mutability ;
55use rustc_middle:: mir:: {
66 BinOp , Body , Constant , LocalDecls , Operand , Place , ProjectionElem , Rvalue , SourceInfo ,
7- StatementKind ,
7+ StatementKind , UnOp ,
88} ;
99use rustc_middle:: ty:: { self , TyCtxt } ;
1010
@@ -47,28 +47,35 @@ impl<'tcx, 'a> InstCombineContext<'tcx, 'a> {
4747 Rvalue :: BinaryOp ( op @ ( BinOp :: Eq | BinOp :: Ne ) , box ( a, b) ) => {
4848 let new = match ( op, self . try_eval_bool ( a) , self . try_eval_bool ( b) ) {
4949 // Transform "Eq(a, true)" ==> "a"
50- ( BinOp :: Eq , _, Some ( true ) ) => Some ( a. clone ( ) ) ,
50+ ( BinOp :: Eq , _, Some ( true ) ) => Some ( Rvalue :: Use ( a. clone ( ) ) ) ,
5151
5252 // Transform "Ne(a, false)" ==> "a"
53- ( BinOp :: Ne , _, Some ( false ) ) => Some ( a. clone ( ) ) ,
53+ ( BinOp :: Ne , _, Some ( false ) ) => Some ( Rvalue :: Use ( a. clone ( ) ) ) ,
5454
5555 // Transform "Eq(true, b)" ==> "b"
56- ( BinOp :: Eq , Some ( true ) , _) => Some ( b. clone ( ) ) ,
56+ ( BinOp :: Eq , Some ( true ) , _) => Some ( Rvalue :: Use ( b. clone ( ) ) ) ,
5757
5858 // Transform "Ne(false, b)" ==> "b"
59- ( BinOp :: Ne , Some ( false ) , _) => Some ( b. clone ( ) ) ,
59+ ( BinOp :: Ne , Some ( false ) , _) => Some ( Rvalue :: Use ( b. clone ( ) ) ) ,
6060
61- // FIXME: Consider combining remaining comparisons into logical operations:
6261 // Transform "Eq(false, b)" ==> "Not(b)"
62+ ( BinOp :: Eq , Some ( false ) , _) => Some ( Rvalue :: UnaryOp ( UnOp :: Not , b. clone ( ) ) ) ,
63+
6364 // Transform "Ne(true, b)" ==> "Not(b)"
65+ ( BinOp :: Ne , Some ( true ) , _) => Some ( Rvalue :: UnaryOp ( UnOp :: Not , b. clone ( ) ) ) ,
66+
6467 // Transform "Eq(a, false)" ==> "Not(a)"
68+ ( BinOp :: Eq , _, Some ( false ) ) => Some ( Rvalue :: UnaryOp ( UnOp :: Not , a. clone ( ) ) ) ,
69+
6570 // Transform "Ne(a, true)" ==> "Not(a)"
71+ ( BinOp :: Ne , _, Some ( true ) ) => Some ( Rvalue :: UnaryOp ( UnOp :: Not , a. clone ( ) ) ) ,
72+
6673 _ => None ,
6774 } ;
6875
6976 if let Some ( new) = new {
7077 if self . should_combine ( source_info, rvalue) {
71- * rvalue = Rvalue :: Use ( new) ;
78+ * rvalue = new;
7279 }
7380 }
7481 }
0 commit comments