11use rustc_middle:: mir;
2- use rustc_middle:: ty:: layout:: HasTyCtxt ;
3- use rustc_middle:: ty:: InstanceDef ;
42use rustc_middle:: ty:: { self , Ty } ;
53use std:: borrow:: Borrow ;
64use std:: collections:: hash_map:: Entry ;
@@ -17,60 +15,13 @@ use rustc_span::symbol::{sym, Symbol};
1715use rustc_target:: abi:: { Align , Size } ;
1816
1917use crate :: interpret:: {
20- self , compile_time_machine, AllocId , Allocation , Frame , GlobalId , ImmTy , InterpCx ,
21- InterpResult , Memory , OpTy , PlaceTy , Pointer , Scalar ,
18+ self , compile_time_machine, AllocId , Allocation , Frame , ImmTy , InterpCx , InterpResult , Memory ,
19+ OpTy , PlaceTy , Pointer , Scalar ,
2220} ;
2321
2422use super :: error:: * ;
2523
2624impl < ' mir , ' tcx > InterpCx < ' mir , ' tcx , CompileTimeInterpreter < ' mir , ' tcx > > {
27- /// Evaluate a const function where all arguments (if any) are zero-sized types.
28- /// The evaluation is memoized thanks to the query system.
29- ///
30- /// Returns `true` if the call has been evaluated.
31- fn try_eval_const_fn_call (
32- & mut self ,
33- instance : ty:: Instance < ' tcx > ,
34- ret : Option < ( PlaceTy < ' tcx > , mir:: BasicBlock ) > ,
35- args : & [ OpTy < ' tcx > ] ,
36- ) -> InterpResult < ' tcx , bool > {
37- trace ! ( "try_eval_const_fn_call: {:?}" , instance) ;
38- // Because `#[track_caller]` adds an implicit non-ZST argument, we also cannot
39- // perform this optimization on items tagged with it.
40- if instance. def . requires_caller_location ( self . tcx ( ) ) {
41- return Ok ( false ) ;
42- }
43- // Only memoize instrinsics. This was added in #79594 while adding the `const_allocate` intrinsic.
44- // We only memoize intrinsics because it would be unsound to memoize functions
45- // which might interact with the heap.
46- // Additionally, const_allocate intrinsic is impure and thus should not be memoized;
47- // it will not be memoized because it has non-ZST args
48- if !matches ! ( instance. def, InstanceDef :: Intrinsic ( _) ) {
49- return Ok ( false ) ;
50- }
51- // For the moment we only do this for functions which take no arguments
52- // (or all arguments are ZSTs) so that we don't memoize too much.
53- if args. iter ( ) . any ( |a| !a. layout . is_zst ( ) ) {
54- return Ok ( false ) ;
55- }
56-
57- let dest = match ret {
58- Some ( ( dest, _) ) => dest,
59- // Don't memoize diverging function calls.
60- None => return Ok ( false ) ,
61- } ;
62-
63- let gid = GlobalId { instance, promoted : None } ;
64-
65- let place = self . eval_to_allocation ( gid) ?;
66-
67- self . copy_op ( place. into ( ) , dest) ?;
68-
69- self . return_to_block ( ret. map ( |r| r. 1 ) ) ?;
70- trace ! ( "{:?}" , self . dump_place( * dest) ) ;
71- Ok ( true )
72- }
73-
7425 /// "Intercept" a function call to a panic-related function
7526 /// because we have something special to do for it.
7627 /// If this returns successfully (`Ok`), the function should just be evaluated normally.
@@ -253,7 +204,7 @@ impl<'mir, 'tcx> interpret::Machine<'mir, 'tcx> for CompileTimeInterpreter<'mir,
253204 ecx : & mut InterpCx < ' mir , ' tcx , Self > ,
254205 instance : ty:: Instance < ' tcx > ,
255206 args : & [ OpTy < ' tcx > ] ,
256- ret : Option < ( PlaceTy < ' tcx > , mir:: BasicBlock ) > ,
207+ _ret : Option < ( PlaceTy < ' tcx > , mir:: BasicBlock ) > ,
257208 _unwind : Option < mir:: BasicBlock > , // unwinding is not supported in consts
258209 ) -> InterpResult < ' tcx , Option < & ' mir mir:: Body < ' tcx > > > {
259210 debug ! ( "find_mir_or_eval_fn: {:?}" , instance) ;
@@ -263,13 +214,7 @@ impl<'mir, 'tcx> interpret::Machine<'mir, 'tcx> for CompileTimeInterpreter<'mir,
263214 // Execution might have wandered off into other crates, so we cannot do a stability-
264215 // sensitive check here. But we can at least rule out functions that are not const
265216 // at all.
266- if ecx. tcx . is_const_fn_raw ( def. did ) {
267- // If this function is a `const fn` then under certain circumstances we
268- // can evaluate call via the query system, thus memoizing all future calls.
269- if ecx. try_eval_const_fn_call ( instance, ret, args) ? {
270- return Ok ( None ) ;
271- }
272- } else {
217+ if !ecx. tcx . is_const_fn_raw ( def. did ) {
273218 // Some functions we support even if they are non-const -- but avoid testing
274219 // that for const fn!
275220 ecx. hook_panic_fn ( instance, args) ?;
0 commit comments