9292//! source-level module, functions from the same module will be available for
9393//! inlining, even when they are not marked `#[inline]`.
9494
95+ mod autodiff;
96+
9597use std:: cmp;
9698use std:: collections:: hash_map:: Entry ;
9799use std:: fs:: { self , File } ;
98100use std:: io:: Write ;
99101use std:: path:: { Path , PathBuf } ;
100102
101- use rustc_ast:: expand:: autodiff_attrs:: { AutoDiffItem , DiffActivity } ;
102103use rustc_data_structures:: fx:: { FxIndexMap , FxIndexSet } ;
103104use rustc_data_structures:: sync;
104105use rustc_data_structures:: unord:: { UnordMap , UnordSet } ;
@@ -114,14 +115,13 @@ use rustc_middle::mir::mono::{
114115 MonoItemPartitions , Visibility ,
115116} ;
116117use rustc_middle:: ty:: print:: { characteristic_def_id_of_type, with_no_trimmed_paths} ;
117- use rustc_middle:: ty:: { self , InstanceKind , Ty , TyCtxt } ;
118+ use rustc_middle:: ty:: { self , InstanceKind , TyCtxt } ;
118119use rustc_middle:: util:: Providers ;
119120use rustc_session:: CodegenUnits ;
120121use rustc_session:: config:: { DumpMonoStatsFormat , SwitchWithOptPath } ;
121122use rustc_span:: Symbol ;
122- use rustc_symbol_mangling:: symbol_name_for_instance_in_crate;
123123use rustc_target:: spec:: SymbolVisibility ;
124- use tracing:: { debug, trace } ;
124+ use tracing:: debug;
125125
126126use crate :: collector:: { self , MonoItemCollectionStrategy , UsageMap } ;
127127use crate :: errors:: { CouldntDumpMonoStats , SymbolAlreadyDefined , UnknownCguCollectionMode } ;
@@ -1126,60 +1126,6 @@ where
11261126 }
11271127}
11281128
1129- pub ( crate ) fn adjust_activity_to_abi < ' tcx > (
1130- tcx : TyCtxt < ' tcx > ,
1131- fn_ty : Ty < ' tcx > ,
1132- da : & mut Vec < DiffActivity > ,
1133- ) {
1134- if !matches ! ( fn_ty. kind( ) , ty:: FnDef ( ..) ) {
1135- bug ! ( "expected fn def for autodiff, got {:?}" , fn_ty) ;
1136- }
1137- let fnc_binder: ty:: Binder < ' _ , ty:: FnSig < ' _ > > = fn_ty. fn_sig ( tcx) ;
1138-
1139- // If rustc compiles the unmodified primal, we know that this copy of the function
1140- // also has correct lifetimes. We know that Enzyme won't free the shadow too early
1141- // (or actually at all), so let's strip lifetimes when computing the layout.
1142- let x = tcx. instantiate_bound_regions_with_erased ( fnc_binder) ;
1143- let mut new_activities = vec ! [ ] ;
1144- let mut new_positions = vec ! [ ] ;
1145- for ( i, ty) in x. inputs ( ) . iter ( ) . enumerate ( ) {
1146- if let Some ( inner_ty) = ty. builtin_deref ( true ) {
1147- if ty. is_fn_ptr ( ) {
1148- // FIXME(ZuseZ4): add a nicer error, or just figure out how to support them,
1149- // since Enzyme itself can handle them.
1150- tcx. dcx ( ) . err ( "function pointers are currently not supported in autodiff" ) ;
1151- }
1152- if inner_ty. is_slice ( ) {
1153- // We know that the length will be passed as extra arg.
1154- if !da. is_empty ( ) {
1155- // We are looking at a slice. The length of that slice will become an
1156- // extra integer on llvm level. Integers are always const.
1157- // However, if the slice get's duplicated, we want to know to later check the
1158- // size. So we mark the new size argument as FakeActivitySize.
1159- let activity = match da[ i] {
1160- DiffActivity :: DualOnly
1161- | DiffActivity :: Dual
1162- | DiffActivity :: DuplicatedOnly
1163- | DiffActivity :: Duplicated => DiffActivity :: FakeActivitySize ,
1164- DiffActivity :: Const => DiffActivity :: Const ,
1165- _ => bug ! ( "unexpected activity for ptr/ref" ) ,
1166- } ;
1167- new_activities. push ( activity) ;
1168- new_positions. push ( i + 1 ) ;
1169- }
1170- continue ;
1171- }
1172- }
1173- }
1174- // now add the extra activities coming from slices
1175- // Reverse order to not invalidate the indices
1176- for _ in 0 ..new_activities. len ( ) {
1177- let pos = new_positions. pop ( ) . unwrap ( ) ;
1178- let activity = new_activities. pop ( ) . unwrap ( ) ;
1179- da. insert ( pos, activity) ;
1180- }
1181- }
1182-
11831129fn collect_and_partition_mono_items ( tcx : TyCtxt < ' _ > , ( ) : ( ) ) -> MonoItemPartitions < ' _ > {
11841130 let collection_strategy = match tcx. sess . opts . unstable_opts . print_mono_items {
11851131 Some ( ref s) => {
@@ -1249,55 +1195,9 @@ fn collect_and_partition_mono_items(tcx: TyCtxt<'_>, (): ()) -> MonoItemPartitio
12491195 _ => None ,
12501196 } )
12511197 . collect ( ) ;
1252- let mut autodiff_items: Vec < AutoDiffItem > = vec ! [ ] ;
1253-
1254- for ( item, instance) in autodiff_mono_items {
1255- let target_id = instance. def_id ( ) ;
1256- let cg_fn_attr = tcx. codegen_fn_attrs ( target_id) . autodiff_item . clone ( ) ;
1257- let Some ( target_attrs) = cg_fn_attr else {
1258- continue ;
1259- } ;
1260- //let target_attrs: &AutoDiffAttrs = tcx.autodiff_attrs(target_id);
1261- let mut input_activities: Vec < DiffActivity > = target_attrs. input_activity . clone ( ) ;
1262- if target_attrs. is_source ( ) {
1263- trace ! ( "source found: {:?}" , target_id) ;
1264- }
1265- if !target_attrs. apply_autodiff ( ) {
1266- continue ;
1267- }
1268-
1269- let target_symbol = symbol_name_for_instance_in_crate ( tcx, instance. clone ( ) , LOCAL_CRATE ) ;
1270-
1271- let source =
1272- usage_map. used_map . get ( & item) . unwrap ( ) . into_iter ( ) . find_map ( |item| match * item {
1273- MonoItem :: Fn ( ref instance_s) => {
1274- let source_id = instance_s. def_id ( ) ;
1275- //if tcx.autodiff_attrs(source_id).is_active() {
1276- if let Some ( ad) = & tcx. codegen_fn_attrs ( source_id) . autodiff_item
1277- && ad. is_active ( )
1278- {
1279- return Some ( instance_s) ;
1280- }
1281- None
1282- }
1283- _ => None ,
1284- } ) ;
1285- let inst = match source {
1286- Some ( source) => source,
1287- None => continue ,
1288- } ;
1289-
1290- debug ! ( "source_id: {:?}" , inst. def_id( ) ) ;
1291- let fn_ty = inst. ty ( tcx, ty:: TypingEnv :: fully_monomorphized ( ) ) ;
1292- assert ! ( fn_ty. is_fn( ) ) ;
1293- adjust_activity_to_abi ( tcx, fn_ty, & mut input_activities) ;
1294- let symb = symbol_name_for_instance_in_crate ( tcx, inst. clone ( ) , LOCAL_CRATE ) ;
1295-
1296- let mut new_target_attrs = target_attrs. clone ( ) ;
1297- new_target_attrs. input_activity = input_activities;
1298- let itm = new_target_attrs. into_item ( symb, target_symbol) ;
1299- autodiff_items. push ( itm) ;
1300- }
1198+ // call autodiff fnc
1199+ let autodiff_items =
1200+ autodiff:: find_autodiff_source_functions ( tcx, & usage_map, autodiff_mono_items) ;
13011201 let autodiff_items = tcx. arena . alloc_from_iter ( autodiff_items) ;
13021202
13031203 // Output monomorphization stats per def_id
@@ -1360,13 +1260,6 @@ fn collect_and_partition_mono_items(tcx: TyCtxt<'_>, (): ()) -> MonoItemPartitio
13601260 }
13611261 }
13621262
1363- if !autodiff_items. is_empty ( ) {
1364- trace ! ( "AUTODIFF ITEMS EXIST" ) ;
1365- for item in & mut * autodiff_items {
1366- trace ! ( "{}" , & item) ;
1367- }
1368- }
1369-
13701263 MonoItemPartitions {
13711264 all_mono_items : tcx. arena . alloc ( mono_items) ,
13721265 codegen_units,
0 commit comments