@@ -533,6 +533,72 @@ TEST_F(PatternMatchTest, BitWise) {
533533 EXPECT_FALSE (m_c_BitwiseLogic (m_Zero (), m_Zero ()).match (Xor));
534534}
535535
536+ TEST_F (PatternMatchTest, XorLike) {
537+ Value *AllocaX = IRB.CreateAlloca (IRB.getInt32Ty ());
538+ Value *X = IRB.CreateLoad (IRB.getInt32Ty (), AllocaX);
539+ Value *AllocaY = IRB.CreateAlloca (IRB.getInt32Ty ());
540+ Value *Y = IRB.CreateLoad (IRB.getInt32Ty (), AllocaY);
541+ Value *MaskC = IRB.getInt32 (31 );
542+ Value *NonMaskC = IRB.getInt32 (32 );
543+
544+ Value *OpA, *OpB;
545+ {
546+ Value *Xor = IRB.CreateXor (X, Y);
547+ Value *Sub = IRB.CreateNUWSub (X, Y);
548+ OpA = nullptr ;
549+ OpB = nullptr ;
550+ EXPECT_TRUE (m_c_XorLike (m_Value (OpA), m_Value (OpB)).match (Xor));
551+ EXPECT_TRUE (OpA != OpB && (OpA == X || OpB == X) && (OpA == Y || OpB == Y));
552+ OpA = nullptr ;
553+ OpB = nullptr ;
554+ EXPECT_FALSE (m_c_XorLike (m_Value (OpA), m_Value (OpB)).match (Sub));
555+ }
556+ {
557+ Value *Xor = IRB.CreateXor (X, MaskC);
558+ Value *Sub = IRB.CreateNUWSub (MaskC, X);
559+ OpA = nullptr ;
560+ OpB = nullptr ;
561+ EXPECT_TRUE (m_c_XorLike (m_Value (OpA), m_Value (OpB)).match (Xor));
562+ EXPECT_TRUE (OpA != OpB && (OpA == X || OpB == X) &&
563+ (OpA == MaskC || OpB == MaskC));
564+ OpA = nullptr ;
565+ OpB = nullptr ;
566+ EXPECT_TRUE (m_c_XorLike (m_Value (OpA), m_Value (OpB)).match (Sub));
567+ EXPECT_TRUE (OpA != OpB && (OpA == X || OpB == X) &&
568+ (OpA == MaskC || OpB == MaskC));
569+ }
570+ {
571+ Value *Xor = IRB.CreateXor (X, MaskC);
572+ Value *Sub = IRB.CreateNSWSub (MaskC, X);
573+ OpA = nullptr ;
574+ OpB = nullptr ;
575+ EXPECT_TRUE (m_c_XorLike (m_Value (OpA), m_Value (OpB)).match (Xor));
576+ EXPECT_TRUE (OpA != OpB && (OpA == X || OpB == X) &&
577+ (OpA == MaskC || OpB == MaskC));
578+ OpA = nullptr ;
579+ OpB = nullptr ;
580+ EXPECT_FALSE (m_c_XorLike (m_Value (OpA), m_Value (OpB)).match (Sub));
581+ }
582+ {
583+ Value *Sub = IRB.CreateNUWSub (X, MaskC);
584+ OpA = nullptr ;
585+ OpB = nullptr ;
586+ EXPECT_FALSE (m_c_XorLike (m_Value (OpA), m_Value (OpB)).match (Sub));
587+ }
588+ {
589+ Value *Xor = IRB.CreateXor (X, NonMaskC);
590+ Value *Sub = IRB.CreateNUWSub (NonMaskC, X);
591+ OpA = nullptr ;
592+ OpB = nullptr ;
593+ EXPECT_TRUE (m_c_XorLike (m_Value (OpA), m_Value (OpB)).match (Xor));
594+ EXPECT_TRUE (OpA != OpB && (OpA == X || OpB == X) &&
595+ (OpA == NonMaskC || OpB == NonMaskC));
596+ OpA = nullptr ;
597+ OpB = nullptr ;
598+ EXPECT_FALSE (m_c_XorLike (m_Value (OpA), m_Value (OpB)).match (Sub));
599+ }
600+ }
601+
536602TEST_F (PatternMatchTest, ZExtSExtSelf) {
537603 LLVMContext &Ctx = IRB.getContext ();
538604
0 commit comments