@@ -2,7 +2,7 @@ use rustc_ast::expand::typetree::{FncTree, TypeTree};
22use rustc_middle:: ty:: layout:: HasTyCtxt ;
33use rustc_middle:: ty:: { self , Ty , TyCtxt , typetree_from} ;
44use rustc_middle:: { bug, span_bug} ;
5- use rustc_session:: config:: OptLevel ;
5+ use rustc_session:: config:: { AutoDiff , OptLevel } ;
66use rustc_span:: { Span , sym} ;
77use rustc_target:: abi:: WrappingRange ;
88use rustc_target:: abi:: call:: { FnAbi , PassMode } ;
@@ -26,8 +26,15 @@ fn copy_intrinsic<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>>(
2626) {
2727 let tcx: TyCtxt < ' _ > = bx. cx ( ) . tcx ( ) ;
2828 let tt: TypeTree = typetree_from ( tcx, ty) ;
29- let fnc_tree: FncTree =
30- FncTree { args : vec ! [ tt. clone( ) , tt. clone( ) , TypeTree :: all_ints( ) ] , ret : TypeTree :: new ( ) } ;
29+ let ad = & tcx. sess . opts . unstable_opts . autodiff ;
30+ let fnc_tree: Option < FncTree > = if ad. contains ( & AutoDiff :: NoTypeTrees ) {
31+ None
32+ } else {
33+ Some ( FncTree {
34+ args : vec ! [ tt. clone( ) , tt. clone( ) , TypeTree :: all_ints( ) ] ,
35+ ret : TypeTree :: new ( ) ,
36+ } )
37+ } ;
3138
3239 let layout = bx. layout_of ( ty) ;
3340 let size = layout. size ;
@@ -36,9 +43,9 @@ fn copy_intrinsic<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>>(
3643 let flags = if volatile { MemFlags :: VOLATILE } else { MemFlags :: empty ( ) } ;
3744 trace ! ( "copy: mir ty: {:?}, enzyme tt: {:?}" , ty, fnc_tree) ;
3845 if allow_overlap {
39- bx. memmove ( dst, align, src, align, size, flags, Some ( fnc_tree) ) ;
46+ bx. memmove ( dst, align, src, align, size, flags, fnc_tree) ;
4047 } else {
41- bx. memcpy ( dst, align, src, align, size, flags, Some ( fnc_tree) ) ;
48+ bx. memcpy ( dst, align, src, align, size, flags, fnc_tree) ;
4249 }
4350}
4451
@@ -52,15 +59,22 @@ fn memset_intrinsic<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>>(
5259) {
5360 let tcx: TyCtxt < ' _ > = bx. cx ( ) . tcx ( ) ;
5461 let tt: TypeTree = typetree_from ( tcx, ty) ;
55- let fnc_tree: FncTree =
56- FncTree { args : vec ! [ tt. clone( ) , tt. clone( ) , TypeTree :: all_ints( ) ] , ret : TypeTree :: new ( ) } ;
62+ let ad = & tcx. sess . opts . unstable_opts . autodiff ;
63+ let fnc_tree: Option < FncTree > = if ad. contains ( & AutoDiff :: NoTypeTrees ) {
64+ None
65+ } else {
66+ Some ( FncTree {
67+ args : vec ! [ tt. clone( ) , tt. clone( ) , TypeTree :: all_ints( ) ] ,
68+ ret : TypeTree :: new ( ) ,
69+ } )
70+ } ;
5771
5872 let layout = bx. layout_of ( ty) ;
5973 let size = layout. size ;
6074 let align = layout. align . abi ;
6175 let size = bx. mul ( bx. const_usize ( size. bytes ( ) ) , count) ;
6276 let flags = if volatile { MemFlags :: VOLATILE } else { MemFlags :: empty ( ) } ;
63- bx. memset ( dst, val, size, align, flags, Some ( fnc_tree) ) ;
77+ bx. memset ( dst, val, size, align, flags, fnc_tree) ;
6478}
6579
6680impl < ' a , ' tcx , Bx : BuilderMethods < ' a , ' tcx > > FunctionCx < ' a , ' tcx , Bx > {
0 commit comments