r295473 - [OpenMP] Remove barriers at cancel and cancellation point

Hahnfeld, Jonas via cfe-commits cfe-commits at lists.llvm.org
Fri Feb 17 10:52:37 PST 2017


Hi Hans, Alexey,

can we merge this commit and r295474 for the 4.0 release or is it
already too late for that? I will totally understand that and can apply
these commits locally prior to installing.
However, I think that these changes are quite focussed and bear minimal
possibility of introducing regressions.

Thanks,
Jonas

Am Freitag, den 17.02.2017, 18:32 +0000 schrieb Jonas Hahnfeld via cfe-
commits:
> Author: hahnfeld
> Date: Fri Feb 17 12:32:51 2017
> New Revision: 295473
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=295473&view=rev
> Log:
> [OpenMP] Remove barriers at cancel and cancellation point
> 
> This resolves a deadlock with the cancel directive when there is no explicit
> cancellation point. In that case, the implicit barrier acts as cancellation
> point. After removing the barrier after cancel, the now unmatched barrier for
> the explicit cancellation point has to go as well.
> 
> This has probably worked before rL255992: With the calls for the explicit
> barrier, it was sure that all threads passed a barrier before exiting.
> 
> Reported by Simon Convent and Joachim Protze!
> 
> Differential Revision: https://reviews.llvm.org/D30088
> 
> Modified:
>     cfe/trunk/lib/CodeGen/CGOpenMPRuntime.cpp
>     cfe/trunk/test/OpenMP/cancel_codegen.cpp
>     cfe/trunk/test/OpenMP/cancellation_point_codegen.cpp
> 
> Modified: cfe/trunk/lib/CodeGen/CGOpenMPRuntime.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGOpenMPRuntime.cpp?rev=295473&r1=295472&r2=295473&view=diff
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/CGOpenMPRuntime.cpp (original)
> +++ cfe/trunk/lib/CodeGen/CGOpenMPRuntime.cpp Fri Feb 17 12:32:51 2017
> @@ -4724,7 +4724,6 @@ void CGOpenMPRuntime::emitCancellationPo
>        auto *Result = CGF.EmitRuntimeCall(
>            createRuntimeFunction(OMPRTL__kmpc_cancellationpoint), Args);
>        // if (__kmpc_cancellationpoint()) {
> -      //  __kmpc_cancel_barrier();
>        //   exit from construct;
>        // }
>        auto *ExitBB = CGF.createBasicBlock(".cancel.exit");
> @@ -4732,8 +4731,6 @@ void CGOpenMPRuntime::emitCancellationPo
>        auto *Cmp = CGF.Builder.CreateIsNotNull(Result);
>        CGF.Builder.CreateCondBr(Cmp, ExitBB, ContBB);
>        CGF.EmitBlock(ExitBB);
> -      // __kmpc_cancel_barrier();
> -      emitBarrierCall(CGF, Loc, OMPD_unknown, /*EmitChecks=*/false);
>        // exit from construct;
>        auto CancelDest =
>            CGF.getOMPCancelDestination(OMPRegionInfo->getDirectiveKind());
> @@ -4762,7 +4759,6 @@ void CGOpenMPRuntime::emitCancelCall(Cod
>        auto *Result = CGF.EmitRuntimeCall(
>            RT.createRuntimeFunction(OMPRTL__kmpc_cancel), Args);
>        // if (__kmpc_cancel()) {
> -      //  __kmpc_cancel_barrier();
>        //   exit from construct;
>        // }
>        auto *ExitBB = CGF.createBasicBlock(".cancel.exit");
> @@ -4770,8 +4766,6 @@ void CGOpenMPRuntime::emitCancelCall(Cod
>        auto *Cmp = CGF.Builder.CreateIsNotNull(Result);
>        CGF.Builder.CreateCondBr(Cmp, ExitBB, ContBB);
>        CGF.EmitBlock(ExitBB);
> -      // __kmpc_cancel_barrier();
> -      RT.emitBarrierCall(CGF, Loc, OMPD_unknown, /*EmitChecks=*/false);
>        // exit from construct;
>        auto CancelDest =
>            CGF.getOMPCancelDestination(OMPRegionInfo->getDirectiveKind());
> 
> Modified: cfe/trunk/test/OpenMP/cancel_codegen.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/cancel_codegen.cpp?rev=295473&r1=295472&r2=295473&view=diff
> ==============================================================================
> --- cfe/trunk/test/OpenMP/cancel_codegen.cpp (original)
> +++ cfe/trunk/test/OpenMP/cancel_codegen.cpp Fri Feb 17 12:32:51 2017
> @@ -12,6 +12,8 @@ int main (int argc, char **argv) {
>  {
>  #pragma omp cancel parallel if(flag)
>    argv[0][0] = argc;
> +#pragma omp barrier
> +  argv[0][0] += argc;
>  }
>  // CHECK: call void (%ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(
>  #pragma omp sections
> @@ -20,7 +22,6 @@ int main (int argc, char **argv) {
>  }
>  // CHECK: call void @__kmpc_for_static_init_4(
>  // CHECK: call i32 @__kmpc_cancel(
> -// CHECK: call i32 @__kmpc_cancel_barrier(%ident_t*
>  // CHECK: call void @__kmpc_for_static_fini(
>  // CHECK: call void @__kmpc_barrier(%ident_t*
>  #pragma omp sections
> @@ -36,7 +37,6 @@ int main (int argc, char **argv) {
>  // CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
>  // CHECK: br i1 [[CMP]], label %[[EXIT:[^,].+]], label %[[CONTINUE:.+]]
>  // CHECK: [[EXIT]]
> -// CHECK: call i32 @__kmpc_cancel_barrier(%ident_t*
>  // CHECK: br label
>  // CHECK: [[CONTINUE]]
>  // CHECK: br label
> @@ -44,7 +44,6 @@ int main (int argc, char **argv) {
>  // CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
>  // CHECK: br i1 [[CMP]], label %[[EXIT:[^,].+]], label %[[CONTINUE:.+]]
>  // CHECK: [[EXIT]]
> -// CHECK: call i32 @__kmpc_cancel_barrier(%ident_t*
>  // CHECK: br label
>  // CHECK: [[CONTINUE]]
>  // CHECK: br label
> @@ -62,7 +61,6 @@ for (int i = 0; i < argc; ++i) {
>  // CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
>  // CHECK: br i1 [[CMP]], label %[[EXIT:[^,].+]], label %[[CONTINUE:.+]]
>  // CHECK: [[EXIT]]
> -// CHECK: call i32 @__kmpc_cancel_barrier(%ident_t*
>  // CHECK: br label
>  // CHECK: [[CONTINUE]]
>  // CHECK: br label
> @@ -109,9 +107,10 @@ for (int i = 0; i < argc; ++i) {
>  // CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
>  // CHECK: br i1 [[CMP]], label %[[EXIT:[^,]+]],
>  // CHECK: [[EXIT]]
> -// CHECK: call i32 @__kmpc_cancel_barrier(%ident_t*
>  // CHECK: br label %[[RETURN:.+]]
>  // CHECK: [[ELSE]]
> +// The barrier directive should now call __kmpc_cancel_barrier
> +// CHECK: call i32 @__kmpc_cancel_barrier(%ident_t*
>  // CHECK: br label
>  // CHECK: [[RETURN]]
>  // CHECK: ret void
> @@ -121,7 +120,6 @@ for (int i = 0; i < argc; ++i) {
>  // CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
>  // CHECK: br i1 [[CMP]], label %[[EXIT:[^,]+]],
>  // CHECK: [[EXIT]]
> -// CHECK: call i32 @__kmpc_cancel_barrier(%ident_t*
>  // CHECK: br label %[[RETURN:.+]]
>  // CHECK: [[RETURN]]
>  // CHECK: ret i32 0
> @@ -129,7 +127,6 @@ for (int i = 0; i < argc; ++i) {
>  // CHECK: define internal void @{{[^(]+}}(i32* {{[^,]+}}, i32* {{[^,]+}})
>  // CHECK: call void @__kmpc_for_static_init_4(
>  // CHECK: call i32 @__kmpc_cancel(
> -// CHECK: call i32 @__kmpc_cancel_barrier(%ident_t*
>  // CHECK: call void @__kmpc_for_static_fini(
>  // CHECK: ret void
>  
> @@ -139,7 +136,6 @@ for (int i = 0; i < argc; ++i) {
>  // CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
>  // CHECK: br i1 [[CMP]], label %[[EXIT:[^,].+]], label %[[CONTINUE:.+]]
>  // CHECK: [[EXIT]]
> -// CHECK: call i32 @__kmpc_cancel_barrier(%ident_t*
>  // CHECK: br label
>  // CHECK: [[CONTINUE]]
>  // CHECK: br label
> @@ -147,7 +143,6 @@ for (int i = 0; i < argc; ++i) {
>  // CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
>  // CHECK: br i1 [[CMP]], label %[[EXIT:[^,].+]], label %[[CONTINUE:.+]]
>  // CHECK: [[EXIT]]
> -// CHECK: call i32 @__kmpc_cancel_barrier(%ident_t*
>  // CHECK: br label
>  // CHECK: [[CONTINUE]]
>  // CHECK: br label
> @@ -160,7 +155,6 @@ for (int i = 0; i < argc; ++i) {
>  // CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
>  // CHECK: br i1 [[CMP]], label %[[EXIT:[^,].+]], label %[[CONTINUE:.+]]
>  // CHECK: [[EXIT]]
> -// CHECK: call i32 @__kmpc_cancel_barrier(%ident_t*
>  // CHECK: br label
>  // CHECK: [[CONTINUE]]
>  // CHECK: br label
> 
> Modified: cfe/trunk/test/OpenMP/cancellation_point_codegen.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/cancellation_point_codegen.cpp?rev=295473&r1=295472&r2=295473&view=diff
> ==============================================================================
> --- cfe/trunk/test/OpenMP/cancellation_point_codegen.cpp (original)
> +++ cfe/trunk/test/OpenMP/cancellation_point_codegen.cpp Fri Feb 17 12:32:51 2017
> @@ -26,7 +26,6 @@ int main (int argc, char **argv) {
>  // CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
>  // CHECK: br i1 [[CMP]], label %[[EXIT:[^,].+]], label %[[CONTINUE:.+]]
>  // CHECK: [[EXIT]]
> -// CHECK: call i32 @__kmpc_cancel_barrier(%ident_t*
>  // CHECK: br label
>  // CHECK: [[CONTINUE]]
>  // CHECK: br label
> @@ -46,7 +45,6 @@ int main (int argc, char **argv) {
>  // CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
>  // CHECK: br i1 [[CMP]], label %[[EXIT:[^,].+]], label %[[CONTINUE:.+]]
>  // CHECK: [[EXIT]]
> -// CHECK: call i32 @__kmpc_cancel_barrier(%ident_t*
>  // CHECK: br label
>  // CHECK: [[CONTINUE]]
>  // CHECK: br label
> @@ -54,7 +52,6 @@ int main (int argc, char **argv) {
>  // CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
>  // CHECK: br i1 [[CMP]], label %[[EXIT:[^,].+]], label %[[CONTINUE:.+]]
>  // CHECK: [[EXIT]]
> -// CHECK: call i32 @__kmpc_cancel_barrier(%ident_t*
>  // CHECK: br label
>  // CHECK: [[CONTINUE]]
>  // CHECK: br label
> @@ -69,7 +66,6 @@ for (int i = 0; i < argc; ++i) {
>  // CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
>  // CHECK: br i1 [[CMP]], label %[[EXIT:[^,].+]], label %[[CONTINUE:.+]]
>  // CHECK: [[EXIT]]
> -// CHECK: call i32 @__kmpc_cancel_barrier(%ident_t*
>  // CHECK: br label
>  // CHECK: [[CONTINUE]]
>  // CHECK: br label
> @@ -116,7 +112,6 @@ for (int i = 0; i < argc; ++i) {
>  // CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
>  // CHECK: br i1 [[CMP]], label %[[EXIT:[^,]+]],
>  // CHECK: [[EXIT]]
> -// CHECK: call i32 @__kmpc_cancel_barrier(%ident_t*
>  // CHECK: br label %[[RETURN:.+]]
>  // CHECK: [[RETURN]]
>  // CHECK: ret void
> @@ -126,7 +121,6 @@ for (int i = 0; i < argc; ++i) {
>  // CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
>  // CHECK: br i1 [[CMP]], label %[[EXIT:[^,]+]],
>  // CHECK: [[EXIT]]
> -// CHECK: call i32 @__kmpc_cancel_barrier(%ident_t*
>  // CHECK: br label %[[RETURN:.+]]
>  // CHECK: [[RETURN]]
>  // CHECK: ret i32 0
> @@ -137,7 +131,6 @@ for (int i = 0; i < argc; ++i) {
>  // CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
>  // CHECK: br i1 [[CMP]], label %[[EXIT:[^,].+]], label %[[CONTINUE:.+]]
>  // CHECK: [[EXIT]]
> -// CHECK: call i32 @__kmpc_cancel_barrier(%ident_t*
>  // CHECK: br label
>  // CHECK: [[CONTINUE]]
>  // CHECK: br label
> @@ -150,7 +143,6 @@ for (int i = 0; i < argc; ++i) {
>  // CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
>  // CHECK: br i1 [[CMP]], label %[[EXIT:[^,].+]], label %[[CONTINUE:.+]]
>  // CHECK: [[EXIT]]
> -// CHECK: call i32 @__kmpc_cancel_barrier(%ident_t*
>  // CHECK: br label
>  // CHECK: [[CONTINUE]]
>  // CHECK: br label
> @@ -158,7 +150,6 @@ for (int i = 0; i < argc; ++i) {
>  // CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
>  // CHECK: br i1 [[CMP]], label %[[EXIT:[^,].+]], label %[[CONTINUE:.+]]
>  // CHECK: [[EXIT]]
> -// CHECK: call i32 @__kmpc_cancel_barrier(%ident_t*
>  // CHECK: br label
>  // CHECK: [[CONTINUE]]
>  // CHECK: br label
> @@ -171,7 +162,6 @@ for (int i = 0; i < argc; ++i) {
>  // CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
>  // CHECK: br i1 [[CMP]], label %[[EXIT:[^,].+]], label %[[CONTINUE:.+]]
>  // CHECK: [[EXIT]]
> -// CHECK: call i32 @__kmpc_cancel_barrier(%ident_t*
>  // CHECK: br label
>  // CHECK: [[CONTINUE]]
>  // CHECK: br label
> 
> 
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20170217/81f5d531/attachment-0001.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/x-pkcs7-signature
Size: 6055 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20170217/81f5d531/attachment-0001.bin>


More information about the cfe-commits mailing list