[PATCH] D38371: [OpenMP] Initial implementation of teams distribute code generation

2017-10-04 Thread Carlo Bertolli via Phabricator via cfe-commits
carlo.bertolli closed this revision.
carlo.bertolli added a comment.

Committed revision 314905.


Repository:
  rL LLVM

https://reviews.llvm.org/D38371



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


[PATCH] D43513: [OpenMP] Limit reduction support for pragma 'distribute' when combined with pragma 'simd'

2018-02-20 Thread Carlo Bertolli via Phabricator via cfe-commits
carlo.bertolli created this revision.
carlo.bertolli added a reviewer: ABataev.
Herald added a subscriber: guansong.

This is a bug fix that removes the emission of reduction support for pragma 
'distribute' when found alone or in combinations without simd.
Pragma 'distribute' does not have a reduction clause, but when combined with 
pragma 'simd' we need to emit the support for simd's reduction clause as part 
of code generation for distribute. This guard is similar to the one used for 
reduction support earlier in the same code gen function.


Repository:
  rC Clang

https://reviews.llvm.org/D43513

Files:
  lib/CodeGen/CGStmtOpenMP.cpp


Index: lib/CodeGen/CGStmtOpenMP.cpp
===
--- lib/CodeGen/CGStmtOpenMP.cpp
+++ lib/CodeGen/CGStmtOpenMP.cpp
@@ -3358,26 +3358,30 @@
   CGF.EmitLoadOfScalar(IL, S.getLocStart()));
 });
   }
-  OpenMPDirectiveKind ReductionKind = OMPD_unknown;
-  if (isOpenMPParallelDirective(S.getDirectiveKind()) &&
-  isOpenMPSimdDirective(S.getDirectiveKind())) {
-ReductionKind = OMPD_parallel_for_simd;
-  } else if (isOpenMPParallelDirective(S.getDirectiveKind())) {
-ReductionKind = OMPD_parallel_for;
-  } else if (isOpenMPSimdDirective(S.getDirectiveKind())) {
-ReductionKind = OMPD_simd;
-  } else if (!isOpenMPTeamsDirective(S.getDirectiveKind()) &&
- S.hasClausesOfKind()) {
-llvm_unreachable(
-"No reduction clauses is allowed in distribute directive.");
+  if (isOpenMPSimdDirective(S.getDirectiveKind()) &&
+  !isOpenMPParallelDirective(S.getDirectiveKind()) &&
+  !isOpenMPTeamsDirective(S.getDirectiveKind())) {
+OpenMPDirectiveKind ReductionKind = OMPD_unknown;
+if (isOpenMPParallelDirective(S.getDirectiveKind()) &&
+isOpenMPSimdDirective(S.getDirectiveKind())) {
+  ReductionKind = OMPD_parallel_for_simd;
+} else if (isOpenMPParallelDirective(S.getDirectiveKind())) {
+  ReductionKind = OMPD_parallel_for;
+} else if (isOpenMPSimdDirective(S.getDirectiveKind())) {
+  ReductionKind = OMPD_simd;
+} else if (!isOpenMPTeamsDirective(S.getDirectiveKind()) &&
+   S.hasClausesOfKind()) {
+  llvm_unreachable(
+  "No reduction clauses is allowed in distribute directive.");
+}
+EmitOMPReductionClauseFinal(S, ReductionKind);
+// Emit post-update of the reduction variables if IsLastIter != 0.
+emitPostUpdateForReductionClause(
+*this, S, [&](CodeGenFunction &CGF) -> llvm::Value * {
+  return CGF.Builder.CreateIsNotNull(
+  CGF.EmitLoadOfScalar(IL, S.getLocStart()));
+});
   }
-  EmitOMPReductionClauseFinal(S, ReductionKind);
-  // Emit post-update of the reduction variables if IsLastIter != 0.
-  emitPostUpdateForReductionClause(
-  *this, S, [&](CodeGenFunction &CGF) -> llvm::Value * {
-return CGF.Builder.CreateIsNotNull(
-CGF.EmitLoadOfScalar(IL, S.getLocStart()));
-  });
   // Emit final copy of the lastprivate variables if IsLastIter != 0.
   if (HasLastprivateClause) {
 EmitOMPLastprivateClauseFinal(


Index: lib/CodeGen/CGStmtOpenMP.cpp
===
--- lib/CodeGen/CGStmtOpenMP.cpp
+++ lib/CodeGen/CGStmtOpenMP.cpp
@@ -3358,26 +3358,30 @@
   CGF.EmitLoadOfScalar(IL, S.getLocStart()));
 });
   }
