TIFitis added inline comments.

================
Comment at: llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h:1561
+  /// should be placed.
+  /// \param HasRegion True if the op has a region associated with it, false
+  /// otherwise
----------------
kiranchandramohan wrote:
> Can't the presence/absence of the BodyGenCB indicate the presence/absence of 
> a region?
The `BodyGenCB` is always present as an argument right? Passing a `nullptr` 
when its not required doesn't seem possible at least when using the 
`BodyGenCallbackTy`. Is there a way to selectively pass the `BodyGenCB`?


================
Comment at: llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp:4052-4060
+  // LLVM utilities like blocks with terminators.
+  auto *UI = Builder.CreateUnreachable();
+  Instruction *ThenTI = UI, *ElseTI = nullptr;
+  if (IfCond) {
+    SplitBlockAndInsertIfThenElse(IfCond, UI, &ThenTI, &ElseTI);
+    ThenTI->getParent()->setName("omp_if.then");
+    ElseTI->getParent()->setName("omp_if.else");
----------------
kiranchandramohan wrote:
> TIFitis wrote:
> > kiranchandramohan wrote:
> > > There is some recent recommendation to not insert artificial instructions 
> > > and remove them. The preferred approach is to use `splitBB` function(s) 
> > > inside the OpenMPIRBuilder. This function works on blocks without 
> > > terminators. You can consult the `IfCondition` code in `createParallel`.
> > Thanks a lot for taking the time to review this lengthy patch.
> > 
> > This one seems a bit tricky to do. At first glance `createParallel` seems 
> > to be doing something different where its calling different runtime 
> > functions based on the `IfCondition` instead of much in the way of Control 
> > Flow changes.
> > 
> > The `unreachable` inst helps out a lot here as it makes it really easy to 
> > keep trace of the resume point for adding instructions after the `BodyGen` 
> > codes are generated.
> > 
> > I am still looking into finding a way to do this elegantly without having 
> > to use the `unreachable` instruction, but would it be a major blocker if we 
> > had to keep it?
> > 
> > I have addressed all the other changes you requested.
> Thanks for explaining the need for the `unreachable`.  I will leave it with 
> you on whether to make the change.
> 
> You can see an instance of a past request for not using temporary 
> instruction. That patch (if for createTask) addressed the issue one way.
> https://reviews.llvm.org/D130615#inline-1257711
> 
> I gave a quick try and came up with the following code. I don't think it is 
> very elegant, but it is one way to do it. 
> ```
> -  // LLVM utilities like blocks with terminators.
> -  auto *UI = Builder.CreateUnreachable();
> +  BasicBlock *ContBB = nullptr;
>    if (IfCond) {
> -    auto *ThenTI =
> -        SplitBlockAndInsertIfThen(IfCond, UI, /* Unreachable */ false);
> -    ThenTI->getParent()->setName("omp_if.then");
> -    Builder.SetInsertPoint(ThenTI);
> -  } else {
> -    Builder.SetInsertPoint(UI);
> +    BasicBlock *EntryBB = Builder.GetInsertBlock();
> +    ContBB = splitBB(Builder, /*CreateBranch*/ false);
> +    BasicBlock *ThenBB =
> +    BasicBlock::Create(Builder.getContext(), EntryBB->getName() + ".if",
> +                       ContBB->getParent(), ContBB);
> +    ContBB->setName(EntryBB->getName() + ".if.end");
> +    Builder.CreateCondBr(IfCond, ThenBB, ContBB);
> +    Builder.SetInsertPoint(ThenBB);
> +    Builder.CreateBr(ContBB);
> +    Builder.SetInsertPoint(ThenBB->getTerminator());
>    }
>  
>    ProcessMapOpCB(Builder.saveIP(), Builder.saveIP());
> @@ -4087,9 +4090,10 @@ OpenMPIRBuilder::InsertPointTy 
> OpenMPIRBuilder::createTargetData(
>      emitMapperCall(Builder.saveIP(), beginMapperFunc, srcLocInfo, 
> MapTypesArg,
>                     MapNamesArg, MapperAllocas, DeviceID, 
> MapTypeFlags.size());
>  
> +    BasicBlock *DataExitBB = splitBB(Builder, true, "target_data.exit");
>      BodyGenCB(Builder.saveIP(), Builder.saveIP());
>  
> -    Builder.SetInsertPoint(UI->getParent());
> +    Builder.SetInsertPoint(DataExitBB, DataExitBB->begin());
>      // Create call to end the data region.
>      emitMapperCall(Builder.saveIP(), endMapperFunc, srcLocInfo, MapTypesArg,
>                     MapNamesArg, MapperAllocas, DeviceID, 
> MapTypeFlags.size());
> @@ -4100,11 +4104,9 @@ OpenMPIRBuilder::InsertPointTy 
> OpenMPIRBuilder::createTargetData(
>                     MapTypeFlags.size());
>    }
>  
> -  // Update the insertion point and remove the terminator we introduced.
> -  Builder.SetInsertPoint(UI->getParent());
> -  if (IfCond)
> -    UI->getParent()->setName("omp_if.end");
> -  UI->eraseFromParent();
> +  if (ContBB)
> +    return {ContBB, ContBB->begin()};
> +
> ```
I saw the other directives were making use of an explicit `ExitBB`, but for 
those directives they always needed to splice the directive into multiple BB's 
anyways.

Since for target data we don't need to splice the BB unless using the `if` 
clause or `target region` are present, I was trying to find a way to do it 
without having to add a new BB at all times. IMO adding an unreachable inst 
that we always remove soon after is better than adding a new BB, but I'd defer 
to you in this case.


================
Comment at: llvm/unittests/Frontend/OpenMPIRBuilderTest.cpp:4915
 
+TEST_F(OpenMPIRBuilderTest, TargetEnterData) {
+  OpenMPIRBuilder OMPBuilder(*M);
----------------
kiranchandramohan wrote:
> In general, we have to test more in these unit tests. At the moment this only 
> tests the `enter data` variant.
The `IRBuilder` part of the code doesn't really generate much code in itself. 
It mainly calls the `BodyGenCB` and `ProcessMapCB`, and makes use of the 
existing `emitMapperCall` function.

Test for `emitMapperCall` is already present in the unit test and the `CB` 
functors are tested through the MLIR test. Thus I've only added a single unit 
test for the `IRBuilder`, would you like me to add a few more?


================
Comment at: 
mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp:1357
+/// Process MapOperands for Target Data directives.
+static LogicalResult processMapOperand(
+    llvm::IRBuilderBase &builder, LLVM::ModuleTranslation &moduleTranslation,
----------------
kiranchandramohan wrote:
> Isn't it possible to sink this whole function into the OpenMPIRBuilder by 
> passing it a list of `mapOpValue` and `mapTypeFlags`?
> `lvm::Value *mapOpValue = moduleTranslation.lookupValue(mapOp);`
> 
> Did i miss something? Or is this in anticipation of more processing required 
> for other types?
I'm not fully sure but we might need more MLIR related things when supporting 
types other than LLVMPointerType. Also there is a call to 
mlir::LLVM::createMappingInformation.

I guess it might still be possible to move most of it to the IRBuilder, would 
you like me to do that?


================
Comment at: 
mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp:1502-1510
+  llvm::OpenMPIRBuilder::LocationDescription ompLoc(builder);
+  llvm::OpenMPIRBuilder::InsertPointTy allocaIP =
+      findAllocaInsertPoint(builder, moduleTranslation);
+
+  struct llvm::OpenMPIRBuilder::MapperAllocas mapperAllocas;
+  SmallVector<uint64_t> mapTypeFlags;
+  SmallVector<llvm::Constant *> mapNames;
----------------
kiranchandramohan wrote:
> Can all this go into the OpenMP IRBuilder? And be passed back if necessary 
> via the callback.
If we decide to move processMapOperand then these can be moved along with it.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D142914/new/

https://reviews.llvm.org/D142914

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to