From 8140d0ec4a3e0c0a2a5c496ef956686a8eaf55a5 Mon Sep 17 00:00:00 2001 From: Joseph Huber Date: Mon, 15 Mar 2021 11:52:38 -0400 Subject: [PATCH] [OpenMP] Change OMPIRBuilder to append function attributes Summary: Currently the OMPIRBuilder overwrites the function's existing attributes when it assigns the ones defined in OMPKinds.def. This changes the behaviour to append the current function's attributes with them instead. Reviewed By: jdoerfert Differential Revision: https://reviews.llvm.org/D98740 --- llvm/include/llvm/Frontend/OpenMP/OMPKinds.def | 52 ++++++++++++++--------- llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp | 18 ++++++-- llvm/test/Transforms/OpenMP/add_attributes.ll | 59 +++++++++++++++----------- 3 files changed, 81 insertions(+), 48 deletions(-) diff --git a/llvm/include/llvm/Frontend/OpenMP/OMPKinds.def b/llvm/include/llvm/Frontend/OpenMP/OMPKinds.def index 75d360b..9a77dd7 100644 --- a/llvm/include/llvm/Frontend/OpenMP/OMPKinds.def +++ b/llvm/include/llvm/Frontend/OpenMP/OMPKinds.def @@ -838,29 +838,41 @@ __OMP_RTL_ATTRS(__kmpc_doacross_wait, BarrierAttrs, AttributeSet(), __OMP_RTL_ATTRS(__kmpc_doacross_fini, BarrierAttrs, AttributeSet(), ParamAttrs(ReadOnlyPtrAttrs)) -__OMP_RTL_ATTRS(__kmpc_alloc, DefaultAttrs, ReturnPtrAttrs, {}) -__OMP_RTL_ATTRS(__kmpc_free, AllocAttrs, AttributeSet(), {}) - -__OMP_RTL_ATTRS(__kmpc_init_allocator, DefaultAttrs, ReturnPtrAttrs, {}) -__OMP_RTL_ATTRS(__kmpc_destroy_allocator, AllocAttrs, AttributeSet(), {}) - -__OMP_RTL_ATTRS(__kmpc_push_target_tripcount_mapper, SetterAttrs, AttributeSet(), {}) -__OMP_RTL_ATTRS(__tgt_target_mapper, ForkAttrs, AttributeSet(), {}) -__OMP_RTL_ATTRS(__tgt_target_nowait_mapper, ForkAttrs, AttributeSet(), {}) -__OMP_RTL_ATTRS(__tgt_target_teams_mapper, ForkAttrs, AttributeSet(), {}) -__OMP_RTL_ATTRS(__tgt_target_teams_nowait_mapper, ForkAttrs, AttributeSet(), {}) -__OMP_RTL_ATTRS(__tgt_register_requires, ForkAttrs, AttributeSet(), {}) -__OMP_RTL_ATTRS(__tgt_target_data_begin_mapper, ForkAttrs, AttributeSet(), {}) +__OMP_RTL_ATTRS(__kmpc_alloc, DefaultAttrs, ReturnPtrAttrs, ParamAttrs()) +__OMP_RTL_ATTRS(__kmpc_free, AllocAttrs, AttributeSet(), ParamAttrs()) + +__OMP_RTL_ATTRS(__kmpc_init_allocator, DefaultAttrs, ReturnPtrAttrs, + ParamAttrs()) +__OMP_RTL_ATTRS(__kmpc_destroy_allocator, AllocAttrs, AttributeSet(), + ParamAttrs()) + +__OMP_RTL_ATTRS(__kmpc_push_target_tripcount_mapper, SetterAttrs, + AttributeSet(), ParamAttrs()) +__OMP_RTL_ATTRS(__tgt_target_mapper, ForkAttrs, AttributeSet(), ParamAttrs()) +__OMP_RTL_ATTRS(__tgt_target_nowait_mapper, ForkAttrs, AttributeSet(), + ParamAttrs()) +__OMP_RTL_ATTRS(__tgt_target_teams_mapper, ForkAttrs, AttributeSet(), + ParamAttrs()) +__OMP_RTL_ATTRS(__tgt_target_teams_nowait_mapper, ForkAttrs, AttributeSet(), + ParamAttrs()) +__OMP_RTL_ATTRS(__tgt_register_requires, ForkAttrs, AttributeSet(), + ParamAttrs()) +__OMP_RTL_ATTRS(__tgt_target_data_begin_mapper, ForkAttrs, AttributeSet(), + ParamAttrs()) __OMP_RTL_ATTRS(__tgt_target_data_begin_nowait_mapper, ForkAttrs, - AttributeSet(), {}) -__OMP_RTL_ATTRS(__tgt_target_data_end_mapper, ForkAttrs, AttributeSet(), {}) + AttributeSet(), ParamAttrs()) +__OMP_RTL_ATTRS(__tgt_target_data_end_mapper, ForkAttrs, AttributeSet(), + ParamAttrs()) __OMP_RTL_ATTRS(__tgt_target_data_end_nowait_mapper, ForkAttrs, - AttributeSet(), {}) -__OMP_RTL_ATTRS(__tgt_target_data_update_mapper, ForkAttrs, AttributeSet(), {}) + AttributeSet(), ParamAttrs()) +__OMP_RTL_ATTRS(__tgt_target_data_update_mapper, ForkAttrs, AttributeSet(), + ParamAttrs()) __OMP_RTL_ATTRS(__tgt_target_data_update_nowait_mapper, ForkAttrs, - AttributeSet(), {}) -__OMP_RTL_ATTRS(__tgt_mapper_num_components, ForkAttrs, AttributeSet(), {}) -__OMP_RTL_ATTRS(__tgt_push_mapper_component, ForkAttrs, AttributeSet(), {}) + AttributeSet(), ParamAttrs()) +__OMP_RTL_ATTRS(__tgt_mapper_num_components, ForkAttrs, AttributeSet(), + ParamAttrs()) +__OMP_RTL_ATTRS(__tgt_push_mapper_component, ForkAttrs, AttributeSet(), + ParamAttrs()) __OMP_RTL_ATTRS(__kmpc_task_allow_completion_event, DefaultAttrs, ReturnPtrAttrs, ParamAttrs(ReadOnlyPtrAttrs)) diff --git a/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp b/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp index 0827298..26f5901 100644 --- a/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp +++ b/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp @@ -41,15 +41,27 @@ static cl::opt void OpenMPIRBuilder::addAttributes(omp::RuntimeFunction FnID, Function &Fn) { LLVMContext &Ctx = Fn.getContext(); + // Get the function's current attributes. + auto Attrs = Fn.getAttributes(); + auto FnAttrs = Attrs.getFnAttributes(); + auto RetAttrs = Attrs.getRetAttributes(); + SmallVector ArgAttrs; + for (size_t ArgNo = 0; ArgNo < Fn.arg_size(); ++ArgNo) + ArgAttrs.emplace_back(Attrs.getParamAttributes(ArgNo)); + #define OMP_ATTRS_SET(VarName, AttrSet) AttributeSet VarName = AttrSet; #include "llvm/Frontend/OpenMP/OMPKinds.def" - // Add attributes to the new declaration. + // Add attributes to the function declaration. switch (FnID) { #define OMP_RTL_ATTRS(Enum, FnAttrSet, RetAttrSet, ArgAttrSets) \ case Enum: \ - Fn.setAttributes( \ - AttributeList::get(Ctx, FnAttrSet, RetAttrSet, ArgAttrSets)); \ + FnAttrs = FnAttrs.addAttributes(Ctx, FnAttrSet); \ + RetAttrs = RetAttrs.addAttributes(Ctx, RetAttrSet); \ + for (size_t ArgNo = 0; ArgNo < ArgAttrSets.size(); ++ArgNo) \ + ArgAttrs[ArgNo] = \ + ArgAttrs[ArgNo].addAttributes(Ctx, ArgAttrSets[ArgNo]); \ + Fn.setAttributes(AttributeList::get(Ctx, FnAttrs, RetAttrs, ArgAttrs)); \ break; #include "llvm/Frontend/OpenMP/OMPKinds.def" default: diff --git a/llvm/test/Transforms/OpenMP/add_attributes.ll b/llvm/test/Transforms/OpenMP/add_attributes.ll index 8476f42..087fc57 100644 --- a/llvm/test/Transforms/OpenMP/add_attributes.ll +++ b/llvm/test/Transforms/OpenMP/add_attributes.ll @@ -2,9 +2,6 @@ ; RUN: opt < %s -S -passes=openmpopt | FileCheck %s ; RUN: opt < %s -S -openmpopt -openmp-ir-builder-optimistic-attributes | FileCheck %s --check-prefix=OPTIMISTIC ; RUN: opt < %s -S -passes=openmpopt -openmp-ir-builder-optimistic-attributes | FileCheck %s --check-prefix=OPTIMISTIC -; -; TODO: Not all omp_XXXX methods are known to the OpenMPIRBuilder/OpenMPOpt. -; target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" %struct.omp_lock_t = type { i8* } @@ -669,6 +666,11 @@ declare i8* @__kmpc_task_reduction_modifier_init(i8*, i32, i32, i32, i8*) declare void @__kmpc_proxy_task_completed_ooo(i8*) +; Function Attrs: noinline +declare void @__kmpc_barrier_simple_spmd(%struct.ident_t* nocapture nofree readonly, i32) #0 + +attributes #0 = { noinline } + ; CHECK: ; Function Attrs: nounwind ; CHECK-NEXT: declare dso_local void @omp_set_num_threads(i32) @@ -685,52 +687,52 @@ declare void @__kmpc_proxy_task_completed_ooo(i8*) ; CHECK-NEXT: declare dso_local void @omp_set_schedule(i32, i32) ; CHECK: ; Function Attrs: nounwind -; CHECK-NEXT: declare dso_local i32 @omp_get_num_threads() #0 +; CHECK-NEXT: declare dso_local i32 @omp_get_num_threads() ; CHECK-NOT: Function Attrs ; CHECK: declare dso_local void @use_int(i32) ; CHECK: ; Function Attrs: nounwind -; CHECK-NEXT: declare dso_local i32 @omp_get_dynamic() #0 +; CHECK-NEXT: declare dso_local i32 @omp_get_dynamic() ; CHECK: ; Function Attrs: nounwind -; CHECK-NEXT: declare dso_local i32 @omp_get_nested() #0 +; CHECK-NEXT: declare dso_local i32 @omp_get_nested() ; CHECK: ; Function Attrs: nounwind -; CHECK-NEXT: declare dso_local i32 @omp_get_max_threads() #0 +; CHECK-NEXT: declare dso_local i32 @omp_get_max_threads() ; CHECK: ; Function Attrs: nounwind -; CHECK-NEXT: declare dso_local i32 @omp_get_thread_num() #0 +; CHECK-NEXT: declare dso_local i32 @omp_get_thread_num() ; CHECK: ; Function Attrs: nounwind -; CHECK-NEXT: declare dso_local i32 @omp_get_num_procs() #0 +; CHECK-NEXT: declare dso_local i32 @omp_get_num_procs() ; CHECK: ; Function Attrs: nounwind -; CHECK-NEXT: declare dso_local i32 @omp_in_parallel() #0 +; CHECK-NEXT: declare dso_local i32 @omp_in_parallel() ; CHECK: ; Function Attrs: nounwind -; CHECK-NEXT: declare dso_local i32 @omp_in_final() #0 +; CHECK-NEXT: declare dso_local i32 @omp_in_final() ; CHECK: ; Function Attrs: nounwind -; CHECK-NEXT: declare dso_local i32 @omp_get_active_level() #0 +; CHECK-NEXT: declare dso_local i32 @omp_get_active_level() ; CHECK: ; Function Attrs: nounwind -; CHECK-NEXT: declare dso_local i32 @omp_get_level() #0 +; CHECK-NEXT: declare dso_local i32 @omp_get_level() ; CHECK: ; Function Attrs: nounwind -; CHECK-NEXT: declare dso_local i32 @omp_get_ancestor_thread_num(i32) #0 +; CHECK-NEXT: declare dso_local i32 @omp_get_ancestor_thread_num(i32) ; CHECK: ; Function Attrs: nounwind -; CHECK-NEXT: declare dso_local i32 @omp_get_team_size(i32) #0 +; CHECK-NEXT: declare dso_local i32 @omp_get_team_size(i32) ; CHECK: ; Function Attrs: nounwind -; CHECK-NEXT: declare dso_local i32 @omp_get_thread_limit() #0 +; CHECK-NEXT: declare dso_local i32 @omp_get_thread_limit() ; CHECK: ; Function Attrs: nounwind -; CHECK-NEXT: declare dso_local i32 @omp_get_max_active_levels() #0 +; CHECK-NEXT: declare dso_local i32 @omp_get_max_active_levels() ; CHECK: ; Function Attrs: nounwind -; CHECK-NEXT: declare dso_local void @omp_get_schedule(i32* nocapture writeonly, i32* nocapture writeonly) #0 +; CHECK-NEXT: declare dso_local void @omp_get_schedule(i32* nocapture writeonly, i32* nocapture writeonly) ; CHECK-NOT: Function Attrs ; CHECK: declare dso_local i32 @omp_get_max_task_priority() @@ -799,7 +801,7 @@ declare void @__kmpc_proxy_task_completed_ooo(i8*) ; CHECK: declare dso_local i32 @omp_get_team_num() ; CHECK: ; Function Attrs: nounwind -; CHECK-NEXT: declare dso_local i32 @omp_get_cancellation() #0 +; CHECK-NEXT: declare dso_local i32 @omp_get_cancellation() ; CHECK-NOT: Function Attrs ; CHECK: declare dso_local i32 @omp_get_initial_device() @@ -829,25 +831,25 @@ declare void @__kmpc_proxy_task_completed_ooo(i8*) ; CHECK: declare dso_local i32 @omp_get_device_num() ; CHECK: ; Function Attrs: nounwind -; CHECK-NEXT: declare dso_local i32 @omp_get_proc_bind() #0 +; CHECK-NEXT: declare dso_local i32 @omp_get_proc_bind() ; CHECK: ; Function Attrs: nounwind -; CHECK-NEXT: declare dso_local i32 @omp_get_num_places() #0 +; CHECK-NEXT: declare dso_local i32 @omp_get_num_places() ; CHECK-NOT: Function Attrs ; CHECK: declare dso_local i32 @omp_get_place_num_procs(i32) ; CHECK: ; Function Attrs: nounwind -; CHECK-NEXT: declare dso_local void @omp_get_place_proc_ids(i32, i32* nocapture writeonly) #0 +; CHECK-NEXT: declare dso_local void @omp_get_place_proc_ids(i32, i32* nocapture writeonly) ; CHECK: ; Function Attrs: nounwind -; CHECK-NEXT: declare dso_local i32 @omp_get_place_num() #0 +; CHECK-NEXT: declare dso_local i32 @omp_get_place_num() ; CHECK: ; Function Attrs: nounwind -; CHECK-NEXT: declare dso_local i32 @omp_get_partition_num_places() #0 +; CHECK-NEXT: declare dso_local i32 @omp_get_partition_num_places() ; CHECK: ; Function Attrs: nounwind -; CHECK-NEXT: declare dso_local void @omp_get_partition_place_nums(i32*) #0 +; CHECK-NEXT: declare dso_local void @omp_get_partition_place_nums(i32*) ; CHECK-NOT: Function Attrs ; CHECK: declare dso_local i32 @omp_control_tool(i32, i32, i8*) @@ -1206,6 +1208,9 @@ declare void @__kmpc_proxy_task_completed_ooo(i8*) ; CHECK: ; Function Attrs: nounwind ; CHECK-NEXT: declare void @__kmpc_proxy_task_completed_ooo(i8*) +; CHECK: ; Function Attrs: convergent noinline nounwind +; CHECK-NEXT: declare void @__kmpc_barrier_simple_spmd(%struct.ident_t* nocapture nofree readonly, i32) + ; OPTIMISTIC: ; Function Attrs: inaccessiblememonly nofree nosync nounwind willreturn writeonly ; OPTIMISTIC-NEXT: declare dso_local void @omp_set_num_threads(i32) @@ -1730,3 +1735,7 @@ declare void @__kmpc_proxy_task_completed_ooo(i8*) ; OPTIMISTIC: ; Function Attrs: nofree nosync nounwind willreturn ; OPTIMISTIC-NEXT: declare void @__kmpc_proxy_task_completed_ooo(i8*) + +; OPTIMISTIC: ; Function Attrs: convergent noinline nounwind +; OPTIMISTIC-NEXT: declare void @__kmpc_barrier_simple_spmd(%struct.ident_t* nocapture nofree readonly, i32) + -- 2.7.4