[Mlir-commits] [llvm] [mlir] [MLIR][OpenMP] Add Taskloop Collapse Support (PR #175924)
Tom Eccles
llvmlistbot at llvm.org
Wed Jan 14 06:04:54 PST 2026
================
@@ -2360,29 +2361,42 @@ OpenMPIRBuilder::InsertPointOrErrorTy OpenMPIRBuilder::createTaskloop(
Builder.SetInsertPoint(CLI->getBody(),
CLI->getBody()->getFirstInsertionPt());
- // The canonical loop is generated with a fixed lower bound. We need to
- // update the index calculation code to use the task's lower bound. The
- // generated code looks like this:
- // %omp_loop.iv = phi ...
- // ...
- // %tmp = mul [type] %omp_loop.iv, step
- // %user_index = add [type] tmp, lb
- // OpenMPIRBuilder constructs canonical loops to have exactly three uses of
- // the normalised induction variable:
- // 1. This one: converting the normalised IV to the user IV
- // 2. The increment (add)
- // 3. The comparison against the trip count (icmp)
- // (1) is the only use that is a mul followed by an add so this cannot match
- // other IR.
- assert(CLI->getIndVar()->getNumUses() == 3 &&
- "Canonical loop should have exactly three uses of the ind var");
- for (User *IVUser : CLI->getIndVar()->users()) {
- if (auto *Mul = dyn_cast<BinaryOperator>(IVUser)) {
- if (Mul->getOpcode() == Instruction::Mul) {
- for (User *MulUser : Mul->users()) {
- if (auto *Add = dyn_cast<BinaryOperator>(MulUser)) {
- if (Add->getOpcode() == Instruction::Add) {
- Add->setOperand(1, CastedTaskLB);
+ if (NumOfCollapseLoops > 1) {
+ // When using the collapse clause, the bounds of the loop have to be
+ // adjusted to
+ Value *IVPlusTaskLB = Builder.CreateAdd(
+ CLI->getIndVar(),
+ Builder.CreateSub(CastedTaskLB, ConstantInt::get(IVTy, 1)));
+ for (User *IVUser : CLI->getIndVar()->users()) {
+ if (IVUser == IVPlusTaskLB)
+ continue;
+ IVUser->replaceUsesOfWith(CLI->getIndVar(), IVPlusTaskLB);
+ }
----------------
tblah wrote:
Could a similar solution also handle the else case?
https://github.com/llvm/llvm-project/pull/175924
More information about the Mlir-commits
mailing list