Hex Artifact Content
Not logged in

Artifact baad4e6c3c70b3b16c805ab37c45f54c02c3d7bf:

Unrecognized artifact
0000: 2f 2f 3d 3d 3d 2d 20 4f 70 74 69 6d 69 7a 65 50  //===- OptimizeP
0010: 48 49 73 2e 63 70 70 20 2d 20 4f 70 74 69 6d 69  HIs.cpp - Optimi
0020: 7a 65 20 6d 61 63 68 69 6e 65 20 69 6e 73 74 72  ze machine instr
0030: 75 63 74 69 6f 6e 20 50 48 49 73 20 2d 2d 2d 2d  uction PHIs ----
0040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 3d 3d 3d 2f 2f  -----------===//
0050: 0a 2f 2f 0a 2f 2f 20 20 20 20 20 20 20 20 20 20  .//.//          
0060: 20 20 20 20 20 20 20 20 20 20 20 54 68 65 20 4c             The L
0070: 4c 56 4d 20 43 6f 6d 70 69 6c 65 72 20 49 6e 66  LVM Compiler Inf
0080: 72 61 73 74 72 75 63 74 75 72 65 0a 2f 2f 0a 2f  rastructure.//./
0090: 2f 20 54 68 69 73 20 66 69 6c 65 20 69 73 20 64  / This file is d
00a0: 69 73 74 72 69 62 75 74 65 64 20 75 6e 64 65 72  istributed under
00b0: 20 74 68 65 20 55 6e 69 76 65 72 73 69 74 79 20   the University 
00c0: 6f 66 20 49 6c 6c 69 6e 6f 69 73 20 4f 70 65 6e  of Illinois Open
00d0: 20 53 6f 75 72 63 65 0a 2f 2f 20 4c 69 63 65 6e   Source.// Licen
00e0: 73 65 2e 20 53 65 65 20 4c 49 43 45 4e 53 45 2e  se. See LICENSE.
00f0: 54 58 54 20 66 6f 72 20 64 65 74 61 69 6c 73 2e  TXT for details.
0100: 0a 2f 2f 0a 2f 2f 3d 3d 3d 2d 2d 2d 2d 2d 2d 2d  .//.//===-------
0110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 3d  ---------------=
0150: 3d 3d 2f 2f 0a 2f 2f 0a 2f 2f 20 54 68 69 73 20  ==//.//.// This 
0160: 70 61 73 73 20 6f 70 74 69 6d 69 7a 65 73 20 6d  pass optimizes m
0170: 61 63 68 69 6e 65 20 69 6e 73 74 72 75 63 74 69  achine instructi
0180: 6f 6e 20 50 48 49 73 20 74 6f 20 74 61 6b 65 20  on PHIs to take 
0190: 61 64 76 61 6e 74 61 67 65 20 6f 66 0a 2f 2f 20  advantage of.// 
01a0: 6f 70 70 6f 72 74 75 6e 69 74 69 65 73 20 63 72  opportunities cr
01b0: 65 61 74 65 64 20 64 75 72 69 6e 67 20 44 41 47  eated during DAG
01c0: 20 6c 65 67 61 6c 69 7a 61 74 69 6f 6e 2e 0a 2f   legalization../
01d0: 2f 0a 2f 2f 3d 3d 3d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /.//===---------
01e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
01f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 3d 3d 3d  -------------===
0220: 2f 2f 0a 0a 23 69 6e 63 6c 75 64 65 20 22 6c 6c  //..#include "ll
0230: 76 6d 2f 41 44 54 2f 53 6d 61 6c 6c 50 74 72 53  vm/ADT/SmallPtrS
0240: 65 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22  et.h".#include "
0250: 6c 6c 76 6d 2f 41 44 54 2f 53 74 61 74 69 73 74  llvm/ADT/Statist
0260: 69 63 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22  ic.h".#include "
0270: 6c 6c 76 6d 2f 43 6f 64 65 47 65 6e 2f 4d 61 63  llvm/CodeGen/Mac
0280: 68 69 6e 65 42 61 73 69 63 42 6c 6f 63 6b 2e 68  hineBasicBlock.h
0290: 22 0a 23 69 6e 63 6c 75 64 65 20 22 6c 6c 76 6d  ".#include "llvm
02a0: 2f 43 6f 64 65 47 65 6e 2f 4d 61 63 68 69 6e 65  /CodeGen/Machine
02b0: 46 75 6e 63 74 69 6f 6e 2e 68 22 0a 23 69 6e 63  Function.h".#inc
02c0: 6c 75 64 65 20 22 6c 6c 76 6d 2f 43 6f 64 65 47  lude "llvm/CodeG
02d0: 65 6e 2f 4d 61 63 68 69 6e 65 46 75 6e 63 74 69  en/MachineFuncti
02e0: 6f 6e 50 61 73 73 2e 68 22 0a 23 69 6e 63 6c 75  onPass.h".#inclu
02f0: 64 65 20 22 6c 6c 76 6d 2f 43 6f 64 65 47 65 6e  de "llvm/CodeGen
0300: 2f 4d 61 63 68 69 6e 65 49 6e 73 74 72 2e 68 22  /MachineInstr.h"
0310: 0a 23 69 6e 63 6c 75 64 65 20 22 6c 6c 76 6d 2f  .#include "llvm/
0320: 43 6f 64 65 47 65 6e 2f 4d 61 63 68 69 6e 65 4f  CodeGen/MachineO
0330: 70 65 72 61 6e 64 2e 68 22 0a 23 69 6e 63 6c 75  perand.h".#inclu
0340: 64 65 20 22 6c 6c 76 6d 2f 43 6f 64 65 47 65 6e  de "llvm/CodeGen
0350: 2f 4d 61 63 68 69 6e 65 52 65 67 69 73 74 65 72  /MachineRegister
0360: 49 6e 66 6f 2e 68 22 0a 23 69 6e 63 6c 75 64 65  Info.h".#include
0370: 20 22 6c 6c 76 6d 2f 43 6f 64 65 47 65 6e 2f 54   "llvm/CodeGen/T
0380: 61 72 67 65 74 52 65 67 69 73 74 65 72 49 6e 66  argetRegisterInf
0390: 6f 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 6c  o.h".#include "l
03a0: 6c 76 6d 2f 43 6f 64 65 47 65 6e 2f 54 61 72 67  lvm/CodeGen/Targ
03b0: 65 74 53 75 62 74 61 72 67 65 74 49 6e 66 6f 2e  etSubtargetInfo.
03c0: 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 6c 6c 76  h".#include "llv
03d0: 6d 2f 50 61 73 73 2e 68 22 0a 23 69 6e 63 6c 75  m/Pass.h".#inclu
03e0: 64 65 20 3c 63 61 73 73 65 72 74 3e 0a 0a 75 73  de <cassert>..us
03f0: 69 6e 67 20 6e 61 6d 65 73 70 61 63 65 20 6c 6c  ing namespace ll
0400: 76 6d 3b 0a 0a 23 64 65 66 69 6e 65 20 44 45 42  vm;..#define DEB
0410: 55 47 5f 54 59 50 45 20 22 6f 70 74 2d 70 68 69  UG_TYPE "opt-phi
0420: 73 22 0a 0a 53 54 41 54 49 53 54 49 43 28 4e 75  s"..STATISTIC(Nu
0430: 6d 50 48 49 43 79 63 6c 65 73 2c 20 22 4e 75 6d  mPHICycles, "Num
0440: 62 65 72 20 6f 66 20 50 48 49 20 63 79 63 6c 65  ber of PHI cycle
0450: 73 20 72 65 70 6c 61 63 65 64 22 29 3b 0a 53 54  s replaced");.ST
0460: 41 54 49 53 54 49 43 28 4e 75 6d 44 65 61 64 50  ATISTIC(NumDeadP
0470: 48 49 43 79 63 6c 65 73 2c 20 22 4e 75 6d 62 65  HICycles, "Numbe
0480: 72 20 6f 66 20 64 65 61 64 20 50 48 49 20 63 79  r of dead PHI cy
0490: 63 6c 65 73 22 29 3b 0a 0a 6e 61 6d 65 73 70 61  cles");..namespa
04a0: 63 65 20 7b 0a 0a 20 20 63 6c 61 73 73 20 4f 70  ce {..  class Op
04b0: 74 69 6d 69 7a 65 50 48 49 73 20 3a 20 70 75 62  timizePHIs : pub
04c0: 6c 69 63 20 4d 61 63 68 69 6e 65 46 75 6e 63 74  lic MachineFunct
04d0: 69 6f 6e 50 61 73 73 20 7b 0a 20 20 20 20 4d 61  ionPass {.    Ma
04e0: 63 68 69 6e 65 52 65 67 69 73 74 65 72 49 6e 66  chineRegisterInf
04f0: 6f 20 2a 4d 52 49 3b 0a 20 20 20 20 63 6f 6e 73  o *MRI;.    cons
0500: 74 20 54 61 72 67 65 74 49 6e 73 74 72 49 6e 66  t TargetInstrInf
0510: 6f 20 2a 54 49 49 3b 0a 0a 20 20 70 75 62 6c 69  o *TII;..  publi
0520: 63 3a 0a 20 20 20 20 73 74 61 74 69 63 20 63 68  c:.    static ch
0530: 61 72 20 49 44 3b 20 2f 2f 20 50 61 73 73 20 69  ar ID; // Pass i
0540: 64 65 6e 74 69 66 69 63 61 74 69 6f 6e 0a 0a 20  dentification.. 
0550: 20 20 20 4f 70 74 69 6d 69 7a 65 50 48 49 73 28     OptimizePHIs(
0560: 29 20 3a 20 4d 61 63 68 69 6e 65 46 75 6e 63 74  ) : MachineFunct
0570: 69 6f 6e 50 61 73 73 28 49 44 29 20 7b 0a 20 20  ionPass(ID) {.  
0580: 20 20 20 20 69 6e 69 74 69 61 6c 69 7a 65 4f 70      initializeOp
0590: 74 69 6d 69 7a 65 50 48 49 73 50 61 73 73 28 2a  timizePHIsPass(*
05a0: 50 61 73 73 52 65 67 69 73 74 72 79 3a 3a 67 65  PassRegistry::ge
05b0: 74 50 61 73 73 52 65 67 69 73 74 72 79 28 29 29  tPassRegistry())
05c0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 62 6f 6f  ;.    }..    boo
05d0: 6c 20 72 75 6e 4f 6e 4d 61 63 68 69 6e 65 46 75  l runOnMachineFu
05e0: 6e 63 74 69 6f 6e 28 4d 61 63 68 69 6e 65 46 75  nction(MachineFu
05f0: 6e 63 74 69 6f 6e 20 26 4d 46 29 20 6f 76 65 72  nction &MF) over
0600: 72 69 64 65 3b 0a 0a 20 20 20 20 76 6f 69 64 20  ride;..    void 
0610: 67 65 74 41 6e 61 6c 79 73 69 73 55 73 61 67 65  getAnalysisUsage
0620: 28 41 6e 61 6c 79 73 69 73 55 73 61 67 65 20 26  (AnalysisUsage &
0630: 41 55 29 20 63 6f 6e 73 74 20 6f 76 65 72 72 69  AU) const overri
0640: 64 65 20 7b 0a 20 20 20 20 20 20 41 55 2e 73 65  de {.      AU.se
0650: 74 50 72 65 73 65 72 76 65 73 43 46 47 28 29 3b  tPreservesCFG();
0660: 0a 20 20 20 20 20 20 4d 61 63 68 69 6e 65 46 75  .      MachineFu
0670: 6e 63 74 69 6f 6e 50 61 73 73 3a 3a 67 65 74 41  nctionPass::getA
0680: 6e 61 6c 79 73 69 73 55 73 61 67 65 28 41 55 29  nalysisUsage(AU)
0690: 3b 0a 20 20 20 20 7d 0a 0a 20 20 70 72 69 76 61  ;.    }..  priva
06a0: 74 65 3a 0a 20 20 20 20 75 73 69 6e 67 20 49 6e  te:.    using In
06b0: 73 74 72 53 65 74 20 3d 20 53 6d 61 6c 6c 50 74  strSet = SmallPt
06c0: 72 53 65 74 3c 4d 61 63 68 69 6e 65 49 6e 73 74  rSet<MachineInst
06d0: 72 20 2a 2c 20 31 36 3e 3b 0a 20 20 20 20 75 73  r *, 16>;.    us
06e0: 69 6e 67 20 49 6e 73 74 72 53 65 74 49 74 65 72  ing InstrSetIter
06f0: 61 74 6f 72 20 3d 20 53 6d 61 6c 6c 50 74 72 53  ator = SmallPtrS
0700: 65 74 49 74 65 72 61 74 6f 72 3c 4d 61 63 68 69  etIterator<Machi
0710: 6e 65 49 6e 73 74 72 20 2a 3e 3b 0a 0a 20 20 20  neInstr *>;..   
0720: 20 62 6f 6f 6c 20 49 73 53 69 6e 67 6c 65 56 61   bool IsSingleVa
0730: 6c 75 65 50 48 49 43 79 63 6c 65 28 4d 61 63 68  luePHICycle(Mach
0740: 69 6e 65 49 6e 73 74 72 20 2a 4d 49 2c 20 75 6e  ineInstr *MI, un
0750: 73 69 67 6e 65 64 20 26 53 69 6e 67 6c 65 56 61  signed &SingleVa
0760: 6c 52 65 67 2c 0a 20 20 20 20 20 20 20 20 20 20  lReg,.          
0770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0780: 20 20 20 20 20 49 6e 73 74 72 53 65 74 20 26 50       InstrSet &P
0790: 48 49 73 49 6e 43 79 63 6c 65 29 3b 0a 20 20 20  HIsInCycle);.   
07a0: 20 62 6f 6f 6c 20 49 73 44 65 61 64 50 48 49 43   bool IsDeadPHIC
07b0: 79 63 6c 65 28 4d 61 63 68 69 6e 65 49 6e 73 74  ycle(MachineInst
07c0: 72 20 2a 4d 49 2c 20 49 6e 73 74 72 53 65 74 20  r *MI, InstrSet 
07d0: 26 50 48 49 73 49 6e 43 79 63 6c 65 29 3b 0a 20  &PHIsInCycle);. 
07e0: 20 20 20 62 6f 6f 6c 20 4f 70 74 69 6d 69 7a 65     bool Optimize
07f0: 42 42 28 4d 61 63 68 69 6e 65 42 61 73 69 63 42  BB(MachineBasicB
0800: 6c 6f 63 6b 20 26 4d 42 42 29 3b 0a 20 20 7d 3b  lock &MBB);.  };
0810: 0a 0a 7d 20 2f 2f 20 65 6e 64 20 61 6e 6f 6e 79  ..} // end anony
0820: 6d 6f 75 73 20 6e 61 6d 65 73 70 61 63 65 0a 0a  mous namespace..
0830: 63 68 61 72 20 4f 70 74 69 6d 69 7a 65 50 48 49  char OptimizePHI
0840: 73 3a 3a 49 44 20 3d 20 30 3b 0a 0a 63 68 61 72  s::ID = 0;..char
0850: 20 26 6c 6c 76 6d 3a 3a 4f 70 74 69 6d 69 7a 65   &llvm::Optimize
0860: 50 48 49 73 49 44 20 3d 20 4f 70 74 69 6d 69 7a  PHIsID = Optimiz
0870: 65 50 48 49 73 3a 3a 49 44 3b 0a 0a 49 4e 49 54  ePHIs::ID;..INIT
0880: 49 41 4c 49 5a 45 5f 50 41 53 53 28 4f 70 74 69  IALIZE_PASS(Opti
0890: 6d 69 7a 65 50 48 49 73 2c 20 44 45 42 55 47 5f  mizePHIs, DEBUG_
08a0: 54 59 50 45 2c 0a 20 20 20 20 20 20 20 20 20 20  TYPE,.          
08b0: 20 20 20 20 20 20 22 4f 70 74 69 6d 69 7a 65 20        "Optimize 
08c0: 6d 61 63 68 69 6e 65 20 69 6e 73 74 72 75 63 74  machine instruct
08d0: 69 6f 6e 20 50 48 49 73 22 2c 20 66 61 6c 73 65  ion PHIs", false
08e0: 2c 20 66 61 6c 73 65 29 0a 0a 62 6f 6f 6c 20 4f  , false)..bool O
08f0: 70 74 69 6d 69 7a 65 50 48 49 73 3a 3a 72 75 6e  ptimizePHIs::run
0900: 4f 6e 4d 61 63 68 69 6e 65 46 75 6e 63 74 69 6f  OnMachineFunctio
0910: 6e 28 4d 61 63 68 69 6e 65 46 75 6e 63 74 69 6f  n(MachineFunctio
0920: 6e 20 26 46 6e 29 20 7b 0a 20 20 69 66 20 28 73  n &Fn) {.  if (s
0930: 6b 69 70 46 75 6e 63 74 69 6f 6e 28 46 6e 2e 67  kipFunction(Fn.g
0940: 65 74 46 75 6e 63 74 69 6f 6e 28 29 29 29 0a 20  etFunction())). 
0950: 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b     return false;
0960: 0a 0a 20 20 4d 52 49 20 3d 20 26 46 6e 2e 67 65  ..  MRI = &Fn.ge
0970: 74 52 65 67 49 6e 66 6f 28 29 3b 0a 20 20 54 49  tRegInfo();.  TI
0980: 49 20 3d 20 46 6e 2e 67 65 74 53 75 62 74 61 72  I = Fn.getSubtar
0990: 67 65 74 28 29 2e 67 65 74 49 6e 73 74 72 49 6e  get().getInstrIn
09a0: 66 6f 28 29 3b 0a 0a 20 20 2f 2f 20 46 69 6e 64  fo();..  // Find
09b0: 20 64 65 61 64 20 50 48 49 20 63 79 63 6c 65 73   dead PHI cycles
09c0: 20 61 6e 64 20 50 48 49 20 63 79 63 6c 65 73 20   and PHI cycles 
09d0: 74 68 61 74 20 63 61 6e 20 62 65 20 72 65 70 6c  that can be repl
09e0: 61 63 65 64 20 62 79 20 61 20 73 69 6e 67 6c 65  aced by a single
09f0: 0a 20 20 2f 2f 20 76 61 6c 75 65 2e 20 20 49 6e  .  // value.  In
0a00: 73 74 43 6f 6d 62 69 6e 65 20 64 6f 65 73 20 74  stCombine does t
0a10: 68 65 73 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  hese optimizatio
0a20: 6e 73 2c 20 62 75 74 20 44 41 47 20 6c 65 67 61  ns, but DAG lega
0a30: 6c 69 7a 61 74 69 6f 6e 20 6d 61 79 0a 20 20 2f  lization may.  /
0a40: 2f 20 69 6e 74 72 6f 64 75 63 65 20 6e 65 77 20  / introduce new 
0a50: 6f 70 70 6f 72 74 75 6e 69 74 69 65 73 2c 20 65  opportunities, e
0a60: 2e 67 2e 2c 20 77 68 65 6e 20 69 36 34 20 76 61  .g., when i64 va
0a70: 6c 75 65 73 20 61 72 65 20 73 70 6c 69 74 20 75  lues are split u
0a80: 70 20 66 6f 72 0a 20 20 2f 2f 20 33 32 2d 62 69  p for.  // 32-bi
0a90: 74 20 74 61 72 67 65 74 73 2e 0a 20 20 62 6f 6f  t targets..  boo
0aa0: 6c 20 43 68 61 6e 67 65 64 20 3d 20 66 61 6c 73  l Changed = fals
0ab0: 65 3b 0a 20 20 66 6f 72 20 28 4d 61 63 68 69 6e  e;.  for (Machin
0ac0: 65 46 75 6e 63 74 69 6f 6e 3a 3a 69 74 65 72 61  eFunction::itera
0ad0: 74 6f 72 20 49 20 3d 20 46 6e 2e 62 65 67 69 6e  tor I = Fn.begin
0ae0: 28 29 2c 20 45 20 3d 20 46 6e 2e 65 6e 64 28 29  (), E = Fn.end()
0af0: 3b 20 49 20 21 3d 20 45 3b 20 2b 2b 49 29 0a 20  ; I != E; ++I). 
0b00: 20 20 20 43 68 61 6e 67 65 64 20 7c 3d 20 4f 70     Changed |= Op
0b10: 74 69 6d 69 7a 65 42 42 28 2a 49 29 3b 0a 0a 20  timizeBB(*I);.. 
0b20: 20 72 65 74 75 72 6e 20 43 68 61 6e 67 65 64 3b   return Changed;
0b30: 0a 7d 0a 0a 2f 2f 2f 20 49 73 53 69 6e 67 6c 65  .}../// IsSingle
0b40: 56 61 6c 75 65 50 48 49 43 79 63 6c 65 20 2d 20  ValuePHICycle - 
0b50: 43 68 65 63 6b 20 69 66 20 4d 49 20 69 73 20 61  Check if MI is a
0b60: 20 50 48 49 20 77 68 65 72 65 20 61 6c 6c 20 74   PHI where all t
0b70: 68 65 20 73 6f 75 72 63 65 20 6f 70 65 72 61 6e  he source operan
0b80: 64 73 0a 2f 2f 2f 20 61 72 65 20 63 6f 70 69 65  ds./// are copie
0b90: 73 20 6f 66 20 53 69 6e 67 6c 65 56 61 6c 52 65  s of SingleValRe
0ba0: 67 2c 20 70 6f 73 73 69 62 6c 79 20 76 69 61 20  g, possibly via 
0bb0: 63 6f 70 69 65 73 20 74 68 72 6f 75 67 68 20 6f  copies through o
0bc0: 74 68 65 72 20 50 48 49 73 2e 20 20 49 66 0a 2f  ther PHIs.  If./
0bd0: 2f 2f 20 53 69 6e 67 6c 65 56 61 6c 52 65 67 20  // SingleValReg 
0be0: 69 73 20 7a 65 72 6f 20 6f 6e 20 65 6e 74 72 79  is zero on entry
0bf0: 2c 20 69 74 20 69 73 20 73 65 74 20 74 6f 20 74  , it is set to t
0c00: 68 65 20 72 65 67 69 73 74 65 72 20 77 69 74 68  he register with
0c10: 20 74 68 65 20 73 69 6e 67 6c 65 0a 2f 2f 2f 20   the single./// 
0c20: 6e 6f 6e 2d 63 6f 70 79 20 76 61 6c 75 65 2e 20  non-copy value. 
0c30: 20 50 48 49 73 49 6e 43 79 63 6c 65 20 69 73 20   PHIsInCycle is 
0c40: 61 20 73 65 74 20 75 73 65 64 20 74 6f 20 6b 65  a set used to ke
0c50: 65 70 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20  ep track of the 
0c60: 50 48 49 73 20 74 68 61 74 0a 2f 2f 2f 20 68 61  PHIs that./// ha
0c70: 76 65 20 62 65 65 6e 20 73 63 61 6e 6e 65 64 2e  ve been scanned.
0c80: 0a 62 6f 6f 6c 20 4f 70 74 69 6d 69 7a 65 50 48  .bool OptimizePH
0c90: 49 73 3a 3a 49 73 53 69 6e 67 6c 65 56 61 6c 75  Is::IsSingleValu
0ca0: 65 50 48 49 43 79 63 6c 65 28 4d 61 63 68 69 6e  ePHICycle(Machin
0cb0: 65 49 6e 73 74 72 20 2a 4d 49 2c 0a 20 20 20 20  eInstr *MI,.    
0cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ce0: 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 26 53       unsigned &S
0cf0: 69 6e 67 6c 65 56 61 6c 52 65 67 2c 0a 20 20 20  ingleValReg,.   
0d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d20: 20 20 20 20 20 20 49 6e 73 74 72 53 65 74 20 26        InstrSet &
0d30: 50 48 49 73 49 6e 43 79 63 6c 65 29 20 7b 0a 20  PHIsInCycle) {. 
0d40: 20 61 73 73 65 72 74 28 4d 49 2d 3e 69 73 50 48   assert(MI->isPH
0d50: 49 28 29 20 26 26 20 22 49 73 53 69 6e 67 6c 65  I() && "IsSingle
0d60: 56 61 6c 75 65 50 48 49 43 79 63 6c 65 20 65 78  ValuePHICycle ex
0d70: 70 65 63 74 73 20 61 20 50 48 49 20 69 6e 73 74  pects a PHI inst
0d80: 72 75 63 74 69 6f 6e 22 29 3b 0a 20 20 75 6e 73  ruction");.  uns
0d90: 69 67 6e 65 64 20 44 73 74 52 65 67 20 3d 20 4d  igned DstReg = M
0da0: 49 2d 3e 67 65 74 4f 70 65 72 61 6e 64 28 30 29  I->getOperand(0)
0db0: 2e 67 65 74 52 65 67 28 29 3b 0a 0a 20 20 2f 2f  .getReg();..  //
0dc0: 20 53 65 65 20 69 66 20 77 65 20 61 6c 72 65 61   See if we alrea
0dd0: 64 79 20 73 61 77 20 74 68 69 73 20 72 65 67 69  dy saw this regi
0de0: 73 74 65 72 2e 0a 20 20 69 66 20 28 21 50 48 49  ster..  if (!PHI
0df0: 73 49 6e 43 79 63 6c 65 2e 69 6e 73 65 72 74 28  sInCycle.insert(
0e00: 4d 49 29 2e 73 65 63 6f 6e 64 29 0a 20 20 20 20  MI).second).    
0e10: 72 65 74 75 72 6e 20 74 72 75 65 3b 0a 0a 20 20  return true;..  
0e20: 2f 2f 20 44 6f 6e 27 74 20 73 63 61 6e 20 63 72  // Don't scan cr
0e30: 61 7a 69 6c 79 20 63 6f 6d 70 6c 65 78 20 74 68  azily complex th
0e40: 69 6e 67 73 2e 0a 20 20 69 66 20 28 50 48 49 73  ings..  if (PHIs
0e50: 49 6e 43 79 63 6c 65 2e 73 69 7a 65 28 29 20 3d  InCycle.size() =
0e60: 3d 20 31 36 29 0a 20 20 20 20 72 65 74 75 72 6e  = 16).    return
0e70: 20 66 61 6c 73 65 3b 0a 0a 20 20 2f 2f 20 53 63   false;..  // Sc
0e80: 61 6e 20 74 68 65 20 50 48 49 20 6f 70 65 72 61  an the PHI opera
0e90: 6e 64 73 2e 0a 20 20 66 6f 72 20 28 75 6e 73 69  nds..  for (unsi
0ea0: 67 6e 65 64 20 69 20 3d 20 31 3b 20 69 20 21 3d  gned i = 1; i !=
0eb0: 20 4d 49 2d 3e 67 65 74 4e 75 6d 4f 70 65 72 61   MI->getNumOpera
0ec0: 6e 64 73 28 29 3b 20 69 20 2b 3d 20 32 29 20 7b  nds(); i += 2) {
0ed0: 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 53 72  .    unsigned Sr
0ee0: 63 52 65 67 20 3d 20 4d 49 2d 3e 67 65 74 4f 70  cReg = MI->getOp
0ef0: 65 72 61 6e 64 28 69 29 2e 67 65 74 52 65 67 28  erand(i).getReg(
0f00: 29 3b 0a 20 20 20 20 69 66 20 28 53 72 63 52 65  );.    if (SrcRe
0f10: 67 20 3d 3d 20 44 73 74 52 65 67 29 0a 20 20 20  g == DstReg).   
0f20: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
0f30: 20 4d 61 63 68 69 6e 65 49 6e 73 74 72 20 2a 53   MachineInstr *S
0f40: 72 63 4d 49 20 3d 20 4d 52 49 2d 3e 67 65 74 56  rcMI = MRI->getV
0f50: 52 65 67 44 65 66 28 53 72 63 52 65 67 29 3b 0a  RegDef(SrcReg);.
0f60: 0a 20 20 20 20 2f 2f 20 53 6b 69 70 20 6f 76 65  .    // Skip ove
0f70: 72 20 72 65 67 69 73 74 65 72 2d 74 6f 2d 72 65  r register-to-re
0f80: 67 69 73 74 65 72 20 6d 6f 76 65 73 2e 0a 20 20  gister moves..  
0f90: 20 20 69 66 20 28 53 72 63 4d 49 20 26 26 20 53    if (SrcMI && S
0fa0: 72 63 4d 49 2d 3e 69 73 43 6f 70 79 28 29 20 26  rcMI->isCopy() &
0fb0: 26 0a 20 20 20 20 20 20 20 20 21 53 72 63 4d 49  &.        !SrcMI
0fc0: 2d 3e 67 65 74 4f 70 65 72 61 6e 64 28 30 29 2e  ->getOperand(0).
0fd0: 67 65 74 53 75 62 52 65 67 28 29 20 26 26 0a 20  getSubReg() &&. 
0fe0: 20 20 20 20 20 20 20 21 53 72 63 4d 49 2d 3e 67         !SrcMI->g
0ff0: 65 74 4f 70 65 72 61 6e 64 28 31 29 2e 67 65 74  etOperand(1).get
1000: 53 75 62 52 65 67 28 29 20 26 26 0a 20 20 20 20  SubReg() &&.    
1010: 20 20 20 20 54 61 72 67 65 74 52 65 67 69 73 74      TargetRegist
1020: 65 72 49 6e 66 6f 3a 3a 69 73 56 69 72 74 75 61  erInfo::isVirtua
1030: 6c 52 65 67 69 73 74 65 72 28 53 72 63 4d 49 2d  lRegister(SrcMI-
1040: 3e 67 65 74 4f 70 65 72 61 6e 64 28 31 29 2e 67  >getOperand(1).g
1050: 65 74 52 65 67 28 29 29 29 0a 20 20 20 20 20 20  etReg())).      
1060: 53 72 63 4d 49 20 3d 20 4d 52 49 2d 3e 67 65 74  SrcMI = MRI->get
1070: 56 52 65 67 44 65 66 28 53 72 63 4d 49 2d 3e 67  VRegDef(SrcMI->g
1080: 65 74 4f 70 65 72 61 6e 64 28 31 29 2e 67 65 74  etOperand(1).get
1090: 52 65 67 28 29 29 3b 0a 20 20 20 20 69 66 20 28  Reg());.    if (
10a0: 21 53 72 63 4d 49 29 0a 20 20 20 20 20 20 72 65  !SrcMI).      re
10b0: 74 75 72 6e 20 66 61 6c 73 65 3b 0a 0a 20 20 20  turn false;..   
10c0: 20 69 66 20 28 53 72 63 4d 49 2d 3e 69 73 50 48   if (SrcMI->isPH
10d0: 49 28 29 29 20 7b 0a 20 20 20 20 20 20 69 66 20  I()) {.      if 
10e0: 28 21 49 73 53 69 6e 67 6c 65 56 61 6c 75 65 50  (!IsSingleValueP
10f0: 48 49 43 79 63 6c 65 28 53 72 63 4d 49 2c 20 53  HICycle(SrcMI, S
1100: 69 6e 67 6c 65 56 61 6c 52 65 67 2c 20 50 48 49  ingleValReg, PHI
1110: 73 49 6e 43 79 63 6c 65 29 29 0a 20 20 20 20 20  sInCycle)).     
1120: 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b     return false;
1130: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
1140: 20 20 20 20 2f 2f 20 46 61 69 6c 20 69 66 20 74      // Fail if t
1150: 68 65 72 65 20 69 73 20 6d 6f 72 65 20 74 68 61  here is more tha
1160: 6e 20 6f 6e 65 20 6e 6f 6e 2d 70 68 69 2f 6e 6f  n one non-phi/no
1170: 6e 2d 6d 6f 76 65 20 72 65 67 69 73 74 65 72 2e  n-move register.
1180: 0a 20 20 20 20 20 20 69 66 20 28 53 69 6e 67 6c  .      if (Singl
1190: 65 56 61 6c 52 65 67 20 21 3d 20 30 29 0a 20 20  eValReg != 0).  
11a0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c        return fal
11b0: 73 65 3b 0a 20 20 20 20 20 20 53 69 6e 67 6c 65  se;.      Single
11c0: 56 61 6c 52 65 67 20 3d 20 53 72 63 52 65 67 3b  ValReg = SrcReg;
11d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
11e0: 75 72 6e 20 74 72 75 65 3b 0a 7d 0a 0a 2f 2f 2f  urn true;.}..///
11f0: 20 49 73 44 65 61 64 50 48 49 43 79 63 6c 65 20   IsDeadPHICycle 
1200: 2d 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 72  - Check if the r
1210: 65 67 69 73 74 65 72 20 64 65 66 69 6e 65 64 20  egister defined 
1220: 62 79 20 61 20 50 48 49 20 69 73 20 6f 6e 6c 79  by a PHI is only
1230: 20 75 73 65 64 20 62 79 0a 2f 2f 2f 20 6f 74 68   used by./// oth
1240: 65 72 20 50 48 49 73 20 69 6e 20 61 20 63 79 63  er PHIs in a cyc
1250: 6c 65 2e 0a 62 6f 6f 6c 20 4f 70 74 69 6d 69 7a  le..bool Optimiz
1260: 65 50 48 49 73 3a 3a 49 73 44 65 61 64 50 48 49  ePHIs::IsDeadPHI
1270: 43 79 63 6c 65 28 4d 61 63 68 69 6e 65 49 6e 73  Cycle(MachineIns
1280: 74 72 20 2a 4d 49 2c 20 49 6e 73 74 72 53 65 74  tr *MI, InstrSet
1290: 20 26 50 48 49 73 49 6e 43 79 63 6c 65 29 20 7b   &PHIsInCycle) {
12a0: 0a 20 20 61 73 73 65 72 74 28 4d 49 2d 3e 69 73  .  assert(MI->is
12b0: 50 48 49 28 29 20 26 26 20 22 49 73 44 65 61 64  PHI() && "IsDead
12c0: 50 48 49 43 79 63 6c 65 20 65 78 70 65 63 74 73  PHICycle expects
12d0: 20 61 20 50 48 49 20 69 6e 73 74 72 75 63 74 69   a PHI instructi
12e0: 6f 6e 22 29 3b 0a 20 20 75 6e 73 69 67 6e 65 64  on");.  unsigned
12f0: 20 44 73 74 52 65 67 20 3d 20 4d 49 2d 3e 67 65   DstReg = MI->ge
1300: 74 4f 70 65 72 61 6e 64 28 30 29 2e 67 65 74 52  tOperand(0).getR
1310: 65 67 28 29 3b 0a 20 20 61 73 73 65 72 74 28 54  eg();.  assert(T
1320: 61 72 67 65 74 52 65 67 69 73 74 65 72 49 6e 66  argetRegisterInf
1330: 6f 3a 3a 69 73 56 69 72 74 75 61 6c 52 65 67 69  o::isVirtualRegi
1340: 73 74 65 72 28 44 73 74 52 65 67 29 20 26 26 0a  ster(DstReg) &&.
1350: 20 20 20 20 20 20 20 20 20 22 50 48 49 20 64 65           "PHI de
1360: 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 6e 6f 74  stination is not
1370: 20 61 20 76 69 72 74 75 61 6c 20 72 65 67 69 73   a virtual regis
1380: 74 65 72 22 29 3b 0a 0a 20 20 2f 2f 20 53 65 65  ter");..  // See
1390: 20 69 66 20 77 65 20 61 6c 72 65 61 64 79 20 73   if we already s
13a0: 61 77 20 74 68 69 73 20 72 65 67 69 73 74 65 72  aw this register
13b0: 2e 0a 20 20 69 66 20 28 21 50 48 49 73 49 6e 43  ..  if (!PHIsInC
13c0: 79 63 6c 65 2e 69 6e 73 65 72 74 28 4d 49 29 2e  ycle.insert(MI).
13d0: 73 65 63 6f 6e 64 29 0a 20 20 20 20 72 65 74 75  second).    retu
13e0: 72 6e 20 74 72 75 65 3b 0a 0a 20 20 2f 2f 20 44  rn true;..  // D
13f0: 6f 6e 27 74 20 73 63 61 6e 20 63 72 61 7a 69 6c  on't scan crazil
1400: 79 20 63 6f 6d 70 6c 65 78 20 74 68 69 6e 67 73  y complex things
1410: 2e 0a 20 20 69 66 20 28 50 48 49 73 49 6e 43 79  ..  if (PHIsInCy
1420: 63 6c 65 2e 73 69 7a 65 28 29 20 3d 3d 20 31 36  cle.size() == 16
1430: 29 0a 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c  ).    return fal
1440: 73 65 3b 0a 0a 20 20 66 6f 72 20 28 4d 61 63 68  se;..  for (Mach
1450: 69 6e 65 49 6e 73 74 72 20 26 55 73 65 4d 49 20  ineInstr &UseMI 
1460: 3a 20 4d 52 49 2d 3e 75 73 65 5f 6e 6f 64 62 67  : MRI->use_nodbg
1470: 5f 69 6e 73 74 72 75 63 74 69 6f 6e 73 28 44 73  _instructions(Ds
1480: 74 52 65 67 29 29 20 7b 0a 20 20 20 20 69 66 20  tReg)) {.    if 
1490: 28 21 55 73 65 4d 49 2e 69 73 50 48 49 28 29 20  (!UseMI.isPHI() 
14a0: 7c 7c 20 21 49 73 44 65 61 64 50 48 49 43 79 63  || !IsDeadPHICyc
14b0: 6c 65 28 26 55 73 65 4d 49 2c 20 50 48 49 73 49  le(&UseMI, PHIsI
14c0: 6e 43 79 63 6c 65 29 29 0a 20 20 20 20 20 20 72  nCycle)).      r
14d0: 65 74 75 72 6e 20 66 61 6c 73 65 3b 0a 20 20 7d  eturn false;.  }
14e0: 0a 0a 20 20 72 65 74 75 72 6e 20 74 72 75 65 3b  ..  return true;
14f0: 0a 7d 0a 0a 2f 2f 2f 20 4f 70 74 69 6d 69 7a 65  .}../// Optimize
1500: 42 42 20 2d 20 52 65 6d 6f 76 65 20 64 65 61 64  BB - Remove dead
1510: 20 50 48 49 20 63 79 63 6c 65 73 20 61 6e 64 20   PHI cycles and 
1520: 50 48 49 20 63 79 63 6c 65 73 20 74 68 61 74 20  PHI cycles that 
1530: 63 61 6e 20 62 65 20 72 65 70 6c 61 63 65 64 20  can be replaced 
1540: 62 79 0a 2f 2f 2f 20 61 20 73 69 6e 67 6c 65 20  by./// a single 
1550: 76 61 6c 75 65 2e 0a 62 6f 6f 6c 20 4f 70 74 69  value..bool Opti
1560: 6d 69 7a 65 50 48 49 73 3a 3a 4f 70 74 69 6d 69  mizePHIs::Optimi
1570: 7a 65 42 42 28 4d 61 63 68 69 6e 65 42 61 73 69  zeBB(MachineBasi
1580: 63 42 6c 6f 63 6b 20 26 4d 42 42 29 20 7b 0a 20  cBlock &MBB) {. 
1590: 20 62 6f 6f 6c 20 43 68 61 6e 67 65 64 20 3d 20   bool Changed = 
15a0: 66 61 6c 73 65 3b 0a 20 20 66 6f 72 20 28 4d 61  false;.  for (Ma
15b0: 63 68 69 6e 65 42 61 73 69 63 42 6c 6f 63 6b 3a  chineBasicBlock:
15c0: 3a 69 74 65 72 61 74 6f 72 0a 20 20 20 20 20 20  :iterator.      
15d0: 20 20 20 4d 49 49 20 3d 20 4d 42 42 2e 62 65 67     MII = MBB.beg
15e0: 69 6e 28 29 2c 20 45 20 3d 20 4d 42 42 2e 65 6e  in(), E = MBB.en
15f0: 64 28 29 3b 20 4d 49 49 20 21 3d 20 45 3b 20 29  d(); MII != E; )
1600: 20 7b 0a 20 20 20 20 4d 61 63 68 69 6e 65 49 6e   {.    MachineIn
1610: 73 74 72 20 2a 4d 49 20 3d 20 26 2a 4d 49 49 2b  str *MI = &*MII+
1620: 2b 3b 0a 20 20 20 20 69 66 20 28 21 4d 49 2d 3e  +;.    if (!MI->
1630: 69 73 50 48 49 28 29 29 0a 20 20 20 20 20 20 62  isPHI()).      b
1640: 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2f 20 43 68  reak;..    // Ch
1650: 65 63 6b 20 66 6f 72 20 73 69 6e 67 6c 65 2d 76  eck for single-v
1660: 61 6c 75 65 20 50 48 49 20 63 79 63 6c 65 73 2e  alue PHI cycles.
1670: 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 53 69  .    unsigned Si
1680: 6e 67 6c 65 56 61 6c 52 65 67 20 3d 20 30 3b 0a  ngleValReg = 0;.
1690: 20 20 20 20 49 6e 73 74 72 53 65 74 20 50 48 49      InstrSet PHI
16a0: 73 49 6e 43 79 63 6c 65 3b 0a 20 20 20 20 69 66  sInCycle;.    if
16b0: 20 28 49 73 53 69 6e 67 6c 65 56 61 6c 75 65 50   (IsSingleValueP
16c0: 48 49 43 79 63 6c 65 28 4d 49 2c 20 53 69 6e 67  HICycle(MI, Sing
16d0: 6c 65 56 61 6c 52 65 67 2c 20 50 48 49 73 49 6e  leValReg, PHIsIn
16e0: 43 79 63 6c 65 29 20 26 26 0a 20 20 20 20 20 20  Cycle) &&.      
16f0: 20 20 53 69 6e 67 6c 65 56 61 6c 52 65 67 20 21    SingleValReg !
1700: 3d 20 30 29 20 7b 0a 20 20 20 20 20 20 75 6e 73  = 0) {.      uns
1710: 69 67 6e 65 64 20 4f 6c 64 52 65 67 20 3d 20 4d  igned OldReg = M
1720: 49 2d 3e 67 65 74 4f 70 65 72 61 6e 64 28 30 29  I->getOperand(0)
1730: 2e 67 65 74 52 65 67 28 29 3b 0a 20 20 20 20 20  .getReg();.     
1740: 20 69 66 20 28 21 4d 52 49 2d 3e 63 6f 6e 73 74   if (!MRI->const
1750: 72 61 69 6e 52 65 67 43 6c 61 73 73 28 53 69 6e  rainRegClass(Sin
1760: 67 6c 65 56 61 6c 52 65 67 2c 20 4d 52 49 2d 3e  gleValReg, MRI->
1770: 67 65 74 52 65 67 43 6c 61 73 73 28 4f 6c 64 52  getRegClass(OldR
1780: 65 67 29 29 29 0a 20 20 20 20 20 20 20 20 63 6f  eg))).        co
1790: 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 20 20 4d  ntinue;..      M
17a0: 52 49 2d 3e 72 65 70 6c 61 63 65 52 65 67 57 69  RI->replaceRegWi
17b0: 74 68 28 4f 6c 64 52 65 67 2c 20 53 69 6e 67 6c  th(OldReg, Singl
17c0: 65 56 61 6c 52 65 67 29 3b 0a 20 20 20 20 20 20  eValReg);.      
17d0: 4d 49 2d 3e 65 72 61 73 65 46 72 6f 6d 50 61 72  MI->eraseFromPar
17e0: 65 6e 74 28 29 3b 0a 20 20 20 20 20 20 2b 2b 4e  ent();.      ++N
17f0: 75 6d 50 48 49 43 79 63 6c 65 73 3b 0a 20 20 20  umPHICycles;.   
1800: 20 20 20 43 68 61 6e 67 65 64 20 3d 20 74 72 75     Changed = tru
1810: 65 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  e;.      continu
1820: 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2f  e;.    }..    //
1830: 20 43 68 65 63 6b 20 66 6f 72 20 64 65 61 64 20   Check for dead 
1840: 50 48 49 20 63 79 63 6c 65 73 2e 0a 20 20 20 20  PHI cycles..    
1850: 50 48 49 73 49 6e 43 79 63 6c 65 2e 63 6c 65 61  PHIsInCycle.clea
1860: 72 28 29 3b 0a 20 20 20 20 69 66 20 28 49 73 44  r();.    if (IsD
1870: 65 61 64 50 48 49 43 79 63 6c 65 28 4d 49 2c 20  eadPHICycle(MI, 
1880: 50 48 49 73 49 6e 43 79 63 6c 65 29 29 20 7b 0a  PHIsInCycle)) {.
1890: 20 20 20 20 20 20 66 6f 72 20 28 49 6e 73 74 72        for (Instr
18a0: 53 65 74 49 74 65 72 61 74 6f 72 20 50 49 20 3d  SetIterator PI =
18b0: 20 50 48 49 73 49 6e 43 79 63 6c 65 2e 62 65 67   PHIsInCycle.beg
18c0: 69 6e 28 29 2c 20 50 45 20 3d 20 50 48 49 73 49  in(), PE = PHIsI
18d0: 6e 43 79 63 6c 65 2e 65 6e 64 28 29 3b 0a 20 20  nCycle.end();.  
18e0: 20 20 20 20 20 20 20 20 20 50 49 20 21 3d 20 50           PI != P
18f0: 45 3b 20 2b 2b 50 49 29 20 7b 0a 20 20 20 20 20  E; ++PI) {.     
1900: 20 20 20 4d 61 63 68 69 6e 65 49 6e 73 74 72 20     MachineInstr 
1910: 2a 50 68 69 4d 49 20 3d 20 2a 50 49 3b 0a 20 20  *PhiMI = *PI;.  
1920: 20 20 20 20 20 20 69 66 20 28 4d 49 49 20 3d 3d        if (MII ==
1930: 20 50 68 69 4d 49 29 0a 20 20 20 20 20 20 20 20   PhiMI).        
1940: 20 20 2b 2b 4d 49 49 3b 0a 20 20 20 20 20 20 20    ++MII;.       
1950: 20 50 68 69 4d 49 2d 3e 65 72 61 73 65 46 72 6f   PhiMI->eraseFro
1960: 6d 50 61 72 65 6e 74 28 29 3b 0a 20 20 20 20 20  mParent();.     
1970: 20 7d 0a 20 20 20 20 20 20 2b 2b 4e 75 6d 44 65   }.      ++NumDe
1980: 61 64 50 48 49 43 79 63 6c 65 73 3b 0a 20 20 20  adPHICycles;.   
1990: 20 20 20 43 68 61 6e 67 65 64 20 3d 20 74 72 75     Changed = tru
19a0: 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  e;.    }.  }.  r
19b0: 65 74 75 72 6e 20 43 68 61 6e 67 65 64 3b 0a 7d  eturn Changed;.}
19c0: 0a                                               .