Skip to content

Commit 45e8e08

Browse files
committed
[OpenMP] Encode omp [...] assume[...] assumptions with omp[x] prefix
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"))) Reviewed By: jhuber6 Differential Revision: https://reviews.llvm.org/D105937
1 parent 7dbba33 commit 45e8e08

File tree

7 files changed

+48
-46
lines changed

7 files changed

+48
-46
lines changed

clang/include/clang/Sema/Sema.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10462,7 +10462,7 @@ class Sema final {
1046210462
/// Called on well-formed '#pragma omp [begin] assume[s]'.
1046310463
void ActOnOpenMPAssumesDirective(SourceLocation Loc,
1046410464
OpenMPDirectiveKind DKind,
10465-
ArrayRef<StringRef> Assumptions,
10465+
ArrayRef<std::string> Assumptions,
1046610466
bool SkippedClauses);
1046710467

1046810468
/// Check if there is an active global `omp begin assumes` directive.

clang/lib/Parse/ParseOpenMP.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1532,7 +1532,7 @@ bool Parser::parseOMPDeclareVariantMatchClause(SourceLocation Loc,
15321532
///
15331533
void Parser::ParseOpenMPAssumesDirective(OpenMPDirectiveKind DKind,
15341534
SourceLocation Loc) {
1535-
SmallVector<StringRef, 4> Assumptions;
1535+
SmallVector<std::string, 4> Assumptions;
15361536
bool SkippedClauses = false;
15371537

15381538
auto SkipBraces = [&](llvm::StringRef Spelling, bool IssueNote) {
@@ -1599,9 +1599,11 @@ void Parser::ParseOpenMPAssumesDirective(OpenMPDirectiveKind DKind,
15991599
}
16001600

16011601
assert(II && "Expected an identifier clause!");
1602-
StringRef Assumption = II->getName();
1602+
std::string Assumption = II->getName().str();
16031603
if (ACMI.StartsWith)
1604-
Assumption = Assumption.substr(ACMI.Identifier.size());
1604+
Assumption = "ompx_" + Assumption.substr(ACMI.Identifier.size());
1605+
else
1606+
Assumption = "omp_" + Assumption;
16051607
Assumptions.push_back(Assumption);
16061608
}
16071609

clang/lib/Sema/SemaOpenMP.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3213,7 +3213,7 @@ Sema::ActOnOpenMPRequiresDirective(SourceLocation Loc,
32133213

32143214
void Sema::ActOnOpenMPAssumesDirective(SourceLocation Loc,
32153215
OpenMPDirectiveKind DKind,
3216-
ArrayRef<StringRef> Assumptions,
3216+
ArrayRef<std::string> Assumptions,
32173217
bool SkippedClauses) {
32183218
if (!SkippedClauses && Assumptions.empty())
32193219
Diag(Loc, diag::err_omp_no_clause_for_directive)

clang/test/OpenMP/assumes_codegen.cpp

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -67,41 +67,41 @@ int lambda_outer() {
6767
}
6868
#pragma omp end assumes
6969

70-
// AST: void foo() __attribute__((assume("no_openmp_routines,another_warning,after_invalid_clauses"))) __attribute__((assume("no_openmp"))) {
70+
// AST: void foo() __attribute__((assume("omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses"))) __attribute__((assume("omp_no_openmp"))) {
7171
// AST-NEXT: }
7272
// AST-NEXT: class BAR {
7373
// AST-NEXT: public:
74-
// AST-NEXT: BAR() __attribute__((assume("range_bar_only"))) __attribute__((assume("range_bar_only_2"))) __attribute__((assume("no_openmp_routines,another_warning,after_invalid_clauses"))) __attribute__((assume("no_openmp"))) {
74+
// AST-NEXT: BAR() __attribute__((assume("ompx_range_bar_only"))) __attribute__((assume("ompx_range_bar_only_2"))) __attribute__((assume("omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses"))) __attribute__((assume("omp_no_openmp"))) {
7575
// AST-NEXT: }
76-
// AST-NEXT: void bar1() __attribute__((assume("range_bar_only"))) __attribute__((assume("range_bar_only_2"))) __attribute__((assume("no_openmp_routines,another_warning,after_invalid_clauses"))) __attribute__((assume("no_openmp"))) {
76+
// AST-NEXT: void bar1() __attribute__((assume("ompx_range_bar_only"))) __attribute__((assume("ompx_range_bar_only_2"))) __attribute__((assume("omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses"))) __attribute__((assume("omp_no_openmp"))) {
7777
// AST-NEXT: }
78-
// AST-NEXT: static void bar2() __attribute__((assume("range_bar_only"))) __attribute__((assume("range_bar_only_2"))) __attribute__((assume("no_openmp_routines,another_warning,after_invalid_clauses"))) __attribute__((assume("no_openmp"))) {
78+
// AST-NEXT: static void bar2() __attribute__((assume("ompx_range_bar_only"))) __attribute__((assume("ompx_range_bar_only_2"))) __attribute__((assume("omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses"))) __attribute__((assume("omp_no_openmp"))) {
7979
// AST-NEXT: }
8080
// AST-NEXT: };
81-
// AST-NEXT: void bar() __attribute__((assume("range_bar_only"))) __attribute__((assume("range_bar_only_2"))) __attribute__((assume("no_openmp_routines,another_warning,after_invalid_clauses"))) __attribute__((assume("no_openmp"))) {
81+
// AST-NEXT: void bar() __attribute__((assume("ompx_range_bar_only"))) __attribute__((assume("ompx_range_bar_only_2"))) __attribute__((assume("omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses"))) __attribute__((assume("omp_no_openmp"))) {
8282
// AST-NEXT: BAR b;
8383
// AST-NEXT: }
84-
// AST-NEXT: void baz() __attribute__((assume("1234"))) __attribute__((assume("no_openmp_routines,another_warning,after_invalid_clauses"))) __attribute__((assume("no_openmp")));
84+
// AST-NEXT: void baz() __attribute__((assume("ompx_1234"))) __attribute__((assume("omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses"))) __attribute__((assume("omp_no_openmp")));
8585
// AST-NEXT: template <typename T> class BAZ {
8686
// AST-NEXT: public:
87-
// AST-NEXT: BAZ<T>() __attribute__((assume("1234"))) __attribute__((assume("no_openmp_routines,another_warning,after_invalid_clauses"))) __attribute__((assume("no_openmp"))) {
87+
// AST-NEXT: BAZ<T>() __attribute__((assume("ompx_1234"))) __attribute__((assume("omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses"))) __attribute__((assume("omp_no_openmp"))) {
8888
// AST-NEXT: }
89-
// AST-NEXT: void baz1() __attribute__((assume("1234"))) __attribute__((assume("no_openmp_routines,another_warning,after_invalid_clauses"))) __attribute__((assume("no_openmp"))) {
89+
// AST-NEXT: void baz1() __attribute__((assume("ompx_1234"))) __attribute__((assume("omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses"))) __attribute__((assume("omp_no_openmp"))) {
9090
// AST-NEXT: }
91-
// AST-NEXT: static void baz2() __attribute__((assume("1234"))) __attribute__((assume("no_openmp_routines,another_warning,after_invalid_clauses"))) __attribute__((assume("no_openmp"))) {
91+
// AST-NEXT: static void baz2() __attribute__((assume("ompx_1234"))) __attribute__((assume("omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses"))) __attribute__((assume("omp_no_openmp"))) {
9292
// AST-NEXT: }
9393
// AST-NEXT: };
9494
// AST-NEXT: template<> class BAZ<float> {
9595
// AST-NEXT: public:
96-
// AST-NEXT: BAZ() __attribute__((assume("1234"))) __attribute__((assume("no_openmp_routines,another_warning,after_invalid_clauses"))) __attribute__((assume("no_openmp"))) __attribute__((assume("no_openmp_routines,another_warning,after_invalid_clauses"))) __attribute__((assume("no_openmp"))) {
96+
// AST-NEXT: BAZ() __attribute__((assume("ompx_1234"))) __attribute__((assume("omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses"))) __attribute__((assume("omp_no_openmp"))) __attribute__((assume("omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses"))) __attribute__((assume("omp_no_openmp"))) {
9797
// AST-NEXT: }
98-
// AST-NEXT: void baz1() __attribute__((assume("1234"))) __attribute__((assume("no_openmp_routines,another_warning,after_invalid_clauses"))) __attribute__((assume("no_openmp"))) __attribute__((assume("no_openmp_routines,another_warning,after_invalid_clauses"))) __attribute__((assume("no_openmp")));
99-
// AST-NEXT: static void baz2() __attribute__((assume("1234"))) __attribute__((assume("no_openmp_routines,another_warning,after_invalid_clauses"))) __attribute__((assume("no_openmp"))) __attribute__((assume("no_openmp_routines,another_warning,after_invalid_clauses"))) __attribute__((assume("no_openmp")));
98+
// AST-NEXT: void baz1() __attribute__((assume("ompx_1234"))) __attribute__((assume("omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses"))) __attribute__((assume("omp_no_openmp"))) __attribute__((assume("omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses"))) __attribute__((assume("omp_no_openmp")));
99+
// AST-NEXT: static void baz2() __attribute__((assume("ompx_1234"))) __attribute__((assume("omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses"))) __attribute__((assume("omp_no_openmp"))) __attribute__((assume("omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses"))) __attribute__((assume("omp_no_openmp")));
100100
// AST-NEXT: };
101-
// AST-NEXT: void baz() __attribute__((assume("1234"))) __attribute__((assume("no_openmp_routines,another_warning,after_invalid_clauses"))) __attribute__((assume("no_openmp"))) {
101+
// AST-NEXT: void baz() __attribute__((assume("ompx_1234"))) __attribute__((assume("omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses"))) __attribute__((assume("omp_no_openmp"))) {
102102
// AST-NEXT: BAZ<float> b;
103103
// AST-NEXT: }
104-
// AST-NEXT: int lambda_outer() __attribute__((assume("lambda_assumption"))) __attribute__((assume("no_openmp_routines,another_warning,after_invalid_clauses"))) __attribute__((assume("no_openmp"))) {
104+
// AST-NEXT: int lambda_outer() __attribute__((assume("ompx_lambda_assumption"))) __attribute__((assume("omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses"))) __attribute__((assume("omp_no_openmp"))) {
105105
// AST-NEXT: auto lambda_inner = []() {
106106
// AST-NEXT: return 42;
107107
// AST-NEXT: };
@@ -140,26 +140,26 @@ int lambda_outer() {
140140
// CHECK-SAME: [[attr8:#[0-9]]]
141141

142142
// CHECK: attributes [[attr0]]
143-
// CHECK-SAME: "llvm.assume"="no_openmp_routines,another_warning,after_invalid_clauses,no_openmp"
143+
// CHECK-SAME: "llvm.assume"="omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses,omp_no_openmp"
144144
// CHECK: attributes [[attr1]]
145-
// CHECK-SAME: "llvm.assume"="range_bar_only,range_bar_only_2,no_openmp_routines,another_warning,after_invalid_clauses,no_openmp"
145+
// CHECK-SAME: "llvm.assume"="ompx_range_bar_only,ompx_range_bar_only_2,omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses,omp_no_openmp"
146146
// CHECK: attributes [[attr2]]
147-
// CHECK-SAME: "llvm.assume"="range_bar_only,range_bar_only_2,no_openmp_routines,another_warning,after_invalid_clauses,no_openmp"
147+
// CHECK-SAME: "llvm.assume"="ompx_range_bar_only,ompx_range_bar_only_2,omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses,omp_no_openmp"
148148
// CHECK: attributes [[attr3]]
149-
// CHECK-SAME: "llvm.assume"="range_bar_only,range_bar_only_2,no_openmp_routines,another_warning,after_invalid_clauses,no_openmp"
149+
// CHECK-SAME: "llvm.assume"="ompx_range_bar_only,ompx_range_bar_only_2,omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses,omp_no_openmp"
150150
// CHECK: attributes [[attr4]]
151-
// CHECK-SAME: "llvm.assume"="1234,no_openmp_routines,another_warning,after_invalid_clauses,no_openmp,1234,no_openmp_routines,another_warning,after_invalid_clauses,no_openmp"
151+
// CHECK-SAME: "llvm.assume"="ompx_1234,omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses,omp_no_openmp,ompx_1234,omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses,omp_no_openmp"
152152
// CHECK: attributes [[attr5]]
153-
// CHECK-SAME: "llvm.assume"="1234,no_openmp_routines,another_warning,after_invalid_clauses,no_openmp,no_openmp_routines,another_warning,after_invalid_clauses,no_openmp"
153+
// CHECK-SAME: "llvm.assume"="ompx_1234,omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses,omp_no_openmp,omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses,omp_no_openmp"
154154
// CHECK: attributes [[attr6]]
155-
// CHECK-SAME: "llvm.assume"="1234,no_openmp_routines,another_warning,after_invalid_clauses,no_openmp,no_openmp_routines,another_warning,after_invalid_clauses,no_openmp"
155+
// CHECK-SAME: "llvm.assume"="ompx_1234,omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses,omp_no_openmp,omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses,omp_no_openmp"
156156
// CHECK: attributes [[attr7]]
157-
// CHECK-SAME: "llvm.assume"="lambda_assumption,no_openmp_routines,another_warning,after_invalid_clauses,no_openmp"
157+
// CHECK-SAME: "llvm.assume"="ompx_lambda_assumption,omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses,omp_no_openmp"
158158
// CHECK: attributes [[attr8]]
159-
// CHECK-SAME: "llvm.assume"="lambda_assumption,no_openmp_routines,another_warning,after_invalid_clauses,no_openmp"
159+
// CHECK-SAME: "llvm.assume"="ompx_lambda_assumption,omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses,omp_no_openmp"
160160
// CHECK: attributes [[attr9]]
161-
// CHECK-SAME: "llvm.assume"="range_bar_only,range_bar_only_2,no_openmp_routines,another_warning,after_invalid_clauses,no_openmp"
161+
// CHECK-SAME: "llvm.assume"="ompx_range_bar_only,ompx_range_bar_only_2,omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses,omp_no_openmp"
162162
// CHECK: attributes [[attr10]]
163-
// CHECK-SAME: "llvm.assume"="1234,no_openmp_routines,another_warning,after_invalid_clauses,no_openmp,no_openmp_routines,another_warning,after_invalid_clauses,no_openmp"
163+
// CHECK-SAME: "llvm.assume"="ompx_1234,omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses,omp_no_openmp,omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses,omp_no_openmp"
164164
// CHECK: attributes [[attr11]]
165-
// CHECK-SAME: "llvm.assume"="lambda_assumption,no_openmp_routines,another_warning,after_invalid_clauses,no_openmp"
165+
// CHECK-SAME: "llvm.assume"="ompx_lambda_assumption,omp_no_openmp_routines,ompx_another_warning,ompx_after_invalid_clauses,omp_no_openmp"

clang/test/OpenMP/assumes_include_nvptx.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,9 @@
2222
// CHECK: attributes [[attr0]]
2323
// CHECK-NOT: "llvm.assume"
2424
// CHECK: attributes [[attr1]]
25-
// CHECK-SAME: "llvm.assume"="check_that_this_is_attached_to_included_functions_and_template_instantiations"
25+
// CHECK-SAME: "llvm.assume"="ompx_check_that_this_is_attached_to_included_functions_and_template_instantiations"
2626
// CHECK: attributes [[attr2]]
27-
// CHECK-SAME: "llvm.assume"="check_that_this_is_attached_to_included_functions_and_template_instantiations"
27+
// CHECK-SAME: "llvm.assume"="ompx_check_that_this_is_attached_to_included_functions_and_template_instantiations"
2828

2929

3030
template <typename T>

clang/test/OpenMP/assumes_print.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,8 @@ void baz() {
3737
}
3838
#pragma omp end assumes
3939

40-
// CHECK: void foo() __attribute__((assume("no_openmp_routines"))) __attribute__((assume("no_openmp")))
41-
// CHECK: void bar() __attribute__((assume("range_bar_only"))) __attribute__((assume("range_bar_only_2"))) __attribute__((assume("no_openmp_routines"))) __attribute__((assume("no_openmp")))
42-
// CHECK: void baz() __attribute__((assume("1234"))) __attribute__((assume("no_openmp_routines"))) __attribute__((assume("no_openmp")))
40+
// CHECK: void foo() __attribute__((assume("omp_no_openmp_routines"))) __attribute__((assume("omp_no_openmp")))
41+
// 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")))
42+
// CHECK: void baz() __attribute__((assume("ompx_1234"))) __attribute__((assume("omp_no_openmp_routines"))) __attribute__((assume("omp_no_openmp")))
4343

4444
#endif

clang/test/OpenMP/assumes_template_print.cpp

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,23 +17,23 @@ template <typename T>
1717
struct S {
1818
int a;
1919
// CHECK: template <typename T> struct S {
20-
// CHECK: void foo() __attribute__((assume("global_assumption"))) {
20+
// CHECK: void foo() __attribute__((assume("ompx_global_assumption"))) {
2121
void foo() {
2222
#pragma omp parallel
2323
{}
2424
}
2525
};
2626

2727
// CHECK: template<> struct S<int> {
28-
// CHECK: void foo() __attribute__((assume("global_assumption"))) {
28+
// CHECK: void foo() __attribute__((assume("ompx_global_assumption"))) {
2929

3030
#pragma omp begin assumes no_openmp
31-
// CHECK: void S_with_assumes_no_call() __attribute__((assume("no_openmp"))) __attribute__((assume("global_assumption"))) {
31+
// CHECK: void S_with_assumes_no_call() __attribute__((assume("omp_no_openmp"))) __attribute__((assume("ompx_global_assumption"))) {
3232
void S_with_assumes_no_call() {
3333
S<int> s;
3434
s.a = 0;
3535
}
36-
// CHECK: void S_with_assumes_call() __attribute__((assume("no_openmp"))) __attribute__((assume("global_assumption"))) {
36+
// CHECK: void S_with_assumes_call() __attribute__((assume("omp_no_openmp"))) __attribute__((assume("ompx_global_assumption"))) {
3737
void S_with_assumes_call() {
3838
S<int> s;
3939
s.a = 0;
@@ -42,7 +42,7 @@ void S_with_assumes_call() {
4242
}
4343
#pragma omp end assumes
4444

45-
// CHECK: void S_without_assumes() __attribute__((assume("global_assumption"))) {
45+
// CHECK: void S_without_assumes() __attribute__((assume("ompx_global_assumption"))) {
4646
void S_without_assumes() {
4747
S<int> s;
4848
s.foo();
@@ -54,7 +54,7 @@ void S_without_assumes() {
5454
template <typename T>
5555
struct P {
5656
// CHECK: template <typename T> struct P {
57-
// CHECK: void foo() __attribute__((assume("global_assumption"))) {
57+
// CHECK: void foo() __attribute__((assume("ompx_global_assumption"))) {
5858
int a;
5959
void foo() {
6060
#pragma omp parallel
@@ -65,21 +65,21 @@ struct P {
6565
// TODO: Avoid the duplication here:
6666

6767
// CHECK: template<> struct P<int> {
68-
// CHECK: void foo() __attribute__((assume("global_assumption"))) __attribute__((assume("global_assumption"))) {
68+
// CHECK: void foo() __attribute__((assume("ompx_global_assumption"))) __attribute__((assume("ompx_global_assumption"))) {
6969

70-
// CHECK: void P_without_assumes() __attribute__((assume("global_assumption"))) {
70+
// CHECK: void P_without_assumes() __attribute__((assume("ompx_global_assumption"))) {
7171
void P_without_assumes() {
7272
P<int> p;
7373
p.foo();
7474
}
7575

7676
#pragma omp begin assumes no_openmp
77-
// CHECK: void P_with_assumes_no_call() __attribute__((assume("no_openmp"))) __attribute__((assume("global_assumption"))) {
77+
// CHECK: void P_with_assumes_no_call() __attribute__((assume("omp_no_openmp"))) __attribute__((assume("ompx_global_assumption"))) {
7878
void P_with_assumes_no_call() {
7979
P<int> p;
8080
p.a = 0;
8181
}
82-
// CHECK: void P_with_assumes_call() __attribute__((assume("no_openmp"))) __attribute__((assume("global_assumption"))) {
82+
// CHECK: void P_with_assumes_call() __attribute__((assume("omp_no_openmp"))) __attribute__((assume("ompx_global_assumption"))) {
8383
void P_with_assumes_call() {
8484
P<int> p;
8585
p.a = 0;

0 commit comments

Comments
 (0)