diff --git a/clang/test/OpenMP/barrier_codegen.cpp b/clang/test/OpenMP/barrier_codegen.cpp --- a/clang/test/OpenMP/barrier_codegen.cpp +++ b/clang/test/OpenMP/barrier_codegen.cpp @@ -46,7 +46,7 @@ // CLANGCG-NOT: # // IRBUILDER: ; Function Attrs: nounwind // IRBUILDER-NEXT: declare i32 @__kmpc_global_thread_num(%struct.ident_t*) # -// IRBUILDER_OPT: ; Function Attrs: nofree nosync nounwind readonly +// IRBUILDER_OPT: ; Function Attrs: inaccessiblememonly nofree nosync nounwind readonly // IRBUILDER_OPT-NEXT: declare i32 @__kmpc_global_thread_num(%struct.ident_t*) # // CHECK: define {{.+}} [[TMAIN_INT]]( diff --git a/llvm/include/llvm/Frontend/OpenMP/OMPKinds.def b/llvm/include/llvm/Frontend/OpenMP/OMPKinds.def --- a/llvm/include/llvm/Frontend/OpenMP/OMPKinds.def +++ b/llvm/include/llvm/Frontend/OpenMP/OMPKinds.def @@ -249,17 +249,17 @@ __OMP_ATTRS_SET(GetterAttrs, OptimisticAttributes ? AttributeSet(EnumAttr(NoUnwind), EnumAttr(ReadOnly), - EnumAttr(NoSync), EnumAttr(NoFree)) + EnumAttr(NoSync), EnumAttr(NoFree), EnumAttr(InaccessibleMemOnly)) : AttributeSet(EnumAttr(NoUnwind))) __OMP_ATTRS_SET(GetterArgWriteAttrs, OptimisticAttributes ? AttributeSet(EnumAttr(NoUnwind), EnumAttr(NoSync), - EnumAttr(NoFree)) + EnumAttr(NoFree), EnumAttr(InaccessibleMemOrArgMemOnly)) : AttributeSet(EnumAttr(NoUnwind))) __OMP_ATTRS_SET(SetterAttrs, OptimisticAttributes ? AttributeSet(EnumAttr(NoUnwind), EnumAttr(WriteOnly), - EnumAttr(NoSync), EnumAttr(NoFree)) + EnumAttr(NoSync), EnumAttr(NoFree), EnumAttr(InaccessibleMemOnly)) : AttributeSet(EnumAttr(NoUnwind))) #undef __OMP_ATTRS_SET @@ -272,10 +272,40 @@ #define __OMP_RTL_ATTRS(Name, FnAttrSet, RetAttrSet, ArgAttrSets) \ OMP_RTL_ATTRS(OMPRTL_##Name, FnAttrSet, RetAttrSet, ArgAttrSets) +__OMP_RTL_ATTRS(__kmpc_barrier, + AttributeSet(EnumAttr(InaccessibleMemOrArgMemOnly)), + AttributeSet(), {}) +__OMP_RTL_ATTRS(__kmpc_cancel, + AttributeSet(EnumAttr(InaccessibleMemOrArgMemOnly)), + AttributeSet(), {}) +__OMP_RTL_ATTRS(__kmpc_cancel_barrier, + AttributeSet(EnumAttr(InaccessibleMemOrArgMemOnly)), + AttributeSet(), {}) +__OMP_RTL_ATTRS(__kmpc_flush, + AttributeSet(EnumAttr(InaccessibleMemOrArgMemOnly)), + AttributeSet(), {}) +__OMP_RTL_ATTRS(__kmpc_global_thread_num, GetterAttrs, AttributeSet(), {}) __OMP_RTL_ATTRS(__kmpc_fork_call, AttributeSet(EnumAttr(NoUnwind)), AttributeSet(), {}) +__OMP_RTL_ATTRS(__kmpc_omp_taskwait, + AttributeSet(EnumAttr(InaccessibleMemOrArgMemOnly)), + AttributeSet(), {}) +__OMP_RTL_ATTRS(__kmpc_omp_taskyield, + AttributeSet(EnumAttr(InaccessibleMemOrArgMemOnly)), + AttributeSet(), {}) +__OMP_RTL_ATTRS(__kmpc_push_num_threads, + AttributeSet(EnumAttr(InaccessibleMemOrArgMemOnly)), + AttributeSet(), {}) +__OMP_RTL_ATTRS(__kmpc_push_proc_bind, + AttributeSet(EnumAttr(InaccessibleMemOrArgMemOnly)), + AttributeSet(), {}) +__OMP_RTL_ATTRS(__kmpc_serialized_parallel, + AttributeSet(EnumAttr(InaccessibleMemOrArgMemOnly)), + AttributeSet(), {}) +__OMP_RTL_ATTRS(__kmpc_end_serialized_parallel, + AttributeSet(EnumAttr(InaccessibleMemOrArgMemOnly)), + AttributeSet(), {}) -__OMP_RTL_ATTRS(__kmpc_global_thread_num, GetterAttrs, AttributeSet(), {}) __OMP_RTL_ATTRS(omp_get_thread_num, GetterAttrs, AttributeSet(), {}) __OMP_RTL_ATTRS(omp_get_num_threads, GetterAttrs, AttributeSet(), {}) __OMP_RTL_ATTRS(omp_get_max_threads, GetterAttrs, AttributeSet(), {}) @@ -313,6 +343,22 @@ __OMP_RTL_ATTRS(omp_set_schedule, SetterAttrs, AttributeSet(), {}) __OMP_RTL_ATTRS(omp_set_max_active_levels, SetterAttrs, AttributeSet(), {}) +__OMP_RTL_ATTRS(__kmpc_master, + AttributeSet(EnumAttr(InaccessibleMemOrArgMemOnly)), + AttributeSet(), {}) +__OMP_RTL_ATTRS(__kmpc_end_master, + AttributeSet(EnumAttr(InaccessibleMemOrArgMemOnly)), + AttributeSet(), {}) +__OMP_RTL_ATTRS(__kmpc_critical, + AttributeSet(EnumAttr(InaccessibleMemOrArgMemOnly)), + AttributeSet(), {}) +__OMP_RTL_ATTRS(__kmpc_critical_with_hint, + AttributeSet(EnumAttr(InaccessibleMemOrArgMemOnly)), + AttributeSet(), {}) +__OMP_RTL_ATTRS(__kmpc_end_critical, + AttributeSet(EnumAttr(InaccessibleMemOrArgMemOnly)), + AttributeSet(), {}) + #undef __OMP_RTL_ATTRS #undef OMP_RTL_ATTRS #undef AttributeSet diff --git a/llvm/test/Transforms/OpenMP/gtid.ll b/llvm/test/Transforms/OpenMP/gtid.ll --- a/llvm/test/Transforms/OpenMP/gtid.ll +++ b/llvm/test/Transforms/OpenMP/gtid.ll @@ -1,6 +1,6 @@ ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature -; RUN: opt -openmpopt -S < %s | FileCheck %s -; RUN: opt -passes=openmpopt -S < %s | FileCheck %s +; RUN: opt -openmpopt -openmp-ir-builder-optimistic-attributes=true -S < %s | FileCheck %s +; RUN: opt -passes=openmpopt -openmp-ir-builder-optimistic-attributes=true -S < %s | FileCheck %s target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" %struct.ident_t = type { i32, i32, i32, i32, i8* } @@ -8,6 +8,8 @@ @0 = private unnamed_addr global %struct.ident_t { i32 0, i32 34, i32 0, i32 0, i8* getelementptr inbounds ([23 x i8], [23 x i8]* @.str, i32 0, i32 0) }, align 8 @.str = private unnamed_addr constant [23 x i8] c";unknown;unknown;0;0;;\00", align 1 +; CHECK: Function Attrs: inaccessiblememonly nofree nosync nounwind readonly +; CHECK-NEXT: declare i32 @__kmpc_global_thread_num declare i32 @__kmpc_global_thread_num(%struct.ident_t*) declare void @useI32(i32) diff --git a/llvm/test/Transforms/OpenMP/parallel_deletion.ll b/llvm/test/Transforms/OpenMP/parallel_deletion.ll --- a/llvm/test/Transforms/OpenMP/parallel_deletion.ll +++ b/llvm/test/Transforms/OpenMP/parallel_deletion.ll @@ -1,6 +1,6 @@ ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py -; RUN: opt -S -attributor -openmpopt -attributor-disable=false < %s | FileCheck %s -; RUN: opt -S -passes='attributor,cgscc(openmpopt)' -attributor-disable=false < %s | FileCheck %s +; RUN: opt -S -attributor -openmpopt -attributor-disable=false -openmp-ir-builder-optimistic-attributes=true < %s | FileCheck %s +; RUN: opt -S -passes='attributor,cgscc(openmpopt)' -attributor-disable=false -openmp-ir-builder-optimistic-attributes=true < %s | FileCheck %s ; target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" @@ -25,7 +25,7 @@ ; ; We delete all but the first of the parallel regions in this test. define void @delete_parallel_0() { -; CHECK-LABEL: define {{[^@]+}}@delete_parallel_0() +; CHECK-LABEL: @delete_parallel_0( ; CHECK-NEXT: entry: ; CHECK-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull align 8 dereferenceable(24) @0, i32 0, void (i32*, i32*, ...)* nonnull bitcast (void (i32*, i32*)* @.omp_outlined.willreturn to void (i32*, i32*, ...)*)) ; CHECK-NEXT: ret void @@ -74,7 +74,7 @@ ; ; We delete only the last parallel regions in this test because the others might not return. define void @delete_parallel_1() { -; CHECK-LABEL: define {{[^@]+}}@delete_parallel_1() +; CHECK-LABEL: @delete_parallel_1( ; CHECK-NEXT: entry: ; CHECK-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull align 8 dereferenceable(24) @0, i32 0, void (i32*, i32*, ...)* nonnull bitcast (void (i32*, i32*)* @.omp_outlined. to void (i32*, i32*, ...)*)) ; CHECK-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull align 8 dereferenceable(24) @0, i32 0, void (i32*, i32*, ...)* nonnull bitcast (void (i32*, i32*)* @.omp_outlined..0 to void (i32*, i32*, ...)*)) @@ -138,13 +138,13 @@ ; FIXME: We do not realize that `a` is dead and all accesses to it can be removed ; making the parallel regions readonly and deletable. define void @delete_parallel_2() { -; CHECK-LABEL: define {{[^@]+}}@delete_parallel_2() +; CHECK-LABEL: @delete_parallel_2( ; CHECK-NEXT: entry: ; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4 ; CHECK-NEXT: [[TMP:%.*]] = bitcast i32* [[A]] to i8* -; CHECK-NEXT: call void @llvm.lifetime.start.p0i8(i64 4, i8* nonnull align 4 dereferenceable(4) [[TMP]]) +; CHECK-NEXT: call void @llvm.lifetime.start.p0i8(i64 4, i8* nonnull align 4 dereferenceable(4) [[TMP]]) #0 ; CHECK-NEXT: store i32 0, i32* [[A]], align 4 -; CHECK-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull align 8 dereferenceable(24) @0, i32 1, void (i32*, i32*, ...)* nonnull bitcast (void (i32*, i32*, i32*)* @.omp_outlined..3 to void (i32*, i32*, ...)*), i32* nocapture nofree nonnull align 4 dereferenceable(4) [[A]]) +; CHECK-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull align 8 dereferenceable(24) @0, i32 1, void (i32*, i32*, ...)* nonnull bitcast (void (i32*, i32*, i32*)* @.omp_outlined..3 to void (i32*, i32*, ...)*), i32* nocapture nonnull align 4 dereferenceable(4) [[A]]) ; CHECK-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull align 8 dereferenceable(24) @0, i32 1, void (i32*, i32*, ...)* nonnull bitcast (void (i32*, i32*, i32*)* @.omp_outlined..4 to void (i32*, i32*, ...)*), i32* nocapture nonnull align 4 dereferenceable(4) [[A]]) ; CHECK-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull align 8 dereferenceable(24) @0, i32 1, void (i32*, i32*, ...)* nonnull bitcast (void (i32*, i32*, i32*)* @.omp_outlined..5 to void (i32*, i32*, ...)*), i32* nocapture nonnull align 4 dereferenceable(4) [[A]]) ; CHECK-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull align 8 dereferenceable(24) @0, i32 1, void (i32*, i32*, ...)* nonnull bitcast (void (i32*, i32*, i32*)* @.omp_outlined..6 to void (i32*, i32*, ...)*), i32* nocapture nonnull align 4 dereferenceable(4) [[A]]) @@ -202,10 +202,16 @@ declare void @llvm.lifetime.start.p0i8(i64 immarg, i8* nocapture) -declare i32 @omp_get_thread_num() inaccessiblememonly nofree nosync nounwind readonly +; CHECK: Function Attrs: inaccessiblememonly nofree nosync nounwind readonly +; CHECK-NEXT: declare i32 @omp_get_thread_num +declare i32 @omp_get_thread_num() +; CHECK: Function Attrs: inaccessiblemem_or_argmemonly +; CHECK-NEXT: declare i32 @__kmpc_master declare i32 @__kmpc_master(%struct.ident_t*, i32) +; CHECK: Function Attrs: inaccessiblemem_or_argmemonly +; CHECK-NEXT: declare void @__kmpc_end_master declare void @__kmpc_end_master(%struct.ident_t*, i32) define internal void @.omp_outlined..5(i32* noalias %.global_tid., i32* noalias %.bound_tid., i32* dereferenceable(4) %a) { @@ -281,9 +287,13 @@ declare void @__kmpc_end_single(%struct.ident_t*, i32) +; CHECK: Function Attrs: inaccessiblemem_or_argmemonly +; CHECK-NEXT: declare void @__kmpc_barrier declare void @__kmpc_barrier(%struct.ident_t*, i32) -declare i32 @__kmpc_global_thread_num(%struct.ident_t*) nofree nosync nounwind readonly +; CHECK: Function Attrs: inaccessiblememonly nofree nosync nounwind readonly +; CHECK-NEXT: declare i32 @__kmpc_global_thread_num +declare i32 @__kmpc_global_thread_num(%struct.ident_t*) declare i32 @__kmpc_reduce_nowait(%struct.ident_t*, i32, i32, i64, i8*, void (i8*, i8*)*, [8 x i32]*)