@@ -2,7 +2,7 @@ use rustc_ast::expand::typetree::{FncTree, TypeTree};
2
2
use rustc_middle:: ty:: layout:: HasTyCtxt ;
3
3
use rustc_middle:: ty:: { self , Ty , TyCtxt , typetree_from} ;
4
4
use rustc_middle:: { bug, span_bug} ;
5
- use rustc_session:: config:: OptLevel ;
5
+ use rustc_session:: config:: { AutoDiff , OptLevel } ;
6
6
use rustc_span:: { Span , sym} ;
7
7
use rustc_target:: abi:: WrappingRange ;
8
8
use rustc_target:: abi:: call:: { FnAbi , PassMode } ;
@@ -26,8 +26,15 @@ fn copy_intrinsic<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>>(
26
26
) {
27
27
let tcx: TyCtxt < ' _ > = bx. cx ( ) . tcx ( ) ;
28
28
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
+ } ;
31
38
32
39
let layout = bx. layout_of ( ty) ;
33
40
let size = layout. size ;
@@ -36,9 +43,9 @@ fn copy_intrinsic<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>>(
36
43
let flags = if volatile { MemFlags :: VOLATILE } else { MemFlags :: empty ( ) } ;
37
44
trace ! ( "copy: mir ty: {:?}, enzyme tt: {:?}" , ty, fnc_tree) ;
38
45
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) ;
40
47
} else {
41
- bx. memcpy ( dst, align, src, align, size, flags, Some ( fnc_tree) ) ;
48
+ bx. memcpy ( dst, align, src, align, size, flags, fnc_tree) ;
42
49
}
43
50
}
44
51
@@ -52,15 +59,22 @@ fn memset_intrinsic<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>>(
52
59
) {
53
60
let tcx: TyCtxt < ' _ > = bx. cx ( ) . tcx ( ) ;
54
61
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
+ } ;
57
71
58
72
let layout = bx. layout_of ( ty) ;
59
73
let size = layout. size ;
60
74
let align = layout. align . abi ;
61
75
let size = bx. mul ( bx. const_usize ( size. bytes ( ) ) , count) ;
62
76
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) ;
64
78
}
65
79
66
80
impl < ' a , ' tcx , Bx : BuilderMethods < ' a , ' tcx > > FunctionCx < ' a , ' tcx , Bx > {
0 commit comments