Skip to content

Revert "[Clang][LoongArch] Support target attribute for function" #141998

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
May 29, 2025

Conversation

ilovepi
Copy link
Contributor

@ilovepi ilovepi commented May 29, 2025

@ilovepi ilovepi requested a review from Ami-zhang May 29, 2025 17:52
@llvmbot llvmbot added clang Clang issues not falling into any other category clang:frontend Language frontend issues, e.g. anything involving "Sema" backend:loongarch labels May 29, 2025
@llvmbot
Copy link
Member

llvmbot commented May 29, 2025

@llvm/pr-subscribers-clang

@llvm/pr-subscribers-backend-loongarch

Author: Paul Kirth (ilovepi)

Changes

Reverts llvm/llvm-project#140700

This breaks bots both in buildbot and downstream CI:


Full diff: https://github.com/llvm/llvm-project/pull/141998.diff

7 Files Affected:

  • (modified) clang/lib/Basic/Targets/LoongArch.cpp (-71)
  • (modified) clang/lib/Basic/Targets/LoongArch.h (-4)
  • (modified) clang/lib/Sema/SemaDeclAttr.cpp (-11)
  • (removed) clang/test/CodeGen/LoongArch/targetattr.c (-92)
  • (removed) clang/test/Sema/attr-target-loongarch.c (-25)
  • (modified) llvm/include/llvm/TargetParser/LoongArchTargetParser.h (-1)
  • (modified) llvm/lib/TargetParser/LoongArchTargetParser.cpp (-12)
diff --git a/clang/lib/Basic/Targets/LoongArch.cpp b/clang/lib/Basic/Targets/LoongArch.cpp
index 6e5e5a6d1a3e6..f4bcb54bd470d 100644
--- a/clang/lib/Basic/Targets/LoongArch.cpp
+++ b/clang/lib/Basic/Targets/LoongArch.cpp
@@ -393,73 +393,6 @@ bool LoongArchTargetInfo::handleTargetFeatures(
   return true;
 }
 
-enum class AttrFeatureKind { Arch, Tune, NoFeature, Feature };
-
-static std::pair<AttrFeatureKind, llvm::StringRef>
-getAttrFeatureTypeAndValue(llvm::StringRef AttrFeature) {
-  if (auto Split = AttrFeature.split("="); !Split.second.empty()) {
-    if (Split.first.trim() == "arch")
-      return {AttrFeatureKind::Arch, Split.second.trim()};
-    if (Split.first.trim() == "tune")
-      return {AttrFeatureKind::Tune, Split.second.trim()};
-  }
-  if (AttrFeature.starts_with("no-"))
-    return {AttrFeatureKind::NoFeature, AttrFeature.drop_front(3)};
-  return {AttrFeatureKind::Feature, AttrFeature};
-}
-
-ParsedTargetAttr
-LoongArchTargetInfo::parseTargetAttr(StringRef Features) const {
-  ParsedTargetAttr Ret;
-  if (Features == "default")
-    return Ret;
-  SmallVector<StringRef, 1> AttrFeatures;
-  Features.split(AttrFeatures, ",");
-
-  for (auto &Feature : AttrFeatures) {
-    auto [Kind, Value] = getAttrFeatureTypeAndValue(Feature.trim());
-
-    switch (Kind) {
-    case AttrFeatureKind::Arch: {
-      if (llvm::LoongArch::isValidArchName(Value) || Value == "la64v1.0" ||
-          Value == "la64v1.1") {
-        std::vector<llvm::StringRef> ArchFeatures;
-        if (llvm::LoongArch::getArchFeatures(Value, ArchFeatures)) {
-          Ret.Features.insert(Ret.Features.end(), ArchFeatures.begin(),
-                              ArchFeatures.end());
-        }
-
-        if (!Ret.CPU.empty())
-          Ret.Duplicate = "arch=";
-        else if (Value == "la64v1.0" || Value == "la64v1.1")
-          Ret.CPU = "loongarch64";
-        else
-          Ret.CPU = Value;
-      } else {
-        Ret.Features.push_back("!arch=" + Value.str());
-      }
-      break;
-    }
-
-    case AttrFeatureKind::Tune:
-      if (!Ret.Tune.empty())
-        Ret.Duplicate = "tune=";
-      else
-        Ret.Tune = Value;
-      break;
-
-    case AttrFeatureKind::NoFeature:
-      Ret.Features.push_back("-" + Value.str());
-      break;
-
-    case AttrFeatureKind::Feature:
-      Ret.Features.push_back("+" + Value.str());
-      break;
-    }
-  }
-  return Ret;
-}
-
 bool LoongArchTargetInfo::isValidCPUName(StringRef Name) const {
   return llvm::LoongArch::isValidCPUName(Name);
 }
