[llvm] 4fe326d - [X86] combineVECREDUCE_LOGIC - add missing reduce_xor parity result sign extension (#217002)
via llvm-commits
llvm-commits at lists.llvm.org
Tue Aug 18 10:52:35 PDT 2026
Author: Simon Pilgrim
Date: 2026-08-18T17:52:30Z
New Revision: 4fe326dd0db9bddf12980c3865bcf4a5daa8c7fb
URL: https://github.com/llvm/llvm-project/commit/4fe326dd0db9bddf12980c3865bcf4a5daa8c7fb
DIFF: https://github.com/llvm/llvm-project/commit/4fe326dd0db9bddf12980c3865bcf4a5daa8c7fb.diff
LOG: [X86] combineVECREDUCE_LOGIC - add missing reduce_xor parity result sign extension (#217002)
#199544 enabled support for reduce_xor with non-vXi1 types, but we were
missing the sign extension that was handled only for the reduce_or/and
cases
Fixes #215069
Added:
Modified:
llvm/lib/Target/X86/X86ISelLowering.cpp
llvm/test/CodeGen/X86/vector-reduce-xor.ll
Removed:
################################################################################
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp
index e89afce282602..b515f434134c5 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.cpp
+++ b/llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -47396,32 +47396,33 @@ static SDValue combineVECREDUCE_LOGIC(SDNode *Reduce, SelectionDAG &DAG,
assert((NumElts <= 32 || NumElts == 64) &&
"Not expecting more than 64 elements");
+ SDValue Result;
MVT CmpVT = NumElts == 64 ? MVT::i64 : MVT::i32;
if (BinOp == ISD::XOR) {
// parity -> (PARITY(MOVMSK X))
- SDValue Result = DAG.getNode(ISD::PARITY, DL, CmpVT, Movmsk);
- return DAG.getZExtOrTrunc(Result, DL, ExtractVT);
+ Result = DAG.getNode(ISD::PARITY, DL, CmpVT, Movmsk);
+ } else {
+ SDValue CmpC;
+ ISD::CondCode CondCode;
+ if (BinOp == ISD::OR) {
+ // any_of -> MOVMSK != 0
+ CmpC = DAG.getConstant(0, DL, CmpVT);
+ CondCode = ISD::CondCode::SETNE;
+ } else {
+ // all_of -> MOVMSK == ((1 << NumElts) - 1)
+ CmpC = DAG.getConstant(
+ APInt::getLowBitsSet(CmpVT.getSizeInBits(), NumElts), DL, CmpVT);
+ CondCode = ISD::CondCode::SETEQ;
+ }
+
+ EVT SetccVT = TLI.getSetCCResultType(DAG.getDataLayout(), Ctx, CmpVT);
+ Result = DAG.getSetCC(DL, SetccVT, Movmsk, CmpC, CondCode);
}
- SDValue CmpC;
- ISD::CondCode CondCode;
- if (BinOp == ISD::OR) {
- // any_of -> MOVMSK != 0
- CmpC = DAG.getConstant(0, DL, CmpVT);
- CondCode = ISD::CondCode::SETNE;
- } else {
- // all_of -> MOVMSK == ((1 << NumElts) - 1)
- CmpC = DAG.getConstant(APInt::getLowBitsSet(CmpVT.getSizeInBits(), NumElts),
- DL, CmpVT);
- CondCode = ISD::CondCode::SETEQ;
- }
-
- // The setcc produces an i8 of 0/1, so extend that to the result width and
- // negate to get the final 0/-1 mask value.
- EVT SetccVT = TLI.getSetCCResultType(DAG.getDataLayout(), Ctx, CmpVT);
- SDValue Setcc = DAG.getSetCC(DL, SetccVT, Movmsk, CmpC, CondCode);
- SDValue Zext = DAG.getZExtOrTrunc(Setcc, DL, ExtractVT);
- return DAG.getNegative(Zext, DL, ExtractVT);
+ // The setcc/parity produces an i8 of 0/1, so extend that to the result width
+ // and negate to get the final 0/-1 mask value.
+ Result = DAG.getZExtOrTrunc(Result, DL, ExtractVT);
+ return DAG.getNegative(Result, DL, ExtractVT);
}
static SDValue combineVPDPBUSDPattern(SDNode *Extract, SelectionDAG &DAG,
diff --git a/llvm/test/CodeGen/X86/vector-reduce-xor.ll b/llvm/test/CodeGen/X86/vector-reduce-xor.ll
index 6122c6ea2104c..b46ee32b3ee78 100644
--- a/llvm/test/CodeGen/X86/vector-reduce-xor.ll
+++ b/llvm/test/CodeGen/X86/vector-reduce-xor.ll
@@ -1564,6 +1564,7 @@ define i32 @PR215069() {
; CHECK-NEXT: xorl %eax, %eax
; CHECK-NEXT: testb %cl, %cl
; CHECK-NEXT: setnp %al
+; CHECK-NEXT: negl %eax
; CHECK-NEXT: ret{{[l|q]}}
%i0 = insertelement <4 x i32> zeroinitializer, i32 0, i64 0
%i1 = xor <4 x i32> %i0, <i32 -1, i32 -1, i32 -1, i32 0>
More information about the llvm-commits
mailing list