[llvm] [LLVM][InstCombine] Add simplification of SVE compare intrinsics. (PR #211249)
Matthew Devereau via llvm-commits
llvm-commits at lists.llvm.org
Wed Jul 29 03:38:43 PDT 2026
================
@@ -1964,6 +2018,72 @@ simplifySVEIntrinsicBinOp(InstCombiner &IC, IntrinsicInst &II,
return IC.replaceInstUsesWith(II, SimpleII);
}
+static std::optional<Instruction *>
+simplifySVEIntrinsicCompare(InstCombiner &IC, IntrinsicInst &II,
+ const SVEIntrinsicInfo &IInfo) {
+ const unsigned Opc = IInfo.getMatchingIROpode();
+ assert((Opc == Instruction::ICmp || Opc == Instruction::FCmp) &&
+ "Expected a compare operation!");
+
+ Value *Pg = II.getOperand(0);
+ Value *LHS = II.getOperand(1);
+ Value *RHS = II.getOperand(2);
+ CmpInst::Predicate CmpPred = IInfo.getCmpPredicate();
+ bool IsWideICmp =
+ Opc == Instruction::ICmp && LHS->getType() != RHS->getType();
+ assert((IsWideICmp || LHS->getType() == RHS->getType()) &&
+ "Unexpected wide compare!");
+
+ // Canonicalise constants to the RHS.
+ if ((ICmpInst::isCommutative(CmpPred) || FCmpInst::isCommutative(CmpPred)) &&
+ isa<Constant>(LHS) && !isa<Constant>(RHS) && !IsWideICmp) {
+ IC.replaceOperand(II, 1, RHS);
+ IC.replaceOperand(II, 2, LHS);
+ return &II;
+ }
+
+ // Only active lanes matter when simplifying the operation.
+ LHS = stripInactiveLanes(LHS, Pg);
+ RHS = stripInactiveLanes(RHS, Pg);
+
+ if (IsWideICmp) {
+ // We can do more for wide compares, but not using simplifyCmpInst.
+ const APInt *LHSVal, *RHSVal;
+ if (!match(LHS, m_APInt(LHSVal)) || !match(RHS, m_APInt(RHSVal)))
+ return std::nullopt;
+
+ // Consider cmpge.wide(..., <vscale x 4 x i32> LHS, <vscale x 2 x i64> RHS),
+ // we must reconstruct the constants because LHS has the wrong element type,
+ // and RHS the wrong element count.
+ Type *WideVT = VectorType::get(RHS->getType()->getScalarType(),
+ cast<VectorType>(LHS->getType()));
+ if (ICmpInst::isSigned(CmpPred)) {
+ LHS = ConstantInt::get(WideVT, LHSVal->getSExtValue());
+ RHS = ConstantInt::get(WideVT, RHSVal->getSExtValue());
+ } else {
+ LHS = ConstantInt::get(WideVT, LHSVal->getZExtValue());
+ RHS = ConstantInt::get(WideVT, RHSVal->getZExtValue());
+ }
+ }
+
+ // TODO: Allow fast-math flags for calls to compare intrinsics.
+ const DataLayout &DL = II.getDataLayout();
+ Value *SimpleII = simplifyCmpInst(CmpPred, LHS, RHS, DL);
+
+ // No simplification happened.
+ if (!SimpleII)
+ return std::nullopt;
+
+ assert(IInfo.resultIsZeroInitialized() && "Expected a zeroing operation!");
+
+ if (match(SimpleII, m_ZeroInt()))
+ return IC.replaceInstUsesWith(II, SimpleII);
+
+ // Inactive lanes must be zero'd.
----------------
MDevereau wrote:
```suggestion
// Inactive lanes must be zeroed.
```
https://github.com/llvm/llvm-project/pull/211249
More information about the llvm-commits
mailing list