@@ -468,7 +401,3 @@ void LoongArchTargetInfo::fillValidCPUList(
     SmallVectorImpl<StringRef> &Values) const {
   llvm::LoongArch::fillValidCPUList(Values);
 }
-
-bool LoongArchTargetInfo::isValidFeatureName(StringRef Name) const {
-  return llvm::LoongArch::isValidFeatureName(Name);
-}
diff --git a/clang/lib/Basic/Targets/LoongArch.h b/clang/lib/Basic/Targets/LoongArch.h
index a83bb925bc310..4c7b53abfef9b 100644
--- a/clang/lib/Basic/Targets/LoongArch.h
+++ b/clang/lib/Basic/Targets/LoongArch.h
@@ -101,9 +101,6 @@ class LLVM_LIBRARY_VISIBILITY LoongArchTargetInfo : public TargetInfo {
   bool handleTargetFeatures(std::vector<std::string> &Features,
                             DiagnosticsEngine &Diags) override;
 
-  ParsedTargetAttr parseTargetAttr(StringRef Str) const override;
-  bool supportsTargetAttributeTune() const override { return true; }
-
   bool
   initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
                  StringRef CPU,
@@ -113,7 +110,6 @@ class LLVM_LIBRARY_VISIBILITY LoongArchTargetInfo : public TargetInfo {
 
   bool isValidCPUName(StringRef Name) const override;
   void fillValidCPUList(SmallVectorImpl<StringRef> &Values) const override;
-  bool isValidFeatureName(StringRef Name) const override;
 };
 
 class LLVM_LIBRARY_VISIBILITY LoongArch32TargetInfo
diff --git a/clang/lib/Sema/SemaDeclAttr.cpp b/clang/lib/Sema/SemaDeclAttr.cpp
index 5bc358ca5fca0..119ba8486b09f 100644
--- a/clang/lib/Sema/SemaDeclAttr.cpp
+++ b/clang/lib/Sema/SemaDeclAttr.cpp
@@ -3195,17 +3195,6 @@ bool Sema::checkTargetAttr(SourceLocation LiteralLoc, StringRef AttrStr) {
     }
   }
 
-  if (Context.getTargetInfo().getTriple().isLoongArch()) {
-    for (const auto &Feature : ParsedAttrs.Features) {
-      StringRef CurFeature = Feature;
-      if (CurFeature.starts_with("!arch=")) {
-        StringRef ArchValue = CurFeature.split("=").second.trim();
-        return Diag(LiteralLoc, diag::err_attribute_unsupported)
-               << "target(arch=..)" << ArchValue;
-      }
-    }
-  }
-
   if (ParsedAttrs.Duplicate != "")
     return Diag(LiteralLoc, diag::warn_unsupported_target_attribute)
            << Duplicate << None << ParsedAttrs.Duplicate << Target;
