[PATCH] D126268: [InstCombine] [NFC] refector foldXorOfICmps
Chenbing.Zheng via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Wed May 25 20:09:42 PDT 2022
This revision was landed with ongoing or failed builds.
This revision was automatically updated to reflect the committed changes.
Chenbing.Zheng marked an inline comment as done.
Closed by commit rG1486a9c9fe82: [InstCombine] [NFC] refector foldXorOfICmps (authored by Chenbing.Zheng).
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D126268/new/
https://reviews.llvm.org/D126268
Files:
llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
Index: llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
===================================================================
--- llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
+++ llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
@@ -3054,27 +3054,26 @@
assert(I.getOpcode() == Instruction::Xor && I.getOperand(0) == LHS &&
I.getOperand(1) == RHS && "Should be 'xor' with these operands");
- if (predicatesFoldable(LHS->getPredicate(), RHS->getPredicate())) {
- if (LHS->getOperand(0) == RHS->getOperand(1) &&
- LHS->getOperand(1) == RHS->getOperand(0))
- LHS->swapOperands();
- if (LHS->getOperand(0) == RHS->getOperand(0) &&
- LHS->getOperand(1) == RHS->getOperand(1)) {
+ ICmpInst::Predicate PredL = LHS->getPredicate(), PredR = RHS->getPredicate();
+ Value *LHS0 = LHS->getOperand(0), *LHS1 = LHS->getOperand(1);
+ Value *RHS0 = RHS->getOperand(0), *RHS1 = RHS->getOperand(1);
+
+ if (predicatesFoldable(PredL, PredR)) {
+ if (LHS0 == RHS1 && LHS1 == RHS0) {
+ std::swap(LHS0, LHS1);
+ PredL = ICmpInst::getSwappedPredicate(PredL);
+ }
+ if (LHS0 == RHS0 && LHS1 == RHS1) {
// (icmp1 A, B) ^ (icmp2 A, B) --> (icmp3 A, B)
- Value *Op0 = LHS->getOperand(0), *Op1 = LHS->getOperand(1);
- unsigned Code =
- getICmpCode(LHS->getPredicate()) ^ getICmpCode(RHS->getPredicate());
+ unsigned Code = getICmpCode(PredL) ^ getICmpCode(PredR);
bool IsSigned = LHS->isSigned() || RHS->isSigned();
- return getNewICmpValue(Code, IsSigned, Op0, Op1, Builder);
+ return getNewICmpValue(Code, IsSigned, LHS0, LHS1, Builder);
}
}
// TODO: This can be generalized to compares of non-signbits using
// decomposeBitTestICmp(). It could be enhanced more by using (something like)
// foldLogOpOfMaskedICmps().
- ICmpInst::Predicate PredL = LHS->getPredicate(), PredR = RHS->getPredicate();
- Value *LHS0 = LHS->getOperand(0), *LHS1 = LHS->getOperand(1);
- Value *RHS0 = RHS->getOperand(0), *RHS1 = RHS->getOperand(1);
if ((LHS->hasOneUse() || RHS->hasOneUse()) &&
LHS0->getType() == RHS0->getType() &&
LHS0->getType()->isIntOrIntVectorTy()) {
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D126268.432177.patch
Type: text/x-patch
Size: 2196 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20220526/52e38a3a/attachment.bin>
More information about the llvm-commits
mailing list