Skip to content

Commit ee33fbf

Browse files
committed
Auto merge of rust-lang#116457 - RalfJung:try_eval_scalar_int, r=<try>
fast-path for try_eval_scalar (instead of try_eval_scalar_int) Cc rust-lang#116281 `@Nadrieril`
2 parents cdca82c + cbe892f commit ee33fbf

File tree

1 file changed

+15
-15
lines changed

1 file changed

+15
-15
lines changed

compiler/rustc_middle/src/mir/consts.rs

+15-15
Original file line numberDiff line numberDiff line change
@@ -213,10 +213,10 @@ impl<'tcx> Const<'tcx> {
213213
pub fn try_to_scalar(self) -> Option<Scalar> {
214214
match self {
215215
Const::Ty(c) => match c.kind() {
216-
ty::ConstKind::Value(valtree) => match valtree {
217-
ty::ValTree::Leaf(scalar_int) => Some(Scalar::Int(scalar_int)),
218-
ty::ValTree::Branch(_) => None,
219-
},
216+
ty::ConstKind::Value(valtree) if c.ty().is_primitive() => {
217+
// A valtree of a type where leaves directly represent the scalar const value.
218+
Some(valtree.unwrap_leaf().into())
219+
}
220220
_ => None,
221221
},
222222
Const::Val(val, _) => val.try_to_scalar(),
@@ -279,7 +279,16 @@ impl<'tcx> Const<'tcx> {
279279
tcx: TyCtxt<'tcx>,
280280
param_env: ty::ParamEnv<'tcx>,
281281
) -> Option<Scalar> {
282-
self.eval(tcx, param_env, None).ok()?.try_to_scalar()
282+
match self {
283+
Const::Ty(c) if c.ty().is_primitive() => {
284+
// Avoid the `valtree_to_const_val` query. Can only be done on primitive types that
285+
// are valtree leaves, and *not* on references. (References should return the
286+
// pointer here, which valtrees don't represent.)
287+
let val = c.eval(tcx, param_env, None).ok()?;
288+
Some(val.unwrap_leaf().into())
289+
}
290+
_ => self.eval(tcx, param_env, None).ok()?.try_to_scalar(),
291+
}
283292
}
284293

285294
#[inline]
@@ -288,16 +297,7 @@ impl<'tcx> Const<'tcx> {
288297
tcx: TyCtxt<'tcx>,
289298
param_env: ty::ParamEnv<'tcx>,
290299
) -> Option<ScalarInt> {
291-
match self {
292-
// If the constant is already evaluated, we shortcut here.
293-
Const::Ty(c) if let ty::ConstKind::Value(valtree) = c.kind() => {
294-
valtree.try_to_scalar_int()
295-
},
296-
// This is a more general form of the previous case.
297-
_ => {
298-
self.try_eval_scalar(tcx, param_env)?.try_to_int().ok()
299-
},
300-
}
300+
self.try_eval_scalar(tcx, param_env)?.try_to_int().ok()
301301
}
302302

303303
#[inline]

0 commit comments

Comments
 (0)