[llvm] acbad50 - [InstCombine] [NFC] separate a function foldICmpBinOpWithConstant
Chenbing Zheng via llvm-commits
llvm-commits at lists.llvm.org
Fri May 13 19:57:03 PDT 2022
Author: Chenbing Zheng
Date: 2022-05-14T10:54:15+08:00
New Revision: acbad5086af3ab94a59d1428c4116a192c10fb49
URL: https://github.com/llvm/llvm-project/commit/acbad5086af3ab94a59d1428c4116a192c10fb49
DIFF: https://github.com/llvm/llvm-project/commit/acbad5086af3ab94a59d1428c4116a192c10fb49.diff
LOG: [InstCombine] [NFC] separate a function foldICmpBinOpWithConstant
There is a long function foldICmpInstWithConstant,
we can separate a function foldICmpBinOpWithConstant from it.
Reviewed By: spatel
Differential Revision: https://reviews.llvm.org/D125457
Added:
Modified:
llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp
llvm/lib/Transforms/InstCombine/InstCombineInternal.h
Removed:
################################################################################
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp
index 4511b661357b8..70785dafb0472 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp
@@ -3021,57 +3021,7 @@ Instruction *InstCombinerImpl::foldICmpInstWithConstant(ICmpInst &Cmp) {
return nullptr;
if (auto *BO = dyn_cast<BinaryOperator>(Cmp.getOperand(0))) {
- switch (BO->getOpcode()) {
- case Instruction::Xor:
- if (Instruction *I = foldICmpXorConstant(Cmp, BO, *C))
- return I;
- break;
- case Instruction::And:
- if (Instruction *I = foldICmpAndConstant(Cmp, BO, *C))
- return I;
- break;
- case Instruction::Or:
- if (Instruction *I = foldICmpOrConstant(Cmp, BO, *C))
- return I;
- break;
- case Instruction::Mul:
- if (Instruction *I = foldICmpMulConstant(Cmp, BO, *C))
- return I;
- break;
- case Instruction::Shl:
- if (Instruction *I = foldICmpShlConstant(Cmp, BO, *C))
- return I;
- break;
- case Instruction::LShr:
- case Instruction::AShr:
- if (Instruction *I = foldICmpShrConstant(Cmp, BO, *C))
- return I;
- break;
- case Instruction::SRem:
- if (Instruction *I = foldICmpSRemConstant(Cmp, BO, *C))
- return I;
- break;
- case Instruction::UDiv:
- if (Instruction *I = foldICmpUDivConstant(Cmp, BO, *C))
- return I;
- LLVM_FALLTHROUGH;
- case Instruction::SDiv:
- if (Instruction *I = foldICmpDivConstant(Cmp, BO, *C))
- return I;
- break;
- case Instruction::Sub:
- if (Instruction *I = foldICmpSubConstant(Cmp, BO, *C))
- return I;
- break;
- case Instruction::Add:
- if (Instruction *I = foldICmpAddConstant(Cmp, BO, *C))
- return I;
- break;
- default:
- break;
- }
- // TODO: These folds could be refactored to be part of the above calls.
- if (Instruction *I = foldICmpBinOpEqualityWithConstant(Cmp, BO, *C))
+ if (Instruction *I = foldICmpBinOpWithConstant(Cmp, BO, *C))
return I;
}
@@ -3328,6 +3278,64 @@ static Instruction *foldICmpIntrinsicWithIntrinsic(ICmpInst &Cmp) {
return nullptr;
}
+/// Fold an icmp with BinaryOp and constant operand: icmp Pred BO, C.
+Instruction *InstCombinerImpl::foldICmpBinOpWithConstant(ICmpInst &Cmp,
+ BinaryOperator *BO,
+ const APInt &C) {
+ switch (BO->getOpcode()) {
+ case Instruction::Xor:
+ if (Instruction *I = foldICmpXorConstant(Cmp, BO, C))
+ return I;
+ break;
+ case Instruction::And:
+ if (Instruction *I = foldICmpAndConstant(Cmp, BO, C))
+ return I;
+ break;
+ case Instruction::Or:
+ if (Instruction *I = foldICmpOrConstant(Cmp, BO, C))
+ return I;
+ break;
+ case Instruction::Mul:
+ if (Instruction *I = foldICmpMulConstant(Cmp, BO, C))
+ return I;
+ break;
+ case Instruction::Shl:
+ if (Instruction *I = foldICmpShlConstant(Cmp, BO, C))
+ return I;
+ break;
+ case Instruction::LShr:
+ case Instruction::AShr:
+ if (Instruction *I = foldICmpShrConstant(Cmp, BO, C))
+ return I;
+ break;
+ case Instruction::SRem:
+ if (Instruction *I = foldICmpSRemConstant(Cmp, BO, C))
+ return I;
+ break;
+ case Instruction::UDiv:
+ if (Instruction *I = foldICmpUDivConstant(Cmp, BO, C))
+ return I;
+ LLVM_FALLTHROUGH;
+ case Instruction::SDiv:
+ if (Instruction *I = foldICmpDivConstant(Cmp, BO, C))
+ return I;
+ break;
+ case Instruction::Sub:
+ if (Instruction *I = foldICmpSubConstant(Cmp, BO, C))
+ return I;
+ break;
+ case Instruction::Add:
+ if (Instruction *I = foldICmpAddConstant(Cmp, BO, C))
+ return I;
+ break;
+ default:
+ break;
+ }
+
+ // TODO: These folds could be refactored to be part of the above calls.
+ return foldICmpBinOpEqualityWithConstant(Cmp, BO, C);
+}
+
/// Fold an icmp with LLVM intrinsic and constant operand: icmp Pred II, C.
Instruction *InstCombinerImpl::foldICmpIntrinsicWithConstant(ICmpInst &Cmp,
IntrinsicInst *II,
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineInternal.h b/llvm/lib/Transforms/InstCombine/InstCombineInternal.h
index 34544c861b6ad..352e7a9c689a8 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineInternal.h
+++ b/llvm/lib/Transforms/InstCombine/InstCombineInternal.h
@@ -682,6 +682,8 @@ class LLVM_LIBRARY_VISIBILITY InstCombinerImpl final
Value *foldMultiplicationOverflowCheck(ICmpInst &Cmp);
+ Instruction *foldICmpBinOpWithConstant(ICmpInst &Cmp, BinaryOperator *BO,
+ const APInt &C);
Instruction *foldICmpSelectConstant(ICmpInst &Cmp, SelectInst *Select,
ConstantInt *C);
Instruction *foldICmpTruncConstant(ICmpInst &Cmp, TruncInst *Trunc,
More information about the llvm-commits
mailing list