Auto merge of #139534 - madhav-madhusoodanan:apx-target-feature-addit… · rust-lang/rust@e3d0b57 (original) (raw)
`@@ -18,6 +18,7 @@ use rustc_session::config::{PrintKind, PrintRequest};
`
18
18
`use rustc_span::Symbol;
`
19
19
`use rustc_target::spec::{MergeFunctions, PanicStrategy, SmallDataThresholdSupport};
`
20
20
`use rustc_target::target_features::{RUSTC_SPECIAL_FEATURES, RUSTC_SPECIFIC_FEATURES};
`
``
21
`+
use smallvec::{SmallVec, smallvec};
`
21
22
``
22
23
`use crate:🔙:write::create_informational_target_machine;
`
23
24
`use crate::errors::{
`
`@@ -179,27 +180,27 @@ impl<'a> TargetFeatureFoldStrength<'a> {
`
179
180
``
180
181
`pub(crate) struct LLVMFeature<'a> {
`
181
182
`llvm_feature_name: &'a str,
`
182
``
`-
dependency: Option<TargetFeatureFoldStrength<'a>>,
`
``
183
`+
dependencies: SmallVec<[TargetFeatureFoldStrength<'a>; 1]>,
`
183
184
`}
`
184
185
``
185
186
`impl<'a> LLVMFeature<'a> {
`
186
187
`fn new(llvm_feature_name: &'a str) -> Self {
`
187
``
`-
Self { llvm_feature_name, dependency: None }
`
``
188
`+
Self { llvm_feature_name, dependencies: SmallVec::new() }
`
188
189
`}
`
189
190
``
190
``
`-
fn with_dependency(
`
``
191
`+
fn with_dependencies(
`
191
192
`llvm_feature_name: &'a str,
`
192
``
`-
dependency: TargetFeatureFoldStrength<'a>,
`
``
193
`+
dependencies: SmallVec<[TargetFeatureFoldStrength<'a>; 1]>,
`
193
194
`) -> Self {
`
194
``
`-
Self { llvm_feature_name, dependency: Some(dependency) }
`
``
195
`+
Self { llvm_feature_name, dependencies }
`
195
196
`}
`
196
197
``
197
``
`-
fn contains(&self, feat: &str) -> bool {
`
``
198
`+
fn contains(&'a self, feat: &str) -> bool {
`
198
199
`self.iter().any(|dep| dep == feat)
`
199
200
`}
`
200
201
``
201
202
`fn iter(&'a self) -> impl Iterator<Item = &'a str> {
`
202
``
`-
let dependencies = self.dependency.iter().map(|feat| feat.as_str());
`
``
203
`+
let dependencies = self.dependencies.iter().map(|feat| feat.as_str());
`
203
204
` std::iter::once(self.llvm_feature_name).chain(dependencies)
`
204
205
`}
`
205
206
`}
`
`@@ -209,7 +210,7 @@ impl<'a> IntoIterator for LLVMFeature<'a> {
`
209
210
`type IntoIter = impl Iterator<Item = &'a str>;
`
210
211
``
211
212
`fn into_iter(self) -> Self::IntoIter {
`
212
``
`-
let dependencies = self.dependency.into_iter().map(|feat| feat.as_str());
`
``
213
`+
let dependencies = self.dependencies.into_iter().map(|feat| feat.as_str());
`
213
214
` std::iter::once(self.llvm_feature_name).chain(dependencies)
`
214
215
`}
`
215
216
`}
`
`@@ -239,9 +240,9 @@ pub(crate) fn to_llvm_features<'a>(sess: &Session, s: &'a str) -> Option<LLVMFea
`
239
240
`&*sess.target.arch
`
240
241
`};
`
241
242
`match (arch, s) {
`
242
``
`-
("x86", "sse4.2") => Some(LLVMFeature::with_dependency(
`
``
243
`+
("x86", "sse4.2") => Some(LLVMFeature::with_dependencies(
`
243
244
`"sse4.2",
`
244
``
`-
TargetFeatureFoldStrength::EnableOnly("crc32"),
`
``
245
`+
smallvec![TargetFeatureFoldStrength::EnableOnly("crc32")],
`
245
246
`)),
`
246
247
`("x86", "pclmulqdq") => Some(LLVMFeature::new("pclmul")),
`
247
248
`("x86", "rdrand") => Some(LLVMFeature::new("rdrnd")),
`
`@@ -261,9 +262,10 @@ pub(crate) fn to_llvm_features<'a>(sess: &Session, s: &'a str) -> Option<LLVMFea
`
261
262
`("aarch64", "sme-b16b16") if get_version().0 < 20 => Some(LLVMFeature::new("b16b16")),
`
262
263
`("aarch64", "flagm2") => Some(LLVMFeature::new("altnzcv")),
`
263
264
`// Rust ties fp and neon together.
`
264
``
`-
("aarch64", "neon") => {
`
265
``
`-
Some(LLVMFeature::with_dependency("neon", TargetFeatureFoldStrength::Both("fp-armv8")))
`
266
``
`-
}
`
``
265
`+
("aarch64", "neon") => Some(LLVMFeature::with_dependencies(
`
``
266
`+
"neon",
`
``
267
`+
smallvec![TargetFeatureFoldStrength::Both("fp-armv8")],
`
``
268
`+
)),
`
267
269
`// In LLVM neon implicitly enables fp, but we manually enable
`
268
270
`// neon when a feature only implicitly enables fp
`
269
271
`("aarch64", "fhm") => Some(LLVMFeature::new("fp16fml")),
`
`@@ -274,9 +276,10 @@ pub(crate) fn to_llvm_features<'a>(sess: &Session, s: &'a str) -> Option<LLVMFea
`
274
276
`// Filter out features that are not supported by the current LLVM version
`
275
277
`("riscv32" | "riscv64", "zacas") if get_version().0 < 20 => None,
`
276
278
`// Enable the evex512 target feature if an avx512 target feature is enabled.
`
277
``
`-
("x86", s) if s.starts_with("avx512") => {
`
278
``
`-
Some(LLVMFeature::with_dependency(s, TargetFeatureFoldStrength::EnableOnly("evex512")))
`
279
``
`-
}
`
``
279
`+
("x86", s) if s.starts_with("avx512") => Some(LLVMFeature::with_dependencies(
`
``
280
`+
s,
`
``
281
`+
smallvec![TargetFeatureFoldStrength::EnableOnly("evex512")],
`
``
282
`+
)),
`
280
283
`` // Support for wide-arithmetic
will first land in LLVM 20 as part of
``
281
284
`// llvm/llvm-project#111598
`
282
285
`("wasm32" | "wasm64", "wide-arithmetic") if get_version() < (20, 0, 0) => None,
`
`@@ -765,7 +768,7 @@ pub(crate) fn global_llvm_features(
`
765
768
`"{}{}",
`
766
769
` enable_disable, llvm_feature.llvm_feature_name
`
767
770
`))
`
768
``
`-
.chain(llvm_feature.dependency.into_iter().filter_map(
`
``
771
`+
.chain(llvm_feature.dependencies.into_iter().filter_map(
`
769
772
`move |feat| match (enable, feat) {
`
770
773
`(_, TargetFeatureFoldStrength::Both(f))
`
771
774
` | (true, TargetFeatureFoldStrength::EnableOnly(f)) => {
`