提交 7aa5ea9a 编写于 作者: C Caio

7 - Make more use of `let_chains`

Continuation of #94376.

cc #53667
上级 6e5a6ffb
...@@ -55,10 +55,8 @@ fn find_optimization_oportunities<'tcx>(body: &Body<'tcx>) -> Vec<(Local, Consta ...@@ -55,10 +55,8 @@ fn find_optimization_oportunities<'tcx>(body: &Body<'tcx>) -> Vec<(Local, Consta
let mut locals_to_debuginfo = BitSet::new_empty(body.local_decls.len()); let mut locals_to_debuginfo = BitSet::new_empty(body.local_decls.len());
for debuginfo in &body.var_debug_info { for debuginfo in &body.var_debug_info {
if let VarDebugInfoContents::Place(p) = debuginfo.value { if let VarDebugInfoContents::Place(p) = debuginfo.value && let Some(l) = p.as_local() {
if let Some(l) = p.as_local() { locals_to_debuginfo.insert(l);
locals_to_debuginfo.insert(l);
}
} }
} }
......
...@@ -633,24 +633,22 @@ fn check_binary_op( ...@@ -633,24 +633,22 @@ fn check_binary_op(
fn propagate_operand(&mut self, operand: &mut Operand<'tcx>) { fn propagate_operand(&mut self, operand: &mut Operand<'tcx>) {
match *operand { match *operand {
Operand::Copy(l) | Operand::Move(l) => { Operand::Copy(l) | Operand::Move(l) => {
if let Some(value) = self.get_const(l) { if let Some(value) = self.get_const(l) && self.should_const_prop(&value) {
if self.should_const_prop(&value) { // FIXME(felix91gr): this code only handles `Scalar` cases.
// FIXME(felix91gr): this code only handles `Scalar` cases. // For now, we're not handling `ScalarPair` cases because
// For now, we're not handling `ScalarPair` cases because // doing so here would require a lot of code duplication.
// doing so here would require a lot of code duplication. // We should hopefully generalize `Operand` handling into a fn,
// We should hopefully generalize `Operand` handling into a fn, // and use it to do const-prop here and everywhere else
// and use it to do const-prop here and everywhere else // where it makes sense.
// where it makes sense. if let interpret::Operand::Immediate(interpret::Immediate::Scalar(
if let interpret::Operand::Immediate(interpret::Immediate::Scalar( ScalarMaybeUninit::Scalar(scalar),
ScalarMaybeUninit::Scalar(scalar), )) = *value
)) = *value {
{ *operand = self.operand_from_scalar(
*operand = self.operand_from_scalar( scalar,
scalar, value.layout.ty,
value.layout.ty, self.source_info.unwrap().span,
self.source_info.unwrap().span, );
);
}
} }
} }
} }
...@@ -1086,15 +1084,13 @@ fn visit_statement(&mut self, statement: &mut Statement<'tcx>, location: Locatio ...@@ -1086,15 +1084,13 @@ fn visit_statement(&mut self, statement: &mut Statement<'tcx>, location: Locatio
// This will return None if the above `const_prop` invocation only "wrote" a // This will return None if the above `const_prop` invocation only "wrote" a
// type whose creation requires no write. E.g. a generator whose initial state // type whose creation requires no write. E.g. a generator whose initial state
// consists solely of uninitialized memory (so it doesn't capture any locals). // consists solely of uninitialized memory (so it doesn't capture any locals).
if let Some(ref value) = self.get_const(place) { if let Some(ref value) = self.get_const(place) && self.should_const_prop(value) {
if self.should_const_prop(value) { trace!("replacing {:?} with {:?}", rval, value);
trace!("replacing {:?} with {:?}", rval, value); self.replace_with_const(rval, value, source_info);
self.replace_with_const(rval, value, source_info); if can_const_prop == ConstPropMode::FullConstProp
if can_const_prop == ConstPropMode::FullConstProp || can_const_prop == ConstPropMode::OnlyInsideOwnBlock
|| can_const_prop == ConstPropMode::OnlyInsideOwnBlock {
{ trace!("propagated into {:?}", place);
trace!("propagated into {:?}", place);
}
} }
} }
match can_const_prop { match can_const_prop {
......
...@@ -357,14 +357,12 @@ fn format_operand(&self, operand: ExpressionOperandId) -> String { ...@@ -357,14 +357,12 @@ fn format_operand(&self, operand: ExpressionOperandId) -> String {
if let Some(counters) = &self.some_counters { if let Some(counters) = &self.some_counters {
if let Some(DebugCounter { counter_kind, some_block_label }) = counters.get(&operand) { if let Some(DebugCounter { counter_kind, some_block_label }) = counters.get(&operand) {
if let CoverageKind::Expression { .. } = counter_kind { if let CoverageKind::Expression { .. } = counter_kind {
if let Some(block_label) = some_block_label { if let Some(label) = some_block_label && debug_options().counter_format.block {
if debug_options().counter_format.block { return format!(
return format!( "{}:({})",
"{}:({})", label,
block_label, self.format_counter_kind(counter_kind)
self.format_counter_kind(counter_kind) );
);
}
} }
return format!("({})", self.format_counter_kind(counter_kind)); return format!("({})", self.format_counter_kind(counter_kind));
} }
......
...@@ -191,16 +191,13 @@ pub fn current_macro(&self) -> Option<Symbol> { ...@@ -191,16 +191,13 @@ pub fn current_macro(&self) -> Option<Symbol> {
/// If the span is part of a macro, and the macro is visible (expands directly to the given /// If the span is part of a macro, and the macro is visible (expands directly to the given
/// body_span), returns the macro name symbol. /// body_span), returns the macro name symbol.
pub fn visible_macro(&self, body_span: Span) -> Option<Symbol> { pub fn visible_macro(&self, body_span: Span) -> Option<Symbol> {
if let Some(current_macro) = self.current_macro() { if let Some(current_macro) = self.current_macro() && self
if self .expn_span
.expn_span .parent_callsite()
.parent_callsite() .unwrap_or_else(|| bug!("macro must have a parent"))
.unwrap_or_else(|| bug!("macro must have a parent")) .ctxt() == body_span.ctxt()
.ctxt() {
== body_span.ctxt() return Some(current_macro);
{
return Some(current_macro);
}
} }
None None
} }
...@@ -584,21 +581,19 @@ fn take_prev(&mut self) -> CoverageSpan { ...@@ -584,21 +581,19 @@ fn take_prev(&mut self) -> CoverageSpan {
/// In either case, no more spans will match the span of `pending_dups`, so /// In either case, no more spans will match the span of `pending_dups`, so
/// add the `pending_dups` if they don't overlap `curr`, and clear the list. /// add the `pending_dups` if they don't overlap `curr`, and clear the list.
fn check_pending_dups(&mut self) { fn check_pending_dups(&mut self) {
if let Some(dup) = self.pending_dups.last() { if let Some(dup) = self.pending_dups.last() && dup.span != self.prev().span {
if dup.span != self.prev().span { debug!(
debug!( " SAME spans, but pending_dups are NOT THE SAME, so BCBs matched on \
" SAME spans, but pending_dups are NOT THE SAME, so BCBs matched on \ previous iteration, or prev started a new disjoint span"
previous iteration, or prev started a new disjoint span" );
); if dup.span.hi() <= self.curr().span.lo() {
if dup.span.hi() <= self.curr().span.lo() { let pending_dups = self.pending_dups.split_off(0);
let pending_dups = self.pending_dups.split_off(0); for dup in pending_dups.into_iter() {
for dup in pending_dups.into_iter() { debug!(" ...adding at least one pending={:?}", dup);
debug!(" ...adding at least one pending={:?}", dup); self.push_refined_span(dup);
self.push_refined_span(dup);
}
} else {
self.pending_dups.clear();
} }
} else {
self.pending_dups.clear();
} }
} }
} }
......
...@@ -549,14 +549,15 @@ fn record_terminator_conflicts(&mut self, term: &Terminator<'_>) { ...@@ -549,14 +549,15 @@ fn record_terminator_conflicts(&mut self, term: &Terminator<'_>) {
target: _, target: _,
unwind: _, unwind: _,
} => { } => {
if let Some(place) = value.place() { if let Some(place) = value.place()
if !place.is_indirect() && !dropped_place.is_indirect() { && !place.is_indirect()
self.record_local_conflict( && !dropped_place.is_indirect()
place.local, {
dropped_place.local, self.record_local_conflict(
"DropAndReplace operand overlap", place.local,
); dropped_place.local,
} "DropAndReplace operand overlap",
);
} }
} }
TerminatorKind::Yield { value, resume: _, resume_arg, drop: _ } => { TerminatorKind::Yield { value, resume: _, resume_arg, drop: _ } => {
...@@ -614,14 +615,15 @@ fn record_terminator_conflicts(&mut self, term: &Terminator<'_>) { ...@@ -614,14 +615,15 @@ fn record_terminator_conflicts(&mut self, term: &Terminator<'_>) {
for op in operands { for op in operands {
match op { match op {
InlineAsmOperand::In { reg: _, value } => { InlineAsmOperand::In { reg: _, value } => {
if let Some(p) = value.place() { if let Some(p) = value.place()
if !p.is_indirect() && !dest_place.is_indirect() { && !p.is_indirect()
self.record_local_conflict( && !dest_place.is_indirect()
p.local, {
dest_place.local, self.record_local_conflict(
"asm! operand overlap", p.local,
); dest_place.local,
} "asm! operand overlap",
);
} }
} }
InlineAsmOperand::Out { InlineAsmOperand::Out {
...@@ -643,24 +645,26 @@ fn record_terminator_conflicts(&mut self, term: &Terminator<'_>) { ...@@ -643,24 +645,26 @@ fn record_terminator_conflicts(&mut self, term: &Terminator<'_>) {
in_value, in_value,
out_place, out_place,
} => { } => {
if let Some(place) = in_value.place() { if let Some(place) = in_value.place()
if !place.is_indirect() && !dest_place.is_indirect() { && !place.is_indirect()
self.record_local_conflict( && !dest_place.is_indirect()
place.local, {
dest_place.local, self.record_local_conflict(
"asm! operand overlap", place.local,
); dest_place.local,
} "asm! operand overlap",
);
} }
if let Some(place) = out_place { if let Some(place) = out_place
if !place.is_indirect() && !dest_place.is_indirect() { && !place.is_indirect()
self.record_local_conflict( && !dest_place.is_indirect()
place.local, {
dest_place.local, self.record_local_conflict(
"asm! operand overlap", place.local,
); dest_place.local,
} "asm! operand overlap",
);
} }
} }
InlineAsmOperand::Out { reg: _, late: _, place: None } InlineAsmOperand::Out { reg: _, late: _, place: None }
......
...@@ -724,12 +724,11 @@ fn create_temp_if_necessary( ...@@ -724,12 +724,11 @@ fn create_temp_if_necessary(
caller_body: &mut Body<'tcx>, caller_body: &mut Body<'tcx>,
) -> Local { ) -> Local {
// Reuse the operand if it is a moved temporary. // Reuse the operand if it is a moved temporary.
if let Operand::Move(place) = &arg { if let Operand::Move(place) = &arg
if let Some(local) = place.as_local() { && let Some(local) = place.as_local()
if caller_body.local_kind(local) == LocalKind::Temp { && caller_body.local_kind(local) == LocalKind::Temp
return local; {
} return local;
}
} }
// Otherwise, create a temporary for the argument. // Otherwise, create a temporary for the argument.
......
...@@ -77,10 +77,8 @@ fn combine_bool_cmp(&self, source_info: &SourceInfo, rvalue: &mut Rvalue<'tcx>) ...@@ -77,10 +77,8 @@ fn combine_bool_cmp(&self, source_info: &SourceInfo, rvalue: &mut Rvalue<'tcx>)
_ => None, _ => None,
}; };
if let Some(new) = new { if let Some(new) = new && self.should_combine(source_info, rvalue) {
if self.should_combine(source_info, rvalue) { *rvalue = new;
*rvalue = new;
}
} }
} }
......
#![allow(rustc::potential_query_instability)]
#![feature(box_patterns)] #![feature(box_patterns)]
#![feature(box_syntax)] #![feature(box_syntax)]
#![feature(crate_visibility_modifier)] #![feature(crate_visibility_modifier)]
#![feature(let_chains)]
#![feature(let_else)] #![feature(let_else)]
#![feature(map_try_insert)] #![feature(map_try_insert)]
#![feature(min_specialization)] #![feature(min_specialization)]
#![feature(option_get_or_insert_default)]
#![feature(once_cell)]
#![feature(never_type)] #![feature(never_type)]
#![feature(once_cell)]
#![feature(option_get_or_insert_default)]
#![feature(trusted_step)] #![feature(trusted_step)]
#![feature(try_blocks)] #![feature(try_blocks)]
#![recursion_limit = "256"] #![recursion_limit = "256"]
#![allow(rustc::potential_query_instability)]
#[macro_use] #[macro_use]
extern crate tracing; extern crate tracing;
......
...@@ -14,10 +14,9 @@ pub fn new(required_consts: &'a mut Vec<Constant<'tcx>>) -> Self { ...@@ -14,10 +14,9 @@ pub fn new(required_consts: &'a mut Vec<Constant<'tcx>>) -> Self {
impl<'tcx> Visitor<'tcx> for RequiredConstsVisitor<'_, 'tcx> { impl<'tcx> Visitor<'tcx> for RequiredConstsVisitor<'_, 'tcx> {
fn visit_constant(&mut self, constant: &Constant<'tcx>, _: Location) { fn visit_constant(&mut self, constant: &Constant<'tcx>, _: Location) {
if let Some(ct) = constant.literal.const_for_ty() { let literal = constant.literal;
if let ConstKind::Unevaluated(_) = ct.val() { if let Some(ct) = literal.const_for_ty() && let ConstKind::Unevaluated(_) = ct.val() {
self.required_consts.push(*constant); self.required_consts.push(*constant);
}
} }
} }
} }
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册