@@ -924,9 +924,19 @@ Instruction *InstCombinerImpl::foldAddWithConstant(BinaryOperator &Add) {
924
924
C2->isMinSignedValue () && C2->sext (Ty->getScalarSizeInBits ()) == *C)
925
925
return CastInst::Create (Instruction::SExt, X, Ty);
926
926
927
- // (X ^ signmask) + C --> (X + (signmask ^ C))
928
- if (match (Op0, m_Xor (m_Value (X), m_APInt (C2))) && C2->isSignMask ())
929
- return BinaryOperator::CreateAdd (X, ConstantInt::get (Ty, *C2 ^ *C));
927
+ if (match (Op0, m_Xor (m_Value (X), m_APInt (C2)))) {
928
+ // (X ^ signmask) + C --> (X + (signmask ^ C))
929
+ if (C2->isSignMask ())
930
+ return BinaryOperator::CreateAdd (X, ConstantInt::get (Ty, *C2 ^ *C));
931
+
932
+ // If X has no high-bits set above an xor mask:
933
+ // add (xor X, LowMaskC), C --> sub (LowMaskC + C), X
934
+ if (C2->isMask ()) {
935
+ KnownBits LHSKnown = computeKnownBits (X, 0 , &Add);
936
+ if ((*C2 | LHSKnown.Zero ).isAllOnesValue ())
937
+ return BinaryOperator::CreateSub (ConstantInt::get (Ty, *C2 + *C), X);
938
+ }
939
+ }
930
940
931
941
if (C->isOneValue () && Op0->hasOneUse ()) {
932
942
// add (sext i1 X), 1 --> zext (not X)
@@ -1295,15 +1305,6 @@ Instruction *InstCombinerImpl::visitAdd(BinaryOperator &I) {
1295
1305
Value *NewShl = Builder.CreateShl (XorLHS, ShAmt, " sext" );
1296
1306
return BinaryOperator::CreateAShr (NewShl, ShAmt);
1297
1307
}
1298
-
1299
- // If X has no high-bits above the xor mask set:
1300
- // add (xor X, LowMaskC), C --> sub (LowMaskC + C), X
1301
- if ((XorRHS->getValue () + 1 ).isPowerOf2 ()) {
1302
- KnownBits LHSKnown = computeKnownBits (XorLHS, 0 , &I);
1303
- if ((XorRHS->getValue () | LHSKnown.Zero ).isAllOnesValue ())
1304
- return BinaryOperator::CreateSub (ConstantExpr::getAdd (XorRHS, CI),
1305
- XorLHS);
1306
- }
1307
1308
}
1308
1309
}
1309
1310
0 commit comments