Use Itertools::all_equal_value() where applicable
This commit is contained in:
@@ -87,6 +87,7 @@
|
||||
use std::borrow::Cow;
|
||||
|
||||
use either::Either;
|
||||
use itertools::Itertools as _;
|
||||
use rustc_abi::{self as abi, BackendRepr, FIRST_VARIANT, FieldIdx, Primitive, Size, VariantIdx};
|
||||
use rustc_const_eval::const_eval::DummyMachine;
|
||||
use rustc_const_eval::interpret::{
|
||||
@@ -1023,15 +1024,15 @@ impl<'body, 'tcx> VnState<'body, 'tcx> {
|
||||
}
|
||||
};
|
||||
|
||||
if ty.is_array() && fields.len() > 4 {
|
||||
let first = fields[0];
|
||||
if fields.iter().all(|&v| v == first) {
|
||||
let len = ty::Const::from_target_usize(self.tcx, fields.len().try_into().unwrap());
|
||||
if let Some(op) = self.try_as_operand(first, location) {
|
||||
*rvalue = Rvalue::Repeat(op, len);
|
||||
}
|
||||
return Some(self.insert(ty, Value::Repeat(first, len)));
|
||||
if ty.is_array()
|
||||
&& fields.len() > 4
|
||||
&& let Ok(&first) = fields.iter().all_equal_value()
|
||||
{
|
||||
let len = ty::Const::from_target_usize(self.tcx, fields.len().try_into().unwrap());
|
||||
if let Some(op) = self.try_as_operand(first, location) {
|
||||
*rvalue = Rvalue::Repeat(op, len);
|
||||
}
|
||||
return Some(self.insert(ty, Value::Repeat(first, len)));
|
||||
}
|
||||
|
||||
if let Some(value) =
|
||||
|
||||
@@ -2,6 +2,7 @@ use std::cell::RefCell;
|
||||
use std::collections::hash_map;
|
||||
use std::rc::Rc;
|
||||
|
||||
use itertools::Itertools as _;
|
||||
use rustc_data_structures::fx::{FxHashMap, FxHashSet, FxIndexMap};
|
||||
use rustc_data_structures::unord::{UnordMap, UnordSet};
|
||||
use rustc_errors::Subdiagnostic;
|
||||
@@ -339,9 +340,9 @@ pub(crate) fn run_lint<'tcx>(tcx: TyCtxt<'tcx>, def_id: LocalDefId, body: &Body<
|
||||
// Suppose that all BIDs point into the same local,
|
||||
// we can remove the this local from the observed drops,
|
||||
// so that we can focus our diagnosis more on the others.
|
||||
if candidates.iter().all(|&(_, place)| candidates[0].1.local == place.local) {
|
||||
if let Ok(local) = candidates.iter().map(|&(_, place)| place.local).all_equal_value() {
|
||||
for path_idx in all_locals_dropped.iter() {
|
||||
if move_data.move_paths[path_idx].place.local == candidates[0].1.local {
|
||||
if move_data.move_paths[path_idx].place.local == local {
|
||||
to_exclude.insert(path_idx);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -34,6 +34,7 @@
|
||||
//! The normal logic that a program with UB can be changed to do anything does not apply to
|
||||
//! pre-"runtime" MIR!
|
||||
|
||||
use itertools::Itertools as _;
|
||||
use rustc_index::{Idx, IndexSlice, IndexVec};
|
||||
use rustc_middle::mir::visit::{MutVisitor, MutatingUseContext, PlaceContext, Visitor};
|
||||
use rustc_middle::mir::*;
|
||||
@@ -288,20 +289,13 @@ impl<'a, 'tcx> CfgSimplifier<'a, 'tcx> {
|
||||
return false;
|
||||
};
|
||||
|
||||
let first_succ = {
|
||||
if let Some(first_succ) = terminator.successors().next() {
|
||||
if terminator.successors().all(|s| s == first_succ) {
|
||||
let count = terminator.successors().count();
|
||||
self.pred_count[first_succ] -= (count - 1) as u32;
|
||||
first_succ
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
let Ok(first_succ) = terminator.successors().all_equal_value() else {
|
||||
return false;
|
||||
};
|
||||
|
||||
let count = terminator.successors().count();
|
||||
self.pred_count[first_succ] -= (count - 1) as u32;
|
||||
|
||||
debug!("simplifying branch {:?}", terminator);
|
||||
terminator.kind = TerminatorKind::Goto { target: first_succ };
|
||||
true
|
||||
|
||||
Reference in New Issue
Block a user