[llvm] [InstCombine][Docs] Update InstCombine contributor guide (PR #144228)
Ramkumar Ramachandra via llvm-commits
llvm-commits at lists.llvm.org
Sun Jun 15 04:43:52 PDT 2025
================
@@ -531,6 +551,19 @@ need to add a one-use check for the inner instruction.
One-use checks can be performed using the `m_OneUse()` matcher, or the
`V->hasOneUse()` method.
+### Flag handling
+
+When possible, propagate poison-generating flags like `nuw` and `nsw` since they may be
+hard to salvage later. If it is not free (e.g. requires additional complexity like `willNotOverflow`
+or KnownBits queries), don't do that.
+
+Be careful with in-place operand/predicate changes, as poison-generating flags may not be valid for new
+operands. It is recommended to create a new instruction with carefully handling of flags. If not
+applicable, call `Instruction::dropPoisonGeneratingFlags()` to clear flags in a conservative manner.
+
+Do not rely on fcmp's `nsz` flag to perform optimizations. It is meaningless for fcmp so it should not affect
+the optimization.
----------------
artagnon wrote:
Perhaps I'm confused about something? See CmpInst::isEquivalence, which is used in some places:
```cpp
// Returns true if either operand of CmpInst is a provably non-zero
// floating-point constant.
static bool hasNonZeroFPOperands(const CmpInst *Cmp) {
auto *LHS = dyn_cast<Constant>(Cmp->getOperand(0));
auto *RHS = dyn_cast<Constant>(Cmp->getOperand(1));
if (auto *Const = LHS ? LHS : RHS) {
using namespace llvm::PatternMatch;
return match(Const, m_NonZeroNotDenormalFP());
}
return false;
}
// Floating-point equality is not an equivalence when comparing +0.0 with
// -0.0, when comparing NaN with another value, or when flushing
// denormals-to-zero.
bool CmpInst::isEquivalence(bool Invert) const {
switch (Invert ? getInversePredicate() : getPredicate()) {
case CmpInst::Predicate::ICMP_EQ:
return true;
case CmpInst::Predicate::FCMP_UEQ:
if (!hasNoNaNs())
return false;
[[fallthrough]];
case CmpInst::Predicate::FCMP_OEQ:
return hasNonZeroFPOperands(this);
default:
return false;
}
}
```
https://github.com/llvm/llvm-project/pull/144228
More information about the llvm-commits
mailing list