@@ -396,63 +396,29 @@ where
396396}
397397
398398#[ inline( always) ]
399- fn try_execute_query < CTX , C > (
399+ fn try_execute_query < CTX , K , V > (
400400 tcx : CTX ,
401- state : & QueryState < CTX :: DepKind , CTX :: Query , C > ,
402- span : Span ,
403- key : C :: Key ,
404- lookup : QueryLookup < ' _ , CTX :: DepKind , CTX :: Query , C :: Key , C :: Sharded > ,
405- caller : & QueryCaller < CTX :: DepKind > ,
406- query : & QueryVtable < CTX , C :: Key , C :: Value > ,
407- ) -> C :: Stored
401+ job_id : QueryJobId < CTX :: DepKind > ,
402+ key : K ,
403+ query : & QueryVtable < CTX , K , V > ,
404+ ) -> ( V , DepNodeIndex , bool )
408405where
409- C : QueryCache ,
410- C :: Key : crate :: dep_graph:: DepNodeParams < CTX > ,
406+ K : Eq + Clone + Debug + crate :: dep_graph:: DepNodeParams < CTX > ,
411407 CTX : QueryContext ,
412408{
413- let job = JobOwner :: < ' _ , CTX :: DepKind , CTX :: Query , C > :: try_start (
414- tcx, state, span, & key, lookup, query,
415- ) ;
416-
417- if let QueryCaller :: Force ( dep_node) = caller {
418- // We may be concurrently trying both execute and force a query.
419- // Ensure that only one of them runs the query.
420-
421- let job = match job {
422- TryGetJob :: NotYetStarted ( job) => job,
423- TryGetJob :: Cycle ( result) => return result,
424- #[ cfg( parallel_compiler) ]
425- TryGetJob :: JobCompleted ( ( v, _) ) => {
426- return v;
427- }
428- } ;
429- let ( result, dep_node_index) = force_query_with_job ( tcx, key, job. id , * dep_node, query) ;
430- return job. complete ( result, dep_node_index) ;
431- } ;
432-
433- let job = match job {
434- TryGetJob :: NotYetStarted ( job) => job,
435- TryGetJob :: Cycle ( result) => return result,
436- #[ cfg( parallel_compiler) ]
437- TryGetJob :: JobCompleted ( ( v, index) ) => {
438- tcx. dep_graph ( ) . read_index ( index) ;
439- return v;
440- }
441- } ;
442-
443409 // Fast path for when incr. comp. is off. `to_dep_node` is
444410 // expensive for some `DepKind`s.
445411 if !tcx. dep_graph ( ) . is_fully_enabled ( ) {
446412 let null_dep_node = DepNode :: new_no_params ( DepKind :: NULL ) ;
447- let ( result, dep_node_index) = force_query_with_job ( tcx, key, job . id , null_dep_node, query) ;
448- return job . complete ( result, dep_node_index) ;
413+ let ( result, dep_node_index) = force_query_with_job ( tcx, key, job_id , null_dep_node, query) ;
414+ return ( result, dep_node_index, false ) ;
449415 }
450416
451417 if query. anon {
452418 let prof_timer = tcx. profiler ( ) . query_provider ( ) ;
453419
454420 let ( ( result, dep_node_index) , diagnostics) = with_diagnostics ( |diagnostics| {
455- tcx. start_query ( job . id , diagnostics, |tcx| {
421+ tcx. start_query ( job_id , diagnostics, |tcx| {
456422 tcx. dep_graph ( ) . with_anon_task ( query. dep_kind , || query. compute ( tcx, key) )
457423 } )
458424 } ) ;
@@ -465,7 +431,7 @@ where
465431 tcx. store_diagnostics_for_anon_node ( dep_node_index, diagnostics) ;
466432 }
467433
468- return job . complete ( result, dep_node_index) ;
434+ return ( result, dep_node_index, false ) ;
469435 }
470436
471437 let dep_node = query. to_dep_node ( tcx, & key) ;
@@ -474,7 +440,7 @@ where
474440 // The diagnostics for this query will be
475441 // promoted to the current session during
476442 // `try_mark_green()`, so we can ignore them here.
477- let loaded = tcx. start_query ( job . id , None , |tcx| {
443+ let loaded = tcx. start_query ( job_id , None , |tcx| {
478444 let marked = tcx. dep_graph ( ) . try_mark_green_and_read ( tcx, & dep_node) ;
479445 marked. map ( |( prev_dep_node_index, dep_node_index) | {
480446 (
@@ -491,14 +457,12 @@ where
491457 } )
492458 } ) ;
493459 if let Some ( ( result, dep_node_index) ) = loaded {
494- return job . complete ( result, dep_node_index) ;
460+ return ( result, dep_node_index, false ) ;
495461 }
496462 }
497463
498- let ( result, dep_node_index) = force_query_with_job ( tcx, key, job. id , dep_node, query) ;
499- let result = job. complete ( result, dep_node_index) ;
500- tcx. dep_graph ( ) . read_index ( dep_node_index) ;
501- result
464+ let ( result, dep_node_index) = force_query_with_job ( tcx, key, job_id, dep_node, query) ;
465+ return ( result, dep_node_index, true ) ;
502466}
503467
504468fn load_from_disk_and_cache_in_memory < CTX , K , V > (
@@ -730,7 +694,43 @@ where
730694 }
731695 }
732696 } ,
733- |key, lookup| Some ( try_execute_query ( tcx, state, span, key, lookup, & caller, query) ) ,
697+ |key, lookup| {
698+ let job = JobOwner :: try_start ( tcx, state, span, & key, lookup, query) ;
699+
700+ if let QueryCaller :: Force ( dep_node) = & caller {
701+ // We may be concurrently trying both execute and force a query.
702+ // Ensure that only one of them runs the query.
703+
704+ let job = match job {
705+ TryGetJob :: NotYetStarted ( job) => job,
706+ TryGetJob :: Cycle ( _) => return None ,
707+ #[ cfg( parallel_compiler) ]
708+ TryGetJob :: JobCompleted ( _) => {
709+ return None ;
710+ }
711+ } ;
712+ let ( result, dep_node_index) =
713+ force_query_with_job ( tcx, key, job. id , * dep_node, query) ;
714+ return Some ( job. complete ( result, dep_node_index) ) ;
715+ } ;
716+
717+ let job = match job {
718+ TryGetJob :: NotYetStarted ( job) => job,
719+ TryGetJob :: Cycle ( result) => return Some ( result) ,
720+ #[ cfg( parallel_compiler) ]
721+ TryGetJob :: JobCompleted ( ( v, index) ) => {
722+ tcx. dep_graph ( ) . read_index ( index) ;
723+ return Some ( v) ;
724+ }
725+ } ;
726+
727+ let ( result, dep_node_index, read_index) = try_execute_query ( tcx, job. id , key, query) ;
728+ if read_index {
729+ tcx. dep_graph ( ) . read_index ( dep_node_index) ;
730+ }
731+ let result = job. complete ( result, dep_node_index) ;
732+ Some ( result)
733+ } ,
734734 )
735735}
736736
0 commit comments