@@ -607,23 +607,30 @@ mod llvm_enzyme {
607607 exprs = ecx. expr_call ( new_decl_span, bb_call_expr, thin_vec ! [ default_call_expr] ) ;
608608 }
609609 } else if x. mode . is_rev ( ) {
610- //if x.width == 1 {
611- // if primal_ret {
612- // // We have extra handling above for the primal ret
613- // d_ret_ty = d_ret_ty[1..].to_vec().into();
614- // }
615-
616- // for arg in d_ret_ty.iter() {
617- // let arg = arg.kind.is_simple_path().unwrap();
618- // let sl: Vec<Symbol> = vec![arg, kw::Default];
619- // let tmp = ecx.def_site_path(&sl);
620- // let default_call_expr = ecx.expr_path(ecx.path(span, tmp));
621- // let default_call_expr =
622- // ecx.expr_call(new_decl_span, default_call_expr, thin_vec![]);
623- // exprs = default_call_expr;
624- // //exprs.push(default_call_expr);
625- // }
626- //}
610+ if x. width == 1 {
611+ // We either have `-> ArbitraryType` or `-> (ArbitraryType, repeated_float_scalars)`.
612+ match d_ret_ty. kind {
613+ TyKind :: Tup ( ref args) => {
614+ // We have a tuple return type. We need to create a tuple of the same size
615+ // and fill it with default values.
616+ let mut exprs2 = thin_vec ! [ exprs] ;
617+ for arg in args. iter ( ) . skip ( 1 ) {
618+ let arg = arg. kind . is_simple_path ( ) . unwrap ( ) ;
619+ let sl: Vec < Symbol > = vec ! [ arg, kw:: Default ] ;
620+ let tmp = ecx. def_site_path ( & sl) ;
621+ let default_call_expr = ecx. expr_path ( ecx. path ( span, tmp) ) ;
622+ let default_call_expr =
623+ ecx. expr_call ( new_decl_span, default_call_expr, thin_vec ! [ ] ) ;
624+ exprs2. push ( default_call_expr) ;
625+ }
626+ exprs = ecx. expr_tuple ( new_decl_span, exprs2) ;
627+ }
628+ _ => {
629+ panic ! ( "Unsupported return type: {:?}" , d_ret_ty) ;
630+ }
631+ }
632+ }
633+ exprs = ecx. expr_call ( new_decl_span, bb_call_expr, thin_vec ! [ exprs] ) ;
627634 } else {
628635 // The return type of our dummy function is the same as the return type of our primal.
629636 // In that case, we can just use the primal call as last instruction.
0 commit comments