56 mlir::acc::CombinedConstructsTypeAttr combinedAttr,
mlir::Location loc) {
57 mlir::ArrayAttr collapseAttr = mlir::ArrayAttr{};
58 mlir::ArrayAttr collapseDeviceTypeAttr = mlir::ArrayAttr{};
59 auto newLoop = mlir::acc::LoopOp::create(
60 rewriter, loc, origLoop->getResultTypes(), lb, ub, step, inclusiveUBAttr,
61 collapseAttr, collapseDeviceTypeAttr, origLoop.getGangOperands(),
62 origLoop.getGangOperandsArgTypeAttr(),
63 origLoop.getGangOperandsSegmentsAttr(),
64 origLoop.getGangOperandsDeviceTypeAttr(), origLoop.getWorkerNumOperands(),
65 origLoop.getWorkerNumOperandsDeviceTypeAttr(),
66 origLoop.getVectorOperands(), origLoop.getVectorOperandsDeviceTypeAttr(),
67 origLoop.getSeqAttr(), origLoop.getIndependentAttr(),
68 origLoop.getAuto_Attr(), origLoop.getGangAttr(), origLoop.getWorkerAttr(),
70 mlir::ArrayAttr{}, origLoop.getCacheOperands(),
71 origLoop.getPrivateOperands(), origLoop.getFirstprivateOperands(),
72 origLoop.getReductionOperands(), combinedAttr);
78 mlir::acc::LoopOp targetLoop,
94 movedOps.push_back(op);
95 rewriter.startOpModification(op);
98 targetLoop.getBody().getOperations().splice(
99 targetLoop.getBody().getOperations().begin(),
100 sourceLoop.getBody().getOperations(), begin, end);
103 for (
auto [i, newIV] : llvm::enumerate(newIVs))
120 tileLoop, rewriter, lbs, ubs, steps, inclusiveUBAttr,
121 mlir::acc::CombinedConstructsTypeAttr{}, loc);
126 if (tileLoop.hasGang() ||
127 tileLoop.getGangValue(mlir::acc::GangArgType::Num) ||
128 tileLoop.getGangValue(mlir::acc::GangArgType::Dim) ||
129 tileLoop.getGangValue(mlir::acc::GangArgType::Static)) {
130 elementLoop.removeGangAttr();
131 elementLoop.removeGangOperandsArgTypeAttr();
132 elementLoop.removeGangOperandsSegmentsAttr();
133 elementLoop.removeGangOperandsDeviceTypeAttr();
134 elementLoop.getGangOperandsMutable().clear();
136 if (tileLoop.hasVector() || tileLoop.getVectorValue()) {
137 elementLoop.removeWorkerAttr();
138 elementLoop.removeWorkerNumOperandsDeviceTypeAttr();
139 elementLoop.getWorkerNumOperandsMutable().clear();
145 elementLoop.getRegion().begin());
147 mlir::acc::YieldOp::create(rewriter, loc);
149 elementLoop.getBody().addArgument(ivType, loc);
163 const unsigned tileCount = tileSizes.size();
168 const unsigned numIVs = origIVs.size();
169 const size_t nOps = tileLoop.getBody().getOperations().size();
173 for (
unsigned i = 0; i < numIVs; ++i) {
174 if (tileLoop.getInclusiveUpperboundAttr())
175 inclusiveUBs.push_back(
176 tileLoop.getInclusiveUpperboundAttr().asArrayRef()[i]);
178 inclusiveUBs.push_back(
false);
186 for (
unsigned i = 0; i < numIVs; ++i) {
189 tileSizes[i], defaultTileSize, origSteps[i].
getType(), rewriter, loc);
191 mlir::arith::MulIOp::create(rewriter, loc, origSteps[i], tileSize);
192 scaledSteps.push_back(scaled);
193 tileLoopSteps.push_back(scaled);
195 tileLoopSteps.push_back(origSteps[i]);
207 for (
unsigned i = 0; i < tileCount; ++i) {
209 mlir::arith::AddIOp::create(rewriter, loc, origIVs[i], scaledSteps[i]);
215 auto inclusiveEdge = [&](
bool descending) ->
mlir::Value {
216 if (!inclusiveUBs[i])
221 return mlir::arith::AddIOp::create(rewriter, loc, stepped, c1);
222 return mlir::arith::SubIOp::create(rewriter, loc, stepped, c1);
226 if (constStep && *constStep < 0) {
227 elemUB = mlir::arith::MaxSIOp::create(rewriter, loc, origUBs[i],
228 inclusiveEdge(
true));
229 }
else if (constStep) {
230 elemUB = mlir::arith::MinSIOp::create(
231 rewriter, loc, origUBs[i], inclusiveEdge(
false));
234 mlir::Type origStepTy = origSteps[i].getType();
235 mlir::Value zero = mlir::arith::ConstantOp::create(
236 rewriter, loc, origStepTy, rewriter.
getIntegerAttr(origStepTy, 0));
237 mlir::Value isDescending = mlir::arith::CmpIOp::create(
238 rewriter, loc, mlir::arith::CmpIPredicate::slt, origSteps[i], zero);
240 rewriter, loc, origUBs[i], inclusiveEdge(
true));
242 rewriter, loc, origUBs[i], inclusiveEdge(
false));
243 elemUB = mlir::arith::SelectOp::create(rewriter, loc, isDescending,
246 elemUBs.push_back(elemUB);
247 elemLBs.push_back(origIVs[i]);
248 elemSteps.push_back(origSteps[i]);
249 elemIVTypes.push_back(origIVs[i].
getType());
250 elemInclusiveUBs.push_back(inclusiveUBs[i]);
256 if (llvm::is_contained(elemInclusiveUBs,
true))
260 mlir::acc::LoopOp elementLoop =
262 elemInclAttr, elemIVTypes, loc);
267 elementLoop.getBody().getArguments());
269 origIVs.begin() + tileCount);
275 tileLoop.getStepMutable().clear();
276 tileLoop.getStepMutable().append(tileLoopSteps);