-  OpenMPDirectiveKind ReductionKind = OMPD_unknown;
-  if (isOpenMPParallelDirective(S.getDirectiveKind()) &&
-  isOpenMPSimdDirective(S.getDirectiveKind())) {
-ReductionKind = OMPD_parallel_for_simd;
-  } else if (isOpenMPParallelDirective(S.getDirectiveKind())) {
-ReductionKind = OMPD_parallel_for;
-  } else if (isOpenMPSimdDirective(S.getDirectiveKind())) {
-ReductionKind = OMPD_simd;
-  } else if (!isOpenMPTeamsDirective(S.getDirectiveKind()) &&
- S.hasClausesOfKind()) {
-llvm_unreachable(
-"No reduction clauses is allowed in distribute directive.");
+  if (isOpenMPSimdDirective(S.getDirectiveKind()) &&
+  !isOpenMPParallelDirective(S.getDirectiveKind()) &&
+  !isOpenMPTeamsDirective(S.getDirectiveKind())) {
+OpenMPDirectiveKind ReductionKind = OMPD_unknown;
+if (isOpenMPParallelDirective(S.getDirectiveKind()) &&
+isOpenMPSimdDirective(S.getDirectiveKind())) {
+  ReductionKind = OMPD_parallel_for_simd;
+} else if (isOpenMPParallelDirective(S.getDirectiveKind())) {
+  ReductionKind = OMPD_parallel_for;
+} else if (isOpenMPSimdDirective(S.getDirectiveKind())) {
+  ReductionKind = OMPD_simd;
+} else if (!isOpenMPTeamsDirective(S.getDirectiveKind()) &&
+   S.hasClausesO

[PATCH] D43513: [OpenMP] Limit reduction support for pragma 'distribute' when combined with pragma 'simd'

2018-02-22 Thread Carlo Bertolli via Phabricator via cfe-commits
carlo.bertolli updated this revision to Diff 135429.
carlo.bertolli added a comment.

[OpenMP] Add regression test: this verifies that only one call to the runtime 
for reduction is done in a combined construct with distribute, without simd, 
and with at least one pragma accepting reduction as a clause.


Repository:
  rC Clang

https://reviews.llvm.org/D43513

Files:
  lib/CodeGen/CGStmtOpenMP.cpp
  test/OpenMP/distribute_parallel_for_reduction_codegen.cpp

Index: test/OpenMP/distribute_parallel_for_reduction_codegen.cpp
===
--- /dev/null
+++ test/OpenMP/distribute_parallel_for_reduction_codegen.cpp
@@ -0,0 +1,84 @@
+// Test host code gen
+
+// RUN: %clang_cc1  -verify -fopenmp -fopenmp-version=45 -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -o - | FileCheck %s --check-prefix CHECK --check-prefix CHECK-64
+// RUN: %clang_cc1  -fopenmp -fopenmp-version=45 -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-pch -o %t %s
+// RUN: %clang_cc1  -fopenmp -fopenmp-version=45 -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --check-prefix CHECK --check-prefix CHECK-64
+// RUN: %clang_cc1  -verify -fopenmp -fopenmp-version=45 -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-llvm %s -o - | FileCheck %s --check-prefix CHECK --check-prefix CHECK-32
+// RUN: %clang_cc1  -fopenmp -fopenmp-version=45 -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-pch -o %t %s
+// RUN: %clang_cc1  -fopenmp -fopenmp-version=45 -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --check-prefix CHECK --check-prefix CHECK-32
+
+// RUN: %clang_cc1  -verify -fopenmp-simd -fopenmp-version=45 -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -o - | FileCheck --check-prefix SIMD-ONLY1 %s
+// RUN: %clang_cc1  -fopenmp-simd -fopenmp-version=45 -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-pch -o %t %s
+// RUN: %clang_cc1  -fopenmp-simd -fopenmp-version=45 -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck --check-prefix SIMD-ONLY1 %s
+// RUN: %clang_cc1  -verify -fopenmp-simd -fopenmp-version=45 -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-llvm %s -o - | FileCheck --check-prefix SIMD-ONLY1 %s
+// RUN: %clang_cc1  -fopenmp-simd -fopenmp-version=45 -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-pch -o %t %s
+// RUN: %clang_cc1  -fopenmp-simd -fopenmp-version=45 -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck --check-prefix SIMD-ONLY1 %s
+// SIMD-ONLY1-NOT: {{__kmpc|__tgt}}
+// expected-no-diagnostics
+#ifndef HEADER
+#define HEADER
+
+
+template 
+T tmain(T &r) {
+  int n = 1000;  
+  // schedule: dynamic chunk
+  #pragma omp target map(tofrom:r)
+  #pragma omp teams
+  #pragma omp distribute parallel for reduction(+:r)
+  for (int i = 0; i < n; ++i)
+r += (T)i;  
+
+  return r;
+}
+
+int main() {
+  int n = 1000;
+  int r = 0;
+  #pragma omp target map(tofrom:r)
+  #pragma omp teams
+  #pragma omp distribute parallel for reduction(+:r)
+  for (int i = 0; i < n; ++i)
+r += i;
+
+  return tmain(r);
+}
+
+// CHECK-LABEL: main
+// CHECK: call{{.+}} @__tgt_target_teams(
+// CHECK: call void [[OFFL:@.+]](
+// CHECK: call{{.+}} [[TMAIN:@.+]](i{{32|64}}
+// CHECK: ret
+
+// CHECK: define{{.+}} [[OFFL]](
+// CHECK: call{{.+}} @__kmpc_fork_teams({{.+}}, {{.+}}, {{.+}} [[TEOUTL:@.+]] to{{.+}}
+// CHECK: ret void
+
+// CHECK: define{{.+}} [[TEOUTL]](
+// CHECK: call{{.+}} @__kmpc_fork_call({{.+}}, {{.+}}, {{.+}} [[PAROUTL:@.+]] to{{.+}}
+// CHECK: ret void
+
+// CHECK: define{{.+}} [[PAROUTL]](
+// CHECK: call{{.+}} @__kmpc_reduce_nowait(
+// CHECK: call{{.+}} @__kmpc_end_reduce_nowait(
+// CHECK: ret void
+
+// CHECK: define{{.+}} [[TMAIN]](i{{32|64}}
+// CHECK: call{{.+}} @__tgt_target_teams(
+// CHECK: call void [[TOFFL:@.+]](
+// CHECK: ret
+
+// CHECK: define{{.+}} [[TOFFL]](
+// CHECK: call{{.+}} @__kmpc_fork_teams({{.+}}, {{.+}}, {{.+}} [[TEMPLTEOUTL:@.+]] to{{.+}}
+// CHECK: ret void
+
+// CHECK: define{{.+}} [[TEMPLTEOUTL]](
+// CHECK: call{{.+}} @__kmpc_fork_call({{.+}}, {{.+}}, {{.+}} [[TPAROUTL:@.+]] to{{.+}}
+// CHECK: ret void
+
+// CHECK: define{{.+}} [[TPAROUTL]](
+// CHECK: call{{.+}} @__kmpc_reduce_nowait(
+// CHECK: call{{.+}} @__kmpc_end_reduce_nowait(
+// CHECK: ret void
+
+#endif 

[PATCH] D41709: [OpenMP] Initial implementation of code generation for pragma 'target teams distribute parallel for' on host

2018-01-03 Thread Carlo Bertolli via Phabricator via cfe-commits
carlo.bertolli closed this revision.
carlo.bertolli added a comment.

Committed revision 321759.


Repository:
  rC Clang

https://reviews.llvm.org/D41709



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


[PATCH] D43852: [OpenMP] Extend NVPTX SPMD implementation of combined constructs

2018-02-27 Thread Carlo Bertolli via Phabricator via cfe-commits
carlo.bertolli created this revision.
carlo.bertolli added a reviewer: ABataev.
Herald added subscribers: guansong, jholewinski.

This patch extends the SPMD implementation to all target constructs and guards 
this implementation under a new flag.


Repository:
  rC Clang

https://reviews.llvm.org/D43852

Files:
  include/clang/Basic/LangOptions.def
  include/clang/Driver/Options.td
  lib/CodeGen/CGOpenMPRuntimeNVPTX.cpp
  lib/CodeGen/CGStmtOpenMP.cpp
  lib/Driver/ToolChains/Clang.cpp
  lib/Frontend/CompilerInvocation.cpp
  test/OpenMP/nvptx_target_parallel_codegen.cpp
  test/OpenMP/nvptx_target_parallel_num_threads_codegen.cpp
  test/OpenMP/nvptx_target_parallel_proc_bind_codegen.cpp
  test/OpenMP/nvptx_target_parallel_reduction_codegen.cpp
  test/OpenMP/nvptx_target_simd_codegen.cpp
  test/OpenMP/nvptx_target_teams_distribute_parallel_for_codegen.cpp
  test/OpenMP/nvptx_target_teams_distribute_parallel_for_simd_codegen.cpp
  test/OpenMP/nvptx_target_teams_distribute_simd_codegen.cpp
  test/OpenMP/target_parallel_debug_codegen.cpp
  test/OpenMP/target_parallel_for_debug_codegen.cpp

Index: test/OpenMP/target_parallel_for_debug_codegen.cpp
===
--- test/OpenMP/target_parallel_for_debug_codegen.cpp
+++ test/OpenMP/target_parallel_for_debug_codegen.cpp
@@ -1,5 +1,5 @@
-// RUN: %clang_cc1 -DCK1 -verify -fopenmp -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=nvptx64-nvidia-cuda -emit-llvm-bc %s -o %t-ppc-host.bc
-// RUN: %clang_cc1 -DCK1 -verify -fopenmp -x c++ -triple nvptx64-unknown-unknown -fopenmp-targets=nvptx64-nvidia-cuda -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-ppc-host.bc -o - -debug-info-kind=limited | FileCheck %s
+// RUN: %clang_cc1 -DCK1 -verify -fopenmp -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=nvptx64-nvidia-cuda -fopenmp-cuda-mode -emit-llvm-bc %s -o %t-ppc-host.bc
+// RUN: %clang_cc1 -DCK1 -verify -fopenmp -x c++ -triple nvptx64-unknown-unknown -fopenmp-targets=nvptx64-nvidia-cuda -fopenmp-cuda-mode -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-ppc-host.bc -o - -debug-info-kind=limited | FileCheck %s
 // expected-no-diagnostics
 
 int main() {
Index: test/OpenMP/target_parallel_debug_codegen.cpp
===
--- test/OpenMP/target_parallel_debug_codegen.cpp
+++ test/OpenMP/target_parallel_debug_codegen.cpp
@@ -1,5 +1,5 @@
-// RUN: %clang_cc1 -DCK1 -verify -fopenmp -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=nvptx64-nvidia-cuda -emit-llvm-bc %s -o %t-ppc-host.bc
-// RUN: %clang_cc1 -DCK1 -verify -fopenmp -x c++ -triple nvptx64-unknown-unknown -fopenmp-targets=nvptx64-nvidia-cuda -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-ppc-host.bc -o - -debug-info-kind=limited | FileCheck %s
+// RUN: %clang_cc1 -DCK1 -verify -fopenmp -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=nvptx64-nvidia-cuda -fopenmp-cuda-mode -emit-llvm-bc %s -o %t-ppc-host.bc
+// RUN: %clang_cc1 -DCK1 -verify -fopenmp -x c++ -triple nvptx64-unknown-unknown -fopenmp-targets=nvptx64-nvidia-cuda -fopenmp-cuda-mode -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-ppc-host.bc -o - -debug-info-kind=limited | FileCheck %s
 // expected-no-diagnostics
 
 int main() {
Index: test/OpenMP/nvptx_target_teams_distribute_simd_codegen.cpp
===
--- /dev/null
+++ test/OpenMP/nvptx_target_teams_distribute_simd_codegen.cpp
@@ -0,0 +1,99 @@
+// Test target codegen - host bc file has to be created first.
+// RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=45 -fopenmp-cuda-mode -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=nvptx64-nvidia-cuda -emit-llvm-bc %s -o %t-ppc-host.bc
+// RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=45 -fopenmp-cuda-mode -x c++ -triple nvptx64-unknown-unknown -fopenmp-targets=nvptx64-nvidia-cuda -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-ppc-host.bc -o - | FileCheck %s --check-prefix CHECK --check-prefix CHECK-64
+// RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=45 -fopenmp-cuda-mode -x c++ -triple i386-unknown-unknown -fopenmp-targets=nvptx-nvidia-cuda -emit-llvm-bc %s -o %t-x86-host.bc
+// RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=45 -fopenmp-cuda-mode -x c++ -triple nvptx-unknown-unknown -fopenmp-targets=nvptx-nvidia-cuda -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-x86-host.bc -o - | FileCheck %s --check-prefix CHECK --check-prefix CHECK-32
+// RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=45 -fopenmp-cuda-mode -fexceptions -fcxx-exceptions -x c++ -triple nvptx-unknown-unknown -fopenmp-targets=nvptx-nvidia-cuda -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-x86-host.bc -o - | FileCheck %s --check-prefix CHECK --check-prefix CHECK-32
+// expected-no-diagnostics
+#ifndef HEADER
+#define HEADER
+
+// Check that the execution mode o

[PATCH] D40795: [OpenMP] Initial implementation of code generation for pragma 'teams distribute parallel for simd' on host

2017-12-04 Thread Carlo Bertolli via Phabricator via cfe-commits
carlo.bertolli closed this revision.
carlo.bertolli added a comment.

Committed revision 319696.


Repository:
  rC Clang

https://reviews.llvm.org/D40795



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


[PATCH] D102449: [WIP][Clang][OpenMP] Add the support for compare clause in atomic directive

2021-09-17 Thread Carlo Bertolli via Phabricator via cfe-commits
carlo.bertolli added a comment.

In D102449#2977711 , @tianshilei1992 
wrote:

> Another thing is how we deal with a corner case. Say the OpenMP code is 
> written in the following way:
>
>   #pragma omp atomic compare
> x = e < x ? e : x;
>
> That's how OpenMP spec defines the atomic operation. `x` is always in "else 
> statement" of a conditional statement.
>
> Now we need to lower it to LLVM IR, which is `atomicrmw` operation. Based on 
> the LLVM IR reference, it only supports the atomic operations that `x` is in 
> the "then statement". For example: `x = x > e ? x : e`. See the `x` here is 
> before `:`. In order to lower the OpenMP statement, we have to do a 
> transformation. In order to swap `e` and `x`, we need to transform it to `x = 
> e >= x : x : e`, a.k.a. `x = x <= e : x : e`. However, we don't have an 
> atomic operation for `<=`. We only have `<`. So if `x != e`, the result is 
> good.
>
> The incorrectness happens if `x == e`. Recall at the OpenMP statement, when 
> `x == e`, the result should be `x = x`. But if we look at our lowered LLVM 
> IR, `x = x < e : x : e`, when `x == e`, it becomes `x = e`, which doesn't 
> conform with OpenMP spec.
>
> What should we do here?

There seems to be an imbalance in the OpenMP specs, where I would have written 
something like the followin (page 268 or 5.1 spec's):

> x = expr ordop x ? expr : x;
> x = x ordop expr ? **x : expr**;

I tried thinking about a compact solution to your problem, including trying to 
take advantage of the fact that when x == e we don't need to actually do the 
assignment (page 272 line 17 of 5.1 spec's and see below), but I was 
unsuccessful.
Did you consider special casing this transforming it into the equivalent:
#pragma omp critical
{ if (x > e) x = e; }
?

Remember:

> For forms where statement is cond-expr-stmt, if the result of the condition 
> implies that the value of x
> does not change then the update may not occur.

The right thing to do would be to fix the spec's, but that can't happen until 
5.2.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D102449

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


[PATCH] D102449: [WIP][Clang][OpenMP] Add the support for compare clause in atomic directive

2021-11-17 Thread Carlo Bertolli via Phabricator via cfe-commits
carlo.bertolli added a comment.

This is already a lot of code with parse+sema. I wonder if we should split the 
patch into two, i.e. 1. parse+sema; 2. code gen? @ABataev ?
It should simplify maintenance of the patch and allow time to extend the OpenMP 
IR builder.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D102449

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


[PATCH] D132074: [OpenMP] Add option to assert no nested OpenMP parallelism on the GPU

2022-08-22 Thread Carlo Bertolli via Phabricator via cfe-commits
carlo.bertolli added a comment.

This looks good, but what happens when the user accidentally adds a nested 
parallel when this option is turned on? Do we get serial (correct) execution?


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D132074

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


[PATCH] D132074: [OpenMP] Add option to assert no nested OpenMP parallelism on the GPU

2022-08-22 Thread Carlo Bertolli via Phabricator via cfe-commits
carlo.bertolli accepted this revision.
carlo.bertolli added a comment.
This revision is now accepted and ready to land.

Thanks for explaining. LGTM.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D132074

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


[PATCH] D138614: [Clang][OpenMP][AMDGPU] Fix capture of variably modified type alias in teams distribute

2022-11-29 Thread Carlo Bertolli via Phabricator via cfe-commits
carlo.bertolli added a comment.

LGTM but @ABataev should review/approve this


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D138614

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


[PATCH] D39902: [OpenMP] Parse+Sema for copyin clause of 'teams distribute parallel for'

2017-11-10 Thread Carlo Bertolli via Phabricator via cfe-commits
carlo.bertolli created this revision.

Simply leverage existing implementation and verify correct functioning with two 
regression tests.


Repository:
  rL LLVM

https://reviews.llvm.org/D39902

Files:
  include/clang/Basic/OpenMPKinds.def
  test/OpenMP/teams_distribute_parallel_for_ast_print.cpp
  test/OpenMP/teams_distribute_parallel_for_copyin_messages.cpp

Index: test/OpenMP/teams_distribute_parallel_for_copyin_messages.cpp
===
--- /dev/null
+++ test/OpenMP/teams_distribute_parallel_for_copyin_messages.cpp
@@ -0,0 +1,113 @@
+// RUN: %clang_cc1 -verify -fopenmp -ferror-limit 100 -o - %s
+
+void foo() {
+}
+
+bool foobool(int argc) {
+  return argc;
+}
+
+struct S1; // expected-note {{declared here}}
+class S2 {
+  mutable int a;
+
+public:
+  S2() : a(0) {}
+  S2 &operator=(S2 &s2) { return *this; }
+};
+class S3 {
+  int a;
+
+public:
+  S3() : a(0) {}
+  S3 &operator=(S3 &s3) { return *this; }
+};
+class S4 {
+  int a;
+  S4();
+  S4 &operator=(const S4 &s4); // expected-note {{implicitly declared private here}}
+
+public:
+  S4(int v) : a(v) {}
+};
+class S5 {
+  int a;
+  S5() : a(0) {}
+  S5 &operator=(const S5 &s5) { return *this; } // expected-note {{implicitly declared private here}}
+
+public:
+  S5(int v) : a(v) {}
+};
+template 
+class ST {
+public:
+  static T s;
+};
+
+S2 k;
+S3 h;
+S4 l(3);
+S5 m(4);
+#pragma omp threadprivate(h, k, l, m)
+
+namespace A {
+double x;
+#pragma omp threadprivate(x)
+}
+namespace B {
+using A::x;
+}
+
+int main(int argc, char **argv) {
+  int i;
+#pragma omp target
+#pragma omp teams distribute parallel for copyin // expected-error {{expected '(' after 'copyin'}}
+  for (i = 0; i < argc; ++i)
+foo();
+#pragma omp target
+#pragma omp teams distribute parallel for copyin( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
+  for (i = 0; i < argc; ++i)
+foo();
+#pragma omp target
+#pragma omp teams distribute parallel for copyin() // expected-error {{expected expression}}
+  for (i = 0; i < argc; ++i)
+foo();
+#pragma omp target
+#pragma omp teams distribute parallel for copyin(k // expected-error {{expected ')'}} expected-note {{to match this '('}}
+  for (i = 0; i < argc; ++i)
+foo();
+#pragma omp target
+#pragma omp teams distribute parallel for copyin(h, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
+  for (i = 0; i < argc; ++i)
+foo();
+#pragma omp target
+#pragma omp teams distribute parallel for copyin(argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}}
+  for (i = 0; i < argc; ++i)
+foo();
+#pragma omp target
+#pragma omp teams distribute parallel for copyin(l) // expected-error {{'operator=' is a private member of 'S4'}}
+  for (i = 0; i < argc; ++i)
+foo();
+#pragma omp target
+#pragma omp teams distribute parallel for copyin(S1) // expected-error {{'S1' does not refer to a value}}
+  for (i = 0; i < argc; ++i)
+foo();
+#pragma omp target
+#pragma omp teams distribute parallel for copyin(argv[1]) // expected-error {{expected variable name}}
+  for (i = 0; i < argc; ++i)
+foo();
+#pragma omp target
+#pragma omp teams distribute parallel for copyin(i) // expected-error {{copyin variable must be threadprivate}}
+  for (i = 0; i < argc; ++i)
+foo();
+#pragma omp target
+#pragma omp teams distribute parallel for copyin(m) // expected-error {{'operator=' is a private member of 'S5'}}
+  for (i = 0; i < argc; ++i)
+foo();
+#pragma omp target
+#pragma omp teams distribute parallel for copyin(ST::s, B::x) // expected-error {{copyin variable must be threadprivate}}
+  for (i = 0; i < argc; ++i)
+foo();
+
+  return 0;
+}
Index: test/OpenMP/teams_distribute_parallel_for_ast_print.cpp
===
--- test/OpenMP/teams_distribute_parallel_for_ast_print.cpp
+++ test/OpenMP/teams_distribute_parallel_for_ast_print.cpp
@@ -8,6 +8,9 @@
 
 void foo() {}
 
+int x;
+#pragma omp threadprivate(x)
+
 struct S {
   S(): a(0) {}
   S(int v) : a(v) {}
@@ -40,7 +43,7 @@
   void foo() {
 int b, argv, d, c, e, f;
 #pragma omp target
-#pragma omp teams distribute parallel for default(none), private(b) firstprivate(argv) shared(d) reduction(+:c) reduction(max:e) num_teams(f) thread_limit(d)
+#pragma omp teams distribute parallel for default(none), private(b) firstprivate(argv) shared(d) reduction(+:c) reduction(max:e) num_teams(f) thread_limit(d) copyin(x)
 for (int k = 0; k < a.a; ++k)
   ++a.a;
   }
@@ -50,7 +53,7 @@
 // CHECK: #pragma omp target
 // CHECK-NEXT: #pragma omp teams distribute parallel for private(this->a) private(this->a)
 // CHECK: #pragma omp target
-// CHECK-NEXT: #pragma omp teams distribute parallel for default(none) private(b) firstprivate(argv) shared(d) reduction(+: c) reduction(max: e) num_teams(f) thread_limit(d)
+// CHECK-NEXT: #pragma o

[PATCH] D39902: [OpenMP] Parse+Sema for copyin clause of 'teams distribute parallel for'

2017-11-10 Thread Carlo Bertolli via Phabricator via cfe-commits
carlo.bertolli closed this revision.
carlo.bertolli added a comment.

Committed revision 317893.


Repository:
  rL LLVM

https://reviews.llvm.org/D39902



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


[PATCH] D40187: [OpenMP] Initial implementation of code generation for pragma 'teams distribute parallel for' on host

2017-11-20 Thread Carlo Bertolli via Phabricator via cfe-commits
carlo.bertolli closed this revision.
carlo.bertolli added a comment.

Committed revision 318692.


Repository:
  rL LLVM

https://reviews.llvm.org/D40187



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


[PATCH] D144634: [Clang][OpenMP] Support for Code Generation of loop bind clause

2023-03-01 Thread Carlo Bertolli via Phabricator via cfe-commits
carlo.bertolli added inline comments.



Comment at: clang/lib/CodeGen/CGStmtOpenMP.cpp:7791
+OpenMPBindClauseKind bindParam = C->getBindKind();
+switch (bindParam) {
+case OMPC_BIND_parallel: {

What if you have something like this:

void foo(..) {
  #pragma omp loop
  for (..) {
  }
}

int main() {

  #pragma omp target teams
  {
...
foo();
   }

  #pragma omp target
   {
  #pragma omp parallel
  {
 foo();
  }
}

In the first invocation, loop is bound to teams. In the second, loop is bound 
to parallel.
This is a runtime condition.

I *believe* that not even OpenMP 6.0 TR1 allows us to decide at compile time if 
loop should be treated as worksharing or workdistributionbut I might be 
wrong.

Thanks!


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D144634

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


[PATCH] D144634: [Clang][OpenMP] Support for Code Generation of loop bind clause

2023-03-06 Thread Carlo Bertolli via Phabricator via cfe-commits
carlo.bertolli added inline comments.



Comment at: clang/lib/CodeGen/CGStmtOpenMP.cpp:7791
+OpenMPBindClauseKind bindParam = C->getBindKind();
+switch (bindParam) {
+case OMPC_BIND_parallel: {

koops wrote:
> carlo.bertolli wrote:
> > What if you have something like this:
> > 
> > void foo(..) {
> >   #pragma omp loop
> >   for (..) {
> >   }
> > }
> > 
> > int main() {
> > 
> >   #pragma omp target teams
> >   {
> > ...
> > foo();
> >}
> > 
> >   #pragma omp target
> >{
> >   #pragma omp parallel
> >   {
> >  foo();
> >   }
> > }
> > 
> > In the first invocation, loop is bound to teams. In the second, loop is 
> > bound to parallel.
> > This is a runtime condition.
> > 
> > I *believe* that not even OpenMP 6.0 TR1 allows us to decide at compile 
> > time if loop should be treated as worksharing or workdistributionbut I 
> > might be wrong.
> > 
> > Thanks!
> The loop directive does not have a bind clause. If you examine the current 
> patch it takes care to preserve the old structure as is and the binding is 
> done by default during runtime.
Do you mean that this patch adds up to existing support - adding support for 
bind - and that existing support is already based on runtime support to decide 
on the case I mentioned?


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D144634

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


[PATCH] D144634: [Clang][OpenMP] Support for Code Generation of loop bind clause

2023-03-06 Thread Carlo Bertolli via Phabricator via cfe-commits
carlo.bertolli added inline comments.



Comment at: clang/lib/CodeGen/CGStmtOpenMP.cpp:7791
+OpenMPBindClauseKind bindParam = C->getBindKind();
+switch (bindParam) {
+case OMPC_BIND_parallel: {

carlo.bertolli wrote:
> koops wrote:
> > carlo.bertolli wrote:
> > > What if you have something like this:
> > > 
> > > void foo(..) {
> > >   #pragma omp loop
> > >   for (..) {
> > >   }
> > > }
> > > 
> > > int main() {
> > > 
> > >   #pragma omp target teams
> > >   {
> > > ...
> > > foo();
> > >}
> > > 
> > >   #pragma omp target
> > >{
> > >   #pragma omp parallel
> > >   {
> > >  foo();
> > >   }
> > > }
> > > 
> > > In the first invocation, loop is bound to teams. In the second, loop is 
> > > bound to parallel.
> > > This is a runtime condition.
> > > 
> > > I *believe* that not even OpenMP 6.0 TR1 allows us to decide at compile 
> > > time if loop should be treated as worksharing or workdistributionbut 
> > > I might be wrong.
> > > 
> > > Thanks!
> > The loop directive does not have a bind clause. If you examine the current 
> > patch it takes care to preserve the old structure as is and the binding is 
> > done by default during runtime.
> Do you mean that this patch adds up to existing support - adding support for 
> bind - and that existing support is already based on runtime support to 
> decide on the case I mentioned?
Disregard my comment: essentially, loop cannot be orphaned in the way I 
described.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D144634

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


[PATCH] D28243: [OpenMP] Add missing regression test for pragma distribute, clause firstprivate

2017-01-03 Thread Carlo Bertolli via Phabricator via cfe-commits
carlo.bertolli created this revision.
carlo.bertolli added reviewers: ABataev, sfantao, kkwli0.
carlo.bertolli added subscribers: arpith-jacob, gtbercea, caomhin, cfe-commits.

The regression test was missing from the previous already accepted patch.


https://reviews.llvm.org/D28243

Files:
  test/OpenMP/distribute_firstprivate_codegen.cpp

Index: test/OpenMP/distribute_firstprivate_codegen.cpp
===
--- /dev/null
+++ test/OpenMP/distribute_firstprivate_codegen.cpp
@@ -0,0 +1,382 @@
+// RUN: %clang_cc1 -DLAMBDA -verify -fopenmp -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -o - | FileCheck %s --check-prefix LAMBDA --check-prefix LAMBDA-64
+// RUN: %clang_cc1 -DLAMBDA -fopenmp -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-pch -o %t %s
+// RUN: %clang_cc1 -DLAMBDA -fopenmp -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --check-prefix LAMBDA --check-prefix LAMBDA-64
+// RUN: %clang_cc1 -DLAMBDA -verify -fopenmp -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-llvm %s -o - | FileCheck %s --check-prefix LAMBDA --check-prefix LAMBDA-32
+// RUN: %clang_cc1 -DLAMBDA -fopenmp -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-pch -o %t %s
+// RUN: %clang_cc1 -DLAMBDA -fopenmp -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --check-prefix LAMBDA --check-prefix LAMBDA-32
+
+// RUN: %clang_cc1  -verify -fopenmp -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -o - | FileCheck %s --check-prefix CHECK --check-prefix CHECK-64
+// RUN: %clang_cc1  -fopenmp -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-pch -o %t %s
+// RUN: %clang_cc1  -fopenmp -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --check-prefix CHECK --check-prefix CHECK-64
+// RUN: %clang_cc1  -verify -fopenmp -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-llvm %s -o - | FileCheck %s --check-prefix CHECK --check-prefix CHECK-32
+// RUN: %clang_cc1  -fopenmp -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-pch -o %t %s
+// RUN: %clang_cc1  -fopenmp -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --check-prefix CHECK --check-prefix CHECK-32
+// expected-no-diagnostics
+#ifndef HEADER
+#define HEADER
+
+template 
+struct S {
+  T f;
+  S(T a) : f(a) {}
+  S() : f() {}
+  operator T() { return T(); }
+  ~S() {}
+};
+
+// CHECK: [[S_FLOAT_TY:%.+]] = type { float }
+// CHECK: [[S_INT_TY:%.+]] = type { i{{[0-9]+}} }
+template 
+T tmain() {
+  S test;
+  T t_var = T();
+  T vec[] = {1, 2};
+  S s_arr[] = {1, 2};
+  S &var = test;
+  #pragma omp target
+  #pragma omp teams
+#pragma omp distribute firstprivate(t_var, vec, s_arr, s_arr, var, var)
+  for (int i = 0; i < 2; ++i) {
+vec[i] = t_var;
+s_arr[i] = var;
+  }
+  return T();
+}
+
+int main() {
+  static int svar;
+  volatile double g;
+  volatile double &g1 = g;
+
+  #ifdef LAMBDA
+  // LAMBDA-LABEL: @main
+  // LAMBDA: call{{.*}} void [[OUTER_LAMBDA:@.+]](
+  [&]() {
+static float sfvar;
+// LAMBDA: define{{.*}} internal{{.*}} void [[OUTER_LAMBDA]](
+// LAMBDA: call i{{[0-9]+}} @__tgt_target_teams(
+// LAMBDA: call void [[OFFLOADING_FUN:@.+]](
+
+// LAMBDA: define{{.+}} void [[OFFLOADING_FUN]](
+// LAMBDA: call {{.*}}void {{.+}} @__kmpc_fork_teams({{.+}}, {{.+}}, {{.+}}* [[OMP_OUTLINED:@.+]] to {{.+}})
+#pragma omp target
+#pragma omp teams
+#pragma omp distribute firstprivate(g, g1, svar, sfvar)
+for (int i = 0; i < 2; ++i) {
+  // LAMBDA-64: define{{.*}} internal{{.*}} void [[OMP_OUTLINED]](i32* noalias %{{.+}}, i32* noalias %{{.+}}, i{{[0-9]+}} [[G_IN:%.+]], i{{[0-9]+}} [[G1_IN:%.+]], i{{[0-9]+}} [[SVAR_IN:%.+]], i{{[0-9]+}} [[SFVAR_IN:%.+]])
+  // LAMBDA-32: define internal{{.*}} void [[OMP_OUTLINED]](i32* noalias %{{.+}}, i32* noalias %{{.+}}, double*{{.*}} [[G_IN:%.+]], i{{[0-9]+}} [[G1_IN:%.+]], i{{[0-9]+}} [[SVAR_IN:%.+]], i{{[0-9]+}} [[SFVAR_IN:%.+]])
+  // Private alloca's for conversion
+  // LAMBDA-64: [[G_ADDR:%.+]] = alloca i{{[0-9]+}},
+  // LAMBDA-32: [[G_ADDR:%.+]] = alloca double*,
+  // LAMBDA: [[G1_ADDR:%.+]] = alloca i{{[0-9]+}},
+  // LAMBDA: [[SVAR_ADDR:%.+]] = alloca i{{[0-9]+}},
+  // LAMBDA: [[SFVAR_ADDR:%.+]] = alloca i{{[0-9]+}},
+  // LAMBDA:

[PATCH] D17840: [OPENMP] Private, firstprivate, and lastprivate clauses for distribute, host code generation

2017-01-03 Thread Carlo Bertolli via Phabricator via cfe-commits
carlo.bertolli closed this revision.
carlo.bertolli added a comment.

Commited r290898.


Repository:
  rL LLVM

https://reviews.llvm.org/D17840



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


[PATCH] D28243: [OpenMP] Add missing regression test for pragma distribute, clause firstprivate

2017-02-03 Thread Carlo Bertolli via Phabricator via cfe-commits
carlo.bertolli closed this revision.
carlo.bertolli added a comment.

Committed to r294026


https://reviews.llvm.org/D28243



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


[PATCH] D29922: [OpenMP] Prepare Sema for initial implementation for pragma 'distribute parallel for'

2017-02-13 Thread Carlo Bertolli via Phabricator via cfe-commits
carlo.bertolli created this revision.

This patch adds two fields for use in the implementation of 'distribute 
parallel for':

1. The increment expression for the distribute loop. As the chunk assigned to a 
team is executed by multiple threads within the 'parallel for' region, the 
increment expression has to correspond to the value returned by the related 
runtime call (for_static_init).

2. The upper bound of the innermost loop ('for' in 'distribute parallel for') 
is not the globalUB expression normally used for pragma 'for' when found in 
isolation. It is instead the upper bound of the chunk assigned to the team 
('distribute' loop). In this way, we prevent teams from executing chunks 
assigned to other teams.

The use of these two fields can be see in a related explanatory patch:
https://reviews.llvm.org/D29508


Repository:
  rL LLVM

https://reviews.llvm.org/D29922

Files:
  include/clang/AST/StmtOpenMP.h
  lib/AST/StmtOpenMP.cpp
  lib/Basic/OpenMPKinds.cpp
  lib/Sema/SemaOpenMP.cpp
  lib/Serialization/ASTReaderStmt.cpp
  lib/Serialization/ASTWriterStmt.cpp

Index: lib/Serialization/ASTWriterStmt.cpp
===
--- lib/Serialization/ASTWriterStmt.cpp
+++ lib/Serialization/ASTWriterStmt.cpp
@@ -2241,6 +2241,8 @@
   if (isOpenMPLoopBoundSharingDirective(D->getDirectiveKind())) {
 Record.AddStmt(D->getPrevLowerBoundVariable());
 Record.AddStmt(D->getPrevUpperBoundVariable());
+Record.AddStmt(D->getDistInc());
+Record.AddStmt(D->getPrevEnsureUpperBound());
   }
   for (auto I : D->counters()) {
 Record.AddStmt(I);
Index: lib/Serialization/ASTReaderStmt.cpp
===
--- lib/Serialization/ASTReaderStmt.cpp
+++ lib/Serialization/ASTReaderStmt.cpp
@@ -2571,6 +2571,8 @@
   if (isOpenMPLoopBoundSharingDirective(D->getDirectiveKind())) {
 D->setPrevLowerBoundVariable(Record.readSubExpr());
 D->setPrevUpperBoundVariable(Record.readSubExpr());
+D->setDistInc(Record.readSubExpr());
+D->setPrevEnsureUpperBound(Record.readSubExpr());
   }
   SmallVector Sub;
   unsigned CollapsedNum = D->getCollapsedNumber();
Index: lib/Sema/SemaOpenMP.cpp
===
--- lib/Sema/SemaOpenMP.cpp
+++ lib/Sema/SemaOpenMP.cpp
@@ -4181,6 +4181,36 @@
   return 0;
   }
 
+  // Create: increment expression for distribute loop when combined in a same
+  // directive with for as IV = IV + ST; ensure upper bound expression based
+  // on PrevUB instead of NumIterations - used to implement 'for' when found
+  // in combination with 'distribute', like in 'distribute parallel for'
+  SourceLocation DistIncLoc;
+  ExprResult DistCond, DistInc, PrevEUB;
+  if (isOpenMPLoopBoundSharingDirective(DKind)) {
+DistCond = SemaRef.BuildBinOp(CurScope, CondLoc, BO_LE, IV.get(), UB.get());
+assert(DistCond.isUsable() && "distribute cond expr was not built");
+
+DistInc =
+SemaRef.BuildBinOp(CurScope, DistIncLoc, BO_Add, IV.get(), ST.get());
+assert(DistInc.isUsable() && "distribute inc expr was not built");
+DistInc = SemaRef.BuildBinOp(CurScope, DistIncLoc, BO_Assign, IV.get(),
+ DistInc.get());
+DistInc = SemaRef.ActOnFinishFullExpr(DistInc.get());
+assert(DistInc.isUsable() && "distribute inc expr was not built");
+
+// Build expression: UB = min(UB, prevUB) for #for in composite or combined
+// construct
+SourceLocation DistEUBLoc;
+ExprResult IsUBGreater =
+SemaRef.BuildBinOp(CurScope, DistEUBLoc, BO_GT, UB.get(), PrevUB.get());
+ExprResult CondOp = SemaRef.ActOnConditionalOp(
+DistEUBLoc, DistEUBLoc, IsUBGreater.get(), PrevUB.get(), UB.get());
+PrevEUB = SemaRef.BuildBinOp(CurScope, DistIncLoc, BO_Assign, UB.get(),
+ CondOp.get());
+PrevEUB = SemaRef.ActOnFinishFullExpr(PrevEUB.get());
+  }
+
   // Build updates and final values of the loop counters.
   bool HasErrors = false;
   Built.Counters.resize(NestedLoopCount);
@@ -4295,6 +4325,8 @@
   Built.NUB = NextUB.get();
   Built.PrevLB = PrevLB.get();
   Built.PrevUB = PrevUB.get();
+  Built.DistInc = DistInc.get();
+  Built.PrevEUB = PrevEUB.get();
 
   Expr *CounterVal = SemaRef.DefaultLvalueConversion(IV.get()).get();
   // Fill data for doacross depend clauses.
Index: lib/Basic/OpenMPKinds.cpp
===
--- lib/Basic/OpenMPKinds.cpp
+++ lib/Basic/OpenMPKinds.cpp
@@ -873,6 +873,7 @@
   case OMPD_parallel_for:
   case OMPD_parallel_for_simd:
   case OMPD_parallel_sections:
+  case OMPD_distribute_parallel_for:
 CaptureRegions.push_back(OMPD_parallel);
 break;
   case OMPD_target_teams:
@@ -902,7 +903,6 @@
   case OMPD_taskloop_simd:
   case OMPD_distribute_parallel_for_simd:
   case OMPD_distribute_simd:
-  case OMPD_distribute_parallel_for:
   case OMPD_teams_distribute:
   case OMP

[PATCH] D29922: [OpenMP] Prepare Sema for initial implementation for pragma 'distribute parallel for'

2017-02-17 Thread Carlo Bertolli via Phabricator via cfe-commits
carlo.bertolli closed this revision.
carlo.bertolli added a comment.

Committed revision r295497


Repository:
  rL LLVM

https://reviews.llvm.org/D29922



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


[PATCH] D32237: [OpenMP] Prepare sema to support combined constructs with omp distribute and omp for

2017-04-19 Thread Carlo Bertolli via Phabricator via cfe-commits
carlo.bertolli closed this revision.
carlo.bertolli added a comment.

Committed revision 300802.


Repository:
  rL LLVM

https://reviews.llvm.org/D32237



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


[PATCH] D32807: [OpenMP] Extended parse for 'always' map modifier

2017-05-03 Thread Carlo Bertolli via Phabricator via cfe-commits
carlo.bertolli created this revision.

This patch allows the map modifier 'always' to be separated by the map type 
(to, from, tofrom) only by a whitespace, rather than strictly by a comma as in 
current trunk.


Repository:
  rL LLVM

https://reviews.llvm.org/D32807

Files:
  lib/Parse/ParseOpenMP.cpp
  test/OpenMP/target_ast_print.cpp
  test/OpenMP/target_map_messages.cpp

Index: test/OpenMP/target_map_messages.cpp
===
--- test/OpenMP/target_map_messages.cpp
+++ test/OpenMP/target_map_messages.cpp
@@ -66,6 +66,8 @@
 {}
 #pragma omp target map(always, tofrom: c,f[:])   // expected-error {{section length is unspecified and cannot be inferred because subscripted value is not an array}}
 {}
+#pragma omp target map(always)   // expected-error {{use of undeclared identifier 'always'}}
+{}
 return;
   }
 };
Index: test/OpenMP/target_ast_print.cpp
===
--- test/OpenMP/target_ast_print.cpp
+++ test/OpenMP/target_ast_print.cpp
@@ -10,7 +10,7 @@
 
 template 
 T tmain(T argc, T *argv) {
-  T i, j, a[20];
+  T i, j, a[20], always;
 #pragma omp target
   foo();
 #pragma omp target if (target:argc > 0)
@@ -25,6 +25,12 @@
   foo();
 #pragma omp target map(always,alloc: i)
   foo();
+#pragma omp target map(always from: i)
+  foo();
+#pragma omp target map(always)
+  {always++;}
+#pragma omp target map(always,i)
+  {always++;i++;}
 #pragma omp target nowait
   foo();
 #pragma omp target depend(in : argc, argv[i:argc], a[:])
@@ -50,6 +56,17 @@
 // CHECK-NEXT: foo()
 // CHECK-NEXT: #pragma omp target map(always,alloc: i)
 // CHECK-NEXT: foo()
+// CHECK-NEXT: #pragma omp target map(always,from: i)
+// CHECK-NEXT: foo()
+// CHECK-NEXT: #pragma omp target map(tofrom: always)
+// CHECK-NEXT: {
+// CHECK-NEXT: always++;
+// CHECK-NEXT: }
+// CHECK-NEXT: #pragma omp target map(tofrom: always,i)
+// CHECK-NEXT: {
+// CHECK-NEXT: always++;
+// CHECK-NEXT: i++;
+// CHECK-NEXT: }
 // CHECK-NEXT: #pragma omp target nowait
 // CHECK-NEXT: foo()
 // CHECK-NEXT: #pragma omp target depend(in : argc,argv[i:argc],a[:])
@@ -72,6 +89,17 @@
 // CHECK-NEXT: foo()
 // CHECK-NEXT: #pragma omp target map(always,alloc: i)
 // CHECK-NEXT: foo()
+// CHECK-NEXT: #pragma omp target map(always,from: i)
+// CHECK-NEXT: foo()
+// CHECK-NEXT: #pragma omp target map(tofrom: always)
+// CHECK-NEXT: {
+// CHECK-NEXT: always++;
+// CHECK-NEXT: }
+// CHECK-NEXT: #pragma omp target map(tofrom: always,i)
+// CHECK-NEXT: {
+// CHECK-NEXT: always++;
+// CHECK-NEXT: i++;
+// CHECK-NEXT: }
 // CHECK-NEXT: #pragma omp target nowait
 // CHECK-NEXT: foo()
 // CHECK-NEXT: #pragma omp target depend(in : argc,argv[i:argc],a[:])
@@ -94,6 +122,17 @@
 // CHECK-NEXT: foo()
 // CHECK-NEXT: #pragma omp target map(always,alloc: i)
 // CHECK-NEXT: foo()
+// CHECK-NEXT: #pragma omp target map(always,from: i)
+// CHECK-NEXT: foo()
+// CHECK-NEXT: #pragma omp target map(tofrom: always)
+// CHECK-NEXT: {
+// CHECK-NEXT: always++;
+// CHECK-NEXT: }
+// CHECK-NEXT: #pragma omp target map(tofrom: always,i)
+// CHECK-NEXT: {
+// CHECK-NEXT: always++;
+// CHECK-NEXT: i++;
+// CHECK-NEXT: }
 // CHECK-NEXT: #pragma omp target nowait
 // CHECK-NEXT: foo()
 // CHECK-NEXT: #pragma omp target depend(in : argc,argv[i:argc],a[:])
@@ -103,7 +142,7 @@
 
 // CHECK-LABEL: int main(int argc, char **argv) {
 int main (int argc, char **argv) {
-  int i, j, a[20];
+  int i, j, a[20], always;
 // CHECK-NEXT: int i, j, a[20]
 #pragma omp target
 // CHECK-NEXT: #pragma omp target
@@ -139,6 +178,26 @@
   foo();
 // CHECK-NEXT: foo();
 
+#pragma omp target map(always from: i)
+// CHECK-NEXT: #pragma omp target map(always,from: i)
+  foo();
+// CHECK-NEXT: foo();
+
+#pragma omp target map(always)
+// CHECK-NEXT: #pragma omp target map(tofrom: always)
+  {always++;}
+// CHECK-NEXT: {
+// CHECK-NEXT: always++;
+// CHECK-NEXT: }
+
+#pragma omp target map(always,i)
+// CHECK-NEXT: #pragma omp target map(tofrom: always,i)
+  {always++;i++;}
+// CHECK-NEXT: {
+// CHECK-NEXT: always++;
+// CHECK-NEXT: i++;
+// CHECK-NEXT: }
+
 #pragma omp target nowait
 // CHECK-NEXT: #pragma omp target nowait
   foo();
Index: lib/Parse/ParseOpenMP.cpp
===
--- lib/Parse/ParseOpenMP.cpp
+++ lib/Parse/ParseOpenMP.cpp
@@ -1690,6 +1690,30 @@
   Data.MapType = OMPC_MAP_tofrom;
   Data.IsMapTypeImplicit = true;
 }
+  } else if (IsMapClauseModifierToken(PP.LookAhead(0))) {
+if (PP.LookAhead(1).is(tok::colon)) {
+  Data.MapTypeModifier = Data.MapType;
+  if (Data.MapTypeModifier != OMPC_MAP_always) {
+Diag(Tok, diag::err_omp_unknown_map_type_modifier);
+Data.MapTypeModifier = OMPC_MAP_unknown;
+  } else
+MapTypeModifierSpecified = true;
+
+  ConsumeToken();
+
+  Data.MapType =
+  IsMapClauseModifierToken(Tok)

[PATCH] D32807: [OpenMP] Extended parse for 'always' map modifier

2017-05-03 Thread Carlo Bertolli via Phabricator via cfe-commits
carlo.bertolli closed this revision.
carlo.bertolli added a comment.

Committed revision 302031.


Repository:
  rL LLVM

https://reviews.llvm.org/D32807



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


[PATCH] D102449: [WIP][Clang][OpenMP] Add the support for compare clause in atomic directive

2021-08-26 Thread Carlo Bertolli via Phabricator via cfe-commits
carlo.bertolli added a comment.

Thanks for uploading this.

I tried it locally and it is missing proper parsing +sema of the cond-expr-stmt 
and cond-update-stmt as indicate in the openmp 5.1 spec's. I am sure you are 
aware of this and this is still WIP.
Do you plan to add support for that? The regression test is not exposing 
conditional statements, but update ones, so it is not really testing what it 
should.

You might also want to split parse+sema support from codegen, if it helps.

Many thanks again!


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D102449

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