diff --git a/clang/test/CodeGen/LoongArch/targetattr.c b/clang/test/CodeGen/LoongArch/targetattr.c
deleted file mode 100644
index 5546af8fc856c..0000000000000
--- a/clang/test/CodeGen/LoongArch/targetattr.c
+++ /dev/null
@@ -1,92 +0,0 @@
-// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --check-globals all --version 5
-// RUN: %clang --target=loongarch64-linux-gnu %s -S -emit-llvm -o - \
-// RUN:   | FileCheck %s
-
-__attribute__((target("div32")))
-// CHECK-LABEL: define dso_local void @testdiv32(
-// CHECK-SAME: ) #[[ATTR0:[0-9]+]] {
-// CHECK-NEXT:  [[ENTRY:.*:]]
-// CHECK-NEXT:    ret void
-//
-void testdiv32() {}
-
-__attribute__((target("arch=loongarch64")))
-// CHECK-LABEL: define dso_local void @testLoongarch64(
-// CHECK-SAME: ) #[[ATTR1:[0-9]+]] {
-// CHECK-NEXT:  [[ENTRY:.*:]]
-// CHECK-NEXT:    ret void
-//
-void testLoongarch64() {}
-
-__attribute__((target("arch=la64v1.0")))
-// CHECK-LABEL: define dso_local void @testLa64v10(
-// CHECK-SAME: ) #[[ATTR1]] {
-// CHECK-NEXT:  [[ENTRY:.*:]]
-// CHECK-NEXT:    ret void
-//
-void testLa64v10() {}
-
-__attribute__((target("arch=la64v1.1")))
-// CHECK-LABEL: define dso_local void @testLa64v11(
-// CHECK-SAME: ) #[[ATTR2:[0-9]+]] {
-// CHECK-NEXT:  [[ENTRY:.*:]]
-// CHECK-NEXT:    ret void
-//
-void testLa64v11() {}
-
-__attribute__((target("arch=la464")))
-// CHECK-LABEL: define dso_local void @testLa464(
-// CHECK-SAME: ) #[[ATTR3:[0-9]+]] {
-// CHECK-NEXT:  [[ENTRY:.*:]]
-// CHECK-NEXT:    ret void
-//
-void testLa464() {}
-
-__attribute__((target("arch=la664")))
-// CHECK-LABEL: define dso_local void @testLa664(
-// CHECK-SAME: ) #[[ATTR4:[0-9]+]] {
-// CHECK-NEXT:  [[ENTRY:.*:]]
-// CHECK-NEXT:    ret void
-//
-void testLa664() {}
-
-__attribute__((target("arch=la664, no-div32")))
-// CHECK-LABEL: define dso_local void @la664Nodiv32(
-// CHECK-SAME: ) #[[ATTR5:[0-9]+]] {
-// CHECK-NEXT:  [[ENTRY:.*:]]
-// CHECK-NEXT:    ret void
-//
-void la664Nodiv32() {}
-
-__attribute__((target("tune=la464")))
-// CHECK-LABEL: define dso_local void @tuneLa464(
-// CHECK-SAME: ) #[[ATTR6:[0-9]+]] {
-// CHECK-NEXT:  [[ENTRY:.*:]]
-// CHECK-NEXT:    ret void
-//
-void tuneLa464() {}
-
-__attribute__((target("arch=la464, tune=la664")))
-// CHECK-LABEL: define dso_local void @archLa464tuneLa664(
-// CHECK-SAME: ) #[[ATTR7:[0-9]+]] {
-// CHECK-NEXT:  [[ENTRY:.*:]]
-// CHECK-NEXT:    ret void
-//
-void archLa464tuneLa664() {}
-
-//.
-// CHECK: attributes #[[ATTR0]] = { noinline nounwind optnone "frame-pointer"="all" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="loongarch64" "target-features"="+64bit,+d,+div32,+f,+lsx,+ual" }
-// CHECK: attributes #[[ATTR1]] = { noinline nounwind optnone "frame-pointer"="all" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="loongarch64" "target-features"="+64bit,+d,+f,+lsx,+ual" }
-// CHECK: attributes #[[ATTR2]] = { noinline nounwind optnone "frame-pointer"="all" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="loongarch64" "target-features"="+64bit,+d,+div32,+f,+frecipe,+lam-bh,+lamcas,+ld-seq-sa,+lsx,+scq,+ual" }
-// CHECK: attributes #[[ATTR3]] = { noinline nounwind optnone "frame-pointer"="all" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="la464" "target-features"="+64bit,+d,+f,+lasx,+lsx,+ual" }
-// CHECK: attributes #[[ATTR4]] = { noinline nounwind optnone "frame-pointer"="all" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="la664" "target-features"="+64bit,+d,+div32,+f,+frecipe,+lam-bh,+lamcas,+lasx,+ld-seq-sa,+lsx,+scq,+ual" }
-// CHECK: attributes #[[ATTR5]] = { noinline nounwind optnone "frame-pointer"="all" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="la664" "target-features"="+64bit,+d,+f,+frecipe,+lam-bh,+lamcas,+lasx,+ld-seq-sa,+lsx,+scq,+ual,-div32" }
-// CHECK: attributes #[[ATTR6]] = { noinline nounwind optnone "frame-pointer"="all" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="loongarch64" "target-features"="+64bit,+d,+f,+lsx,+ual" "tune-cpu"="la464" }
-// CHECK: attributes #[[ATTR7]] = { noinline nounwind optnone "frame-pointer"="all" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="la464" "target-features"="+64bit,+d,+f,+lasx,+lsx,+ual" "tune-cpu"="la664" }
-//.
-// CHECK: [[META0:![0-9]+]] = !{i32 1, !"wchar_size", i32 4}
-// CHECK: [[META1:![0-9]+]] = !{i32 8, !"PIC Level", i32 2}
-// CHECK: [[META2:![0-9]+]] = !{i32 7, !"PIE Level", i32 2}
-// CHECK: [[META3:![0-9]+]] = !{i32 7, !"frame-pointer", i32 2}
-// CHECK: [[META4:![0-9]+]] = !{!"{{.*}}clang version {{.*}}"}
-//.
diff --git a/clang/test/Sema/attr-target-loongarch.c b/clang/test/Sema/attr-target-loongarch.c
deleted file mode 100644
index 10ac8334bdb0c..0000000000000
--- a/clang/test/Sema/attr-target-loongarch.c
+++ /dev/null
@@ -1,25 +0,0 @@
-// RUN: %clang_cc1 -triple loongarch64-linux-gnu  -fsyntax-only -verify %s
-
-// expected-error@+1 {{function multiversioning is not supported on the current target}}
-void __attribute__((target("default"))) bar(void) {}
-
-// expected-error@+1 {{target(arch=..) attribute is not supported on targets missing invalid; specify an appropriate -march= or -mcpu=}}
-void __attribute__((target("arch=invalid"))) foo(void) {}
-
-// expected-warning@+1 {{unsupported '+div32' in the 'target' attribute string; 'target' attribute ignored}}
-void __attribute__((target("+div32"))) plusfeature(void) {}
-
-// expected-warning@+1 {{unsupported '-div32' in the 'target' attribute string; 'target' attribute ignored}}
-void __attribute__((target("-div32"))) minusfeature(void) {}
-
-// expected-warning@+1 {{unsupported 'aaa' in the 'target' attribute string; 'target' attribute ignored}}
-int __attribute__((target("aaa"))) test_feature(void) { return 4; }
-
-// expected-warning@+1 {{unsupported 'aaa' in the 'target' attribute string; 'target' attribute ignored}}
-int __attribute__((target("no-aaa"))) test_nofeature(void) { return 4; }
-
-// expected-warning@+1 {{duplicate 'arch=' in the 'target' attribute string; 'target' attribute ignored}}
-int __attribute__((target("arch=la464,arch=la664"))) test_duplarch(void) { return 4; }
-
-// expected-warning@+1 {{unknown tune CPU 'la64v1.0' in the 'target' attribute string; 'target' attribute ignored}}
-int __attribute__((target("tune=la64v1.0"))) test_tune(void) { return 4; }
diff --git a/llvm/include/llvm/TargetParser/LoongArchTargetParser.h b/llvm/include/llvm/TargetParser/LoongArchTargetParser.h
index a28e4e9eff811..e08e7bc182e11 100644
--- a/llvm/include/llvm/TargetParser/LoongArchTargetParser.h
+++ b/llvm/include/llvm/TargetParser/LoongArchTargetParser.h
@@ -85,7 +85,6 @@ struct ArchInfo {
 };
 
 bool isValidArchName(StringRef Arch);
