@@ -500,6 +500,18 @@ TEST_F(AArch64GISelMITest, TestConstantFoldICMP) {
500500 EXPECT_TRUE (I->getOperand (1 ).getCImm ()->getZExtValue ());
501501 }
502502
503+ {
504+ auto I = CSEB.buildICmp (CmpInst::Predicate::ICMP_EQ, s32, One, One);
505+ EXPECT_TRUE (I->getOpcode () == TargetOpcode::G_CONSTANT);
506+ EXPECT_EQ (I->getOperand (1 ).getCImm ()->getZExtValue (), 1 );
507+ }
508+
509+ {
510+ auto I = CSEB.buildICmp (CmpInst::Predicate::ICMP_EQ, s32, One, Two);
511+ EXPECT_TRUE (I->getOpcode () == TargetOpcode::G_CONSTANT);
512+ EXPECT_EQ (I->getOperand (1 ).getCImm ()->getZExtValue (), 0 );
513+ }
514+
503515 LLT VecTy = LLT::fixed_vector (2 , s32);
504516 LLT DstTy = LLT::fixed_vector (2 , s1);
505517 auto Three = CSEB.buildConstant (s32, 3 );
@@ -508,6 +520,8 @@ TEST_F(AArch64GISelMITest, TestConstantFoldICMP) {
508520 auto OneTwo = CSEB.buildBuildVector (VecTy, {One.getReg (0 ), Two.getReg (0 )});
509521 auto TwoThree =
510522 CSEB.buildBuildVector (VecTy, {Two.getReg (0 ), Three.getReg (0 )});
523+ auto OneThree =
524+ CSEB.buildBuildVector (VecTy, {One.getReg (0 ), Three.getReg (0 )});
511525 auto MinusOneOne =
512526 CSEB.buildBuildVector (VecTy, {MinusOne.getReg (0 ), MinusOne.getReg (0 )});
513527 auto MinusOneTwo =
@@ -547,6 +561,36 @@ TEST_F(AArch64GISelMITest, TestConstantFoldICMP) {
547561 // ICMP_SLE
548562 CSEB.buildICmp (CmpInst::Predicate::ICMP_SLE, DstTy, MinusOneTwo, MinusOneOne);
549563
564+ {
565+ auto I =
566+ CSEB.buildICmp (CmpInst::Predicate::ICMP_EQ, VecTy, OneOne, TwoThree);
567+ EXPECT_TRUE (I->getOpcode () == TargetOpcode::G_BUILD_VECTOR);
568+ const APInt HiCst = *getIConstantVRegVal (I->getOperand (1 ).getReg (), *MRI);
569+ const APInt LoCst = *getIConstantVRegVal (I->getOperand (2 ).getReg (), *MRI);
570+ EXPECT_EQ (HiCst.getSExtValue (), 0 );
571+ EXPECT_EQ (LoCst.getSExtValue (), 0 );
572+ }
573+
574+ {
575+ auto I =
576+ CSEB.buildICmp (CmpInst::Predicate::ICMP_EQ, VecTy, OneThree, TwoThree);
577+ EXPECT_TRUE (I->getOpcode () == TargetOpcode::G_BUILD_VECTOR);
578+ const APInt HiCst = *getIConstantVRegVal (I->getOperand (1 ).getReg (), *MRI);
579+ const APInt LoCst = *getIConstantVRegVal (I->getOperand (2 ).getReg (), *MRI);
580+ EXPECT_EQ (HiCst.getSExtValue (), 0 );
581+ EXPECT_EQ (LoCst.getSExtValue (), -1 );
582+ }
583+
584+ {
585+ auto I =
586+ CSEB.buildICmp (CmpInst::Predicate::ICMP_EQ, VecTy, TwoThree, TwoThree);
587+ EXPECT_TRUE (I->getOpcode () == TargetOpcode::G_BUILD_VECTOR);
588+ const APInt HiCst = *getIConstantVRegVal (I->getOperand (1 ).getReg (), *MRI);
589+ const APInt LoCst = *getIConstantVRegVal (I->getOperand (2 ).getReg (), *MRI);
590+ EXPECT_EQ (HiCst.getSExtValue (), -1 );
591+ EXPECT_EQ (LoCst.getSExtValue (), -1 );
592+ }
593+
550594 auto CheckStr = R"(
551595 ; CHECK: [[One:%[0-9]+]]:_(s32) = G_CONSTANT i32 1
552596 ; CHECK: [[Two:%[0-9]+]]:_(s32) = G_CONSTANT i32 2
@@ -558,6 +602,7 @@ TEST_F(AArch64GISelMITest, TestConstantFoldICMP) {
558602 ; CHECK: {{%[0-9]+}}:_(<2 x s32>) = G_BUILD_VECTOR [[One]]:_(s32), [[One]]:_(s32)
559603 ; CHECK: {{%[0-9]+}}:_(<2 x s32>) = G_BUILD_VECTOR [[One]]:_(s32), [[Two]]:_(s32)
560604 ; CHECK: {{%[0-9]+}}:_(<2 x s32>) = G_BUILD_VECTOR [[Two]]:_(s32), [[Three]]:_(s32)
605+ ; CHECK: {{%[0-9]+}}:_(<2 x s32>) = G_BUILD_VECTOR [[One]]:_(s32), [[Three]]:_(s32)
561606 ; CHECK: {{%[0-9]+}}:_(<2 x s32>) = G_BUILD_VECTOR [[MinusOne]]:_(s32), [[MinusOne]]:_(s32)
562607 ; CHECK: {{%[0-9]+}}:_(<2 x s32>) = G_BUILD_VECTOR [[MinusOne]]:_(s32), [[MinusTwo]]:_(s32)
563608 ; CHECK: {{%[0-9]+}}:_(<2 x s32>) = G_BUILD_VECTOR [[MinusTwo]]:_(s32), [[MinusThree]]:_(s32)
0 commit comments