Skip to content

Commit 6365178

Browse files
committed
Auto merge of rust-lang#128657 - clubby789:optimize-none, r=fee1-dead,WaffleLapkin
Add `#[optimize(none)]` cc rust-lang#54882 This extends the `optimize` attribute to add `none`, which corresponds to the LLVM `OptimizeNone` attribute. Not sure if an MCP is required for this, happy to file one if so.
2 parents 1fc3491 + 5ac95a5 commit 6365178

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

65 files changed

+374
-32
lines changed

compiler/rustc_attr_data_structures/src/attributes.rs

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,13 +35,25 @@ pub enum InstructionSetAttr {
3535
ArmT32,
3636
}
3737

38-
#[derive(Clone, Encodable, Decodable, Debug, HashStable_Generic)]
38+
#[derive(Clone, Encodable, Decodable, Debug, PartialEq, Eq, HashStable_Generic, Default)]
3939
pub enum OptimizeAttr {
40-
None,
40+
/// No `#[optimize(..)]` attribute
41+
#[default]
42+
Default,
43+
/// `#[optimize(none)]`
44+
DoNotOptimize,
45+
/// `#[optimize(speed)]`
4146
Speed,
47+
/// `#[optimize(size)]`
4248
Size,
4349
}
4450

51+
impl OptimizeAttr {
52+
pub fn do_not_optimize(&self) -> bool {
53+
matches!(self, Self::DoNotOptimize)
54+
}
55+
}
56+
4557
#[derive(Clone, Debug, Encodable, Decodable)]
4658
pub enum DiagnosticAttribute {
4759
// tidy-alphabetical-start

compiler/rustc_codegen_llvm/src/attributes.rs

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -333,22 +333,25 @@ pub(crate) fn llfn_attrs_from_instance<'ll, 'tcx>(
333333
let mut to_add = SmallVec::<[_; 16]>::new();
334334

335335
match codegen_fn_attrs.optimize {
336-
OptimizeAttr::None => {
336+
OptimizeAttr::Default => {
337337
to_add.extend(default_optimisation_attrs(cx));
338338
}
339+
OptimizeAttr::DoNotOptimize => {
340+
to_add.push(llvm::AttributeKind::OptimizeNone.create_attr(cx.llcx));
341+
}
339342
OptimizeAttr::Size => {
340343
to_add.push(llvm::AttributeKind::MinSize.create_attr(cx.llcx));
341344
to_add.push(llvm::AttributeKind::OptimizeForSize.create_attr(cx.llcx));
342345
}
343346
OptimizeAttr::Speed => {}
344347
}
345348

346-
let inline =
347-
if codegen_fn_attrs.inline == InlineAttr::None && instance.def.requires_inline(cx.tcx) {
348-
InlineAttr::Hint
349-
} else {
350-
codegen_fn_attrs.inline
351-
};
349+
// `optnone` requires `noinline`
350+
let inline = match (codegen_fn_attrs.inline, &codegen_fn_attrs.optimize) {
351+
(_, OptimizeAttr::DoNotOptimize) => InlineAttr::Never,
352+
(InlineAttr::None, _) if instance.def.requires_inline(cx.tcx) => InlineAttr::Hint,
353+
(inline, _) => inline,
354+
};
352355
to_add.extend(inline_attr(cx, inline));
353356

354357
// The `uwtable` attribute according to LLVM is:

compiler/rustc_codegen_ssa/src/base.rs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1053,10 +1053,7 @@ pub(crate) fn provide(providers: &mut Providers) {
10531053

10541054
let any_for_speed = defids.items().any(|id| {
10551055
let CodegenFnAttrs { optimize, .. } = tcx.codegen_fn_attrs(*id);
1056-
match optimize {
1057-
attr::OptimizeAttr::None | attr::OptimizeAttr::Size => false,
1058-
attr::OptimizeAttr::Speed => true,
1059-
}
1056+
matches!(optimize, attr::OptimizeAttr::Speed)
10601057
});
10611058

10621059
if any_for_speed {

compiler/rustc_codegen_ssa/src/codegen_attrs.rs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -575,7 +575,7 @@ fn codegen_fn_attrs(tcx: TyCtxt<'_>, did: LocalDefId) -> CodegenFnAttrs {
575575
codegen_fn_attrs.inline = InlineAttr::Never;
576576
}
577577

578-
codegen_fn_attrs.optimize = attrs.iter().fold(OptimizeAttr::None, |ia, attr| {
578+
codegen_fn_attrs.optimize = attrs.iter().fold(OptimizeAttr::Default, |ia, attr| {
579579
if !attr.has_name(sym::optimize) {
580580
return ia;
581581
}
@@ -587,17 +587,19 @@ fn codegen_fn_attrs(tcx: TyCtxt<'_>, did: LocalDefId) -> CodegenFnAttrs {
587587
inline_span = Some(attr.span);
588588
if items.len() != 1 {
589589
err(attr.span, "expected one argument");
590-
OptimizeAttr::None
590+
OptimizeAttr::Default
591591
} else if list_contains_name(items, sym::size) {
592592
OptimizeAttr::Size
593593
} else if list_contains_name(items, sym::speed) {
594594
OptimizeAttr::Speed
595+
} else if list_contains_name(items, sym::none) {
596+
OptimizeAttr::DoNotOptimize
595597
} else {
596598
err(items[0].span(), "invalid argument");
597-
OptimizeAttr::None
599+
OptimizeAttr::Default
598600
}
599601
} else {
600-
OptimizeAttr::None
602+
OptimizeAttr::Default
601603
}
602604
});
603605

compiler/rustc_feature/src/builtin_attrs.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -532,7 +532,7 @@ pub const BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[
532532
),
533533
// RFC 2412
534534
gated!(
535-
optimize, Normal, template!(List: "size|speed"), ErrorPreceding,
535+
optimize, Normal, template!(List: "none|size|speed"), ErrorPreceding,
536536
EncodeCrossCrate::No, optimize_attribute, experimental!(optimize)
537537
),
538538

compiler/rustc_middle/src/middle/codegen_fn_attrs.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ impl CodegenFnAttrs {
147147
CodegenFnAttrs {
148148
flags: CodegenFnAttrFlags::empty(),
149149
inline: InlineAttr::None,
150-
optimize: OptimizeAttr::None,
150+
optimize: OptimizeAttr::Default,
151151
export_name: None,
152152
link_name: None,
153153
link_ordinal: None,

compiler/rustc_mir_transform/src/abort_unwinding_calls.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,4 +116,8 @@ impl<'tcx> crate::MirPass<'tcx> for AbortUnwindingCalls {
116116
// We may have invalidated some `cleanup` blocks so clean those up now.
117117
super::simplify::remove_dead_blocks(body);
118118
}
119+
120+
fn is_required(&self) -> bool {
121+
true
122+
}
119123
}

compiler/rustc_mir_transform/src/add_call_guards.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,4 +75,8 @@ impl<'tcx> crate::MirPass<'tcx> for AddCallGuards {
7575

7676
body.basic_blocks_mut().extend(new_blocks);
7777
}
78+
79+
fn is_required(&self) -> bool {
80+
true
81+
}
7882
}

compiler/rustc_mir_transform/src/add_moves_for_packed_drops.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,10 @@ impl<'tcx> crate::MirPass<'tcx> for AddMovesForPackedDrops {
6868

6969
patch.apply(body);
7070
}
71+
72+
fn is_required(&self) -> bool {
73+
true
74+
}
7175
}
7276

7377
fn add_move_for_packed_drop<'tcx>(

compiler/rustc_mir_transform/src/add_retag.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,4 +176,8 @@ impl<'tcx> crate::MirPass<'tcx> for AddRetag {
176176
}
177177
}
178178
}
179+
180+
fn is_required(&self) -> bool {
181+
true
182+
}
179183
}

0 commit comments

Comments
 (0)