Use `Itertools::all_equal_value()` where applicable
diff --git a/compiler/rustc_codegen_ssa/src/mir/rvalue.rs b/compiler/rustc_codegen_ssa/src/mir/rvalue.rs
index 8a67b8d..f6f2e3f 100644
--- a/compiler/rustc_codegen_ssa/src/mir/rvalue.rs
+++ b/compiler/rustc_codegen_ssa/src/mir/rvalue.rs
@@ -1,3 +1,4 @@
+use itertools::Itertools as _;
use rustc_abi::{self as abi, FIRST_VARIANT};
use rustc_middle::ty::adjustment::PointerCoercion;
use rustc_middle::ty::layout::{HasTyCtxt, HasTypingEnv, LayoutOf, TyAndLayout};
@@ -111,14 +112,13 @@ pub(crate) fn codegen_rvalue(
let size = bx.const_usize(dest.layout.size.bytes());
// Use llvm.memset.p0i8.* to initialize all same byte arrays
- if let Some(int) = bx.cx().const_to_opt_u128(v, false) {
- let bytes = &int.to_le_bytes()[..cg_elem.layout.size.bytes_usize()];
- let first = bytes[0];
- if bytes[1..].iter().all(|&b| b == first) {
- let fill = bx.cx().const_u8(first);
- bx.memset(start, fill, size, dest.val.align, MemFlags::empty());
- return true;
- }
+ if let Some(int) = bx.cx().const_to_opt_u128(v, false)
+ && let bytes = &int.to_le_bytes()[..cg_elem.layout.size.bytes_usize()]
+ && let Ok(&byte) = bytes.iter().all_equal_value()
+ {
+ let fill = bx.cx().const_u8(byte);
+ bx.memset(start, fill, size, dest.val.align, MemFlags::empty());
+ return true;
}
// Use llvm.memset.p0i8.* to initialize byte arrays
@@ -130,13 +130,10 @@ pub(crate) fn codegen_rvalue(
false
};
- match cg_elem.val {
- OperandValue::Immediate(v) => {
- if try_init_all_same(bx, v) {
- return;
- }
- }
- _ => (),
+ if let OperandValue::Immediate(v) = cg_elem.val
+ && try_init_all_same(bx, v)
+ {
+ return;
}
let count = self
diff --git a/compiler/rustc_mir_transform/src/gvn.rs b/compiler/rustc_mir_transform/src/gvn.rs
index 5a13394..9da6e03 100644
--- a/compiler/rustc_mir_transform/src/gvn.rs
+++ b/compiler/rustc_mir_transform/src/gvn.rs
@@ -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 @@ fn simplify_aggregate(
}
};
- 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) =
diff --git a/compiler/rustc_mir_transform/src/lint_tail_expr_drop_order.rs b/compiler/rustc_mir_transform/src/lint_tail_expr_drop_order.rs
index 794984d..61c9bbe 100644
--- a/compiler/rustc_mir_transform/src/lint_tail_expr_drop_order.rs
+++ b/compiler/rustc_mir_transform/src/lint_tail_expr_drop_order.rs
@@ -2,6 +2,7 @@
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);
}
}
diff --git a/compiler/rustc_mir_transform/src/simplify.rs b/compiler/rustc_mir_transform/src/simplify.rs
index 468ef74..75917d2 100644
--- a/compiler/rustc_mir_transform/src/simplify.rs
+++ b/compiler/rustc_mir_transform/src/simplify.rs
@@ -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 @@ fn simplify_branch(&mut self, terminator: &mut Terminator<'tcx>) -> bool {
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
diff --git a/compiler/rustc_resolve/src/diagnostics.rs b/compiler/rustc_resolve/src/diagnostics.rs
index f458a1f..689e713 100644
--- a/compiler/rustc_resolve/src/diagnostics.rs
+++ b/compiler/rustc_resolve/src/diagnostics.rs
@@ -1,3 +1,4 @@
+use itertools::Itertools as _;
use rustc_ast::visit::{self, Visitor};
use rustc_ast::{
self as ast, CRATE_NODE_ID, Crate, ItemKind, ModKind, NodeId, Path, join_path_idents,
@@ -3469,16 +3470,11 @@ fn show_candidates(
err.note(note.to_string());
}
} else {
- let (_, descr_first, _, _, _) = &inaccessible_path_strings[0];
- let descr = if inaccessible_path_strings
+ let descr = inaccessible_path_strings
.iter()
- .skip(1)
- .all(|(_, descr, _, _, _)| descr == descr_first)
- {
- descr_first
- } else {
- "item"
- };
+ .map(|&(_, descr, _, _, _)| descr)
+ .all_equal_value()
+ .unwrap_or("item");
let plural_descr =
if descr.ends_with('s') { format!("{descr}es") } else { format!("{descr}s") };