[llvm] [X86] Narrow vXi32/vXi64 usubsat to vpsubusb/vpsubusw when LHS is known to fit in fewer bits (PR #206592)
via llvm-commits
llvm-commits at lists.llvm.org
Sun Aug 23 13:08:14 PDT 2026
================
@@ -4718,6 +4718,42 @@ SDValue DAGCombiner::visitSUBSAT(SDNode *N) {
if (DAG.willNotOverflowSub(IsSigned, N0, N1))
return DAG.getNode(ISD::SUB, DL, VT, N0, N1);
+ // Narrow a vXiN USUBSAT to a smaller type when both operands are known
+ // to fit in fewer bits. This allows targets with native narrow USUBSAT
+ // (e.g. vpsubusb/vpsubusw) to avoid emulation with vpmaxu + vsub.
+ if (!IsSigned && VT.isVector() && VT.isSimple()) {
+ unsigned ScalarBits = VT.getScalarSizeInBits();
+ if (ScalarBits > 8 && isPowerOf2_32(ScalarBits) &&
+ !TLI.isOperationLegal(ISD::USUBSAT, VT)) {
+ KnownBits Known0 = DAG.computeKnownBits(N0);
+ unsigned ActiveBits = Known0.countMaxActiveBits();
+ for (unsigned NarrowBits = PowerOf2Ceil(ActiveBits);
+ NarrowBits < ScalarBits; NarrowBits *= 2) {
----------------
sipher-01 wrote:
Added NarrowBits != 0 guard in visitSUBSAT to prevent divide-by-zero on known-zero LHS in latest PR
.
https://github.com/llvm/llvm-project/pull/206592
More information about the llvm-commits
mailing list