-bool isValidFeatureName(StringRef Feature);
 bool getArchFeatures(StringRef Arch, std::vector<StringRef> &Features);
 bool isValidCPUName(StringRef TuneCPU);
 void fillValidCPUList(SmallVectorImpl<StringRef> &Values);
diff --git a/llvm/lib/TargetParser/LoongArchTargetParser.cpp b/llvm/lib/TargetParser/LoongArchTargetParser.cpp
index db68498609b57..e394c0c15b207 100644
--- a/llvm/lib/TargetParser/LoongArchTargetParser.cpp
+++ b/llvm/lib/TargetParser/LoongArchTargetParser.cpp
@@ -34,18 +34,6 @@ bool LoongArch::isValidArchName(StringRef Arch) {
   return false;
 }
 
-bool LoongArch::isValidFeatureName(StringRef Feature) {
-  if (Feature.starts_with("+") || Feature.starts_with("-"))
-    return false;
-  for (const auto &F : AllFeatures) {
-    StringRef CanonicalName =
-        F.Name.starts_with("+") ? F.Name.drop_front() : F.Name;
-    if (CanonicalName == Feature)
-      return true;
-  }
-  return false;
-}
-
 bool LoongArch::getArchFeatures(StringRef Arch,
                                 std::vector<StringRef> &Features) {
   for (const auto A : AllArchs) {

@ilovepi ilovepi requested review from heiher and petrhosek May 29, 2025 17:53
@ilovepi ilovepi merged commit d93788f into main May 29, 2025
10 of 13 checks passed
@ilovepi ilovepi deleted the revert-140700-targetattr branch May 29, 2025 18:26
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
backend:loongarch clang:frontend Language frontend issues, e.g. anything involving "Sema" clang Clang issues not falling into any other category
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants