[llvm] r366027 - [clang][Driver][ARM] Favor -mfpu over default CPU features
Alexandros Lamprineas via llvm-commits
llvm-commits at lists.llvm.org
Sun Jul 14 11:32:42 PDT 2019
Author: alelab01
Date: Sun Jul 14 11:32:42 2019
New Revision: 366027
URL: http://llvm.org/viewvc/llvm-project?rev=366027&view=rev
Log:
[clang][Driver][ARM] Favor -mfpu over default CPU features
When processing the command line options march, mcpu and mfpu, we store
the implied target features on a vector. The change D62998 introduced a
temporary vector, where the processed features get accumulated. When
calling DecodeARMFeaturesFromCPU, which sets the default features for
the specified CPU, we certainly don't want to override the features
that have been explicitly specified on the command line. Therefore, the
default features should appear first in the final vector. This problem
became evident once I added the missing (unhandled) target features in
ARM::getExtensionFeatures.
Differential Revision: https://reviews.llvm.org/D63936
Modified:
llvm/trunk/include/llvm/Support/ARMTargetParser.def
llvm/trunk/lib/Support/ARMTargetParser.cpp
llvm/trunk/unittests/Support/TargetParserTest.cpp
Modified: llvm/trunk/include/llvm/Support/ARMTargetParser.def
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/ARMTargetParser.def?rev=366027&r1=366026&r2=366027&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Support/ARMTargetParser.def (original)
+++ llvm/trunk/include/llvm/Support/ARMTargetParser.def Sun Jul 14 11:32:42 2019
@@ -148,6 +148,7 @@ ARM_ARCH_EXT_NAME("aes", ARM::AEK_A
ARM_ARCH_EXT_NAME("dotprod", ARM::AEK_DOTPROD, "+dotprod","-dotprod")
ARM_ARCH_EXT_NAME("dsp", ARM::AEK_DSP, "+dsp", "-dsp")
ARM_ARCH_EXT_NAME("fp", ARM::AEK_FP, nullptr, nullptr)
+ARM_ARCH_EXT_NAME("fp.dp", ARM::AEK_FP_DP, nullptr, nullptr)
ARM_ARCH_EXT_NAME("mve", ARM::AEK_SIMD, "+mve", "-mve")
ARM_ARCH_EXT_NAME("mve.fp", (ARM::AEK_SIMD | ARM::AEK_FP), "+mve.fp", "-mve.fp")
ARM_ARCH_EXT_NAME("idiv", (ARM::AEK_HWDIVARM | ARM::AEK_HWDIVTHUMB), nullptr, nullptr)
Modified: llvm/trunk/lib/Support/ARMTargetParser.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/ARMTargetParser.cpp?rev=366027&r1=366026&r2=366027&view=diff
==============================================================================
--- llvm/trunk/lib/Support/ARMTargetParser.cpp (original)
+++ llvm/trunk/lib/Support/ARMTargetParser.cpp Sun Jul 14 11:32:42 2019
@@ -409,30 +409,12 @@ bool ARM::getExtensionFeatures(unsigned
if (Extensions == AEK_INVALID)
return false;
- if (Extensions & AEK_CRC)
- Features.push_back("+crc");
- else
- Features.push_back("-crc");
-
- if (Extensions & AEK_DSP)
- Features.push_back("+dsp");
- else
- Features.push_back("-dsp");
-
- if (Extensions & AEK_FP16FML)
- Features.push_back("+fp16fml");
- else
- Features.push_back("-fp16fml");
-
- if (Extensions & AEK_RAS)
- Features.push_back("+ras");
- else
- Features.push_back("-ras");
-
- if (Extensions & AEK_DOTPROD)
- Features.push_back("+dotprod");
- else
- Features.push_back("-dotprod");
+ for (const auto AE : ARCHExtNames) {
+ if ((Extensions & AE.ID) == AE.ID && AE.Feature)
+ Features.push_back(AE.Feature);
+ else if (AE.NegFeature)
+ Features.push_back(AE.NegFeature);
+ }
return getHWDivFeatures(Extensions, Features);
}
Modified: llvm/trunk/unittests/Support/TargetParserTest.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/Support/TargetParserTest.cpp?rev=366027&r1=366026&r2=366027&view=diff
==============================================================================
--- llvm/trunk/unittests/Support/TargetParserTest.cpp (original)
+++ llvm/trunk/unittests/Support/TargetParserTest.cpp Sun Jul 14 11:32:42 2019
@@ -571,17 +571,18 @@ TEST(TargetParserTest, ARMFPURestriction
TEST(TargetParserTest, ARMExtensionFeatures) {
std::map<unsigned, std::vector<StringRef>> Extensions;
- Extensions[ARM::AEK_CRC] = { "+crc", "-crc" };
- Extensions[ARM::AEK_DSP] = { "+dsp", "-dsp" };
+ for (auto &Ext : ARM::ARCHExtNames) {
+ if (Ext.Feature && Ext.NegFeature)
+ Extensions[Ext.ID] = { StringRef(Ext.Feature),
+ StringRef(Ext.NegFeature) };
+ }
+
Extensions[ARM::AEK_HWDIVARM] = { "+hwdiv-arm", "-hwdiv-arm" };
Extensions[ARM::AEK_HWDIVTHUMB] = { "+hwdiv", "-hwdiv" };
- Extensions[ARM::AEK_RAS] = { "+ras", "-ras" };
- Extensions[ARM::AEK_FP16FML] = { "+fp16fml", "-fp16fml" };
- Extensions[ARM::AEK_DOTPROD] = { "+dotprod", "-dotprod" };
std::vector<StringRef> Features;
- EXPECT_FALSE(AArch64::getExtensionFeatures(ARM::AEK_INVALID, Features));
+ EXPECT_FALSE(ARM::getExtensionFeatures(ARM::AEK_INVALID, Features));
for (auto &E : Extensions) {
// test +extension
@@ -598,7 +599,7 @@ TEST(TargetParserTest, ARMExtensionFeatu
Found = std::find(std::begin(Features), std::end(Features), E.second.at(1));
EXPECT_TRUE(Found != std::end(Features));
EXPECT_TRUE(Extensions.size() == Features.size());
- }
+ }
}
TEST(TargetParserTest, ARMFPUFeatures) {
More information about the llvm-commits
mailing list