[llvm] [llvm][MC] Fix missing SubArch information when calling lookupTarget (PR #69902)

via llvm-commits llvm-commits at lists.llvm.org
Sat Feb 17 20:26:41 PST 2024


https://github.com/huaatian updated https://github.com/llvm/llvm-project/pull/69902

>From 2be83718e0faf4c1e48f71b3f20b32f028338188 Mon Sep 17 00:00:00 2001
From: huaatian <huaatian at sina.com>
Date: Mon, 23 Oct 2023 15:36:49 +0800
Subject: [PATCH 1/2] [llvm][MC] Fix missing SubArch information when calling
 lookupTarget

When calling the function 'lookupTarget', in some cases, the SubArch information of
the parameter TheTriple gets lost. This modification ensures the integrity
of the parameter TheTriple.
---
 llvm/lib/MC/TargetRegistry.cpp       |  3 ++-
 llvm/unittests/MC/TargetRegistry.cpp | 18 ++++++++++++++++++
 2 files changed, 20 insertions(+), 1 deletion(-)

diff --git a/llvm/lib/MC/TargetRegistry.cpp b/llvm/lib/MC/TargetRegistry.cpp
index fa7aaccabcd610..bfce3f9d4e5b36 100644
--- a/llvm/lib/MC/TargetRegistry.cpp
+++ b/llvm/lib/MC/TargetRegistry.cpp
@@ -43,7 +43,8 @@ const Target *TargetRegistry::lookupTarget(StringRef ArchName,
     // given triple.
     Triple::ArchType Type = Triple::getArchTypeForLLVMName(ArchName);
     if (Type != Triple::UnknownArch)
-      TheTriple.setArch(Type);
+      // Set the type of Arch while preserving SubArch, if any.
+      TheTriple.setArch(Type, TheTriple.getSubArch());
   } else {
     // Get the target specific parser.
     std::string TempError;
diff --git a/llvm/unittests/MC/TargetRegistry.cpp b/llvm/unittests/MC/TargetRegistry.cpp
index cc464b7681ce17..924a55add87469 100644
--- a/llvm/unittests/MC/TargetRegistry.cpp
+++ b/llvm/unittests/MC/TargetRegistry.cpp
@@ -42,4 +42,22 @@ TEST(TargetRegistry, TargetHasArchType) {
   ASSERT_NE(Count, 0);
 }
 
+TEST(TargetRegistry, PreserveSubArchInfo) {
+  auto T = Triple("mipsisa64r6el-unknown-linux-gnuabi64");
+  EXPECT_EQ(Triple::mips64el, T.getArch());
+  EXPECT_EQ(Triple::MipsSubArch_r6, T.getSubArch());
+  EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
+  EXPECT_EQ(Triple::Linux, T.getOS());
+  EXPECT_EQ(Triple::GNUABI64, T.getEnvironment());
+  std::string Error;
+  if (!TargetRegistry::lookupTarget("mips64el", T, Error))
+    GTEST_SKIP();
+  EXPECT_EQ(Triple::mips64el, T.getArch());
+  // The SubArch information needs to be preserved.
+  EXPECT_EQ(Triple::MipsSubArch_r6, T.getSubArch());
+  EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
+  EXPECT_EQ(Triple::Linux, T.getOS());
+  EXPECT_EQ(Triple::GNUABI64, T.getEnvironment());
+}
+
 } // end namespace

>From 95222b59c485c5cfbb83ee97749873a1a0f8c243 Mon Sep 17 00:00:00 2001
From: huaatian <huaatian at sina.com>
Date: Tue, 24 Oct 2023 16:30:19 +0800
Subject: [PATCH 2/2] Code Review adjustments 1

---
 llvm/test/MC/Mips/preserve_subarch_info.ll | 14 ++++++++++++
 llvm/unittests/MC/TargetRegistry.cpp       | 26 ++++++++++++++++++++++
 2 files changed, 40 insertions(+)
 create mode 100644 llvm/test/MC/Mips/preserve_subarch_info.ll

diff --git a/llvm/test/MC/Mips/preserve_subarch_info.ll b/llvm/test/MC/Mips/preserve_subarch_info.ll
new file mode 100644
index 00000000000000..757c88577c3307
--- /dev/null
+++ b/llvm/test/MC/Mips/preserve_subarch_info.ll
@@ -0,0 +1,14 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 3
+; RUN: llc -march=mips64el %s -o - | FileCheck %s
+
+target datalayout = "E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128"
+target triple = "mipsisa64r6el-unknown-linux-gnuabi64"
+
+define i64 @select_equal_zero(i64 %a, i64 %b, i64 %c) {
+entry:
+  ; CHECK: selnez
+  ; CHECK: seleqz
+  %cmp = icmp eq i64 %c, 0
+  %sel = select i1 %cmp, i64 %a, i64 %b
+  ret i64 %sel
+}
diff --git a/llvm/unittests/MC/TargetRegistry.cpp b/llvm/unittests/MC/TargetRegistry.cpp
index 924a55add87469..699e4338dae117 100644
--- a/llvm/unittests/MC/TargetRegistry.cpp
+++ b/llvm/unittests/MC/TargetRegistry.cpp
@@ -60,4 +60,30 @@ TEST(TargetRegistry, PreserveSubArchInfo) {
   EXPECT_EQ(Triple::GNUABI64, T.getEnvironment());
 }
 
+TEST(TargetRegistry, UpdateSubArchInfo) {
+  auto T = Triple("mipsisa64r6el-unknown-linux-gnuabi64");
+  EXPECT_EQ(Triple::mips64el, T.getArch());
+  EXPECT_EQ(Triple::MipsSubArch_r6, T.getSubArch());
+  EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
+  EXPECT_EQ(Triple::Linux, T.getOS());
+  EXPECT_EQ(Triple::GNUABI64, T.getEnvironment());
+  std::string Error;
+  if (!TargetRegistry::lookupTarget("aarch64", T, Error))
+    GTEST_SKIP();
+  EXPECT_EQ(Triple::aarch64, T.getArch());
+  // The SubArch will be updated to the new value corresponding to "aarch64".
+  EXPECT_EQ(Triple::ARMSubArch_v8, T.getSubArch());
+  EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
+  EXPECT_EQ(Triple::Linux, T.getOS());
+  EXPECT_EQ(Triple::GNUABI64, T.getEnvironment());
+  if (!TargetRegistry::lookupTarget("riscv64", T, Error))
+    GTEST_SKIP();
+  EXPECT_EQ(Triple::riscv64, T.getArch());
+  // The SubArch will be updated to the new value corresponding to "riscv64".
+  EXPECT_EQ(Triple::NoSubArch, T.getSubArch());
+  EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
+  EXPECT_EQ(Triple::Linux, T.getOS());
+  EXPECT_EQ(Triple::GNUABI64, T.getEnvironment());
+}
+
 } // end namespace



More information about the llvm-commits mailing list