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

via llvm-commits llvm-commits at lists.llvm.org
Tue Oct 24 01:32:18 PDT 2023


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 fa7aaccabcd6109..bfce3f9d4e5b363 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 cc464b7681ce17e..924a55add874697 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 000000000000000..757c88577c3307d
--- /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 924a55add874697..699e4338dae117e 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