Hex Artifact Content
Not logged in

Artifact 6ed48db86d0110d2cc91c4c982619080dfd81113:


0000: 75 73 65 20 72 75 73 74 63 5f 69 6e 64 65 78 3a  use rustc_index:
0010: 3a 76 65 63 3a 3a 49 6e 64 65 78 56 65 63 3b 0a  :vec::IndexVec;.
0020: 75 73 65 20 72 75 73 74 63 5f 64 61 74 61 5f 73  use rustc_data_s
0030: 74 72 75 63 74 75 72 65 73 3a 3a 73 74 61 62 6c  tructures::stabl
0040: 65 5f 68 61 73 68 65 72 3a 3a 7b 48 61 73 68 53  e_hasher::{HashS
0050: 74 61 62 6c 65 2c 20 53 74 61 62 6c 65 48 61 73  table, StableHas
0060: 68 65 72 7d 3b 0a 75 73 65 20 72 75 73 74 63 5f  her};.use rustc_
0070: 73 65 72 69 61 6c 69 7a 65 3a 3a 7b 45 6e 63 6f  serialize::{Enco
0080: 64 61 62 6c 65 2c 20 45 6e 63 6f 64 65 72 2c 20  dable, Encoder, 
0090: 44 65 63 6f 64 61 62 6c 65 2c 20 44 65 63 6f 64  Decodable, Decod
00a0: 65 72 7d 3b 0a 75 73 65 20 63 72 61 74 65 3a 3a  er};.use crate::
00b0: 69 63 68 3a 3a 53 74 61 62 6c 65 48 61 73 68 69  ich::StableHashi
00c0: 6e 67 43 6f 6e 74 65 78 74 3b 0a 75 73 65 20 63  ngContext;.use c
00d0: 72 61 74 65 3a 3a 6d 69 72 3a 3a 7b 42 61 73 69  rate::mir::{Basi
00e0: 63 42 6c 6f 63 6b 2c 20 42 61 73 69 63 42 6c 6f  cBlock, BasicBlo
00f0: 63 6b 44 61 74 61 2c 20 42 6f 64 79 2c 20 4c 6f  ckData, Body, Lo
0100: 63 61 6c 44 65 63 6c 73 2c 20 4c 6f 63 61 74 69  calDecls, Locati
0110: 6f 6e 2c 20 53 75 63 63 65 73 73 6f 72 73 7d 3b  on, Successors};
0120: 0a 75 73 65 20 72 75 73 74 63 5f 64 61 74 61 5f  .use rustc_data_
0130: 73 74 72 75 63 74 75 72 65 73 3a 3a 67 72 61 70  structures::grap
0140: 68 3a 3a 7b 73 65 6c 66 2c 20 47 72 61 70 68 50  h::{self, GraphP
0150: 72 65 64 65 63 65 73 73 6f 72 73 2c 20 47 72 61  redecessors, Gra
0160: 70 68 53 75 63 63 65 73 73 6f 72 73 7d 3b 0a 75  phSuccessors};.u
0170: 73 65 20 72 75 73 74 63 5f 64 61 74 61 5f 73 74  se rustc_data_st
0180: 72 75 63 74 75 72 65 73 3a 3a 67 72 61 70 68 3a  ructures::graph:
0190: 3a 64 6f 6d 69 6e 61 74 6f 72 73 3a 3a 7b 64 6f  :dominators::{do
01a0: 6d 69 6e 61 74 6f 72 73 2c 20 44 6f 6d 69 6e 61  minators, Domina
01b0: 74 6f 72 73 7d 3b 0a 75 73 65 20 73 74 64 3a 3a  tors};.use std::
01c0: 69 74 65 72 3b 0a 75 73 65 20 73 74 64 3a 3a 6f  iter;.use std::o
01d0: 70 73 3a 3a 7b 44 65 72 65 66 2c 20 44 65 72 65  ps::{Deref, Dere
01e0: 66 4d 75 74 2c 20 49 6e 64 65 78 2c 20 49 6e 64  fMut, Index, Ind
01f0: 65 78 4d 75 74 7d 3b 0a 75 73 65 20 73 74 64 3a  exMut};.use std:
0200: 3a 76 65 63 3a 3a 49 6e 74 6f 49 74 65 72 3b 0a  :vec::IntoIter;.
0210: 0a 23 5b 64 65 72 69 76 65 28 43 6c 6f 6e 65 2c  .#[derive(Clone,
0220: 20 44 65 62 75 67 29 5d 0a 70 75 62 20 73 74 72   Debug)].pub str
0230: 75 63 74 20 43 61 63 68 65 20 7b 0a 20 20 20 20  uct Cache {.    
0240: 70 72 65 64 65 63 65 73 73 6f 72 73 3a 20 4f 70  predecessors: Op
0250: 74 69 6f 6e 3c 49 6e 64 65 78 56 65 63 3c 42 61  tion<IndexVec<Ba
0260: 73 69 63 42 6c 6f 63 6b 2c 20 56 65 63 3c 42 61  sicBlock, Vec<Ba
0270: 73 69 63 42 6c 6f 63 6b 3e 3e 3e 2c 0a 7d 0a 0a  sicBlock>>>,.}..
0280: 69 6d 70 6c 20 72 75 73 74 63 5f 73 65 72 69 61  impl rustc_seria
0290: 6c 69 7a 65 3a 3a 45 6e 63 6f 64 61 62 6c 65 20  lize::Encodable 
02a0: 66 6f 72 20 43 61 63 68 65 20 7b 0a 20 20 20 20  for Cache {.    
02b0: 66 6e 20 65 6e 63 6f 64 65 3c 53 3a 20 45 6e 63  fn encode<S: Enc
02c0: 6f 64 65 72 3e 28 26 73 65 6c 66 2c 20 73 3a 20  oder>(&self, s: 
02d0: 26 6d 75 74 20 53 29 20 2d 3e 20 52 65 73 75 6c  &mut S) -> Resul
02e0: 74 3c 28 29 2c 20 53 3a 3a 45 72 72 6f 72 3e 20  t<(), S::Error> 
02f0: 7b 0a 20 20 20 20 20 20 20 20 45 6e 63 6f 64 61  {.        Encoda
0300: 62 6c 65 3a 3a 65 6e 63 6f 64 65 28 26 28 29 2c  ble::encode(&(),
0310: 20 73 29 0a 20 20 20 20 7d 0a 7d 0a 0a 69 6d 70   s).    }.}..imp
0320: 6c 20 72 75 73 74 63 5f 73 65 72 69 61 6c 69 7a  l rustc_serializ
0330: 65 3a 3a 44 65 63 6f 64 61 62 6c 65 20 66 6f 72  e::Decodable for
0340: 20 43 61 63 68 65 20 7b 0a 20 20 20 20 66 6e 20   Cache {.    fn 
0350: 64 65 63 6f 64 65 3c 44 3a 20 44 65 63 6f 64 65  decode<D: Decode
0360: 72 3e 28 64 3a 20 26 6d 75 74 20 44 29 20 2d 3e  r>(d: &mut D) ->
0370: 20 52 65 73 75 6c 74 3c 53 65 6c 66 2c 20 44 3a   Result<Self, D:
0380: 3a 45 72 72 6f 72 3e 20 7b 0a 20 20 20 20 20 20  :Error> {.      
0390: 20 20 44 65 63 6f 64 61 62 6c 65 3a 3a 64 65 63    Decodable::dec
03a0: 6f 64 65 28 64 29 2e 6d 61 70 28 7c 5f 76 3a 20  ode(d).map(|_v: 
03b0: 28 29 7c 20 53 65 6c 66 3a 3a 6e 65 77 28 29 29  ()| Self::new())
03c0: 0a 20 20 20 20 7d 0a 7d 0a 0a 69 6d 70 6c 3c 27  .    }.}..impl<'
03d0: 61 3e 20 48 61 73 68 53 74 61 62 6c 65 3c 53 74  a> HashStable<St
03e0: 61 62 6c 65 48 61 73 68 69 6e 67 43 6f 6e 74 65  ableHashingConte
03f0: 78 74 3c 27 61 3e 3e 20 66 6f 72 20 43 61 63 68  xt<'a>> for Cach
0400: 65 20 7b 0a 20 20 20 20 66 6e 20 68 61 73 68 5f  e {.    fn hash_
0410: 73 74 61 62 6c 65 28 26 73 65 6c 66 2c 20 5f 3a  stable(&self, _:
0420: 20 26 6d 75 74 20 53 74 61 62 6c 65 48 61 73 68   &mut StableHash
0430: 69 6e 67 43 6f 6e 74 65 78 74 3c 27 61 3e 2c 20  ingContext<'a>, 
0440: 5f 3a 20 26 6d 75 74 20 53 74 61 62 6c 65 48 61  _: &mut StableHa
0450: 73 68 65 72 29 20 7b 0a 20 20 20 20 20 20 20 20  sher) {.        
0460: 2f 2f 20 44 6f 20 6e 6f 74 68 69 6e 67 2e 0a 20  // Do nothing.. 
0470: 20 20 20 7d 0a 7d 0a 0a 69 6d 70 6c 20 43 61 63     }.}..impl Cac
0480: 68 65 20 7b 0a 20 20 20 20 70 75 62 20 66 6e 20  he {.    pub fn 
0490: 6e 65 77 28 29 20 2d 3e 20 53 65 6c 66 20 7b 0a  new() -> Self {.
04a0: 20 20 20 20 20 20 20 20 53 65 6c 66 20 7b 0a 20          Self {. 
04b0: 20 20 20 20 20 20 20 20 20 20 20 70 72 65 64 65             prede
04c0: 63 65 73 73 6f 72 73 3a 20 4e 6f 6e 65 2c 0a 20  cessors: None,. 
04d0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a         }.    }..
04e0: 20 20 20 20 70 75 62 20 66 6e 20 69 6e 76 61 6c      pub fn inval
04f0: 69 64 61 74 65 5f 70 72 65 64 65 63 65 73 73 6f  idate_predecesso
0500: 72 73 28 26 6d 75 74 20 73 65 6c 66 29 20 7b 0a  rs(&mut self) {.
0510: 20 20 20 20 20 20 20 20 2f 2f 20 46 49 58 4d 45          // FIXME
0520: 3a 20 63 6f 6e 73 69 64 65 72 20 62 65 69 6e 67  : consider being
0530: 20 6d 6f 72 65 20 66 69 6e 65 2d 67 72 61 69 6e   more fine-grain
0540: 65 64 0a 20 20 20 20 20 20 20 20 73 65 6c 66 2e  ed.        self.
0550: 70 72 65 64 65 63 65 73 73 6f 72 73 20 3d 20 4e  predecessors = N
0560: 6f 6e 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  one;.    }..    
0570: 70 75 62 20 66 6e 20 65 6e 73 75 72 65 5f 70 72  pub fn ensure_pr
0580: 65 64 65 63 65 73 73 6f 72 73 28 26 6d 75 74 20  edecessors(&mut 
0590: 73 65 6c 66 2c 20 62 6f 64 79 3a 20 26 42 6f 64  self, body: &Bod
05a0: 79 3c 27 5f 3e 29 20 7b 0a 20 20 20 20 20 20 20  y<'_>) {.       
05b0: 20 69 66 20 73 65 6c 66 2e 70 72 65 64 65 63 65   if self.predece
05c0: 73 73 6f 72 73 2e 69 73 5f 6e 6f 6e 65 28 29 20  ssors.is_none() 
05d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 65  {.            le
05e0: 74 20 6d 75 74 20 72 65 73 75 6c 74 20 3d 20 49  t mut result = I
05f0: 6e 64 65 78 56 65 63 3a 3a 66 72 6f 6d 5f 65 6c  ndexVec::from_el
0600: 65 6d 28 76 65 63 21 5b 5d 2c 20 62 6f 64 79 2e  em(vec![], body.
0610: 62 61 73 69 63 5f 62 6c 6f 63 6b 73 28 29 29 3b  basic_blocks());
0620: 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72  .            for
0630: 20 28 62 62 2c 20 64 61 74 61 29 20 69 6e 20 62   (bb, data) in b
0640: 6f 64 79 2e 62 61 73 69 63 5f 62 6c 6f 63 6b 73  ody.basic_blocks
0650: 28 29 2e 69 74 65 72 5f 65 6e 75 6d 65 72 61 74  ().iter_enumerat
0660: 65 64 28 29 20 7b 0a 20 20 20 20 20 20 20 20 20  ed() {.         
0670: 20 20 20 20 20 20 20 69 66 20 6c 65 74 20 53 6f         if let So
0680: 6d 65 28 72 65 66 20 74 65 72 6d 29 20 3d 20 64  me(ref term) = d
0690: 61 74 61 2e 74 65 72 6d 69 6e 61 74 6f 72 20 7b  ata.terminator {
06a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
06b0: 20 20 20 20 20 66 6f 72 20 26 74 67 74 20 69 6e       for &tgt in
06c0: 20 74 65 72 6d 2e 73 75 63 63 65 73 73 6f 72 73   term.successors
06d0: 28 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  () {.           
06e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 73               res
06f0: 75 6c 74 5b 74 67 74 5d 2e 70 75 73 68 28 62 62  ult[tgt].push(bb
0700: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
0710: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
0720: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
0730: 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
0740: 20 20 20 20 20 20 73 65 6c 66 2e 70 72 65 64 65        self.prede
0750: 63 65 73 73 6f 72 73 20 3d 20 53 6f 6d 65 28 72  cessors = Some(r
0760: 65 73 75 6c 74 29 0a 20 20 20 20 20 20 20 20 7d  esult).        }
0770: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2f 2f 20  .    }..    /// 
0780: 54 68 69 73 20 77 69 6c 6c 20 72 65 63 6f 6d 70  This will recomp
0790: 75 74 65 20 74 68 65 20 70 72 65 64 65 63 65 73  ute the predeces
07a0: 73 6f 72 73 20 63 61 63 68 65 20 69 66 20 69 74  sors cache if it
07b0: 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c   is not availabl
07c0: 65 0a 20 20 20 20 66 6e 20 70 72 65 64 65 63 65  e.    fn predece
07d0: 73 73 6f 72 73 28 26 6d 75 74 20 73 65 6c 66 2c  ssors(&mut self,
07e0: 20 62 6f 64 79 3a 20 26 42 6f 64 79 3c 27 5f 3e   body: &Body<'_>
07f0: 29 20 2d 3e 20 26 49 6e 64 65 78 56 65 63 3c 42  ) -> &IndexVec<B
0800: 61 73 69 63 42 6c 6f 63 6b 2c 20 56 65 63 3c 42  asicBlock, Vec<B
0810: 61 73 69 63 42 6c 6f 63 6b 3e 3e 20 7b 0a 20 20  asicBlock>> {.  
0820: 20 20 20 20 20 20 73 65 6c 66 2e 65 6e 73 75 72        self.ensur
0830: 65 5f 70 72 65 64 65 63 65 73 73 6f 72 73 28 62  e_predecessors(b
0840: 6f 64 79 29 3b 0a 20 20 20 20 20 20 20 20 73 65  ody);.        se
0850: 6c 66 2e 70 72 65 64 65 63 65 73 73 6f 72 73 2e  lf.predecessors.
0860: 61 73 5f 72 65 66 28 29 2e 75 6e 77 72 61 70 28  as_ref().unwrap(
0870: 29 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6e 20  ).    }..    fn 
0880: 75 6e 77 72 61 70 5f 70 72 65 64 65 63 65 73 73  unwrap_predecess
0890: 6f 72 73 5f 66 6f 72 28 26 73 65 6c 66 2c 20 62  ors_for(&self, b
08a0: 62 3a 20 42 61 73 69 63 42 6c 6f 63 6b 29 20 2d  b: BasicBlock) -
08b0: 3e 20 26 5b 42 61 73 69 63 42 6c 6f 63 6b 5d 20  > &[BasicBlock] 
08c0: 7b 0a 20 20 20 20 20 20 20 20 26 73 65 6c 66 2e  {.        &self.
08d0: 70 72 65 64 65 63 65 73 73 6f 72 73 2e 61 73 5f  predecessors.as_
08e0: 72 65 66 28 29 2e 75 6e 77 72 61 70 28 29 5b 62  ref().unwrap()[b
08f0: 62 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6e  b].    }..    fn
0900: 20 75 6e 77 72 61 70 5f 70 72 65 64 65 63 65 73   unwrap_predeces
0910: 73 6f 72 5f 6c 6f 63 61 74 69 6f 6e 73 3c 27 61  sor_locations<'a
0920: 3e 28 0a 20 20 20 20 20 20 20 20 26 27 61 20 73  >(.        &'a s
0930: 65 6c 66 2c 0a 20 20 20 20 20 20 20 20 6c 6f 63  elf,.        loc
0940: 3a 20 4c 6f 63 61 74 69 6f 6e 2c 0a 20 20 20 20  : Location,.    
0950: 20 20 20 20 62 6f 64 79 3a 20 26 27 61 20 42 6f      body: &'a Bo
0960: 64 79 3c 27 61 3e 0a 20 20 20 20 29 20 2d 3e 20  dy<'a>.    ) -> 
0970: 69 6d 70 6c 20 49 74 65 72 61 74 6f 72 3c 49 74  impl Iterator<It
0980: 65 6d 20 3d 20 4c 6f 63 61 74 69 6f 6e 3e 20 2b  em = Location> +
0990: 20 27 61 20 7b 0a 20 20 20 20 20 20 20 20 6c 65   'a {.        le
09a0: 74 20 69 66 5f 7a 65 72 6f 5f 6c 6f 63 61 74 69  t if_zero_locati
09b0: 6f 6e 73 20 3d 20 69 66 20 6c 6f 63 2e 73 74 61  ons = if loc.sta
09c0: 74 65 6d 65 6e 74 5f 69 6e 64 65 78 20 3d 3d 20  tement_index == 
09d0: 30 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0 {.            
09e0: 6c 65 74 20 70 72 65 64 65 63 65 73 73 6f 72 5f  let predecessor_
09f0: 62 6c 6f 63 6b 73 20 3d 20 73 65 6c 66 2e 75 6e  blocks = self.un
0a00: 77 72 61 70 5f 70 72 65 64 65 63 65 73 73 6f 72  wrap_predecessor
0a10: 73 5f 66 6f 72 28 6c 6f 63 2e 62 6c 6f 63 6b 29  s_for(loc.block)
0a20: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 65  ;.            le
0a30: 74 20 6e 75 6d 5f 70 72 65 64 65 63 65 73 73 6f  t num_predecesso
0a40: 72 5f 62 6c 6f 63 6b 73 20 3d 20 70 72 65 64 65  r_blocks = prede
0a50: 63 65 73 73 6f 72 5f 62 6c 6f 63 6b 73 2e 6c 65  cessor_blocks.le
0a60: 6e 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  n();.           
0a70: 20 53 6f 6d 65 28 0a 20 20 20 20 20 20 20 20 20   Some(.         
0a80: 20 20 20 20 20 20 20 28 30 2e 2e 6e 75 6d 5f 70         (0..num_p
0a90: 72 65 64 65 63 65 73 73 6f 72 5f 62 6c 6f 63 6b  redecessor_block
0aa0: 73 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s).             
0ab0: 20 20 20 20 20 20 20 2e 6d 61 70 28 6d 6f 76 65         .map(move
0ac0: 20 7c 69 7c 20 70 72 65 64 65 63 65 73 73 6f 72   |i| predecessor
0ad0: 5f 62 6c 6f 63 6b 73 5b 69 5d 29 0a 20 20 20 20  _blocks[i]).    
0ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0af0: 2e 6d 61 70 28 6d 6f 76 65 20 7c 62 62 7c 20 62  .map(move |bb| b
0b00: 6f 64 79 2e 74 65 72 6d 69 6e 61 74 6f 72 5f 6c  ody.terminator_l
0b10: 6f 63 28 62 62 29 29 2c 0a 20 20 20 20 20 20 20  oc(bb)),.       
0b20: 20 20 20 20 20 29 0a 20 20 20 20 20 20 20 20 7d       ).        }
0b30: 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
0b40: 20 20 20 20 4e 6f 6e 65 0a 20 20 20 20 20 20 20      None.       
0b50: 20 7d 3b 0a 0a 20 20 20 20 20 20 20 20 6c 65 74   };..        let
0b60: 20 69 66 5f 6e 6f 74 5f 7a 65 72 6f 5f 6c 6f 63   if_not_zero_loc
0b70: 61 74 69 6f 6e 73 20 3d 20 69 66 20 6c 6f 63 2e  ations = if loc.
0b80: 73 74 61 74 65 6d 65 6e 74 5f 69 6e 64 65 78 20  statement_index 
0b90: 3d 3d 20 30 20 7b 0a 20 20 20 20 20 20 20 20 20  == 0 {.         
0ba0: 20 20 20 4e 6f 6e 65 0a 20 20 20 20 20 20 20 20     None.        
0bb0: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20  } else {.       
0bc0: 20 20 20 20 20 53 6f 6d 65 28 4c 6f 63 61 74 69       Some(Locati
0bd0: 6f 6e 20 7b 20 62 6c 6f 63 6b 3a 20 6c 6f 63 2e  on { block: loc.
0be0: 62 6c 6f 63 6b 2c 20 73 74 61 74 65 6d 65 6e 74  block, statement
0bf0: 5f 69 6e 64 65 78 3a 20 6c 6f 63 2e 73 74 61 74  _index: loc.stat
0c00: 65 6d 65 6e 74 5f 69 6e 64 65 78 20 2d 20 31 20  ement_index - 1 
0c10: 7d 29 0a 20 20 20 20 20 20 20 20 7d 3b 0a 0a 20  }).        };.. 
0c20: 20 20 20 20 20 20 20 69 66 5f 7a 65 72 6f 5f 6c         if_zero_l
0c30: 6f 63 61 74 69 6f 6e 73 2e 69 6e 74 6f 5f 69 74  ocations.into_it
0c40: 65 72 28 29 2e 66 6c 61 74 74 65 6e 28 29 2e 63  er().flatten().c
0c50: 68 61 69 6e 28 69 66 5f 6e 6f 74 5f 7a 65 72 6f  hain(if_not_zero
0c60: 5f 6c 6f 63 61 74 69 6f 6e 73 29 0a 20 20 20 20  _locations).    
0c70: 7d 0a 0a 20 20 20 20 70 75 62 20 66 6e 20 62 61  }..    pub fn ba
0c80: 73 69 63 5f 62 6c 6f 63 6b 73 5f 6d 75 74 3c 27  sic_blocks_mut<'
0c90: 61 2c 20 27 74 63 78 3e 28 0a 20 20 20 20 20 20  a, 'tcx>(.      
0ca0: 20 20 26 6d 75 74 20 73 65 6c 66 2c 0a 20 20 20    &mut self,.   
0cb0: 20 20 20 20 20 62 6f 64 79 3a 20 26 27 61 20 6d       body: &'a m
0cc0: 75 74 20 42 6f 64 79 3c 27 74 63 78 3e 0a 20 20  ut Body<'tcx>.  
0cd0: 20 20 29 20 2d 3e 20 26 27 61 20 6d 75 74 20 49    ) -> &'a mut I
0ce0: 6e 64 65 78 56 65 63 3c 42 61 73 69 63 42 6c 6f  ndexVec<BasicBlo
0cf0: 63 6b 2c 20 42 61 73 69 63 42 6c 6f 63 6b 44 61  ck, BasicBlockDa
0d00: 74 61 3c 27 74 63 78 3e 3e 20 7b 0a 20 20 20 20  ta<'tcx>> {.    
0d10: 20 20 20 20 64 65 62 75 67 21 28 22 62 62 6d 3a      debug!("bbm:
0d20: 20 43 6c 65 61 72 69 6e 67 20 70 72 65 64 65 63   Clearing predec
0d30: 65 73 73 6f 72 73 20 63 61 63 68 65 20 66 6f 72  essors cache for
0d40: 20 62 6f 64 79 20 61 74 3a 20 7b 3a 3f 7d 22 2c   body at: {:?}",
0d50: 20 62 6f 64 79 2e 73 70 61 6e 2e 64 61 74 61 28   body.span.data(
0d60: 29 29 3b 0a 20 20 20 20 20 20 20 20 73 65 6c 66  ));.        self
0d70: 2e 69 6e 76 61 6c 69 64 61 74 65 5f 70 72 65 64  .invalidate_pred
0d80: 65 63 65 73 73 6f 72 73 28 29 3b 0a 20 20 20 20  ecessors();.    
0d90: 20 20 20 20 26 6d 75 74 20 62 6f 64 79 2e 62 61      &mut body.ba
0da0: 73 69 63 5f 62 6c 6f 63 6b 73 0a 20 20 20 20 7d  sic_blocks.    }
0db0: 0a 0a 20 20 20 20 70 75 62 20 66 6e 20 62 61 73  ..    pub fn bas
0dc0: 69 63 5f 62 6c 6f 63 6b 73 5f 61 6e 64 5f 6c 6f  ic_blocks_and_lo
0dd0: 63 61 6c 5f 64 65 63 6c 73 5f 6d 75 74 3c 27 61  cal_decls_mut<'a
0de0: 2c 20 27 74 63 78 3e 28 0a 20 20 20 20 20 20 20  , 'tcx>(.       
0df0: 20 26 6d 75 74 20 73 65 6c 66 2c 0a 20 20 20 20   &mut self,.    
0e00: 20 20 20 20 62 6f 64 79 3a 20 26 27 61 20 6d 75      body: &'a mu
0e10: 74 20 42 6f 64 79 3c 27 74 63 78 3e 0a 20 20 20  t Body<'tcx>.   
0e20: 20 29 20 2d 3e 20 28 26 27 61 20 6d 75 74 20 49   ) -> (&'a mut I
0e30: 6e 64 65 78 56 65 63 3c 42 61 73 69 63 42 6c 6f  ndexVec<BasicBlo
0e40: 63 6b 2c 20 42 61 73 69 63 42 6c 6f 63 6b 44 61  ck, BasicBlockDa
0e50: 74 61 3c 27 74 63 78 3e 3e 2c 20 26 27 61 20 6d  ta<'tcx>>, &'a m
0e60: 75 74 20 4c 6f 63 61 6c 44 65 63 6c 73 3c 27 74  ut LocalDecls<'t
0e70: 63 78 3e 29 20 7b 0a 20 20 20 20 20 20 20 20 64  cx>) {.        d
0e80: 65 62 75 67 21 28 22 62 62 61 6c 64 6d 3a 20 43  ebug!("bbaldm: C
0e90: 6c 65 61 72 69 6e 67 20 70 72 65 64 65 63 65 73  learing predeces
0ea0: 73 6f 72 73 20 63 61 63 68 65 20 66 6f 72 20 62  sors cache for b
0eb0: 6f 64 79 20 61 74 3a 20 7b 3a 3f 7d 22 2c 20 62  ody at: {:?}", b
0ec0: 6f 64 79 2e 73 70 61 6e 2e 64 61 74 61 28 29 29  ody.span.data())
0ed0: 3b 0a 20 20 20 20 20 20 20 20 73 65 6c 66 2e 69  ;.        self.i
0ee0: 6e 76 61 6c 69 64 61 74 65 5f 70 72 65 64 65 63  nvalidate_predec
0ef0: 65 73 73 6f 72 73 28 29 3b 0a 20 20 20 20 20 20  essors();.      
0f00: 20 20 28 26 6d 75 74 20 62 6f 64 79 2e 62 61 73    (&mut body.bas
0f10: 69 63 5f 62 6c 6f 63 6b 73 2c 20 26 6d 75 74 20  ic_blocks, &mut 
0f20: 62 6f 64 79 2e 6c 6f 63 61 6c 5f 64 65 63 6c 73  body.local_decls
0f30: 29 0a 20 20 20 20 7d 0a 7d 0a 0a 23 5b 64 65 72  ).    }.}..#[der
0f40: 69 76 65 28 43 6c 6f 6e 65 2c 20 44 65 62 75 67  ive(Clone, Debug
0f50: 2c 20 48 61 73 68 53 74 61 62 6c 65 2c 20 52 75  , HashStable, Ru
0f60: 73 74 63 45 6e 63 6f 64 61 62 6c 65 2c 20 52 75  stcEncodable, Ru
0f70: 73 74 63 44 65 63 6f 64 61 62 6c 65 2c 20 54 79  stcDecodable, Ty
0f80: 70 65 46 6f 6c 64 61 62 6c 65 29 5d 0a 70 75 62  peFoldable)].pub
0f90: 20 73 74 72 75 63 74 20 42 6f 64 79 41 6e 64 43   struct BodyAndC
0fa0: 61 63 68 65 3c 27 74 63 78 3e 20 7b 0a 20 20 20  ache<'tcx> {.   
0fb0: 20 62 6f 64 79 3a 20 42 6f 64 79 3c 27 74 63 78   body: Body<'tcx
0fc0: 3e 2c 0a 20 20 20 20 63 61 63 68 65 3a 20 43 61  >,.    cache: Ca
0fd0: 63 68 65 2c 0a 7d 0a 0a 69 6d 70 6c 20 42 6f 64  che,.}..impl Bod
0fe0: 79 41 6e 64 43 61 63 68 65 3c 27 74 63 78 3e 20  yAndCache<'tcx> 
0ff0: 7b 0a 20 20 20 20 70 75 62 20 66 6e 20 6e 65 77  {.    pub fn new
1000: 28 62 6f 64 79 3a 20 42 6f 64 79 3c 27 74 63 78  (body: Body<'tcx
1010: 3e 29 20 2d 3e 20 53 65 6c 66 20 7b 0a 20 20 20  >) -> Self {.   
1020: 20 20 20 20 20 53 65 6c 66 20 7b 0a 20 20 20 20       Self {.    
1030: 20 20 20 20 20 20 20 20 62 6f 64 79 2c 0a 20 20          body,.  
1040: 20 20 20 20 20 20 20 20 20 20 63 61 63 68 65 3a            cache:
1050: 20 43 61 63 68 65 3a 3a 6e 65 77 28 29 2c 0a 20   Cache::new(),. 
1060: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 7d         }.    }.}
1070: 0a 0a 23 5b 6d 61 63 72 6f 5f 65 78 70 6f 72 74  ..#[macro_export
1080: 5d 0a 6d 61 63 72 6f 5f 72 75 6c 65 73 21 20 72  ].macro_rules! r
1090: 65 61 64 5f 6f 6e 6c 79 20 7b 0a 20 20 20 20 28  ead_only {.    (
10a0: 24 62 6f 64 79 3a 65 78 70 72 29 20 3d 3e 20 7b  $body:expr) => {
10b0: 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20  .        {.     
10c0: 20 20 20 20 20 20 20 24 62 6f 64 79 2e 65 6e 73         $body.ens
10d0: 75 72 65 5f 70 72 65 64 65 63 65 73 73 6f 72 73  ure_predecessors
10e0: 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ();.            
10f0: 24 62 6f 64 79 2e 75 6e 77 72 61 70 5f 72 65 61  $body.unwrap_rea
1100: 64 5f 6f 6e 6c 79 28 29 0a 20 20 20 20 20 20 20  d_only().       
1110: 20 7d 0a 20 20 20 20 7d 3b 0a 7d 0a 0a 69 6d 70   }.    };.}..imp
1120: 6c 20 42 6f 64 79 41 6e 64 43 61 63 68 65 3c 27  l BodyAndCache<'
1130: 74 63 78 3e 20 7b 0a 20 20 20 20 70 75 62 20 66  tcx> {.    pub f
1140: 6e 20 65 6e 73 75 72 65 5f 70 72 65 64 65 63 65  n ensure_predece
1150: 73 73 6f 72 73 28 26 6d 75 74 20 73 65 6c 66 29  ssors(&mut self)
1160: 20 7b 0a 20 20 20 20 20 20 20 20 73 65 6c 66 2e   {.        self.
1170: 63 61 63 68 65 2e 65 6e 73 75 72 65 5f 70 72 65  cache.ensure_pre
1180: 64 65 63 65 73 73 6f 72 73 28 26 73 65 6c 66 2e  decessors(&self.
1190: 62 6f 64 79 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  body);.    }..  
11a0: 20 20 70 75 62 20 66 6e 20 70 72 65 64 65 63 65    pub fn predece
11b0: 73 73 6f 72 73 28 26 6d 75 74 20 73 65 6c 66 29  ssors(&mut self)
11c0: 20 2d 3e 20 26 49 6e 64 65 78 56 65 63 3c 42 61   -> &IndexVec<Ba
11d0: 73 69 63 42 6c 6f 63 6b 2c 20 56 65 63 3c 42 61  sicBlock, Vec<Ba
11e0: 73 69 63 42 6c 6f 63 6b 3e 3e 20 7b 0a 20 20 20  sicBlock>> {.   
11f0: 20 20 20 20 20 73 65 6c 66 2e 63 61 63 68 65 2e       self.cache.
1200: 70 72 65 64 65 63 65 73 73 6f 72 73 28 26 73 65  predecessors(&se
1210: 6c 66 2e 62 6f 64 79 29 0a 20 20 20 20 7d 0a 0a  lf.body).    }..
1220: 20 20 20 20 70 75 62 20 66 6e 20 75 6e 77 72 61      pub fn unwra
1230: 70 5f 72 65 61 64 5f 6f 6e 6c 79 28 26 73 65 6c  p_read_only(&sel
1240: 66 29 20 2d 3e 20 52 65 61 64 4f 6e 6c 79 42 6f  f) -> ReadOnlyBo
1250: 64 79 41 6e 64 43 61 63 68 65 3c 27 5f 2c 20 27  dyAndCache<'_, '
1260: 74 63 78 3e 20 7b 0a 20 20 20 20 20 20 20 20 52  tcx> {.        R
1270: 65 61 64 4f 6e 6c 79 42 6f 64 79 41 6e 64 43 61  eadOnlyBodyAndCa
1280: 63 68 65 3a 3a 6e 65 77 28 26 73 65 6c 66 2e 62  che::new(&self.b
1290: 6f 64 79 2c 20 26 73 65 6c 66 2e 63 61 63 68 65  ody, &self.cache
12a0: 29 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 75 62  ).    }..    pub
12b0: 20 66 6e 20 62 61 73 69 63 5f 62 6c 6f 63 6b 73   fn basic_blocks
12c0: 5f 6d 75 74 28 26 6d 75 74 20 73 65 6c 66 29 20  _mut(&mut self) 
12d0: 2d 3e 20 26 6d 75 74 20 49 6e 64 65 78 56 65 63  -> &mut IndexVec
12e0: 3c 42 61 73 69 63 42 6c 6f 63 6b 2c 20 42 61 73  <BasicBlock, Bas
12f0: 69 63 42 6c 6f 63 6b 44 61 74 61 3c 27 74 63 78  icBlockData<'tcx
1300: 3e 3e 20 7b 0a 20 20 20 20 20 20 20 20 73 65 6c  >> {.        sel
1310: 66 2e 63 61 63 68 65 2e 62 61 73 69 63 5f 62 6c  f.cache.basic_bl
1320: 6f 63 6b 73 5f 6d 75 74 28 26 6d 75 74 20 73 65  ocks_mut(&mut se
1330: 6c 66 2e 62 6f 64 79 29 0a 20 20 20 20 7d 0a 0a  lf.body).    }..
1340: 20 20 20 20 70 75 62 20 66 6e 20 62 61 73 69 63      pub fn basic
1350: 5f 62 6c 6f 63 6b 73 5f 61 6e 64 5f 6c 6f 63 61  _blocks_and_loca
1360: 6c 5f 64 65 63 6c 73 5f 6d 75 74 28 0a 20 20 20  l_decls_mut(.   
1370: 20 20 20 20 20 26 6d 75 74 20 73 65 6c 66 0a 20       &mut self. 
1380: 20 20 20 29 20 2d 3e 20 28 26 6d 75 74 20 49 6e     ) -> (&mut In
1390: 64 65 78 56 65 63 3c 42 61 73 69 63 42 6c 6f 63  dexVec<BasicBloc
13a0: 6b 2c 20 42 61 73 69 63 42 6c 6f 63 6b 44 61 74  k, BasicBlockDat
13b0: 61 3c 27 74 63 78 3e 3e 2c 20 26 6d 75 74 20 4c  a<'tcx>>, &mut L
13c0: 6f 63 61 6c 44 65 63 6c 73 3c 27 74 63 78 3e 29  ocalDecls<'tcx>)
13d0: 20 7b 0a 20 20 20 20 20 20 20 20 73 65 6c 66 2e   {.        self.
13e0: 63 61 63 68 65 2e 62 61 73 69 63 5f 62 6c 6f 63  cache.basic_bloc
13f0: 6b 73 5f 61 6e 64 5f 6c 6f 63 61 6c 5f 64 65 63  ks_and_local_dec
1400: 6c 73 5f 6d 75 74 28 26 6d 75 74 20 73 65 6c 66  ls_mut(&mut self
1410: 2e 62 6f 64 79 29 0a 20 20 20 20 7d 0a 7d 0a 0a  .body).    }.}..
1420: 69 6d 70 6c 3c 27 74 63 78 3e 20 49 6e 64 65 78  impl<'tcx> Index
1430: 3c 42 61 73 69 63 42 6c 6f 63 6b 3e 20 66 6f 72  <BasicBlock> for
1440: 20 42 6f 64 79 41 6e 64 43 61 63 68 65 3c 27 74   BodyAndCache<'t
1450: 63 78 3e 20 7b 0a 20 20 20 20 74 79 70 65 20 4f  cx> {.    type O
1460: 75 74 70 75 74 20 3d 20 42 61 73 69 63 42 6c 6f  utput = BasicBlo
1470: 63 6b 44 61 74 61 3c 27 74 63 78 3e 3b 0a 0a 20  ckData<'tcx>;.. 
1480: 20 20 20 66 6e 20 69 6e 64 65 78 28 26 73 65 6c     fn index(&sel
1490: 66 2c 20 69 6e 64 65 78 3a 20 42 61 73 69 63 42  f, index: BasicB
14a0: 6c 6f 63 6b 29 20 2d 3e 20 26 42 61 73 69 63 42  lock) -> &BasicB
14b0: 6c 6f 63 6b 44 61 74 61 3c 27 74 63 78 3e 20 7b  lockData<'tcx> {
14c0: 0a 20 20 20 20 20 20 20 20 26 73 65 6c 66 2e 62  .        &self.b
14d0: 6f 64 79 5b 69 6e 64 65 78 5d 0a 20 20 20 20 7d  ody[index].    }
14e0: 0a 7d 0a 0a 69 6d 70 6c 3c 27 74 63 78 3e 20 49  .}..impl<'tcx> I
14f0: 6e 64 65 78 4d 75 74 3c 42 61 73 69 63 42 6c 6f  ndexMut<BasicBlo
1500: 63 6b 3e 20 66 6f 72 20 42 6f 64 79 41 6e 64 43  ck> for BodyAndC
1510: 61 63 68 65 3c 27 74 63 78 3e 20 7b 0a 20 20 20  ache<'tcx> {.   
1520: 20 66 6e 20 69 6e 64 65 78 5f 6d 75 74 28 26 6d   fn index_mut(&m
1530: 75 74 20 73 65 6c 66 2c 20 69 6e 64 65 78 3a 20  ut self, index: 
1540: 42 61 73 69 63 42 6c 6f 63 6b 29 20 2d 3e 20 26  BasicBlock) -> &
1550: 6d 75 74 20 53 65 6c 66 3a 3a 4f 75 74 70 75 74  mut Self::Output
1560: 20 7b 0a 20 20 20 20 20 20 20 20 26 6d 75 74 20   {.        &mut 
1570: 73 65 6c 66 2e 62 61 73 69 63 5f 62 6c 6f 63 6b  self.basic_block
1580: 73 5f 6d 75 74 28 29 5b 69 6e 64 65 78 5d 0a 20  s_mut()[index]. 
1590: 20 20 20 7d 0a 7d 0a 0a 69 6d 70 6c 3c 27 74 63     }.}..impl<'tc
15a0: 78 3e 20 44 65 72 65 66 20 66 6f 72 20 42 6f 64  x> Deref for Bod
15b0: 79 41 6e 64 43 61 63 68 65 3c 27 74 63 78 3e 20  yAndCache<'tcx> 
15c0: 7b 0a 20 20 20 20 74 79 70 65 20 54 61 72 67 65  {.    type Targe
15d0: 74 20 3d 20 42 6f 64 79 3c 27 74 63 78 3e 3b 0a  t = Body<'tcx>;.
15e0: 0a 20 20 20 20 66 6e 20 64 65 72 65 66 28 26 73  .    fn deref(&s
15f0: 65 6c 66 29 20 2d 3e 20 26 53 65 6c 66 3a 3a 54  elf) -> &Self::T
1600: 61 72 67 65 74 20 7b 0a 20 20 20 20 20 20 20 20  arget {.        
1610: 26 73 65 6c 66 2e 62 6f 64 79 0a 20 20 20 20 7d  &self.body.    }
1620: 0a 7d 0a 0a 69 6d 70 6c 3c 27 74 63 78 3e 20 44  .}..impl<'tcx> D
1630: 65 72 65 66 4d 75 74 20 66 6f 72 20 42 6f 64 79  erefMut for Body
1640: 41 6e 64 43 61 63 68 65 3c 27 74 63 78 3e 20 7b  AndCache<'tcx> {
1650: 0a 20 20 20 20 66 6e 20 64 65 72 65 66 5f 6d 75  .    fn deref_mu
1660: 74 28 26 6d 75 74 20 73 65 6c 66 29 20 2d 3e 20  t(&mut self) -> 
1670: 26 6d 75 74 20 53 65 6c 66 3a 3a 54 61 72 67 65  &mut Self::Targe
1680: 74 20 7b 0a 20 20 20 20 20 20 20 20 26 6d 75 74  t {.        &mut
1690: 20 73 65 6c 66 2e 62 6f 64 79 0a 20 20 20 20 7d   self.body.    }
16a0: 0a 7d 0a 0a 23 5b 64 65 72 69 76 65 28 43 6f 70  .}..#[derive(Cop
16b0: 79 2c 20 43 6c 6f 6e 65 2c 20 44 65 62 75 67 29  y, Clone, Debug)
16c0: 5d 0a 70 75 62 20 73 74 72 75 63 74 20 52 65 61  ].pub struct Rea
16d0: 64 4f 6e 6c 79 42 6f 64 79 41 6e 64 43 61 63 68  dOnlyBodyAndCach
16e0: 65 3c 27 61 2c 20 27 74 63 78 3e 20 7b 0a 20 20  e<'a, 'tcx> {.  
16f0: 20 20 62 6f 64 79 3a 20 26 27 61 20 42 6f 64 79    body: &'a Body
1700: 3c 27 74 63 78 3e 2c 0a 20 20 20 20 63 61 63 68  <'tcx>,.    cach
1710: 65 3a 20 26 27 61 20 43 61 63 68 65 2c 0a 7d 0a  e: &'a Cache,.}.
1720: 0a 69 6d 70 6c 20 52 65 61 64 4f 6e 6c 79 42 6f  .impl ReadOnlyBo
1730: 64 79 41 6e 64 43 61 63 68 65 3c 27 61 2c 20 27  dyAndCache<'a, '
1740: 74 63 78 3e 20 7b 0a 20 20 20 20 66 6e 20 6e 65  tcx> {.    fn ne
1750: 77 28 62 6f 64 79 3a 20 26 27 61 20 42 6f 64 79  w(body: &'a Body
1760: 3c 27 74 63 78 3e 2c 20 63 61 63 68 65 3a 20 26  <'tcx>, cache: &
1770: 27 61 20 43 61 63 68 65 29 20 2d 3e 20 53 65 6c  'a Cache) -> Sel
1780: 66 20 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  f {.        asse
1790: 72 74 21 28 0a 20 20 20 20 20 20 20 20 20 20 20  rt!(.           
17a0: 20 63 61 63 68 65 2e 70 72 65 64 65 63 65 73 73   cache.predecess
17b0: 6f 72 73 2e 69 73 5f 73 6f 6d 65 28 29 2c 0a 20  ors.is_some(),. 
17c0: 20 20 20 20 20 20 20 20 20 20 20 22 43 61 6e 6e             "Cann
17d0: 6f 74 20 63 6f 6e 73 74 72 75 63 74 20 52 65 61  ot construct Rea
17e0: 64 4f 6e 6c 79 42 6f 64 79 41 6e 64 43 61 63 68  dOnlyBodyAndCach
17f0: 65 20 77 69 74 68 6f 75 74 20 63 6f 6d 70 75 74  e without comput
1800: 65 64 20 70 72 65 64 65 63 65 73 73 6f 72 73 22  ed predecessors"
1810: 29 3b 0a 20 20 20 20 20 20 20 20 53 65 6c 66 20  );.        Self 
1820: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 6f  {.            bo
1830: 64 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  dy,.            
1840: 63 61 63 68 65 2c 0a 20 20 20 20 20 20 20 20 7d  cache,.        }
1850: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 75 62 20  .    }..    pub 
1860: 66 6e 20 70 72 65 64 65 63 65 73 73 6f 72 73 28  fn predecessors(
1870: 26 73 65 6c 66 29 20 2d 3e 20 26 49 6e 64 65 78  &self) -> &Index
1880: 56 65 63 3c 42 61 73 69 63 42 6c 6f 63 6b 2c 20  Vec<BasicBlock, 
1890: 56 65 63 3c 42 61 73 69 63 42 6c 6f 63 6b 3e 3e  Vec<BasicBlock>>
18a0: 20 7b 0a 20 20 20 20 20 20 20 20 73 65 6c 66 2e   {.        self.
18b0: 63 61 63 68 65 2e 70 72 65 64 65 63 65 73 73 6f  cache.predecesso
18c0: 72 73 2e 61 73 5f 72 65 66 28 29 2e 75 6e 77 72  rs.as_ref().unwr
18d0: 61 70 28 29 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ap().    }..    
18e0: 70 75 62 20 66 6e 20 70 72 65 64 65 63 65 73 73  pub fn predecess
18f0: 6f 72 73 5f 66 6f 72 28 26 73 65 6c 66 2c 20 62  ors_for(&self, b
1900: 62 3a 20 42 61 73 69 63 42 6c 6f 63 6b 29 20 2d  b: BasicBlock) -
1910: 3e 20 26 5b 42 61 73 69 63 42 6c 6f 63 6b 5d 20  > &[BasicBlock] 
1920: 7b 0a 20 20 20 20 20 20 20 20 73 65 6c 66 2e 63  {.        self.c
1930: 61 63 68 65 2e 75 6e 77 72 61 70 5f 70 72 65 64  ache.unwrap_pred
1940: 65 63 65 73 73 6f 72 73 5f 66 6f 72 28 62 62 29  ecessors_for(bb)
1950: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 75 62 20  .    }..    pub 
1960: 66 6e 20 70 72 65 64 65 63 65 73 73 6f 72 5f 6c  fn predecessor_l
1970: 6f 63 61 74 69 6f 6e 73 28 26 73 65 6c 66 2c 20  ocations(&self, 
1980: 6c 6f 63 3a 20 4c 6f 63 61 74 69 6f 6e 29 20 2d  loc: Location) -
1990: 3e 20 69 6d 70 6c 20 49 74 65 72 61 74 6f 72 3c  > impl Iterator<
19a0: 49 74 65 6d 20 3d 20 4c 6f 63 61 74 69 6f 6e 3e  Item = Location>
19b0: 20 2b 20 27 5f 20 7b 0a 20 20 20 20 20 20 20 20   + '_ {.        
19c0: 73 65 6c 66 2e 63 61 63 68 65 2e 75 6e 77 72 61  self.cache.unwra
19d0: 70 5f 70 72 65 64 65 63 65 73 73 6f 72 5f 6c 6f  p_predecessor_lo
19e0: 63 61 74 69 6f 6e 73 28 6c 6f 63 2c 20 73 65 6c  cations(loc, sel
19f0: 66 2e 62 6f 64 79 29 0a 20 20 20 20 7d 0a 0a 20  f.body).    }.. 
1a00: 20 20 20 70 75 62 20 66 6e 20 62 61 73 69 63 5f     pub fn basic_
1a10: 62 6c 6f 63 6b 73 28 26 73 65 6c 66 29 20 2d 3e  blocks(&self) ->
1a20: 20 26 49 6e 64 65 78 56 65 63 3c 42 61 73 69 63   &IndexVec<Basic
1a30: 42 6c 6f 63 6b 2c 20 42 61 73 69 63 42 6c 6f 63  Block, BasicBloc
1a40: 6b 44 61 74 61 3c 27 74 63 78 3e 3e 20 7b 0a 20  kData<'tcx>> {. 
1a50: 20 20 20 20 20 20 20 26 73 65 6c 66 2e 62 6f 64         &self.bod
1a60: 79 2e 62 61 73 69 63 5f 62 6c 6f 63 6b 73 0a 20  y.basic_blocks. 
1a70: 20 20 20 7d 0a 0a 20 20 20 20 70 75 62 20 66 6e     }..    pub fn
1a80: 20 64 6f 6d 69 6e 61 74 6f 72 73 28 26 73 65 6c   dominators(&sel
1a90: 66 29 20 2d 3e 20 44 6f 6d 69 6e 61 74 6f 72 73  f) -> Dominators
1aa0: 3c 42 61 73 69 63 42 6c 6f 63 6b 3e 20 7b 0a 20  <BasicBlock> {. 
1ab0: 20 20 20 20 20 20 20 64 6f 6d 69 6e 61 74 6f 72         dominator
1ac0: 73 28 73 65 6c 66 29 0a 20 20 20 20 7d 0a 7d 0a  s(self).    }.}.
1ad0: 0a 69 6d 70 6c 20 67 72 61 70 68 3a 3a 44 69 72  .impl graph::Dir
1ae0: 65 63 74 65 64 47 72 61 70 68 20 66 6f 72 20 52  ectedGraph for R
1af0: 65 61 64 4f 6e 6c 79 42 6f 64 79 41 6e 64 43 61  eadOnlyBodyAndCa
1b00: 63 68 65 3c 27 61 2c 20 27 74 63 78 3e 20 7b 0a  che<'a, 'tcx> {.
1b10: 20 20 20 20 74 79 70 65 20 4e 6f 64 65 20 3d 20      type Node = 
1b20: 42 61 73 69 63 42 6c 6f 63 6b 3b 0a 7d 0a 0a 69  BasicBlock;.}..i
1b30: 6d 70 6c 20 67 72 61 70 68 3a 3a 47 72 61 70 68  mpl graph::Graph
1b40: 50 72 65 64 65 63 65 73 73 6f 72 73 3c 27 67 72  Predecessors<'gr
1b50: 61 70 68 3e 20 66 6f 72 20 52 65 61 64 4f 6e 6c  aph> for ReadOnl
1b60: 79 42 6f 64 79 41 6e 64 43 61 63 68 65 3c 27 61  yBodyAndCache<'a
1b70: 2c 20 27 74 63 78 3e 20 7b 0a 20 20 20 20 74 79  , 'tcx> {.    ty
1b80: 70 65 20 49 74 65 6d 20 3d 20 42 61 73 69 63 42  pe Item = BasicB
1b90: 6c 6f 63 6b 3b 0a 20 20 20 20 74 79 70 65 20 49  lock;.    type I
1ba0: 74 65 72 20 3d 20 49 6e 74 6f 49 74 65 72 3c 42  ter = IntoIter<B
1bb0: 61 73 69 63 42 6c 6f 63 6b 3e 3b 0a 7d 0a 0a 69  asicBlock>;.}..i
1bc0: 6d 70 6c 20 67 72 61 70 68 3a 3a 57 69 74 68 50  mpl graph::WithP
1bd0: 72 65 64 65 63 65 73 73 6f 72 73 20 66 6f 72 20  redecessors for 
1be0: 52 65 61 64 4f 6e 6c 79 42 6f 64 79 41 6e 64 43  ReadOnlyBodyAndC
1bf0: 61 63 68 65 3c 27 61 2c 20 27 74 63 78 3e 20 7b  ache<'a, 'tcx> {
1c00: 0a 20 20 20 20 66 6e 20 70 72 65 64 65 63 65 73  .    fn predeces
1c10: 73 6f 72 73 28 0a 20 20 20 20 20 20 20 20 26 73  sors(.        &s
1c20: 65 6c 66 2c 0a 20 20 20 20 20 20 20 20 6e 6f 64  elf,.        nod
1c30: 65 3a 20 53 65 6c 66 3a 3a 4e 6f 64 65 2c 0a 20  e: Self::Node,. 
1c40: 20 20 20 29 20 2d 3e 20 3c 53 65 6c 66 20 61 73     ) -> <Self as
1c50: 20 47 72 61 70 68 50 72 65 64 65 63 65 73 73 6f   GraphPredecesso
1c60: 72 73 3c 27 5f 3e 3e 3a 3a 49 74 65 72 20 7b 0a  rs<'_>>::Iter {.
1c70: 20 20 20 20 20 20 20 20 73 65 6c 66 2e 63 61 63          self.cac
1c80: 68 65 2e 75 6e 77 72 61 70 5f 70 72 65 64 65 63  he.unwrap_predec
1c90: 65 73 73 6f 72 73 5f 66 6f 72 28 6e 6f 64 65 29  essors_for(node)
1ca0: 2e 74 6f 5f 76 65 63 28 29 2e 69 6e 74 6f 5f 69  .to_vec().into_i
1cb0: 74 65 72 28 29 0a 20 20 20 20 7d 0a 7d 0a 0a 69  ter().    }.}..i
1cc0: 6d 70 6c 20 67 72 61 70 68 3a 3a 57 69 74 68 4e  mpl graph::WithN
1cd0: 75 6d 4e 6f 64 65 73 20 66 6f 72 20 52 65 61 64  umNodes for Read
1ce0: 4f 6e 6c 79 42 6f 64 79 41 6e 64 43 61 63 68 65  OnlyBodyAndCache
1cf0: 3c 27 61 2c 20 27 74 63 78 3e 20 7b 0a 20 20 20  <'a, 'tcx> {.   
1d00: 20 66 6e 20 6e 75 6d 5f 6e 6f 64 65 73 28 26 73   fn num_nodes(&s
1d10: 65 6c 66 29 20 2d 3e 20 75 73 69 7a 65 20 7b 0a  elf) -> usize {.
1d20: 20 20 20 20 20 20 20 20 73 65 6c 66 2e 62 6f 64          self.bod
1d30: 79 2e 6e 75 6d 5f 6e 6f 64 65 73 28 29 0a 20 20  y.num_nodes().  
1d40: 20 20 7d 0a 7d 0a 0a 69 6d 70 6c 20 67 72 61 70    }.}..impl grap
1d50: 68 3a 3a 57 69 74 68 53 74 61 72 74 4e 6f 64 65  h::WithStartNode
1d60: 20 66 6f 72 20 52 65 61 64 4f 6e 6c 79 42 6f 64   for ReadOnlyBod
1d70: 79 41 6e 64 43 61 63 68 65 3c 27 61 2c 20 27 74  yAndCache<'a, 't
1d80: 63 78 3e 20 7b 0a 20 20 20 20 66 6e 20 73 74 61  cx> {.    fn sta
1d90: 72 74 5f 6e 6f 64 65 28 26 73 65 6c 66 29 20 2d  rt_node(&self) -
1da0: 3e 20 53 65 6c 66 3a 3a 4e 6f 64 65 20 7b 0a 20  > Self::Node {. 
1db0: 20 20 20 20 20 20 20 73 65 6c 66 2e 62 6f 64 79         self.body
1dc0: 2e 73 74 61 72 74 5f 6e 6f 64 65 28 29 0a 20 20  .start_node().  
1dd0: 20 20 7d 0a 7d 0a 0a 69 6d 70 6c 20 67 72 61 70    }.}..impl grap
1de0: 68 3a 3a 57 69 74 68 53 75 63 63 65 73 73 6f 72  h::WithSuccessor
1df0: 73 20 66 6f 72 20 52 65 61 64 4f 6e 6c 79 42 6f  s for ReadOnlyBo
1e00: 64 79 41 6e 64 43 61 63 68 65 3c 27 61 2c 20 27  dyAndCache<'a, '
1e10: 74 63 78 3e 20 7b 0a 20 20 20 20 66 6e 20 73 75  tcx> {.    fn su
1e20: 63 63 65 73 73 6f 72 73 28 0a 20 20 20 20 20 20  ccessors(.      
1e30: 20 20 26 73 65 6c 66 2c 0a 20 20 20 20 20 20 20    &self,.       
1e40: 20 6e 6f 64 65 3a 20 53 65 6c 66 3a 3a 4e 6f 64   node: Self::Nod
1e50: 65 2c 0a 20 20 20 20 29 20 2d 3e 20 3c 53 65 6c  e,.    ) -> <Sel
1e60: 66 20 61 73 20 47 72 61 70 68 53 75 63 63 65 73  f as GraphSucces
1e70: 73 6f 72 73 3c 27 5f 3e 3e 3a 3a 49 74 65 72 20  sors<'_>>::Iter 
1e80: 7b 0a 20 20 20 20 20 20 20 20 73 65 6c 66 2e 62  {.        self.b
1e90: 6f 64 79 2e 73 75 63 63 65 73 73 6f 72 73 28 6e  ody.successors(n
1ea0: 6f 64 65 29 0a 20 20 20 20 7d 0a 7d 0a 0a 69 6d  ode).    }.}..im
1eb0: 70 6c 3c 27 61 2c 20 27 62 2c 20 27 74 63 78 3e  pl<'a, 'b, 'tcx>
1ec0: 20 67 72 61 70 68 3a 3a 47 72 61 70 68 53 75 63   graph::GraphSuc
1ed0: 63 65 73 73 6f 72 73 3c 27 62 3e 20 66 6f 72 20  cessors<'b> for 
1ee0: 52 65 61 64 4f 6e 6c 79 42 6f 64 79 41 6e 64 43  ReadOnlyBodyAndC
1ef0: 61 63 68 65 3c 27 61 2c 20 27 74 63 78 3e 20 7b  ache<'a, 'tcx> {
1f00: 0a 20 20 20 20 74 79 70 65 20 49 74 65 6d 20 3d  .    type Item =
1f10: 20 42 61 73 69 63 42 6c 6f 63 6b 3b 0a 20 20 20   BasicBlock;.   
1f20: 20 74 79 70 65 20 49 74 65 72 20 3d 20 69 74 65   type Iter = ite
1f30: 72 3a 3a 43 6c 6f 6e 65 64 3c 53 75 63 63 65 73  r::Cloned<Succes
1f40: 73 6f 72 73 3c 27 62 3e 3e 3b 0a 7d 0a 0a 0a 69  sors<'b>>;.}...i
1f50: 6d 70 6c 20 44 65 72 65 66 20 66 6f 72 20 52 65  mpl Deref for Re
1f60: 61 64 4f 6e 6c 79 42 6f 64 79 41 6e 64 43 61 63  adOnlyBodyAndCac
1f70: 68 65 3c 27 61 2c 20 27 74 63 78 3e 20 7b 0a 20  he<'a, 'tcx> {. 
1f80: 20 20 20 74 79 70 65 20 54 61 72 67 65 74 20 3d     type Target =
1f90: 20 26 27 61 20 42 6f 64 79 3c 27 74 63 78 3e 3b   &'a Body<'tcx>;
1fa0: 0a 0a 20 20 20 20 66 6e 20 64 65 72 65 66 28 26  ..    fn deref(&
1fb0: 73 65 6c 66 29 20 2d 3e 20 26 53 65 6c 66 3a 3a  self) -> &Self::
1fc0: 54 61 72 67 65 74 20 7b 0a 20 20 20 20 20 20 20  Target {.       
1fd0: 20 26 73 65 6c 66 2e 62 6f 64 79 0a 20 20 20 20   &self.body.    
1fe0: 7d 0a 7d 0a 0a 43 6c 6f 6e 65 54 79 70 65 46 6f  }.}..CloneTypeFo
1ff0: 6c 64 61 62 6c 65 41 6e 64 4c 69 66 74 49 6d 70  ldableAndLiftImp
2000: 6c 73 21 20 7b 0a 20 20 20 20 43 61 63 68 65 2c  ls! {.    Cache,
2010: 0a 7d 0a                                         .}.