@@ -22,7 +22,7 @@ use rustc::ty::subst::InternalSubsts;
2222use rustc_data_structures:: fx:: FxHashMap ;
2323use rustc_index:: vec:: IndexVec ;
2424use rustc:: ty:: layout:: {
25- LayoutOf , TyLayout , LayoutError , HasTyCtxt , TargetDataLayout , HasDataLayout ,
25+ LayoutOf , TyLayout , LayoutError , HasTyCtxt , TargetDataLayout , HasDataLayout , Size ,
2626} ;
2727
2828use crate :: rustc:: ty:: subst:: Subst ;
@@ -35,6 +35,9 @@ use crate::interpret::{
3535use crate :: const_eval:: error_to_const_error;
3636use crate :: transform:: { MirPass , MirSource } ;
3737
38+ /// The maximum number of bytes that we'll allocate space for a return value.
39+ const MAX_ALLOC_LIMIT : u64 = 1024 ;
40+
3841pub struct ConstProp ;
3942
4043impl < ' tcx > MirPass < ' tcx > for ConstProp {
@@ -316,8 +319,10 @@ impl<'mir, 'tcx> ConstPropagator<'mir, 'tcx> {
316319 ecx
317320 . layout_of ( body. return_ty ( ) . subst ( tcx, substs) )
318321 . 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 ) )
321326 . map ( |ret_layout| ecx. allocate ( ret_layout, MemoryKind :: Stack ) ) ;
322327
323328 ecx. push_stack_frame (
0 commit comments