[llvm] 56248ca - [InstCombine] Explicitly set disjoint flag when converting xor to or. (#74229)
via llvm-commits
llvm-commits at lists.llvm.org
Wed Dec 6 09:42:04 PST 2023
Author: Craig Topper
Date: 2023-12-06T09:41:59-08:00
New Revision: 56248caa3b427b0c0700f910d0b7b3e1b175bff1
URL: https://github.com/llvm/llvm-project/commit/56248caa3b427b0c0700f910d0b7b3e1b175bff1
DIFF: https://github.com/llvm/llvm-project/commit/56248caa3b427b0c0700f910d0b7b3e1b175bff1.diff
LOG: [InstCombine] Explicitly set disjoint flag when converting xor to or. (#74229)
Added:
Modified:
llvm/include/llvm/IR/InstrTypes.h
llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp
llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
Removed:
################################################################################
diff --git a/llvm/include/llvm/IR/InstrTypes.h b/llvm/include/llvm/IR/InstrTypes.h
index ddae3e4f43f48..6eba902fa0416 100644
--- a/llvm/include/llvm/IR/InstrTypes.h
+++ b/llvm/include/llvm/IR/InstrTypes.h
@@ -336,6 +336,15 @@ class BinaryOperator : public Instruction {
return BO;
}
+ static inline BinaryOperator *
+ CreateDisjoint(BinaryOps Opc, Value *V1, Value *V2, const Twine &Name = "");
+ static inline BinaryOperator *CreateDisjoint(BinaryOps Opc, Value *V1,
+ Value *V2, const Twine &Name,
+ BasicBlock *BB);
+ static inline BinaryOperator *CreateDisjoint(BinaryOps Opc, Value *V1,
+ Value *V2, const Twine &Name,
+ Instruction *I);
+
#define DEFINE_HELPERS(OPC, NUWNSWEXACT) \
static BinaryOperator *Create##NUWNSWEXACT##OPC(Value *V1, Value *V2, \
const Twine &Name = "") { \
@@ -364,6 +373,8 @@ class BinaryOperator : public Instruction {
DEFINE_HELPERS(AShr, Exact) // CreateExactAShr
DEFINE_HELPERS(LShr, Exact) // CreateExactLShr
+ DEFINE_HELPERS(Or, Disjoint) // CreateDisjointOr
+
#undef DEFINE_HELPERS
/// Helper functions to construct and inspect unary operations (NEG and NOT)
@@ -438,6 +449,27 @@ class PossiblyDisjointInst : public BinaryOperator {
}
};
+BinaryOperator *BinaryOperator::CreateDisjoint(BinaryOps Opc, Value *V1,
+ Value *V2, const Twine &Name) {
+ BinaryOperator *BO = Create(Opc, V1, V2, Name);
+ cast<PossiblyDisjointInst>(BO)->setIsDisjoint(true);
+ return BO;
+}
+BinaryOperator *BinaryOperator::CreateDisjoint(BinaryOps Opc, Value *V1,
+ Value *V2, const Twine &Name,
+ BasicBlock *BB) {
+ BinaryOperator *BO = Create(Opc, V1, V2, Name, BB);
+ cast<PossiblyDisjointInst>(BO)->setIsDisjoint(true);
+ return BO;
+}
+BinaryOperator *BinaryOperator::CreateDisjoint(BinaryOps Opc, Value *V1,
+ Value *V2, const Twine &Name,
+ Instruction *I) {
+ BinaryOperator *BO = Create(Opc, V1, V2, Name, I);
+ cast<PossiblyDisjointInst>(BO)->setIsDisjoint(true);
+ return BO;
+}
+
//===----------------------------------------------------------------------===//
// CastInst Class
//===----------------------------------------------------------------------===//
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp b/llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp
index c6d19c9cabc28..719a2678fc189 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp
@@ -1582,11 +1582,8 @@ Instruction *InstCombinerImpl::visitAdd(BinaryOperator &I) {
// A+B --> A|B iff A and B have no bits set in common.
WithCache<const Value *> LHSCache(LHS), RHSCache(RHS);
- if (haveNoCommonBitsSet(LHSCache, RHSCache, SQ.getWithInstruction(&I))) {
- auto *Or = BinaryOperator::CreateOr(LHS, RHS);
- cast<PossiblyDisjointInst>(Or)->setIsDisjoint(true);
- return Or;
- }
+ if (haveNoCommonBitsSet(LHSCache, RHSCache, SQ.getWithInstruction(&I)))
+ return BinaryOperator::CreateDisjointOr(LHS, RHS);
if (Instruction *Ext = narrowMathIfNoOverflow(I))
return Ext;
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp b/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
index f7d196f7f4336..39466a9e3751b 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
@@ -4462,7 +4462,7 @@ Instruction *InstCombinerImpl::visitXor(BinaryOperator &I) {
Value *M;
if (match(&I, m_c_Xor(m_c_And(m_Not(m_Value(M)), m_Value()),
m_c_And(m_Deferred(M), m_Value()))))
- return BinaryOperator::CreateOr(Op0, Op1);
+ return BinaryOperator::CreateDisjointOr(Op0, Op1);
if (Instruction *Xor = visitMaskedMerge(I, Builder))
return Xor;
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp b/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
index 732a3a13daccc..046ce9d1207e8 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
@@ -315,6 +315,8 @@ Value *InstCombinerImpl::SimplifyDemandedUseBits(Value *V, APInt DemandedMask,
if (DemandedMask.isSubsetOf(RHSKnown.Zero | LHSKnown.Zero)) {
Instruction *Or =
BinaryOperator::CreateOr(I->getOperand(0), I->getOperand(1));
+ if (DemandedMask.isAllOnes())
+ cast<PossiblyDisjointInst>(Or)->setIsDisjoint(true);
Or->takeName(I);
return InsertNewInstWith(Or, I->getIterator());
}
More information about the llvm-commits
mailing list