[Mlir-commits] [mlir] [MLIR][XeGPU] Add Layout Propagation support for multi-reduction/reduction op with scalar result (PR #189133)
Jianhui Li
llvmlistbot at llvm.org
Wed Apr 1 11:02:00 PDT 2026
================
@@ -625,27 +632,38 @@ void LayoutInfoPropagation::visitVectorMultiReductionOp(
vector::MultiDimReductionOp reduction,
ArrayRef<LayoutInfoLattice *> operands,
ArrayRef<const LayoutInfoLattice *> results) {
+ Type resultTy = reduction.getDestType();
// The layout of the result must be present.
LayoutInfo resLayoutInfo = results[0]->getValue();
- if (!resLayoutInfo.isAssigned())
- return;
+
+ xegpu::DistributeLayoutAttr consumerLayoutAttr;
+ if (!resultTy.isIntOrFloat()) {
+ if (!resLayoutInfo.isAssigned())
+ return;
+ consumerLayoutAttr =
+ dyn_cast<xegpu::DistributeLayoutAttr>(resLayoutInfo.get());
+ }
VectorType sourceTy = reduction.getSourceVectorType();
SmallVector<int64_t> reductionDims(reduction.getReductionDims());
const uArch *uArch = getUArch(xegpu::getChipStr(reduction).value_or(""));
if (!uArch)
return;
- auto consumerLayoutAttr =
- dyn_cast<xegpu::DistributeLayoutAttr>(resLayoutInfo.get());
+ int numSg = 0;
+ if (layoutKind == xegpu::LayoutKind::Subgroup) {
+ auto numSgOrErr = getNumSg(reduction, uArch->getSubgroupSize());
+ if (succeeded(numSgOrErr))
+ numSg = numSgOrErr.value();
+ }
// The result layout represents the layout requirements of the operation.
// it is recorded to anchor layout or temporary layout.
// it must be honored for current op and may conflict with the layout
// propagated from consumer op, the conflict is resolved in later phase by
// converting the required result layout to the consumer layout
auto requiredResLayoutAttr = xegpu::setupMultiReductionResultLayout(
- layoutKind, sourceTy, consumerLayoutAttr, reductionDims, uArch);
+ layoutKind, sourceTy, consumerLayoutAttr, reductionDims, numSg, uArch);
----------------
Jianhui-Li wrote:
it is not used.
https://github.com/llvm/llvm-project/pull/189133
More information about the Mlir-commits
mailing list