@@ -22,7 +22,7 @@ use rustc::ty::subst::InternalSubsts;
22
22
use rustc_data_structures:: fx:: FxHashMap ;
23
23
use rustc_index:: vec:: IndexVec ;
24
24
use rustc:: ty:: layout:: {
25
- LayoutOf , TyLayout , LayoutError , HasTyCtxt , TargetDataLayout , HasDataLayout ,
25
+ LayoutOf , TyLayout , LayoutError , HasTyCtxt , TargetDataLayout , HasDataLayout , Size ,
26
26
} ;
27
27
28
28
use crate :: rustc:: ty:: subst:: Subst ;
@@ -35,6 +35,9 @@ use crate::interpret::{
35
35
use crate :: const_eval:: error_to_const_error;
36
36
use crate :: transform:: { MirPass , MirSource } ;
37
37
38
+ /// The maximum number of bytes that we'll allocate space for a return value.
39
+ const MAX_ALLOC_LIMIT : u64 = 1024 ;
40
+
38
41
pub struct ConstProp ;
39
42
40
43
impl < ' tcx > MirPass < ' tcx > for ConstProp {
@@ -316,8 +319,10 @@ impl<'mir, 'tcx> ConstPropagator<'mir, 'tcx> {
316
319
ecx
317
320
. layout_of ( body. return_ty ( ) . subst ( tcx, substs) )
318
321
. ok ( )
319
- // Don't bother allocating memory for ZST types which have no values.
320
- . filter ( |ret_layout| !ret_layout. is_zst ( ) )
322
+ // Don't bother allocating memory for ZST types which have no values
323
+ // or for large values.
324
+ . filter ( |ret_layout| !ret_layout. is_zst ( ) &&
325
+ ret_layout. size < Size :: from_bytes ( MAX_ALLOC_LIMIT ) )
321
326
. map ( |ret_layout| ecx. allocate ( ret_layout, MemoryKind :: Stack ) ) ;
322
327
323
328
ecx. push_stack_frame (
0 commit comments