================
@@ -5272,36 +5682,53 @@ static void emitTargetCall(OpenMPIRBuilder &OMPBuilder, 
IRBuilderBase &Builder,
   Value *DynCGGroupMem = Builder.getInt32(0);
 
   bool HasNoWait = false;
+  bool HasDependencies = Dependencies.size() > 0;
+  bool RequiresOuterTargetTask = HasNoWait || HasDependencies;
 
   OpenMPIRBuilder::TargetKernelArgs KArgs(NumTargetItems, RTArgs, 
NumIterations,
                                           NumTeamsVal, NumThreadsVal,
                                           DynCGGroupMem, HasNoWait);
 
-  Builder.restoreIP(OMPBuilder.emitKernelLaunch(
-      Builder, OutlinedFn, OutlinedFnID, EmitTargetCallFallbackCB, KArgs,
-      DeviceID, RTLoc, AllocaIP));
+  // The presence of certain clauses on the target directive require the
+  // explicit generation of the target task.
+  if (RequiresOuterTargetTask) {
+    OMPBuilder.emitTargetTask(OutlinedFn, OutlinedFnID,
----------------
bhandarkar-pranav wrote:

Thanks for point this out. I want to use this opportunity to understand this 
idiom I see all around in `OMPIRBuilder.cpp` which is 
``Builder.restoreIP(FunctThatReturnsInsertPointTy())``. Now, if the only return 
from `FuncThatReturnsInsertPointTy` is `Builder.saveIP()`, then do I need a 
call to `Builder.restoreIP()` on return ? Because `emitTargetTask()` returns 
`Builder.saveIP()`, which, in other words, means it is returning the state of 
the Builder's insert point. We then restore the same `Builder` to that insert 
point which sounds redundant. However, I see this in a number of places in 
`OMPIRBuilder.cpp`

https://github.com/llvm/llvm-project/pull/93977
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to