Rollup merge of #104605 - RalfJung:clf_consts, r=bjorn3
deduplicate constant evaluation in cranelift backend The cranelift backend had two matches on `ConstantKind`, which can be avoided, and used this `eval_for_mir` that nothing else uses... this makes things more consistent with the (better-tested) LLVM backend. I noticed this because cranelift was the only user of `eval_for_mir`. However `try_eval_for_mir` still has one other user in `eval`... the odd thing is that the interpreter has its own `eval_mir_constant` which seems to duplicate the same functionality and does not use `try_eval_for_mir`. No idea what is happening here. r? ``@bjorn3`` Cc ``@lcnr``
This commit is contained in:
commit
ed22bdc18f
3 changed files with 31 additions and 51 deletions
|
@ -1,5 +1,4 @@
|
|||
use crate::mir::interpret::LitToConstInput;
|
||||
use crate::mir::ConstantKind;
|
||||
use crate::ty::{self, DefIdTree, InternalSubsts, ParamEnv, ParamEnvAnd, Ty, TyCtxt};
|
||||
use rustc_data_structures::intern::Interned;
|
||||
use rustc_hir as hir;
|
||||
|
@ -230,20 +229,6 @@ impl<'tcx> Const<'tcx> {
|
|||
}
|
||||
}
|
||||
|
||||
#[inline]
|
||||
/// Tries to evaluate the constant if it is `Unevaluated` and creates a ConstValue if the
|
||||
/// evaluation succeeds. If it doesn't succeed, returns the unevaluated constant.
|
||||
pub fn eval_for_mir(self, tcx: TyCtxt<'tcx>, param_env: ParamEnv<'tcx>) -> ConstantKind<'tcx> {
|
||||
if let Some(val) = self.kind().try_eval_for_mir(tcx, param_env) {
|
||||
match val {
|
||||
Ok(const_val) => ConstantKind::from_value(const_val, self.ty()),
|
||||
Err(guar) => ConstantKind::Ty(tcx.const_error_with_guaranteed(self.ty(), guar)),
|
||||
}
|
||||
} else {
|
||||
ConstantKind::Ty(self)
|
||||
}
|
||||
}
|
||||
|
||||
#[inline]
|
||||
/// Panics if the value cannot be evaluated or doesn't contain a valid integer of the given type.
|
||||
pub fn eval_bits(self, tcx: TyCtxt<'tcx>, param_env: ParamEnv<'tcx>, ty: Ty<'tcx>) -> u128 {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue