1
Fork 0

Implement optimize(none) attribute

This commit is contained in:
clubby789 2024-12-09 19:00:43 +00:00
parent dee7d0e730
commit cd848c9f3e
8 changed files with 45 additions and 14 deletions

View file

@ -38,7 +38,11 @@ pub enum InstructionSetAttr {
#[derive(Clone, Encodable, Decodable, Debug, HashStable_Generic)] #[derive(Clone, Encodable, Decodable, Debug, HashStable_Generic)]
pub enum OptimizeAttr { pub enum OptimizeAttr {
None, None,
/// `#[optimize(none)]`
DoNotOptimize,
/// `#[optimize(speed)]`
Speed, Speed,
/// `#[optimize(size)]`
Size, Size,
} }

View file

@ -336,6 +336,9 @@ pub(crate) fn llfn_attrs_from_instance<'ll, 'tcx>(
OptimizeAttr::None => { OptimizeAttr::None => {
to_add.extend(default_optimisation_attrs(cx)); to_add.extend(default_optimisation_attrs(cx));
} }
OptimizeAttr::DoNotOptimize => {
to_add.push(llvm::AttributeKind::OptimizeNone.create_attr(cx.llcx));
}
OptimizeAttr::Size => { OptimizeAttr::Size => {
to_add.push(llvm::AttributeKind::MinSize.create_attr(cx.llcx)); to_add.push(llvm::AttributeKind::MinSize.create_attr(cx.llcx));
to_add.push(llvm::AttributeKind::OptimizeForSize.create_attr(cx.llcx)); to_add.push(llvm::AttributeKind::OptimizeForSize.create_attr(cx.llcx));
@ -343,12 +346,12 @@ pub(crate) fn llfn_attrs_from_instance<'ll, 'tcx>(
OptimizeAttr::Speed => {} OptimizeAttr::Speed => {}
} }
let inline = // `optnone` requires `noinline`
if codegen_fn_attrs.inline == InlineAttr::None && instance.def.requires_inline(cx.tcx) { let inline = match (codegen_fn_attrs.inline, &codegen_fn_attrs.optimize) {
InlineAttr::Hint (_, OptimizeAttr::DoNotOptimize) => InlineAttr::Never,
} else { (InlineAttr::None, _) if instance.def.requires_inline(cx.tcx) => InlineAttr::Hint,
codegen_fn_attrs.inline (inline, _) => inline,
}; };
to_add.extend(inline_attr(cx, inline)); to_add.extend(inline_attr(cx, inline));
// The `uwtable` attribute according to LLVM is: // The `uwtable` attribute according to LLVM is:

View file

@ -1053,10 +1053,7 @@ pub(crate) fn provide(providers: &mut Providers) {
let any_for_speed = defids.items().any(|id| { let any_for_speed = defids.items().any(|id| {
let CodegenFnAttrs { optimize, .. } = tcx.codegen_fn_attrs(*id); let CodegenFnAttrs { optimize, .. } = tcx.codegen_fn_attrs(*id);
match optimize { matches!(optimize, attr::OptimizeAttr::Speed)
attr::OptimizeAttr::None | attr::OptimizeAttr::Size => false,
attr::OptimizeAttr::Speed => true,
}
}); });
if any_for_speed { if any_for_speed {

View file

@ -592,6 +592,8 @@ fn codegen_fn_attrs(tcx: TyCtxt<'_>, did: LocalDefId) -> CodegenFnAttrs {
OptimizeAttr::Size OptimizeAttr::Size
} else if list_contains_name(items, sym::speed) { } else if list_contains_name(items, sym::speed) {
OptimizeAttr::Speed OptimizeAttr::Speed
} else if list_contains_name(items, sym::none) {
OptimizeAttr::DoNotOptimize
} else { } else {
err(items[0].span(), "invalid argument"); err(items[0].span(), "invalid argument");
OptimizeAttr::None OptimizeAttr::None

View file

@ -532,7 +532,7 @@ pub const BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[
), ),
// RFC 2412 // RFC 2412
gated!( gated!(
optimize, Normal, template!(List: "size|speed"), ErrorPreceding, optimize, Normal, template!(List: "none|size|speed"), ErrorPreceding,
EncodeCrossCrate::No, optimize_attribute, experimental!(optimize) EncodeCrossCrate::No, optimize_attribute, experimental!(optimize)
), ),

View file

@ -37,11 +37,23 @@ pub fn speed() -> i32 {
4 + 4 4 + 4
} }
// CHECK-LABEL: define{{.*}}i32 @none
// CHECK-SAME: [[NONE_ATTRS:#[0-9]+]]
// SIZE-OPT: alloca
// SPEED-OPT: alloca
#[no_mangle]
#[optimize(none)]
pub fn none() -> i32 {
let arr = [0, 1, 2, 3, 4];
arr[4]
}
// NO-OPT-DAG: attributes [[SIZE_ATTRS]] = {{.*}}minsize{{.*}}optsize{{.*}} // NO-OPT-DAG: attributes [[SIZE_ATTRS]] = {{.*}}minsize{{.*}}optsize{{.*}}
// SPEED-OPT-DAG: attributes [[SIZE_ATTRS]] = {{.*}}minsize{{.*}}optsize{{.*}} // SPEED-OPT-DAG: attributes [[SIZE_ATTRS]] = {{.*}}minsize{{.*}}optsize{{.*}}
// SIZE-OPT-DAG: attributes [[NOTHING_ATTRS]] = {{.*}}optsize{{.*}} // SIZE-OPT-DAG: attributes [[NOTHING_ATTRS]] = {{.*}}optsize{{.*}}
// SIZE-OPT-DAG: attributes [[SIZE_ATTRS]] = {{.*}}minsize{{.*}}optsize{{.*}} // SIZE-OPT-DAG: attributes [[SIZE_ATTRS]] = {{.*}}minsize{{.*}}optsize{{.*}}
// CHECK-DAG: attributes [[NONE_ATTRS]] = {{.*}}noinline{{.*}}optnone{{.*}}
// SIZE-OPT: attributes [[SPEED_ATTRS]] // SIZE-OPT-DAG: attributes [[SPEED_ATTRS]]
// SIZE-OPT-NOT: minsize // SIZE-OPT-NOT: minsize
// SIZE-OPT-NOT: optsize // SIZE-OPT-NOT: optsize

View file

@ -6,6 +6,9 @@ fn size() {}
#[optimize(speed)] //~ ERROR the `#[optimize]` attribute is an experimental feature #[optimize(speed)] //~ ERROR the `#[optimize]` attribute is an experimental feature
fn speed() {} fn speed() {}
#[optimize(none)] //~ ERROR the `#[optimize]` attribute is an experimental feature
fn none() {}
#[optimize(banana)] #[optimize(banana)]
//~^ ERROR the `#[optimize]` attribute is an experimental feature //~^ ERROR the `#[optimize]` attribute is an experimental feature
//~| ERROR E0722 //~| ERROR E0722

View file

@ -21,6 +21,16 @@ LL | #[optimize(speed)]
error[E0658]: the `#[optimize]` attribute is an experimental feature error[E0658]: the `#[optimize]` attribute is an experimental feature
--> $DIR/feature-gate-optimize_attribute.rs:9:1 --> $DIR/feature-gate-optimize_attribute.rs:9:1
| |
LL | #[optimize(none)]
| ^^^^^^^^^^^^^^^^^
|
= note: see issue #54882 <https://github.com/rust-lang/rust/issues/54882> for more information
= help: add `#![feature(optimize_attribute)]` to the crate attributes to enable
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
error[E0658]: the `#[optimize]` attribute is an experimental feature
--> $DIR/feature-gate-optimize_attribute.rs:12:1
|
LL | #[optimize(banana)] LL | #[optimize(banana)]
| ^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^
| |
@ -29,12 +39,12 @@ LL | #[optimize(banana)]
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date = note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
error[E0722]: invalid argument error[E0722]: invalid argument
--> $DIR/feature-gate-optimize_attribute.rs:9:12 --> $DIR/feature-gate-optimize_attribute.rs:12:12
| |
LL | #[optimize(banana)] LL | #[optimize(banana)]
| ^^^^^^ | ^^^^^^
error: aborting due to 4 previous errors error: aborting due to 5 previous errors
Some errors have detailed explanations: E0658, E0722. Some errors have detailed explanations: E0658, E0722.
For more information about an error, try `rustc --explain E0658`. For more information about an error, try `rustc --explain E0658`.