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);
187 for (
unsigned i = 0; i < numIVs; ++i) {
191 origSteps[i].
getType(), rewriter, loc);
193 mlir::arith::MulIOp::create(rewriter, loc, origSteps[i], tileSize);
194 scaledSteps.push_back(scaled);
195 tileLoopSteps.push_back(scaled);
197 tileLoopSteps.push_back(origSteps[i]);
209 for (
unsigned i = 0; i < tileCount; ++i) {
211 mlir::arith::AddIOp::create(rewriter, loc, origIVs[i], scaledSteps[i]);
217 auto inclusiveEdge = [&](
bool descending) ->
mlir::Value {
218 if (!inclusiveUBs[i])
223 return mlir::arith::AddIOp::create(rewriter, loc, stepped, c1);
224 return mlir::arith::SubIOp::create(rewriter, loc, stepped, c1);
228 if (constStep && *constStep < 0) {
229 elemUB = mlir::arith::MaxSIOp::create(rewriter, loc, origUBs[i],
230 inclusiveEdge(
true));
231 }
else if (constStep) {
232 elemUB = mlir::arith::MinSIOp::create(
233 rewriter, loc, origUBs[i], inclusiveEdge(
false));
236 mlir::Type origStepTy = origSteps[i].getType();
237 mlir::Value zero = mlir::arith::ConstantOp::create(
238 rewriter, loc, origStepTy, rewriter.
getIntegerAttr(origStepTy, 0));
239 mlir::Value isDescending = mlir::arith::CmpIOp::create(
240 rewriter, loc, mlir::arith::CmpIPredicate::slt, origSteps[i], zero);
242 rewriter, loc, origUBs[i], inclusiveEdge(
true));
244 rewriter, loc, origUBs[i], inclusiveEdge(
false));
245 elemUB = mlir::arith::SelectOp::create(rewriter, loc, isDescending,
248 elemUBs.push_back(elemUB);
249 elemLBs.push_back(origIVs[i]);
250 elemSteps.push_back(origSteps[i]);
251 elemIVTypes.push_back(origIVs[i].
getType());
252 elemInclusiveUBs.push_back(inclusiveUBs[i]);
258 if (llvm::is_contained(elemInclusiveUBs,
true))
262 mlir::acc::LoopOp elementLoop =
264 elemInclAttr, elemIVTypes, loc);
269 elementLoop.getBody().getArguments());
271 origIVs.begin() + tileCount);
277 tileLoop.getStepMutable().clear();
278 tileLoop.getStepMutable().append(tileLoopSteps);