@@ -12,7 +12,7 @@ use crate::MemFlags;
1212use rustc_ast as ast;
1313use rustc_ast:: { InlineAsmOptions , InlineAsmTemplatePiece } ;
1414use rustc_hir:: lang_items:: LangItem ;
15- use rustc_middle:: mir:: { self , AssertKind , SwitchTargets , UnwindTerminateReason } ;
15+ use rustc_middle:: mir:: { self , AssertKind , BasicBlock , SwitchTargets , UnwindTerminateReason } ;
1616use rustc_middle:: ty:: layout:: { HasTyCtxt , LayoutOf , ValidityRequirement } ;
1717use rustc_middle:: ty:: print:: { with_no_trimmed_paths, with_no_visible_paths} ;
1818use rustc_middle:: ty:: { self , Instance , Ty } ;
@@ -824,8 +824,14 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
824824 self . get_caller_location ( bx, mir:: SourceInfo { span : fn_span, ..source_info } ) ;
825825
826826 let mut llargs = Vec :: with_capacity ( arg_count) ;
827- let ret_dest =
828- self . make_return_dest ( bx, destination, & fn_abi. ret , & mut llargs, true , true ) ;
827+ let ret_dest = self . make_return_dest (
828+ bx,
829+ destination,
830+ & fn_abi. ret ,
831+ & mut llargs,
832+ intrinsic,
833+ Some ( target) ,
834+ ) ;
829835 assert_eq ! ( llargs, [ ] ) ;
830836 if let ReturnDest :: IndirectOperand ( tmp, _) = ret_dest {
831837 location. val . store ( bx, tmp) ;
@@ -846,8 +852,8 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
846852 destination,
847853 & fn_abi. ret ,
848854 & mut llargs,
849- true ,
850- target. is_some ( ) ,
855+ Some ( intrinsic ) ,
856+ target,
851857 ) ;
852858 let dest = match ret_dest {
853859 _ if fn_abi. ret . is_indirect ( ) => llargs[ 0 ] ,
@@ -911,7 +917,17 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
911917
912918 let mut llargs = Vec :: with_capacity ( arg_count) ;
913919 let destination = target. as_ref ( ) . map ( |& target| {
914- ( self . make_return_dest ( bx, destination, & fn_abi. ret , & mut llargs, false , true ) , target)
920+ (
921+ self . make_return_dest (
922+ bx,
923+ destination,
924+ & fn_abi. ret ,
925+ & mut llargs,
926+ None ,
927+ Some ( target) ,
928+ ) ,
929+ target,
930+ )
915931 } ) ;
916932
917933 // Split the rust-call tupled arguments off.
@@ -1644,10 +1660,10 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
16441660 dest : mir:: Place < ' tcx > ,
16451661 fn_ret : & ArgAbi < ' tcx , Ty < ' tcx > > ,
16461662 llargs : & mut Vec < Bx :: Value > ,
1647- is_intrinsic : bool ,
1648- has_target : bool ,
1663+ intrinsic : Option < ty :: IntrinsicDef > ,
1664+ target : Option < BasicBlock > ,
16491665 ) -> ReturnDest < ' tcx , Bx :: Value > {
1650- if !has_target {
1666+ if target . is_none ( ) {
16511667 return ReturnDest :: Nothing ;
16521668 }
16531669 // If the return is ignored, we can just return a do-nothing `ReturnDest`.
@@ -1668,7 +1684,7 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
16681684 tmp. storage_live ( bx) ;
16691685 llargs. push ( tmp. llval ) ;
16701686 ReturnDest :: IndirectOperand ( tmp, index)
1671- } else if is_intrinsic {
1687+ } else if intrinsic . is_some ( ) {
16721688 // Currently, intrinsics always need a location to store
16731689 // the result, so we create a temporary `alloca` for the
16741690 // result.
0 commit comments