[llvm] [SelectionDAG] Fold constant min/max vector reductions (PR #209190)
via llvm-commits
llvm-commits at lists.llvm.org
Fri Jul 17 06:49:42 PDT 2026
================
@@ -7808,16 +7833,23 @@ SDValue SelectionDAG::FoldConstantArithmetic(unsigned Opcode, const SDLoc &DL,
if (Opcode == ISD::BITCAST)
return SDValue();
- // Constant fold VECREDUCE_ADD with a BUILD_VECTOR of integer constants.
- if (Opcode == ISD::VECREDUCE_ADD && ISD::isBuildVectorOfConstantSDNodes(N1.getNode())) {
+ // Constant fold integer vector reductions with constant BUILD_VECTORs.
+ if ((Opcode == ISD::VECREDUCE_ADD || Opcode == ISD::VECREDUCE_SMAX ||
+ Opcode == ISD::VECREDUCE_SMIN || Opcode == ISD::VECREDUCE_UMAX ||
+ Opcode == ISD::VECREDUCE_UMIN) &&
+ ISD::isBuildVectorOfConstantSDNodes(N1.getNode())) {
unsigned EltBits = N1.getValueType().getScalarSizeInBits();
- APInt Acc = APInt::getZero(EltBits);
+ unsigned BaseOpcode = ISD::getVecReduceBaseOpcode(Opcode);
+ APInt Acc = getIntegerIdentity(BaseOpcode, EltBits);
for (SDValue Elt : N1->op_values()) {
if (Elt.getOpcode() == ISD::POISON)
return getPOISON(VT);
if (Elt.isUndef() || cast<ConstantSDNode>(Elt)->isOpaque())
return SDValue();
- Acc += cast<ConstantSDNode>(Elt)->getAPIntValue().trunc(EltBits);
+ APInt Value = cast<ConstantSDNode>(Elt)->getAPIntValue().trunc(EltBits);
+ std::optional<APInt> Folded = FoldValue(BaseOpcode, Acc, Value);
+ assert(Folded && "Unexpected vector reduction opcode");
----------------
mygitljf wrote:
Would "Expected vector reduction base opcode to be foldable" better describe the invariant here, since every opcode admitted by the outer condition maps to a base opcode handled by FoldValue?
https://github.com/llvm/llvm-project/pull/209190
More information about the llvm-commits
mailing list