================
@@ -1800,8 +1779,18 @@ OpenMPIRBuilder::InsertPointOrErrorTy 
OpenMPIRBuilder::createParallel(
   Instruction *PRegPreFiniTI = PRegPreFiniBB->getTerminator();
 
   InsertPointTy PreFiniIP(PRegPreFiniBB, PRegPreFiniTI->getIterator());
-  if (Error Err = FiniCB(PreFiniIP))
-    return Err;
+  if (!FiniInfo.FiniBB) {
+    if (Error Err = FiniCB(PreFiniIP))
----------------
tblah wrote:

The finalisation basic block could have already been created if the body of the 
parallel operation contained a cancellation point or cancel. In that case we 
should just branch straight to the block created previously. I agree the 
control flow with all of the callbacks and the cancellation stack are a bit 
hard to follow. This is not new with this patch.

In most cases, no cancellation will have already created a finalisation block 
so finalisation should be generated right here as was done before this patch.

The intention here is to only run the finalisation callback once and have all 
exists branch to that one instance (and also to include the barrier in that 
unique exit so that all threads block on the same barrier).

https://github.com/llvm/llvm-project/pull/164586
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to