Emit reduction during op vectorization instead of doing it when creating the transfer write. This allow us to not broadcast output arguments for reduction initial value.
Details
Diff Detail
Event Timeline
mlir/lib/Dialect/Linalg/Transforms/Vectorization.cpp | ||
---|---|---|
389 | This "fused" loop structure feels quite unnatural. I'd rather structure the code like: SmallVector<Value> reducedValues, operands; for (Value operand : ...) { ... if (reducedValue) { reducedValues.push_back(reducedValue); operands.push_back(operand); } } assert(reducedValues.size() <= 1); ... etc | |
403 | "reduce only if needed" sounds exactly like reduceIfNeeded. | |
405 | is this check only for avoid interfering with the specific path of contraction vectorization? |
mlir/lib/Dialect/Linalg/Transforms/Vectorization.cpp | ||
---|---|---|
397 | reductionOps may contain multiple ops. Actually, I think we are not even using reductionOps anywhere here? I think this is bringing back the problem I was trying to solve with the matchReduction utility: detecting reductions with multiple ops. |
mlir/lib/Dialect/Linalg/Transforms/Vectorization.cpp | ||
---|---|---|
397 | Right, we currently check that there is only a single op in matchReduction otherwise it fails. This wouldn't work otherwise indeed, maybe we need an assert. Here op will be the same as reductionOps[0], probably worth an assert too. |
This "fused" loop structure feels quite unnatural.
Maybe they are not possible in practice but it looks like there is a possible path where one operand passes all the checks and then we hit return; that would def. sound fishy.
I'd rather structure the code like: