From 78bb4d52f29092111b8bbf397827b381ac0b91ec Mon Sep 17 00:00:00 2001 From: Benjamin Maxwell Date: Wed, 16 Apr 2025 08:36:43 +0000 Subject: [PATCH] [TargetParser] Parse Amazon Linux triple and handle RuntimeLibcalls This parses the "aarch64-amazon-linux" triple and updates RuntimeLibcalls to mark the sincos* functions as available on Amazon Linux. This allows these functions to be vectorized on Amazon Linux. --- llvm/include/llvm/TargetParser/Triple.h | 10 +++++++++- llvm/lib/IR/RuntimeLibcalls.cpp | 3 ++- llvm/lib/TargetParser/Triple.cpp | 5 +++++ llvm/test/CodeGen/AArch64/veclib-llvm.sincos.ll | 3 +++ llvm/test/Transforms/LoopVectorize/AArch64/sincos.ll | 3 +++ llvm/unittests/TargetParser/TripleTest.cpp | 6 ++++++ 6 files changed, 28 insertions(+), 2 deletions(-) diff --git a/llvm/include/llvm/TargetParser/Triple.h b/llvm/include/llvm/TargetParser/Triple.h index 7d67966d1725..e833ff4813d1 100644 --- a/llvm/include/llvm/TargetParser/Triple.h +++ b/llvm/include/llvm/TargetParser/Triple.h @@ -194,7 +194,9 @@ class Triple { SUSE, OpenEmbedded, Intel, - LastVendorType = Intel + // Downstream change: #87 (sincos vectorization) + Amazon, + LastVendorType = Amazon }; enum OSType { UnknownOS, @@ -899,6 +901,12 @@ class Triple { return getArch() == Triple::arm || getArch() == Triple::armeb; } + // Downstream change: #87 (sincos vectorization) + /// Tests whether the target is Amazon Linux. + bool isAmazonLinux() const { + return getOS() == Triple::Linux && getVendor() == Triple::Amazon; + } + /// Tests whether the target supports the EHABI exception /// handling standard. bool isTargetEHABICompatible() const { diff --git a/llvm/lib/IR/RuntimeLibcalls.cpp b/llvm/lib/IR/RuntimeLibcalls.cpp index e38fce764b64..203b9089edbe 100644 --- a/llvm/lib/IR/RuntimeLibcalls.cpp +++ b/llvm/lib/IR/RuntimeLibcalls.cpp @@ -175,7 +175,8 @@ void RuntimeLibcallsInfo::initLibcalls(const Triple &TT) { setLibcallName(RTLIB::FPROUND_F32_F16, "__gnu_f2h_ieee"); } - if (TT.isGNUEnvironment() || TT.isOSFuchsia() || + // Downstream change: #87 (sincos vectorization) + if (TT.isGNUEnvironment() || TT.isOSFuchsia() || TT.isAmazonLinux() || (TT.isAndroid() && !TT.isAndroidVersionLT(9))) { setLibcallName(RTLIB::SINCOS_F32, "sincosf"); setLibcallName(RTLIB::SINCOS_F64, "sincos"); diff --git a/llvm/lib/TargetParser/Triple.cpp b/llvm/lib/TargetParser/Triple.cpp index e9e6f130f757..7b635ae80b41 100644 --- a/llvm/lib/TargetParser/Triple.cpp +++ b/llvm/lib/TargetParser/Triple.cpp @@ -270,6 +270,9 @@ StringRef Triple::getVendorTypeName(VendorType Kind) { case PC: return "pc"; case SCEI: return "scei"; case SUSE: return "suse"; + case Amazon: + // Downstream change: #87 (sincos vectorization) + return "amazon"; } llvm_unreachable("Invalid VendorType!"); @@ -664,6 +667,8 @@ static Triple::VendorType parseVendor(StringRef VendorName) { .Case("suse", Triple::SUSE) .Case("oe", Triple::OpenEmbedded) .Case("intel", Triple::Intel) + // Downstream change: #87 (sincos vectorization) + .Case("amazon", Triple::Amazon) .Default(Triple::UnknownVendor); } diff --git a/llvm/test/CodeGen/AArch64/veclib-llvm.sincos.ll b/llvm/test/CodeGen/AArch64/veclib-llvm.sincos.ll index e18ac46165d2..7f40efa34271 100644 --- a/llvm/test/CodeGen/AArch64/veclib-llvm.sincos.ll +++ b/llvm/test/CodeGen/AArch64/veclib-llvm.sincos.ll @@ -1,6 +1,9 @@ ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --filter "(bl|ptrue)" --version 5 ; RUN: llc -mtriple=aarch64-gnu-linux -mattr=+neon,+sve -vector-library=sleefgnuabi < %s | FileCheck %s -check-prefix=SLEEF ; RUN: llc -mtriple=aarch64-gnu-linux -mattr=+neon,+sve -vector-library=ArmPL < %s | FileCheck %s -check-prefix=ARMPL +; Check we expand to a vector library call on aarch64-amazon-linux: +; RUN: llc -mtriple=aarch64-amazon-linux -mattr=+neon,+sve -vector-library=sleefgnuabi < %s | FileCheck %s -check-prefix=SLEEF +; RUN: llc -mtriple=aarch64-amazon-linux -mattr=+neon,+sve -vector-library=ArmPL < %s | FileCheck %s -check-prefix=ARMPL define void @test_sincos_v4f32(<4 x float> %x, ptr noalias %out_sin, ptr noalias %out_cos) { ; SLEEF-LABEL: test_sincos_v4f32: diff --git a/llvm/test/Transforms/LoopVectorize/AArch64/sincos.ll b/llvm/test/Transforms/LoopVectorize/AArch64/sincos.ll index a7e949838f76..bcfa67eb7ab1 100644 --- a/llvm/test/Transforms/LoopVectorize/AArch64/sincos.ll +++ b/llvm/test/Transforms/LoopVectorize/AArch64/sincos.ll @@ -1,8 +1,11 @@ ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --filter "(:|sincos|extractvalue|store)" --version 5 ; RUN: opt -passes=loop-vectorize -mtriple=aarch64-gnu-linux -mcpu=neoverse-v1 -mattr=+sve < %s -S -o - -debug-only=loop-vectorize 2>%t.1 | FileCheck %s --check-prefix=CHECK ; RUN: opt -passes=loop-vectorize -mtriple=aarch64-gnu-linux -mcpu=neoverse-v1 -mattr=+sve -vector-library=ArmPL < %s -S -o - -debug-only=loop-vectorize 2>%t.2 | FileCheck %s --check-prefix=CHECK-ARMPL +; RUN: opt -passes=loop-vectorize -mtriple=aarch64-amazon-linux -mcpu=neoverse-v1 -mattr=+sve -vector-library=ArmPL < %s -S -o - -debug-only=loop-vectorize 2>%t.3 | FileCheck %s --check-prefix=CHECK-ARMPL ; RUN: FileCheck --input-file=%t.1 --check-prefix=CHECK-COST %s ; RUN: FileCheck --input-file=%t.2 --check-prefix=CHECK-COST-ARMPL %s +; Check we vectorize the functions with the vector-library on aarch64-amazon-linux: +; RUN: FileCheck --input-file=%t.3 --check-prefix=CHECK-COST-ARMPL %s ; REQUIRES: asserts ; CHECK-COST-LABEL: sincos_f32 diff --git a/llvm/unittests/TargetParser/TripleTest.cpp b/llvm/unittests/TargetParser/TripleTest.cpp index 61b3637bb48e..9a4d562fc2c2 100644 --- a/llvm/unittests/TargetParser/TripleTest.cpp +++ b/llvm/unittests/TargetParser/TripleTest.cpp @@ -125,6 +125,12 @@ TEST(TripleTest, ParsedIDs) { EXPECT_EQ(Triple::Hurd, T.getOS()); EXPECT_EQ(Triple::GNU, T.getEnvironment()); + // Downstream change: #87 (sincos vectorization) + T = Triple("aarch64-amazon-linux"); + EXPECT_EQ(Triple::aarch64, T.getArch()); + EXPECT_EQ(Triple::Amazon, T.getVendor()); + EXPECT_EQ(Triple::Linux, T.getOS()); + T = Triple("arm-unknown-linux-android16"); EXPECT_EQ(Triple::arm, T.getArch()); EXPECT_EQ(Triple::UnknownVendor, T.getVendor());