diff options
author | NAKAMURA Takumi <geek4civic@gmail.com> | 2025-01-09 18:49:54 +0900 |
---|---|---|
committer | NAKAMURA Takumi <geek4civic@gmail.com> | 2025-01-09 18:49:54 +0900 |
commit | e2810c9a248f4c7fbfae84bb32b6f7e01027458b (patch) | |
tree | ae0b02a8491b969a1cee94ea16ffe42c559143c5 /llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp | |
parent | fa04eb4af95c1ca7377279728cb004bcd2324d01 (diff) | |
parent | bdcf47e4bcb92889665825654bb80a8bbe30379e (diff) | |
download | llvm-users/chapuni/cov/single/switch.zip llvm-users/chapuni/cov/single/switch.tar.gz llvm-users/chapuni/cov/single/switch.tar.bz2 |
Merge branch 'users/chapuni/cov/single/base' into users/chapuni/cov/single/switchusers/chapuni/cov/single/switch
Diffstat (limited to 'llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp')
-rw-r--r-- | llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp | 43 |
1 files changed, 20 insertions, 23 deletions
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp b/llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp index 7a184a1..73876d0 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp @@ -1326,6 +1326,18 @@ Instruction *InstCombinerImpl::foldAddLikeCommutative(Value *LHS, Value *RHS, R->setHasNoUnsignedWrap(NUWOut); return R; } + + // ((X s/ C1) << C2) + X => X s% -C1 where -C1 is 1 << C2 + const APInt *C1, *C2; + if (match(LHS, m_Shl(m_SDiv(m_Specific(RHS), m_APInt(C1)), m_APInt(C2)))) { + APInt One(C2->getBitWidth(), 1); + APInt MinusC1 = -(*C1); + if (MinusC1 == (One << *C2)) { + Constant *NewRHS = ConstantInt::get(RHS->getType(), MinusC1); + return BinaryOperator::CreateSRem(RHS, NewRHS); + } + } + return nullptr; } @@ -1623,17 +1635,7 @@ Instruction *InstCombinerImpl::visitAdd(BinaryOperator &I) { // X % C0 + (( X / C0 ) % C1) * C0 => X % (C0 * C1) if (Value *V = SimplifyAddWithRemainder(I)) return replaceInstUsesWith(I, V); - // ((X s/ C1) << C2) + X => X s% -C1 where -C1 is 1 << C2 - const APInt *C1, *C2; - if (match(LHS, m_Shl(m_SDiv(m_Specific(RHS), m_APInt(C1)), m_APInt(C2)))) { - APInt one(C2->getBitWidth(), 1); - APInt minusC1 = -(*C1); - if (minusC1 == (one << *C2)) { - Constant *NewRHS = ConstantInt::get(RHS->getType(), minusC1); - return BinaryOperator::CreateSRem(RHS, NewRHS); - } - } - + const APInt *C1; // (A & 2^C1) + A => A & (2^C1 - 1) iff bit C1 in A is a sign bit if (match(&I, m_c_Add(m_And(m_Value(A), m_APInt(C1)), m_Deferred(A))) && C1->isPowerOf2() && (ComputeNumSignBits(A) > C1->countl_zero())) { @@ -2845,12 +2847,11 @@ Instruction *InstCombinerImpl::hoistFNegAboveFMulFDiv(Value *FNegOp, // Make sure to preserve flags and metadata on the call. if (II->getIntrinsicID() == Intrinsic::ldexp) { FastMathFlags FMF = FMFSource.getFastMathFlags() | II->getFastMathFlags(); - IRBuilder<>::FastMathFlagGuard FMFGuard(Builder); - Builder.setFastMathFlags(FMF); - - CallInst *New = Builder.CreateCall( - II->getCalledFunction(), - {Builder.CreateFNeg(II->getArgOperand(0)), II->getArgOperand(1)}); + CallInst *New = + Builder.CreateCall(II->getCalledFunction(), + {Builder.CreateFNegFMF(II->getArgOperand(0), FMF), + II->getArgOperand(1)}); + New->setFastMathFlags(FMF); New->copyMetadata(*II); return New; } @@ -2932,12 +2933,8 @@ Instruction *InstCombinerImpl::visitFNeg(UnaryOperator &I) { // flags the copysign doesn't also have. FastMathFlags FMF = I.getFastMathFlags(); FMF &= cast<FPMathOperator>(OneUse)->getFastMathFlags(); - - IRBuilder<>::FastMathFlagGuard FMFGuard(Builder); - Builder.setFastMathFlags(FMF); - - Value *NegY = Builder.CreateFNeg(Y); - Value *NewCopySign = Builder.CreateCopySign(X, NegY); + Value *NegY = Builder.CreateFNegFMF(Y, FMF); + Value *NewCopySign = Builder.CreateCopySign(X, NegY, FMF); return replaceInstUsesWith(I, NewCopySign); } |