@@ -533,6 +533,72 @@ TEST_F(PatternMatchTest, BitWise) {
533
533
EXPECT_FALSE (m_c_BitwiseLogic (m_Zero (), m_Zero ()).match (Xor));
534
534
}
535
535
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
+
536
602
TEST_F (PatternMatchTest, ZExtSExtSelf) {
537
603
LLVMContext &Ctx = IRB.getContext ();
538
604
0 commit comments