Skip to content

Commit dcaec81

Browse files
committed
[OpenMP] Use assumptions during ICV tracking
The OpenMP 5.1 assumptions `no_openmp` and `no_openmp_routines` allow us to ignore calls that would otherwise prevent ICV tracking. Once we track more ICVs we might need to distinguish the ones that could be impacted even with `no_openmp_routines`. Reviewed By: sstefan1 Differential Revision: https://reviews.llvm.org/D92050
1 parent b9c7754 commit dcaec81

File tree

2 files changed

+46
-1
lines changed

2 files changed

+46
-1
lines changed

llvm/lib/Transforms/IPO/OpenMPOpt.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1768,7 +1768,8 @@ struct AAICVTrackerFunction : public AAICVTracker {
17681768
InternalControlVar &ICV) const {
17691769

17701770
const auto *CB = dyn_cast<CallBase>(I);
1771-
if (!CB)
1771+
if (!CB || CB->hasFnAttr("no_openmp") ||
1772+
CB->hasFnAttr("no_openmp_routines"))
17721773
return None;
17731774

17741775
auto &OMPInfoCache = static_cast<OMPInformationCache &>(A.getInfoCache());

llvm/test/Transforms/OpenMP/icv_tracking.ll

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,22 @@ define i32 @bad_use(i32 %0) {
3030
ret i32 %2
3131
}
3232

33+
define i32 @ok_use_assume(i32 %0) {
34+
; CHECK-LABEL: define {{[^@]+}}@ok_use_assume
35+
; CHECK-SAME: (i32 [[TMP0:%.*]]) {
36+
; CHECK-NEXT: call void @use(i32 [[TMP0]]) [[ATTR1:#.*]]
37+
; CHECK-NEXT: call void @use(i32 [[TMP0]]) [[ATTR2:#.*]]
38+
; CHECK-NEXT: call void @no_openmp_use(i32 [[TMP0]])
39+
; CHECK-NEXT: [[TMP2:%.*]] = add nsw i32 [[TMP0]], 1
40+
; CHECK-NEXT: ret i32 [[TMP2]]
41+
;
42+
call void @use(i32 %0) "no_openmp"
43+
call void @use(i32 %0) "no_openmp_routines"
44+
call void @no_openmp_use(i32 %0)
45+
%2 = add nsw i32 %0, 1
46+
ret i32 %2
47+
}
48+
3349
define void @indirect_call(void ()* %0) {
3450
; CHECK-LABEL: define {{[^@]+}}@indirect_call
3551
; CHECK-SAME: (void ()* [[TMP0:%.*]])
@@ -77,6 +93,7 @@ declare dso_local void @omp_set_num_threads(i32)
7793
declare dso_local i32 @omp_get_max_threads()
7894

7995
declare dso_local void @use(i32)
96+
declare dso_local void @no_openmp_use(i32) "no_openmp"
8097

8198
define internal void @.omp_outlined.(i32* %0, i32* %1) {
8299
; CHECK-LABEL: define {{[^@]+}}@.omp_outlined.
@@ -266,6 +283,33 @@ define void @bad_use_test(i1 %0) {
266283
ret void
267284
}
268285

286+
define void @ok_use_assume_test(i1 %0) {
287+
; CHECK-LABEL: define {{[^@]+}}@ok_use_assume_test
288+
; CHECK-SAME: (i1 [[TMP0:%.*]]) {
289+
; CHECK-NEXT: call void @omp_set_num_threads(i32 2)
290+
; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i1 [[TMP0]], false
291+
; CHECK-NEXT: br i1 [[TMP2]], label [[TMP5:%.*]], label [[TMP3:%.*]]
292+
; CHECK: 3:
293+
; CHECK-NEXT: [[TMP4:%.*]] = call i32 @ok_use_assume(i32 10)
294+
; CHECK-NEXT: br label [[TMP5]]
295+
; CHECK: 5:
296+
; CHECK-NEXT: call void @use(i32 2)
297+
; CHECK-NEXT: ret void
298+
;
299+
call void @omp_set_num_threads(i32 2)
300+
%2 = icmp eq i1 %0, 0
301+
br i1 %2, label %5, label %3
302+
303+
3: ; preds = %1
304+
%4 = call i32 @ok_use_assume(i32 10)
305+
br label %5
306+
307+
5: ; preds = %3, %1
308+
%6 = call i32 @omp_get_max_threads()
309+
call void @use(i32 %6)
310+
ret void
311+
}
312+
269313
define weak void @weak_known_unique_icv(i1 %0) {
270314
; CHECK-LABEL: define {{[^@]+}}@weak_known_unique_icv
271315
; CHECK-SAME: (i1 [[TMP0:%.*]])

0 commit comments

Comments
 (0)