[clang] [Clang] Drop functions with incompatible target-features when using mlink-builtin-bitcode (PR #65737)
via cfe-commits
cfe-commits at lists.llvm.org
Mon Sep 11 13:09:34 PDT 2023
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
More information about the cfe-commits
mailing list