jdoerfert created this revision. jdoerfert added a reviewer: jhuber6. Herald added subscribers: guansong, bollu, yaxunl. jdoerfert requested review of this revision. Herald added subscribers: cfe-commits, sstefan1. Herald added a project: clang.
Since these assumptions are coming from OpenMP it makes sense to mark them as such in the generic IR encoding. Standardized assumptions will be named omp_ASSUMPTION_NAME and extensions will be named ompx_ASSUMPTION_NAME which is the OpenMP 5.2 syntax for "extensions" of any kind. This also matches what the OpenMP-Opt pass expects. Summarized, #pragma omp [...] assume[s] no_parallelism now generates the same IR assumption annotation as __attribute__((assume("omp_no_parallelism"))) Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D105937 Files: clang/lib/Parse/ParseOpenMP.cpp clang/test/OpenMP/assumes_print.cpp clang/test/OpenMP/assumes_template_print.cpp
Index: clang/test/OpenMP/assumes_template_print.cpp =================================================================== --- clang/test/OpenMP/assumes_template_print.cpp +++ clang/test/OpenMP/assumes_template_print.cpp @@ -17,7 +17,7 @@ struct S { int a; // CHECK: template <typename T> struct S { -// CHECK: void foo() __attribute__((assume("global_assumption"))) { +// CHECK: void foo() __attribute__((assume("ompx_global_assumption"))) { void foo() { #pragma omp parallel {} @@ -25,15 +25,15 @@ }; // CHECK: template<> struct S<int> { -// CHECK: void foo() __attribute__((assume("global_assumption"))) { +// CHECK: void foo() __attribute__((assume("ompx_global_assumption"))) { #pragma omp begin assumes no_openmp -// CHECK: void S_with_assumes_no_call() __attribute__((assume("no_openmp"))) __attribute__((assume("global_assumption"))) { +// CHECK: void S_with_assumes_no_call() __attribute__((assume("omp_no_openmp"))) __attribute__((assume("ompx_global_assumption"))) { void S_with_assumes_no_call() { S<int> s; s.a = 0; } -// CHECK: void S_with_assumes_call() __attribute__((assume("no_openmp"))) __attribute__((assume("global_assumption"))) { +// CHECK: void S_with_assumes_call() __attribute__((assume("omp_no_openmp"))) __attribute__((assume("ompx_global_assumption"))) { void S_with_assumes_call() { S<int> s; s.a = 0; @@ -42,7 +42,7 @@ } #pragma omp end assumes -// CHECK: void S_without_assumes() __attribute__((assume("global_assumption"))) { +// CHECK: void S_without_assumes() __attribute__((assume("ompx_global_assumption"))) { void S_without_assumes() { S<int> s; s.foo(); @@ -54,7 +54,7 @@ template <typename T> struct P { // CHECK: template <typename T> struct P { -// CHECK: void foo() __attribute__((assume("global_assumption"))) { +// CHECK: void foo() __attribute__((assume("ompx_global_assumption"))) { int a; void foo() { #pragma omp parallel @@ -65,21 +65,21 @@ // TODO: Avoid the duplication here: // CHECK: template<> struct P<int> { -// CHECK: void foo() __attribute__((assume("global_assumption"))) __attribute__((assume("global_assumption"))) { +// CHECK: void foo() __attribute__((assume("ompx_global_assumption"))) __attribute__((assume("ompx_global_assumption"))) { -// CHECK: void P_without_assumes() __attribute__((assume("global_assumption"))) { +// CHECK: void P_without_assumes() __attribute__((assume("ompx_global_assumption"))) { void P_without_assumes() { P<int> p; p.foo(); } #pragma omp begin assumes no_openmp -// CHECK: void P_with_assumes_no_call() __attribute__((assume("no_openmp"))) __attribute__((assume("global_assumption"))) { +// CHECK: void P_with_assumes_no_call() __attribute__((assume("omp_no_openmp"))) __attribute__((assume("ompx_global_assumption"))) { void P_with_assumes_no_call() { P<int> p; p.a = 0; } -// CHECK: void P_with_assumes_call() __attribute__((assume("no_openmp"))) __attribute__((assume("global_assumption"))) { +// CHECK: void P_with_assumes_call() __attribute__((assume("omp_no_openmp"))) __attribute__((assume("ompx_global_assumption"))) { void P_with_assumes_call() { P<int> p; p.a = 0; Index: clang/test/OpenMP/assumes_print.cpp =================================================================== --- clang/test/OpenMP/assumes_print.cpp +++ clang/test/OpenMP/assumes_print.cpp @@ -37,8 +37,8 @@ } #pragma omp end assumes -// CHECK: void foo() __attribute__((assume("no_openmp_routines"))) __attribute__((assume("no_openmp"))) -// CHECK: void bar() __attribute__((assume("range_bar_only"))) __attribute__((assume("range_bar_only_2"))) __attribute__((assume("no_openmp_routines"))) __attribute__((assume("no_openmp"))) -// CHECK: void baz() __attribute__((assume("1234"))) __attribute__((assume("no_openmp_routines"))) __attribute__((assume("no_openmp"))) +// CHECK: void foo() __attribute__((assume("omp_no_openmp_routines"))) __attribute__((assume("omp_no_openmp"))) +// CHECK: void bar() __attribute__((assume("ompx_range_bar_only"))) __attribute__((assume("ompx_range_bar_only_2"))) __attribute__((assume("omp_no_openmp_routines"))) __attribute__((assume("omp_no_openmp"))) +// CHECK: void baz() __attribute__((assume("ompx_1234"))) __attribute__((assume("omp_no_openmp_routines"))) __attribute__((assume("omp_no_openmp"))) #endif Index: clang/lib/Parse/ParseOpenMP.cpp =================================================================== --- clang/lib/Parse/ParseOpenMP.cpp +++ clang/lib/Parse/ParseOpenMP.cpp @@ -1599,9 +1599,11 @@ } assert(II && "Expected an identifier clause!"); - StringRef Assumption = II->getName(); + std::string Assumption = II->getName().str(); if (ACMI.StartsWith) - Assumption = Assumption.substr(ACMI.Identifier.size()); + Assumption = "ompx_" + Assumption.substr(ACMI.Identifier.size()); + else + Assumption = "omp_" + Assumption; Assumptions.push_back(Assumption); }
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits