llvmbot wrote: @llvm/pr-subscribers-backend-amdgpu
<details> <summary>Changes</summary> Differential Revision: https://reviews.llvm.org/D159257 -- Full diff: https://github.com/llvm/llvm-project/pull/65737.diff 4 Files Affected: - (modified) clang/lib/CodeGen/CGCall.cpp (+20) - (modified) clang/lib/CodeGen/CGCall.h (+5) - (modified) clang/lib/CodeGen/CodeGenAction.cpp (+3-1) - (modified) clang/test/CodeGen/link-builtin-bitcode.c (+1-3) <pre> diff --git a/clang/lib/CodeGen/CGCall.cpp b/clang/lib/CodeGen/CGCall.cpp index 37de2800fd69c02..ace20b0b3745641 100644 --- a/clang/lib/CodeGen/CGCall.cpp +++ b/clang/lib/CodeGen/CGCall.cpp @@ -2112,6 +2112,26 @@ void CodeGen::mergeDefaultFunctionDefinitionAttributes( F.addFnAttrs(FuncAttrs); } +bool CodeGen::dropFunctionWithIncompatibleAttributes( + llvm::Function &F, const TargetOptions &TargetOpts) { + auto FFeatures = F.getFnAttribute("target-features"); + if (!FFeatures.isValid()) + return false; + + const auto &TFeatures = TargetOpts.FeatureMap; + for (StringRef Feature : llvm::split(FFeatures.getValueAsString(), ',')) { + bool EnabledForFunc = Feature[0] == '+'; + StringRef Name = Feature.substr(1); + auto TEntry = TFeatures.find(Name); + if (TEntry != TFeatures.end() && TEntry->second != EnabledForFunc) { + F.replaceAllUsesWith(llvm::ConstantPointerNull::get(F.getType())); + F.eraseFromParent(); + return true; + } + } + return false; +} + void CodeGenModule::getTrivialDefaultFunctionAttributes( StringRef Name, bool HasOptnone, bool AttrOnCallSite, llvm::AttrBuilder &FuncAttrs) { diff --git a/clang/lib/CodeGen/CGCall.h b/clang/lib/CodeGen/CGCall.h index aee86a3242fd3f4..bca664479fff13d 100644 --- a/clang/lib/CodeGen/CGCall.h +++ b/clang/lib/CodeGen/CGCall.h @@ -375,6 +375,11 @@ class ReturnValueSlot { bool isExternallyDestructed() const { return IsExternallyDestructed; } }; +/// If \p F "target-features" are incompatible with the \p TargetOpts features, +/// it is correct to drop the function. \return true if \p F is dropped +bool dropFunctionWithIncompatibleAttributes(llvm::Function &F, + const TargetOptions &TargetOpts); + /// Adds attributes to \p F according to our \p CodeGenOpts and \p LangOpts, as /// though we had emitted it ourselves. We remove any attributes on F that /// conflict with the attributes we add here. diff --git a/clang/lib/CodeGen/CodeGenAction.cpp b/clang/lib/CodeGen/CodeGenAction.cpp index a3b72381d73fc54..6f8e545a3a50816 100644 --- a/clang/lib/CodeGen/CodeGenAction.cpp +++ b/clang/lib/CodeGen/CodeGenAction.cpp @@ -267,11 +267,13 @@ namespace clang { for (auto &LM : LinkModules) { assert(LM.Module && "LinkModule does not actually have a module"); if (LM.PropagateAttrs) - for (Function &F : *LM.Module) { + for (Function &F : llvm::make_early_inc_range(*LM.Module)) { // Skip intrinsics. Keep consistent with how intrinsics are created // in LLVM IR. if (F.isIntrinsic()) continue; + if (CodeGen::dropFunctionWithIncompatibleAttributes(F, TargetOpts)) + continue; CodeGen::mergeDefaultFunctionDefinitionAttributes( F, CodeGenOpts, LangOpts, TargetOpts, LM.Internalize); } diff --git a/clang/test/CodeGen/link-builtin-bitcode.c b/clang/test/CodeGen/link-builtin-bitcode.c index fe60a9746f1c85f..2fcf8c6c4a64dfb 100644 --- a/clang/test/CodeGen/link-builtin-bitcode.c +++ b/clang/test/CodeGen/link-builtin-bitcode.c @@ -40,10 +40,8 @@ int bar() { return no_attr() + attr_in_target() + attr_not_in_target() + attr_in // CHECK-LABEL: define internal i32 @attr_not_in_target // CHECK-SAME: () #[[ATTR_EXTEND:[0-9]+]] { -// CHECK-LABEL: @attr_incompatible -// CHECK-SAME: () #[[ATTR_INCOMPATIBLE:[0-9]+]] { +// CHECK-NOT: @attr_incompatible // CHECK: attributes #[[ATTR_BAR]] = { noinline nounwind optnone "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="gfx90a" "target-features"="+16-bit-insts,+atomic-buffer-global-pk-add-f16-insts,+atomic-fadd-rtn-insts,+ci-insts,+dl-insts,+dot1-insts,+dot10-insts,+dot2-insts,+dot3-insts,+dot4-insts,+dot5-insts,+dot6-insts,+dot7-insts,+dpp,+gfx8-insts,+gfx9-insts,+gfx90a-insts,+mai-insts,+s-memrealtime,+s-memtime-inst,+wavefrontsize64" } // CHECK: attributes #[[ATTR_COMPATIBLE]] = { convergent noinline nounwind optnone "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="gfx90a" "target-features"="+16-bit-insts,+atomic-buffer-global-pk-add-f16-insts,+atomic-fadd-rtn-insts,+ci-insts,+dl-insts,+dot1-insts,+dot10-insts,+dot2-insts,+dot3-insts,+dot4-insts,+dot5-insts,+dot6-insts,+dot7-insts,+dpp,+gfx8-insts,+gfx9-insts,+gfx90a-insts,+gws,+image-insts,+mai-insts,+s-memrealtime,+s-memtime-inst,+wavefrontsize64" } // CHECK: attributes #[[ATTR_EXTEND]] = { convergent noinline nounwind optnone "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="gfx90a" "target-features"="+extended-image-insts,+16-bit-insts,+atomic-buffer-global-pk-add-f16-insts,+atomic-fadd-rtn-insts,+ci-insts,+dl-insts,+dot1-insts,+dot10-insts,+dot2-insts,+dot3-insts,+dot4-insts,+dot5-insts,+dot6-insts,+dot7-insts,+dpp,+gfx8-insts,+gfx9-insts,+gfx90a-insts,+gws,+image-insts,+mai-insts,+s-memrealtime,+s-memtime-inst,+wavefrontsize64" } -// CHECK: attributes #[[ATTR_INCOMPATIBLE]] = { convergent noinline nounwind optnone "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="gfx90a" "target-features"="-gfx9-insts,+16-bit-insts,+atomic-buffer-global-pk-add-f16-insts,+atomic-fadd-rtn-insts,+ci-insts,+dl-insts,+dot1-insts,+dot10-insts,+dot2-insts,+dot3-insts,+dot4-insts,+dot5-insts,+dot6-insts,+dot7-insts,+dpp,+gfx8-insts,+gfx90a-insts,+gws,+image-insts,+mai-insts,+s-memrealtime,+s-memtime-inst,+wavefrontsize64" } </pre> </details> https://github.com/llvm/llvm-project/pull/65737 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits