Hex Artifact Content
Not logged in

Artifact 048af4b263fb4362d50c19e32708bed4e2bf9269:

Unrecognized artifact
0000: 2f 2f 3d 3d 3d 2d 20 53 74 61 63 6b 43 6f 6c 6f  //===- StackColo
0010: 72 69 6e 67 2e 63 70 70 20 2d 2d 2d 2d 2d 2d 2d  ring.cpp -------
0020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 69 6d 70 6c 65 6d 65 6e 74 73 20  pass implements 
0170: 74 68 65 20 73 74 61 63 6b 2d 63 6f 6c 6f 72 69  the stack-colori
0180: 6e 67 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  ng optimization 
0190: 74 68 61 74 20 6c 6f 6f 6b 73 20 66 6f 72 0a 2f  that looks for./
01a0: 2f 20 6c 69 66 65 74 69 6d 65 20 6d 61 72 6b 65  / lifetime marke
01b0: 72 73 20 6d 61 63 68 69 6e 65 20 69 6e 73 74 72  rs machine instr
01c0: 75 63 74 69 6f 6e 73 20 28 4c 49 46 45 53 54 41  uctions (LIFESTA
01d0: 52 54 5f 42 45 47 49 4e 20 61 6e 64 20 4c 49 46  RT_BEGIN and LIF
01e0: 45 53 54 41 52 54 5f 45 4e 44 29 2c 0a 2f 2f 20  ESTART_END),.// 
01f0: 77 68 69 63 68 20 72 65 70 72 65 73 65 6e 74 20  which represent 
0200: 74 68 65 20 70 6f 73 73 69 62 6c 65 20 6c 69 66  the possible lif
0210: 65 74 69 6d 65 20 6f 66 20 73 74 61 63 6b 20 73  etime of stack s
0220: 6c 6f 74 73 2e 20 49 74 20 61 74 74 65 6d 70 74  lots. It attempt
0230: 73 20 74 6f 0a 2f 2f 20 6d 65 72 67 65 20 64 69  s to.// merge di
0240: 73 6a 6f 69 6e 74 20 73 74 61 63 6b 20 73 6c 6f  sjoint stack slo
0250: 74 73 20 61 6e 64 20 72 65 64 75 63 65 20 74 68  ts and reduce th
0260: 65 20 75 73 65 64 20 73 74 61 63 6b 20 73 70 61  e used stack spa
0270: 63 65 2e 0a 2f 2f 20 4e 4f 54 45 3a 20 54 68 69  ce..// NOTE: Thi
0280: 73 20 70 61 73 73 20 69 73 20 6e 6f 74 20 53 74  s pass is not St
0290: 61 63 6b 53 6c 6f 74 43 6f 6c 6f 72 69 6e 67 2c  ackSlotColoring,
02a0: 20 77 68 69 63 68 20 6f 70 74 69 6d 69 7a 65 73   which optimizes
02b0: 20 73 70 69 6c 6c 20 73 6c 6f 74 73 2e 0a 2f 2f   spill slots..//
02c0: 0a 2f 2f 20 54 4f 44 4f 3a 20 49 6e 20 74 68 65  .// TODO: In the
02d0: 20 66 75 74 75 72 65 20 77 65 20 70 6c 61 6e 20   future we plan 
02e0: 74 6f 20 69 6d 70 72 6f 76 65 20 73 74 61 63 6b  to improve stack
02f0: 20 63 6f 6c 6f 72 69 6e 67 20 69 6e 20 74 68 65   coloring in the
0300: 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 61 79 73 3a   following ways:
0310: 0a 2f 2f 20 31 2e 20 41 6c 6c 6f 77 20 6d 65 72  .// 1. Allow mer
0320: 67 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20 73 6d  ging multiple sm
0330: 61 6c 6c 20 73 6c 6f 74 73 20 69 6e 74 6f 20 61  all slots into a
0340: 20 73 69 6e 67 6c 65 20 6c 61 72 67 65 72 20 73   single larger s
0350: 6c 6f 74 20 61 74 20 64 69 66 66 65 72 65 6e 74  lot at different
0360: 0a 2f 2f 20 20 20 20 6f 66 66 73 65 74 73 2e 0a  .//    offsets..
0370: 2f 2f 20 32 2e 20 4d 65 72 67 65 20 74 68 69 73  // 2. Merge this
0380: 20 70 61 73 73 20 77 69 74 68 20 53 74 61 63 6b   pass with Stack
0390: 53 6c 6f 74 43 6f 6c 6f 72 69 6e 67 20 61 6e 64  SlotColoring and
03a0: 20 61 6c 6c 6f 77 20 6d 65 72 67 69 6e 67 20 6f   allow merging o
03b0: 66 20 61 6c 6c 6f 63 61 73 20 77 69 74 68 0a 2f  f allocas with./
03c0: 2f 20 20 20 20 73 70 69 6c 6c 20 73 6c 6f 74 73  /    spill slots
03d0: 2e 0a 2f 2f 0a 2f 2f 3d 3d 3d 2d 2d 2d 2d 2d 2d  ..//.//===------
03e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
03f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0420: 3d 3d 3d 2f 2f 0a 0a 23 69 6e 63 6c 75 64 65 20  ===//..#include 
0430: 22 6c 6c 76 6d 2f 41 44 54 2f 42 69 74 56 65 63  "llvm/ADT/BitVec
0440: 74 6f 72 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  tor.h".#include 
0450: 22 6c 6c 76 6d 2f 41 44 54 2f 44 65 6e 73 65 4d  "llvm/ADT/DenseM
0460: 61 70 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22  ap.h".#include "
0470: 6c 6c 76 6d 2f 41 44 54 2f 44 65 70 74 68 46 69  llvm/ADT/DepthFi
0480: 72 73 74 49 74 65 72 61 74 6f 72 2e 68 22 0a 23  rstIterator.h".#
0490: 69 6e 63 6c 75 64 65 20 22 6c 6c 76 6d 2f 41 44  include "llvm/AD
04a0: 54 2f 53 6d 61 6c 6c 50 74 72 53 65 74 2e 68 22  T/SmallPtrSet.h"
04b0: 0a 23 69 6e 63 6c 75 64 65 20 22 6c 6c 76 6d 2f  .#include "llvm/
04c0: 41 44 54 2f 53 6d 61 6c 6c 56 65 63 74 6f 72 2e  ADT/SmallVector.
04d0: 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 6c 6c 76  h".#include "llv
04e0: 6d 2f 41 44 54 2f 53 74 61 74 69 73 74 69 63 2e  m/ADT/Statistic.
04f0: 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 6c 6c 76  h".#include "llv
0500: 6d 2f 41 6e 61 6c 79 73 69 73 2f 56 61 6c 75 65  m/Analysis/Value
0510: 54 72 61 63 6b 69 6e 67 2e 68 22 0a 23 69 6e 63  Tracking.h".#inc
0520: 6c 75 64 65 20 22 6c 6c 76 6d 2f 43 6f 64 65 47  lude "llvm/CodeG
0530: 65 6e 2f 4c 69 76 65 49 6e 74 65 72 76 61 6c 2e  en/LiveInterval.
0540: 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 6c 6c 76  h".#include "llv
0550: 6d 2f 43 6f 64 65 47 65 6e 2f 4d 61 63 68 69 6e  m/CodeGen/Machin
0560: 65 42 61 73 69 63 42 6c 6f 63 6b 2e 68 22 0a 23  eBasicBlock.h".#
0570: 69 6e 63 6c 75 64 65 20 22 6c 6c 76 6d 2f 43 6f  include "llvm/Co
0580: 64 65 47 65 6e 2f 4d 61 63 68 69 6e 65 46 72 61  deGen/MachineFra
0590: 6d 65 49 6e 66 6f 2e 68 22 0a 23 69 6e 63 6c 75  meInfo.h".#inclu
05a0: 64 65 20 22 6c 6c 76 6d 2f 43 6f 64 65 47 65 6e  de "llvm/CodeGen
05b0: 2f 4d 61 63 68 69 6e 65 46 75 6e 63 74 69 6f 6e  /MachineFunction
05c0: 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 6c 6c  .h".#include "ll
05d0: 76 6d 2f 43 6f 64 65 47 65 6e 2f 4d 61 63 68 69  vm/CodeGen/Machi
05e0: 6e 65 46 75 6e 63 74 69 6f 6e 50 61 73 73 2e 68  neFunctionPass.h
05f0: 22 0a 23 69 6e 63 6c 75 64 65 20 22 6c 6c 76 6d  ".#include "llvm
0600: 2f 43 6f 64 65 47 65 6e 2f 4d 61 63 68 69 6e 65  /CodeGen/Machine
0610: 49 6e 73 74 72 2e 68 22 0a 23 69 6e 63 6c 75 64  Instr.h".#includ
0620: 65 20 22 6c 6c 76 6d 2f 43 6f 64 65 47 65 6e 2f  e "llvm/CodeGen/
0630: 4d 61 63 68 69 6e 65 4d 65 6d 4f 70 65 72 61 6e  MachineMemOperan
0640: 64 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 6c  d.h".#include "l
0650: 6c 76 6d 2f 43 6f 64 65 47 65 6e 2f 4d 61 63 68  lvm/CodeGen/Mach
0660: 69 6e 65 4f 70 65 72 61 6e 64 2e 68 22 0a 23 69  ineOperand.h".#i
0670: 6e 63 6c 75 64 65 20 22 6c 6c 76 6d 2f 43 6f 64  nclude "llvm/Cod
0680: 65 47 65 6e 2f 50 61 73 73 65 73 2e 68 22 0a 23  eGen/Passes.h".#
0690: 69 6e 63 6c 75 64 65 20 22 6c 6c 76 6d 2f 43 6f  include "llvm/Co
06a0: 64 65 47 65 6e 2f 53 65 6c 65 63 74 69 6f 6e 44  deGen/SelectionD
06b0: 41 47 4e 6f 64 65 73 2e 68 22 0a 23 69 6e 63 6c  AGNodes.h".#incl
06c0: 75 64 65 20 22 6c 6c 76 6d 2f 43 6f 64 65 47 65  ude "llvm/CodeGe
06d0: 6e 2f 53 6c 6f 74 49 6e 64 65 78 65 73 2e 68 22  n/SlotIndexes.h"
06e0: 0a 23 69 6e 63 6c 75 64 65 20 22 6c 6c 76 6d 2f  .#include "llvm/
06f0: 43 6f 64 65 47 65 6e 2f 53 74 61 63 6b 50 72 6f  CodeGen/StackPro
0700: 74 65 63 74 6f 72 2e 68 22 0a 23 69 6e 63 6c 75  tector.h".#inclu
0710: 64 65 20 22 6c 6c 76 6d 2f 43 6f 64 65 47 65 6e  de "llvm/CodeGen
0720: 2f 54 61 72 67 65 74 4f 70 63 6f 64 65 73 2e 68  /TargetOpcodes.h
0730: 22 0a 23 69 6e 63 6c 75 64 65 20 22 6c 6c 76 6d  ".#include "llvm
0740: 2f 43 6f 64 65 47 65 6e 2f 57 69 6e 45 48 46 75  /CodeGen/WinEHFu
0750: 6e 63 49 6e 66 6f 2e 68 22 0a 23 69 6e 63 6c 75  ncInfo.h".#inclu
0760: 64 65 20 22 6c 6c 76 6d 2f 49 52 2f 43 6f 6e 73  de "llvm/IR/Cons
0770: 74 61 6e 74 73 2e 68 22 0a 23 69 6e 63 6c 75 64  tants.h".#includ
0780: 65 20 22 6c 6c 76 6d 2f 49 52 2f 44 65 62 75 67  e "llvm/IR/Debug
0790: 49 6e 66 6f 4d 65 74 61 64 61 74 61 2e 68 22 0a  InfoMetadata.h".
07a0: 23 69 6e 63 6c 75 64 65 20 22 6c 6c 76 6d 2f 49  #include "llvm/I
07b0: 52 2f 46 75 6e 63 74 69 6f 6e 2e 68 22 0a 23 69  R/Function.h".#i
07c0: 6e 63 6c 75 64 65 20 22 6c 6c 76 6d 2f 49 52 2f  nclude "llvm/IR/
07d0: 49 6e 73 74 72 75 63 74 69 6f 6e 73 2e 68 22 0a  Instructions.h".
07e0: 23 69 6e 63 6c 75 64 65 20 22 6c 6c 76 6d 2f 49  #include "llvm/I
07f0: 52 2f 4d 65 74 61 64 61 74 61 2e 68 22 0a 23 69  R/Metadata.h".#i
0800: 6e 63 6c 75 64 65 20 22 6c 6c 76 6d 2f 49 52 2f  nclude "llvm/IR/
0810: 55 73 65 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Use.h".#include 
0820: 22 6c 6c 76 6d 2f 49 52 2f 56 61 6c 75 65 2e 68  "llvm/IR/Value.h
0830: 22 0a 23 69 6e 63 6c 75 64 65 20 22 6c 6c 76 6d  ".#include "llvm
0840: 2f 50 61 73 73 2e 68 22 0a 23 69 6e 63 6c 75 64  /Pass.h".#includ
0850: 65 20 22 6c 6c 76 6d 2f 53 75 70 70 6f 72 74 2f  e "llvm/Support/
0860: 43 61 73 74 69 6e 67 2e 68 22 0a 23 69 6e 63 6c  Casting.h".#incl
0870: 75 64 65 20 22 6c 6c 76 6d 2f 53 75 70 70 6f 72  ude "llvm/Suppor
0880: 74 2f 43 6f 6d 6d 61 6e 64 4c 69 6e 65 2e 68 22  t/CommandLine.h"
0890: 0a 23 69 6e 63 6c 75 64 65 20 22 6c 6c 76 6d 2f  .#include "llvm/
08a0: 53 75 70 70 6f 72 74 2f 43 6f 6d 70 69 6c 65 72  Support/Compiler
08b0: 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 6c 6c  .h".#include "ll
08c0: 76 6d 2f 53 75 70 70 6f 72 74 2f 44 65 62 75 67  vm/Support/Debug
08d0: 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 6c 6c  .h".#include "ll
08e0: 76 6d 2f 53 75 70 70 6f 72 74 2f 72 61 77 5f 6f  vm/Support/raw_o
08f0: 73 74 72 65 61 6d 2e 68 22 0a 23 69 6e 63 6c 75  stream.h".#inclu
0900: 64 65 20 3c 61 6c 67 6f 72 69 74 68 6d 3e 0a 23  de <algorithm>.#
0910: 69 6e 63 6c 75 64 65 20 3c 63 61 73 73 65 72 74  include <cassert
0920: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6c 69 6d 69  >.#include <limi
0930: 74 73 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6d 65  ts>.#include <me
0940: 6d 6f 72 79 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  mory>.#include <
0950: 75 74 69 6c 69 74 79 3e 0a 0a 75 73 69 6e 67 20  utility>..using 
0960: 6e 61 6d 65 73 70 61 63 65 20 6c 6c 76 6d 3b 0a  namespace llvm;.
0970: 0a 23 64 65 66 69 6e 65 20 44 45 42 55 47 5f 54  .#define DEBUG_T
0980: 59 50 45 20 22 73 74 61 63 6b 2d 63 6f 6c 6f 72  YPE "stack-color
0990: 69 6e 67 22 0a 0a 73 74 61 74 69 63 20 63 6c 3a  ing"..static cl:
09a0: 3a 6f 70 74 3c 62 6f 6f 6c 3e 0a 44 69 73 61 62  :opt<bool>.Disab
09b0: 6c 65 43 6f 6c 6f 72 69 6e 67 28 22 6e 6f 2d 73  leColoring("no-s
09c0: 74 61 63 6b 2d 63 6f 6c 6f 72 69 6e 67 22 2c 0a  tack-coloring",.
09d0: 20 20 20 20 20 20 20 20 63 6c 3a 3a 69 6e 69 74          cl::init
09e0: 28 66 61 6c 73 65 29 2c 20 63 6c 3a 3a 48 69 64  (false), cl::Hid
09f0: 64 65 6e 2c 0a 20 20 20 20 20 20 20 20 63 6c 3a  den,.        cl:
0a00: 3a 64 65 73 63 28 22 44 69 73 61 62 6c 65 20 73  :desc("Disable s
0a10: 74 61 63 6b 20 63 6f 6c 6f 72 69 6e 67 22 29 29  tack coloring"))
0a20: 3b 0a 0a 2f 2f 2f 20 54 68 65 20 75 73 65 72 20  ;../// The user 
0a30: 6d 61 79 20 77 72 69 74 65 20 63 6f 64 65 20 74  may write code t
0a40: 68 61 74 20 75 73 65 73 20 61 6c 6c 6f 63 61 73  hat uses allocas
0a50: 20 6f 75 74 73 69 64 65 20 6f 66 20 74 68 65 20   outside of the 
0a60: 64 65 63 6c 61 72 65 64 20 6c 69 66 65 74 69 6d  declared lifetim
0a70: 65 0a 2f 2f 2f 20 7a 6f 6e 65 2e 20 54 68 69 73  e./// zone. This
0a80: 20 63 61 6e 20 68 61 70 70 65 6e 20 77 68 65 6e   can happen when
0a90: 20 74 68 65 20 75 73 65 72 20 72 65 74 75 72 6e   the user return
0aa0: 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  s a reference to
0ab0: 20 61 20 6c 6f 63 61 6c 0a 2f 2f 2f 20 64 61 74   a local./// dat
0ac0: 61 2d 73 74 72 75 63 74 75 72 65 2e 20 57 65 20  a-structure. We 
0ad0: 63 61 6e 20 64 65 74 65 63 74 20 74 68 65 73 65  can detect these
0ae0: 20 63 61 73 65 73 20 61 6e 64 20 64 65 63 69 64   cases and decid
0af0: 65 20 6e 6f 74 20 74 6f 20 6f 70 74 69 6d 69 7a  e not to optimiz
0b00: 65 20 74 68 65 0a 2f 2f 2f 20 63 6f 64 65 2e 20  e the./// code. 
0b10: 49 66 20 74 68 69 73 20 66 6c 61 67 20 69 73 20  If this flag is 
0b20: 65 6e 61 62 6c 65 64 2c 20 77 65 20 74 72 79 20  enabled, we try 
0b30: 74 6f 20 73 61 76 65 20 74 68 65 20 75 73 65 72  to save the user
0b40: 2e 20 54 68 69 73 20 6f 70 74 69 6f 6e 0a 2f 2f  . This option.//
0b50: 2f 20 69 73 20 74 72 65 61 74 65 64 20 61 73 20  / is treated as 
0b60: 6f 76 65 72 72 69 64 69 6e 67 20 4c 69 66 65 74  overriding Lifet
0b70: 69 6d 65 53 74 61 72 74 4f 6e 46 69 72 73 74 55  imeStartOnFirstU
0b80: 73 65 20 62 65 6c 6f 77 2e 0a 73 74 61 74 69 63  se below..static
0b90: 20 63 6c 3a 3a 6f 70 74 3c 62 6f 6f 6c 3e 0a 50   cl::opt<bool>.P
0ba0: 72 6f 74 65 63 74 46 72 6f 6d 45 73 63 61 70 65  rotectFromEscape
0bb0: 64 41 6c 6c 6f 63 61 73 28 22 70 72 6f 74 65 63  dAllocas("protec
0bc0: 74 2d 66 72 6f 6d 2d 65 73 63 61 70 65 64 2d 61  t-from-escaped-a
0bd0: 6c 6c 6f 63 61 73 22 2c 0a 20 20 20 20 20 20 20  llocas",.       
0be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0bf0: 20 20 20 63 6c 3a 3a 69 6e 69 74 28 66 61 6c 73     cl::init(fals
0c00: 65 29 2c 20 63 6c 3a 3a 48 69 64 64 65 6e 2c 0a  e), cl::Hidden,.
0c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c20: 20 20 20 20 20 20 20 20 20 20 63 6c 3a 3a 64 65            cl::de
0c30: 73 63 28 22 44 6f 20 6e 6f 74 20 6f 70 74 69 6d  sc("Do not optim
0c40: 69 7a 65 20 6c 69 66 65 74 69 6d 65 20 7a 6f 6e  ize lifetime zon
0c50: 65 73 20 74 68 61 74 20 22 0a 20 20 20 20 20 20  es that ".      
0c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 61 72               "ar
0c80: 65 20 62 72 6f 6b 65 6e 22 29 29 3b 0a 0a 2f 2f  e broken"));..//
0c90: 2f 20 45 6e 61 62 6c 65 20 65 6e 68 61 6e 63 65  / Enable enhance
0ca0: 64 20 64 61 74 61 66 6c 6f 77 20 73 63 68 65 6d  d dataflow schem
0cb0: 65 20 66 6f 72 20 6c 69 66 65 74 69 6d 65 20 61  e for lifetime a
0cc0: 6e 61 6c 79 73 69 73 20 28 74 72 65 61 74 20 66  nalysis (treat f
0cd0: 69 72 73 74 0a 2f 2f 2f 20 75 73 65 20 6f 66 20  irst./// use of 
0ce0: 73 74 61 63 6b 20 73 6c 6f 74 20 61 73 20 73 74  stack slot as st
0cf0: 61 72 74 20 6f 66 20 73 6c 6f 74 20 6c 69 66 65  art of slot life
0d00: 74 69 6d 65 2c 20 61 73 20 6f 70 70 6f 73 65 64  time, as opposed
0d10: 20 74 6f 20 6c 6f 6f 6b 69 6e 67 0a 2f 2f 2f 20   to looking./// 
0d20: 66 6f 72 20 4c 49 46 45 54 49 4d 45 5f 53 54 41  for LIFETIME_STA
0d30: 52 54 20 6d 61 72 6b 65 72 29 2e 20 53 65 65 20  RT marker). See 
0d40: 22 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20  "Implementation 
0d50: 6e 6f 74 65 73 22 20 62 65 6c 6f 77 20 66 6f 72  notes" below for
0d60: 0a 2f 2f 2f 20 6d 6f 72 65 20 69 6e 66 6f 2e 0a  ./// more info..
0d70: 73 74 61 74 69 63 20 63 6c 3a 3a 6f 70 74 3c 62  static cl::opt<b
0d80: 6f 6f 6c 3e 0a 4c 69 66 65 74 69 6d 65 53 74 61  ool>.LifetimeSta
0d90: 72 74 4f 6e 46 69 72 73 74 55 73 65 28 22 73 74  rtOnFirstUse("st
0da0: 61 63 6b 63 6f 6c 6f 72 69 6e 67 2d 6c 69 66 65  ackcoloring-life
0db0: 74 69 6d 65 2d 73 74 61 72 74 2d 6f 6e 2d 66 69  time-start-on-fi
0dc0: 72 73 74 2d 75 73 65 22 2c 0a 20 20 20 20 20 20  rst-use",.      
0dd0: 20 20 63 6c 3a 3a 69 6e 69 74 28 74 72 75 65 29    cl::init(true)
0de0: 2c 20 63 6c 3a 3a 48 69 64 64 65 6e 2c 0a 20 20  , cl::Hidden,.  
0df0: 20 20 20 20 20 20 63 6c 3a 3a 64 65 73 63 28 22        cl::desc("
0e00: 54 72 65 61 74 20 73 74 61 63 6b 20 6c 69 66 65  Treat stack life
0e10: 74 69 6d 65 73 20 61 73 20 73 74 61 72 74 69 6e  times as startin
0e20: 67 20 6f 6e 20 66 69 72 73 74 20 75 73 65 2c 20  g on first use, 
0e30: 6e 6f 74 20 6f 6e 20 53 54 41 52 54 20 6d 61 72  not on START mar
0e40: 6b 65 72 2e 22 29 29 3b 0a 0a 0a 53 54 41 54 49  ker."));...STATI
0e50: 53 54 49 43 28 4e 75 6d 4d 61 72 6b 65 72 53 65  STIC(NumMarkerSe
0e60: 65 6e 2c 20 20 22 4e 75 6d 62 65 72 20 6f 66 20  en,  "Number of 
0e70: 6c 69 66 65 74 69 6d 65 20 6d 61 72 6b 65 72 73  lifetime markers
0e80: 20 66 6f 75 6e 64 2e 22 29 3b 0a 53 54 41 54 49   found.");.STATI
0e90: 53 54 49 43 28 53 74 61 63 6b 53 70 61 63 65 53  STIC(StackSpaceS
0ea0: 61 76 65 64 2c 20 22 4e 75 6d 62 65 72 20 6f 66  aved, "Number of
0eb0: 20 62 79 74 65 73 20 73 61 76 65 64 20 64 75 65   bytes saved due
0ec0: 20 74 6f 20 6d 65 72 67 69 6e 67 20 73 6c 6f 74   to merging slot
0ed0: 73 2e 22 29 3b 0a 53 54 41 54 49 53 54 49 43 28  s.");.STATISTIC(
0ee0: 53 74 61 63 6b 53 6c 6f 74 4d 65 72 67 65 64 2c  StackSlotMerged,
0ef0: 20 22 4e 75 6d 62 65 72 20 6f 66 20 73 74 61 63   "Number of stac
0f00: 6b 20 73 6c 6f 74 20 6d 65 72 67 65 64 2e 22 29  k slot merged.")
0f10: 3b 0a 53 54 41 54 49 53 54 49 43 28 45 73 63 61  ;.STATISTIC(Esca
0f20: 70 65 64 41 6c 6c 6f 63 61 73 2c 20 22 4e 75 6d  pedAllocas, "Num
0f30: 62 65 72 20 6f 66 20 61 6c 6c 6f 63 61 73 20 74  ber of allocas t
0f40: 68 61 74 20 65 73 63 61 70 65 64 20 74 68 65 20  hat escaped the 
0f50: 6c 69 66 65 74 69 6d 65 20 72 65 67 69 6f 6e 22  lifetime region"
0f60: 29 3b 0a 0a 2f 2f 3d 3d 3d 2d 2d 2d 2d 2d 2d 2d  );..//===-------
0f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 3d  ---------------=
0fb0: 3d 3d 2f 2f 0a 2f 2f 20 20 20 20 20 20 20 20 20  ==//.//         
0fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0fd0: 20 20 53 74 61 63 6b 43 6f 6c 6f 72 69 6e 67 20    StackColoring 
0fe0: 50 61 73 73 0a 2f 2f 3d 3d 3d 2d 2d 2d 2d 2d 2d  Pass.//===------
0ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1030: 3d 3d 3d 2f 2f 0a 2f 2f 0a 2f 2f 20 53 74 61 63  ===//.//.// Stac
1040: 6b 20 43 6f 6c 6f 72 69 6e 67 20 72 65 64 75 63  k Coloring reduc
1050: 65 73 20 73 74 61 63 6b 20 75 73 61 67 65 20 62  es stack usage b
1060: 79 20 6d 65 72 67 69 6e 67 20 73 74 61 63 6b 20  y merging stack 
1070: 73 6c 6f 74 73 20 77 68 65 6e 20 74 68 65 79 0a  slots when they.
1080: 2f 2f 20 63 61 6e 27 74 20 62 65 20 75 73 65 64  // can't be used
1090: 20 74 6f 67 65 74 68 65 72 2e 20 46 6f 72 20 65   together. For e
10a0: 78 61 6d 70 6c 65 2c 20 63 6f 6e 73 69 64 65 72  xample, consider
10b0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 43   the following C
10c0: 20 70 72 6f 67 72 61 6d 3a 0a 2f 2f 0a 2f 2f 20   program:.//.// 
10d0: 20 20 20 20 76 6f 69 64 20 62 61 72 28 63 68 61      void bar(cha
10e0: 72 20 2a 2c 20 69 6e 74 29 3b 0a 2f 2f 20 20 20  r *, int);.//   
10f0: 20 20 76 6f 69 64 20 66 6f 6f 28 62 6f 6f 6c 20    void foo(bool 
1100: 76 61 72 29 20 7b 0a 2f 2f 20 20 20 20 20 20 20  var) {.//       
1110: 20 20 41 3a 20 7b 0a 2f 2f 20 20 20 20 20 20 20    A: {.//       
1120: 20 20 20 20 20 20 63 68 61 72 20 7a 5b 34 30 39        char z[409
1130: 36 5d 3b 0a 2f 2f 20 20 20 20 20 20 20 20 20 20  6];.//          
1140: 20 20 20 62 61 72 28 7a 2c 20 30 29 3b 0a 2f 2f     bar(z, 0);.//
1150: 20 20 20 20 20 20 20 20 20 7d 0a 2f 2f 0a 2f 2f           }.//.//
1160: 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70           char *p
1170: 3b 0a 2f 2f 20 20 20 20 20 20 20 20 20 63 68 61  ;.//         cha
1180: 72 20 78 5b 34 30 39 36 5d 3b 0a 2f 2f 20 20 20  r x[4096];.//   
1190: 20 20 20 20 20 20 63 68 61 72 20 79 5b 34 30 39        char y[409
11a0: 36 5d 3b 0a 2f 2f 20 20 20 20 20 20 20 20 20 69  6];.//         i
11b0: 66 20 28 76 61 72 29 20 7b 0a 2f 2f 20 20 20 20  f (var) {.//    
11c0: 20 20 20 20 20 20 20 20 20 70 20 3d 20 78 3b 0a           p = x;.
11d0: 2f 2f 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73  //         } els
11e0: 65 20 7b 0a 2f 2f 20 20 20 20 20 20 20 20 20 20  e {.//          
11f0: 20 20 20 62 61 72 28 79 2c 20 31 29 3b 0a 2f 2f     bar(y, 1);.//
1200: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 20 3d               p =
1210: 20 79 20 2b 20 31 30 32 34 3b 0a 2f 2f 20 20 20   y + 1024;.//   
1220: 20 20 20 20 20 20 7d 0a 2f 2f 20 20 20 20 20 42        }.//     B
1230: 3a 0a 2f 2f 20 20 20 20 20 20 20 20 20 62 61 72  :.//         bar
1240: 28 70 2c 20 32 29 3b 0a 2f 2f 20 20 20 20 20 7d  (p, 2);.//     }
1250: 0a 2f 2f 0a 2f 2f 20 4e 61 69 76 65 6c 79 2d 63  .//.// Naively-c
1260: 6f 6d 70 69 6c 65 64 2c 20 74 68 69 73 20 70 72  ompiled, this pr
1270: 6f 67 72 61 6d 20 77 6f 75 6c 64 20 75 73 65 20  ogram would use 
1280: 31 32 6b 20 6f 66 20 73 74 61 63 6b 20 73 70 61  12k of stack spa
1290: 63 65 2e 20 48 6f 77 65 76 65 72 2c 20 74 68 65  ce. However, the
12a0: 0a 2f 2f 20 73 74 61 63 6b 20 73 6c 6f 74 20 63  .// stack slot c
12b0: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
12c0: 60 7a 60 20 69 73 20 61 6c 77 61 79 73 20 64 65  `z` is always de
12d0: 73 74 72 6f 79 65 64 20 62 65 66 6f 72 65 20 65  stroyed before e
12e0: 69 74 68 65 72 20 6f 66 20 74 68 65 0a 2f 2f 20  ither of the.// 
12f0: 73 74 61 63 6b 20 73 6c 6f 74 73 20 66 6f 72 20  stack slots for 
1300: 60 78 60 20 6f 72 20 60 79 60 20 61 72 65 20 75  `x` or `y` are u
1310: 73 65 64 2c 20 61 6e 64 20 74 68 65 6e 20 60 78  sed, and then `x
1320: 60 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 69  ` is only used i
1330: 66 20 60 76 61 72 60 0a 2f 2f 20 69 73 20 74 72  f `var`.// is tr
1340: 75 65 2c 20 77 68 69 6c 65 20 60 79 60 20 69 73  ue, while `y` is
1350: 20 6f 6e 6c 79 20 75 73 65 64 20 69 66 20 60 76   only used if `v
1360: 61 72 60 20 69 73 20 66 61 6c 73 65 2e 20 53 6f  ar` is false. So
1370: 20 69 6e 20 6e 6f 20 74 69 6d 65 20 61 72 65 20   in no time are 
1380: 32 0a 2f 2f 20 6f 66 20 74 68 65 20 73 74 61 63  2.// of the stac
1390: 6b 20 73 6c 6f 74 73 20 75 73 65 64 20 74 6f 67  k slots used tog
13a0: 65 74 68 65 72 2c 20 61 6e 64 20 74 68 65 72 65  ether, and there
13b0: 66 6f 72 65 20 77 65 20 63 61 6e 20 6d 65 72 67  fore we can merg
13c0: 65 20 74 68 65 6d 2c 0a 2f 2f 20 63 6f 6d 70 69  e them,.// compi
13d0: 6c 69 6e 67 20 74 68 65 20 66 75 6e 63 74 69 6f  ling the functio
13e0: 6e 20 75 73 69 6e 67 20 6f 6e 6c 79 20 61 20 73  n using only a s
13f0: 69 6e 67 6c 65 20 34 6b 20 61 6c 6c 6f 63 61 3a  ingle 4k alloca:
1400: 0a 2f 2f 0a 2f 2f 20 20 20 20 20 76 6f 69 64 20  .//.//     void 
1410: 66 6f 6f 28 62 6f 6f 6c 20 76 61 72 29 20 7b 20  foo(bool var) { 
1420: 2f 2f 20 65 71 75 69 76 61 6c 65 6e 74 0a 2f 2f  // equivalent.//
1430: 20 20 20 20 20 20 20 20 20 63 68 61 72 20 78 5b           char x[
1440: 34 30 39 36 5d 3b 0a 2f 2f 20 20 20 20 20 20 20  4096];.//       
1450: 20 20 63 68 61 72 20 2a 70 3b 0a 2f 2f 20 20 20    char *p;.//   
1460: 20 20 20 20 20 20 62 61 72 28 78 2c 20 30 29 3b        bar(x, 0);
1470: 0a 2f 2f 20 20 20 20 20 20 20 20 20 69 66 20 28  .//         if (
1480: 76 61 72 29 20 7b 0a 2f 2f 20 20 20 20 20 20 20  var) {.//       
1490: 20 20 20 20 20 20 70 20 3d 20 78 3b 0a 2f 2f 20        p = x;.// 
14a0: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
14b0: 0a 2f 2f 20 20 20 20 20 20 20 20 20 20 20 20 20  .//             
14c0: 62 61 72 28 78 2c 20 31 29 3b 0a 2f 2f 20 20 20  bar(x, 1);.//   
14d0: 20 20 20 20 20 20 20 20 20 20 70 20 3d 20 78 20            p = x 
14e0: 2b 20 31 30 32 34 3b 0a 2f 2f 20 20 20 20 20 20  + 1024;.//      
14f0: 20 20 20 7d 0a 2f 2f 20 20 20 20 20 20 20 20 20     }.//         
1500: 62 61 72 28 70 2c 20 32 29 3b 0a 2f 2f 20 20 20  bar(p, 2);.//   
1510: 20 20 7d 0a 2f 2f 0a 2f 2f 20 54 68 69 73 20 69    }.//.// This i
1520: 73 20 61 6e 20 69 6d 70 6f 72 74 61 6e 74 20 6f  s an important o
1530: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 66 20 77  ptimization if w
1540: 65 20 77 61 6e 74 20 73 74 61 63 6b 20 73 70 61  e want stack spa
1550: 63 65 20 74 6f 20 62 65 20 75 6e 64 65 72 0a 2f  ce to be under./
1560: 2f 20 63 6f 6e 74 72 6f 6c 20 69 6e 20 6c 61 72  / control in lar
1570: 67 65 20 66 75 6e 63 74 69 6f 6e 73 2c 20 62 6f  ge functions, bo
1580: 74 68 20 6f 70 65 6e 2d 63 6f 64 65 64 20 6f 6e  th open-coded on
1590: 65 73 20 61 6e 64 20 6f 6e 65 73 20 63 72 65 61  es and ones crea
15a0: 74 65 64 20 62 79 0a 2f 2f 20 69 6e 6c 69 6e 69  ted by.// inlini
15b0: 6e 67 2e 0a 2f 2f 0a 2f 2f 20 49 6d 70 6c 65 6d  ng..//.// Implem
15c0: 65 6e 74 61 74 69 6f 6e 20 4e 6f 74 65 73 3a 0a  entation Notes:.
15d0: 2f 2f 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  // -------------
15e0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 2f 2f 0a 2f 2f 20 41  --------.//.// A
15f0: 6e 20 69 6d 70 6f 72 74 61 6e 74 20 70 61 72 74  n important part
1600: 20 6f 66 20 74 68 65 20 61 62 6f 76 65 20 72 65   of the above re
1610: 61 73 6f 6e 69 6e 67 20 69 73 20 74 68 61 74 20  asoning is that 
1620: 60 7a 60 20 63 61 6e 27 74 20 62 65 20 61 63 63  `z` can't be acc
1630: 65 73 73 65 64 0a 2f 2f 20 77 68 69 6c 65 20 74  essed.// while t
1640: 68 65 20 6c 61 74 74 65 72 20 32 20 63 61 6c 6c  he latter 2 call
1650: 73 20 74 6f 20 60 62 61 72 60 20 61 72 65 20 72  s to `bar` are r
1660: 75 6e 6e 69 6e 67 2e 20 54 68 69 73 20 69 73 20  unning. This is 
1670: 6a 75 73 74 69 66 69 65 64 20 62 65 63 61 75 73  justified becaus
1680: 65 0a 2f 2f 20 60 7a 60 27 73 20 6c 69 66 65 74  e.// `z`'s lifet
1690: 69 6d 65 20 69 73 20 6f 76 65 72 20 61 66 74 65  ime is over afte
16a0: 72 20 77 65 20 65 78 69 74 20 66 72 6f 6d 20 62  r we exit from b
16b0: 6c 6f 63 6b 20 60 41 3a 60 2c 20 73 6f 20 61 6e  lock `A:`, so an
16c0: 79 20 66 75 72 74 68 65 72 0a 2f 2f 20 61 63 63  y further.// acc
16d0: 65 73 73 65 73 20 74 6f 20 69 74 20 77 6f 75 6c  esses to it woul
16e0: 64 20 62 65 20 55 42 2e 20 54 68 65 20 77 61 79  d be UB. The way
16f0: 20 77 65 20 72 65 70 72 65 73 65 6e 74 20 74 68   we represent th
1700: 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2f  is information./
1710: 2f 20 69 6e 20 4c 4c 56 4d 20 69 73 20 62 79 20  / in LLVM is by 
1720: 68 61 76 69 6e 67 20 66 72 6f 6e 74 65 6e 64 73  having frontends
1730: 20 64 65 6c 69 6d 69 74 20 62 6c 6f 63 6b 73 20   delimit blocks 
1740: 77 69 74 68 20 60 6c 69 66 65 74 69 6d 65 2e 73  with `lifetime.s
1750: 74 61 72 74 60 0a 2f 2f 20 61 6e 64 20 60 6c 69  tart`.// and `li
1760: 66 65 74 69 6d 65 2e 65 6e 64 60 20 69 6e 74 72  fetime.end` intr
1770: 69 6e 73 69 63 73 2e 0a 2f 2f 0a 2f 2f 20 54 68  insics..//.// Th
1780: 65 20 65 66 66 65 63 74 20 6f 66 20 74 68 65 73  e effect of thes
1790: 65 20 69 6e 74 72 69 6e 73 69 63 73 20 73 65 65  e intrinsics see
17a0: 6d 73 20 74 6f 20 62 65 20 61 73 20 66 6f 6c 6c  ms to be as foll
17b0: 6f 77 73 20 28 6d 61 79 62 65 20 49 20 73 68 6f  ows (maybe I sho
17c0: 75 6c 64 0a 2f 2f 20 73 70 65 63 69 66 79 20 74  uld.// specify t
17d0: 68 69 73 20 69 6e 20 74 68 65 20 72 65 66 65 72  his in the refer
17e0: 65 6e 63 65 3f 29 3a 0a 2f 2f 0a 2f 2f 20 20 20  ence?):.//.//   
17f0: 4c 31 29 20 61 74 20 73 74 61 72 74 2c 20 65 61  L1) at start, ea
1800: 63 68 20 73 74 61 63 6b 2d 73 6c 6f 74 20 69 73  ch stack-slot is
1810: 20 6d 61 72 6b 65 64 20 61 73 20 2a 6f 75 74 2d   marked as *out-
1820: 6f 66 2d 73 63 6f 70 65 2a 2c 20 75 6e 6c 65 73  of-scope*, unles
1830: 73 20 6e 6f 0a 2f 2f 20 20 20 6c 69 66 65 74 69  s no.//   lifeti
1840: 6d 65 20 69 6e 74 72 69 6e 73 69 63 20 72 65 66  me intrinsic ref
1850: 65 72 73 20 74 6f 20 74 68 61 74 20 73 74 61 63  ers to that stac
1860: 6b 20 73 6c 6f 74 2c 20 69 6e 20 77 68 69 63 68  k slot, in which
1870: 20 63 61 73 65 0a 2f 2f 20 20 20 69 74 20 69 73   case.//   it is
1880: 20 6d 61 72 6b 65 64 20 61 73 20 2a 69 6e 2d 73   marked as *in-s
1890: 63 6f 70 65 2a 2e 0a 2f 2f 20 20 20 4c 32 29 20  cope*..//   L2) 
18a0: 6f 6e 20 61 20 60 6c 69 66 65 74 69 6d 65 2e 73  on a `lifetime.s
18b0: 74 61 72 74 60 2c 20 61 20 73 74 61 63 6b 20 73  tart`, a stack s
18c0: 6c 6f 74 20 69 73 20 6d 61 72 6b 65 64 20 61 73  lot is marked as
18d0: 20 2a 69 6e 2d 73 63 6f 70 65 2a 20 61 6e 64 0a   *in-scope* and.
18e0: 2f 2f 20 20 20 74 68 65 20 73 74 61 63 6b 20 73  //   the stack s
18f0: 6c 6f 74 20 69 73 20 6f 76 65 72 77 72 69 74 74  lot is overwritt
1900: 65 6e 20 77 69 74 68 20 60 75 6e 64 65 66 60 2e  en with `undef`.
1910: 0a 2f 2f 20 20 20 4c 33 29 20 6f 6e 20 61 20 60  .//   L3) on a `
1920: 6c 69 66 65 74 69 6d 65 2e 65 6e 64 60 2c 20 61  lifetime.end`, a
1930: 20 73 74 61 63 6b 20 73 6c 6f 74 20 69 73 20 6d   stack slot is m
1940: 61 72 6b 65 64 20 61 73 20 2a 6f 75 74 2d 6f 66  arked as *out-of
1950: 2d 73 63 6f 70 65 2a 2e 0a 2f 2f 20 20 20 4c 34  -scope*..//   L4
1960: 29 20 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 65 78  ) on function ex
1970: 69 74 2c 20 61 6c 6c 20 73 74 61 63 6b 20 73 6c  it, all stack sl
1980: 6f 74 73 20 61 72 65 20 6d 61 72 6b 65 64 20 61  ots are marked a
1990: 73 20 2a 6f 75 74 2d 6f 66 2d 73 63 6f 70 65 2a  s *out-of-scope*
19a0: 2e 0a 2f 2f 20 20 20 4c 35 29 20 60 6c 69 66 65  ..//   L5) `life
19b0: 74 69 6d 65 2e 65 6e 64 60 20 69 73 20 61 20 6e  time.end` is a n
19c0: 6f 2d 6f 70 20 77 68 65 6e 20 63 61 6c 6c 65 64  o-op when called
19d0: 20 6f 6e 20 61 20 73 6c 6f 74 20 74 68 61 74 20   on a slot that 
19e0: 69 73 20 61 6c 72 65 61 64 79 0a 2f 2f 20 20 20  is already.//   
19f0: 2a 6f 75 74 2d 6f 66 2d 73 63 6f 70 65 2a 2e 0a  *out-of-scope*..
1a00: 2f 2f 20 20 20 4c 36 29 20 6d 65 6d 6f 72 79 20  //   L6) memory 
1a10: 61 63 63 65 73 73 65 73 20 74 6f 20 2a 6f 75 74  accesses to *out
1a20: 2d 6f 66 2d 73 63 6f 70 65 2a 20 73 74 61 63 6b  -of-scope* stack
1a30: 20 73 6c 6f 74 73 20 61 72 65 20 55 42 2e 0a 2f   slots are UB../
1a40: 2f 20 20 20 4c 37 29 20 77 68 65 6e 20 61 20 73  /   L7) when a s
1a50: 74 61 63 6b 2d 73 6c 6f 74 20 69 73 20 6d 61 72  tack-slot is mar
1a60: 6b 65 64 20 61 73 20 2a 6f 75 74 2d 6f 66 2d 73  ked as *out-of-s
1a70: 63 6f 70 65 2a 2c 20 61 6c 6c 20 70 6f 69 6e 74  cope*, all point
1a80: 65 72 73 20 74 6f 20 69 74 0a 2f 2f 20 20 20 61  ers to it.//   a
1a90: 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 2c 20  re invalidated, 
1aa0: 75 6e 6c 65 73 73 20 74 68 65 20 73 6c 6f 74 20  unless the slot 
1ab0: 69 73 20 22 64 65 67 65 6e 65 72 61 74 65 22 2e  is "degenerate".
1ac0: 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f   This is used to
1ad0: 0a 2f 2f 20 20 20 6a 75 73 74 69 66 79 20 6e 6f  .//   justify no
1ae0: 74 20 6d 61 72 6b 69 6e 67 20 73 6c 6f 74 73 20  t marking slots 
1af0: 61 73 20 69 6e 2d 75 73 65 20 75 6e 74 69 6c 20  as in-use until 
1b00: 74 68 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  the pointer to t
1b10: 68 65 6d 20 69 73 0a 2f 2f 20 20 20 75 73 65 64  hem is.//   used
1b20: 2c 20 62 75 74 20 66 65 65 6c 73 20 61 20 62 69  , but feels a bi
1b30: 74 20 68 61 63 6b 79 20 69 6e 20 74 68 65 20 70  t hacky in the p
1b40: 72 65 73 65 6e 63 65 20 6f 66 20 74 68 69 6e 67  resence of thing
1b50: 73 20 6c 69 6b 65 20 4c 49 43 4d 2e 20 53 65 65  s like LICM. See
1b60: 0a 2f 2f 20 20 20 74 68 65 20 22 44 65 67 65 6e  .//   the "Degen
1b70: 65 72 61 74 65 20 53 6c 6f 74 73 22 20 73 65 63  erate Slots" sec
1b80: 74 69 6f 6e 20 66 6f 72 20 6d 6f 72 65 20 64 65  tion for more de
1b90: 74 61 69 6c 73 2e 0a 2f 2f 0a 2f 2f 20 4e 6f 77  tails..//.// Now
1ba0: 2c 20 6c 65 74 27 73 20 67 72 6f 75 6e 64 20 73  , let's ground s
1bb0: 74 61 63 6b 20 63 6f 6c 6f 72 69 6e 67 20 6f 6e  tack coloring on
1bc0: 20 74 68 65 73 65 20 72 75 6c 65 73 2e 20 57 65   these rules. We
1bd0: 27 6c 6c 20 64 65 66 69 6e 65 20 61 20 73 6c 6f  'll define a slo
1be0: 74 0a 2f 2f 20 61 73 20 2a 69 6e 2d 75 73 65 2a  t.// as *in-use*
1bf0: 20 61 74 20 61 20 28 64 79 6e 61 6d 69 63 29 20   at a (dynamic) 
1c00: 70 6f 69 6e 74 20 69 6e 20 65 78 65 63 75 74 69  point in executi
1c10: 6f 6e 20 69 66 20 69 74 20 65 69 74 68 65 72 20  on if it either 
1c20: 63 61 6e 20 62 65 0a 2f 2f 20 77 72 69 74 74 65  can be.// writte
1c30: 6e 20 74 6f 20 61 74 20 74 68 61 74 20 70 6f 69  n to at that poi
1c40: 6e 74 2c 20 6f 72 20 69 66 20 69 74 20 68 61 73  nt, or if it has
1c50: 20 61 20 6c 69 76 65 20 61 6e 64 20 6e 6f 6e 2d   a live and non-
1c60: 75 6e 64 65 66 20 63 6f 6e 74 65 6e 74 0a 2f 2f  undef content.//
1c70: 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a   at that point..
1c80: 2f 2f 0a 2f 2f 20 4f 62 76 69 6f 75 73 6c 79 2c  //.// Obviously,
1c90: 20 73 6c 6f 74 73 20 74 68 61 74 20 61 72 65 20   slots that are 
1ca0: 6e 65 76 65 72 20 2a 69 6e 2d 75 73 65 2a 20 74  never *in-use* t
1cb0: 6f 67 65 74 68 65 72 20 63 61 6e 20 62 65 20 6d  ogether can be m
1cc0: 65 72 67 65 64 2c 20 61 6e 64 0a 2f 2f 20 69 6e  erged, and.// in
1cd0: 20 6f 75 72 20 65 78 61 6d 70 6c 65 20 60 66 6f   our example `fo
1ce0: 6f 60 2c 20 74 68 65 20 73 6c 6f 74 73 20 66 6f  o`, the slots fo
1cf0: 72 20 60 78 60 2c 20 60 79 60 20 61 6e 64 20 60  r `x`, `y` and `
1d00: 7a 60 20 61 72 65 20 6e 65 76 65 72 0a 2f 2f 20  z` are never.// 
1d10: 69 6e 2d 75 73 65 20 74 6f 67 65 74 68 65 72 20  in-use together 
1d20: 28 6f 66 20 63 6f 75 72 73 65 2c 20 73 6f 6d 65  (of course, some
1d30: 74 69 6d 65 73 20 73 6c 6f 74 73 20 74 68 61 74  times slots that
1d40: 20 2a 61 72 65 2a 20 69 6e 2d 75 73 65 20 74 6f   *are* in-use to
1d50: 67 65 74 68 65 72 0a 2f 2f 20 6d 69 67 68 74 20  gether.// might 
1d60: 73 74 69 6c 6c 20 62 65 20 6d 65 72 67 61 62 6c  still be mergabl
1d70: 65 2c 20 62 75 74 20 77 65 20 64 6f 6e 27 74 20  e, but we don't 
1d80: 63 61 72 65 20 61 62 6f 75 74 20 74 68 61 74 20  care about that 
1d90: 68 65 72 65 29 2e 0a 2f 2f 0a 2f 2f 20 49 6e 20  here)..//.// In 
1da0: 74 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74  this implementat
1db0: 69 6f 6e 2c 20 77 65 20 73 75 63 63 65 73 73 69  ion, we successi
1dc0: 76 65 6c 79 20 6d 65 72 67 65 20 70 61 69 72 73  vely merge pairs
1dd0: 20 6f 66 20 73 6c 6f 74 73 20 74 68 61 74 20 61   of slots that a
1de0: 72 65 0a 2f 2f 20 6e 6f 74 20 2a 69 6e 2d 75 73  re.// not *in-us
1df0: 65 2a 20 74 6f 67 65 74 68 65 72 2e 20 57 65 20  e* together. We 
1e00: 63 6f 75 6c 64 20 62 65 20 73 6d 61 72 74 65 72  could be smarter
1e10: 20 2d 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20   - for example, 
1e20: 77 65 20 63 6f 75 6c 64 20 6d 65 72 67 65 0a 2f  we could merge./
1e30: 2f 20 61 20 73 69 6e 67 6c 65 20 6c 61 72 67 65  / a single large
1e40: 20 73 6c 6f 74 20 77 69 74 68 20 32 20 73 6d 61   slot with 2 sma
1e50: 6c 6c 20 73 6c 6f 74 73 2c 20 6f 72 20 77 65 20  ll slots, or we 
1e60: 63 6f 75 6c 64 20 63 6f 6e 73 74 72 75 63 74 20  could construct 
1e70: 74 68 65 0a 2f 2f 20 69 6e 74 65 72 66 65 72 65  the.// interfere
1e80: 6e 63 65 20 67 72 61 70 68 20 61 6e 64 20 72 75  nce graph and ru
1e90: 6e 20 61 20 22 73 6d 61 72 74 22 20 67 72 61 70  n a "smart" grap
1ea0: 68 20 63 6f 6c 6f 72 69 6e 67 20 61 6c 67 6f 72  h coloring algor
1eb0: 69 74 68 6d 2c 20 62 75 74 20 77 69 74 68 0a 2f  ithm, but with./
1ec0: 2f 20 74 68 61 74 20 61 73 69 64 65 2c 20 68 6f  / that aside, ho
1ed0: 77 20 64 6f 20 77 65 20 66 69 6e 64 20 6f 75 74  w do we find out
1ee0: 20 77 68 65 74 68 65 72 20 61 20 70 61 69 72 20   whether a pair 
1ef0: 6f 66 20 73 6c 6f 74 73 20 6d 69 67 68 74 20 62  of slots might b
1f00: 65 20 2a 69 6e 2d 75 73 65 2a 0a 2f 2f 20 74 6f  e *in-use*.// to
1f10: 67 65 74 68 65 72 3f 0a 2f 2f 0a 2f 2f 20 46 72  gether?.//.// Fr
1f20: 6f 6d 20 6f 75 72 20 72 75 6c 65 73 2c 20 77 65  om our rules, we
1f30: 20 73 65 65 20 74 68 61 74 20 2a 6f 75 74 2d 6f   see that *out-o
1f40: 66 2d 73 63 6f 70 65 2a 20 73 6c 6f 74 73 20 61  f-scope* slots a
1f50: 72 65 20 6e 65 76 65 72 20 2a 69 6e 2d 75 73 65  re never *in-use
1f60: 2a 2c 0a 2f 2f 20 61 6e 64 20 66 72 6f 6d 20 28  *,.// and from (
1f70: 4c 37 29 20 77 65 20 73 65 65 20 74 68 61 74 20  L7) we see that 
1f80: 22 6e 6f 6e 2d 64 65 67 65 6e 65 72 61 74 65 22  "non-degenerate"
1f90: 20 73 6c 6f 74 73 20 72 65 6d 61 69 6e 20 6e 6f   slots remain no
1fa0: 6e 2d 2a 69 6e 2d 75 73 65 2a 0a 2f 2f 20 75 6e  n-*in-use*.// un
1fb0: 74 69 6c 20 74 68 65 69 72 20 61 64 64 72 65 73  til their addres
1fc0: 73 20 69 73 20 74 61 6b 65 6e 2e 20 54 68 65 72  s is taken. Ther
1fd0: 65 66 6f 72 65 2c 20 77 65 20 63 61 6e 20 61 70  efore, we can ap
1fe0: 70 72 6f 78 69 6d 61 74 65 20 73 6c 6f 74 20 61  proximate slot a
1ff0: 63 74 69 76 69 74 79 0a 2f 2f 20 75 73 69 6e 67  ctivity.// using
2000: 20 64 61 74 61 66 6c 6f 77 2e 0a 2f 2f 0a 2f 2f   dataflow..//.//
2010: 20 41 20 73 75 62 74 6c 65 20 70 6f 69 6e 74 3a   A subtle point:
2020: 20 6e 61 69 76 65 6c 79 2c 20 77 65 20 6d 69 67   naively, we mig
2030: 68 74 20 74 72 79 20 74 6f 20 66 69 67 75 72 65  ht try to figure
2040: 20 6f 75 74 20 77 68 69 63 68 20 70 61 69 72 73   out which pairs
2050: 20 6f 66 0a 2f 2f 20 73 74 61 63 6b 2d 73 6c 6f   of.// stack-slo
2060: 74 73 20 69 6e 74 65 72 66 65 72 65 20 62 79 20  ts interfere by 
2070: 70 72 6f 70 61 67 61 74 69 6e 67 20 60 53 20 69  propagating `S i
2080: 6e 2d 75 73 65 60 20 74 68 72 6f 75 67 68 20 74  n-use` through t
2090: 68 65 20 43 46 47 20 66 6f 72 20 65 76 65 72 79  he CFG for every
20a0: 0a 2f 2f 20 73 74 61 63 6b 2d 73 6c 6f 74 20 60  .// stack-slot `
20b0: 53 60 2c 20 61 6e 64 20 68 61 76 69 6e 67 20 60  S`, and having `
20c0: 53 60 20 61 6e 64 20 60 54 60 20 69 6e 74 65 72  S` and `T` inter
20d0: 66 65 72 65 20 69 66 20 74 68 65 72 65 20 69 73  fere if there is
20e0: 20 61 20 43 46 47 20 70 6f 69 6e 74 20 69 6e 0a   a CFG point in.
20f0: 2f 2f 20 77 68 69 63 68 20 74 68 65 79 20 61 72  // which they ar
2100: 65 20 62 6f 74 68 20 2a 69 6e 2d 75 73 65 2a 2e  e both *in-use*.
2110: 0a 2f 2f 0a 2f 2f 20 54 68 61 74 20 69 73 20 73  .//.// That is s
2120: 6f 75 6e 64 2c 20 62 75 74 20 6f 76 65 72 6c 79  ound, but overly
2130: 20 63 6f 6e 73 65 72 76 61 74 69 76 65 20 69 6e   conservative in
2140: 20 73 6f 6d 65 20 63 61 73 65 73 3a 20 69 6e 20   some cases: in 
2150: 6f 75 72 20 28 61 72 74 69 66 69 63 69 61 6c 29  our (artificial)
2160: 0a 2f 2f 20 65 78 61 6d 70 6c 65 20 60 66 6f 6f  .// example `foo
2170: 60 2c 20 65 69 74 68 65 72 20 60 78 60 20 6f 72  `, either `x` or
2180: 20 60 79 60 20 6d 69 67 68 74 20 62 65 20 69 6e   `y` might be in
2190: 20 75 73 65 20 61 74 20 74 68 65 20 6c 61 62 65   use at the labe
21a0: 6c 20 60 42 3a 60 2c 20 62 75 74 0a 2f 2f 20 61  l `B:`, but.// a
21b0: 73 20 60 78 60 20 69 73 20 6f 6e 6c 79 20 69 6e  s `x` is only in
21c0: 20 75 73 65 20 69 66 20 77 65 20 63 61 6d 65 20   use if we came 
21d0: 69 6e 20 66 72 6f 6d 20 74 68 65 20 60 76 61 72  in from the `var
21e0: 60 20 65 64 67 65 20 61 6e 64 20 60 79 60 20 6f  ` edge and `y` o
21f0: 6e 6c 79 0a 2f 2f 20 69 66 20 77 65 20 63 61 6d  nly.// if we cam
2200: 65 20 66 72 6f 6d 20 74 68 65 20 60 21 76 61 72  e from the `!var
2210: 60 20 65 64 67 65 2c 20 74 68 65 79 20 73 74 69  ` edge, they sti
2220: 6c 6c 20 63 61 6e 27 74 20 62 65 20 69 6e 20 75  ll can't be in u
2230: 73 65 20 74 6f 67 65 74 68 65 72 2e 0a 2f 2f 20  se together..// 
2240: 53 65 65 20 50 52 33 32 34 38 38 20 66 6f 72 20  See PR32488 for 
2250: 61 6e 20 69 6d 70 6f 72 74 61 6e 74 20 72 65 61  an important rea
2260: 6c 2d 6c 69 66 65 20 63 61 73 65 2e 0a 2f 2f 0a  l-life case..//.
2270: 2f 2f 20 49 66 20 77 65 20 77 61 6e 74 65 64 20  // If we wanted 
2280: 74 6f 20 66 69 6e 64 20 61 6c 6c 20 70 6f 69 6e  to find all poin
2290: 74 73 20 6f 66 20 69 6e 74 65 72 66 65 72 65 6e  ts of interferen
22a0: 63 65 20 70 72 65 63 69 73 65 6c 79 2c 20 77 65  ce precisely, we
22b0: 20 63 6f 75 6c 64 0a 2f 2f 20 70 72 6f 70 61 67   could.// propag
22c0: 61 74 65 20 60 53 20 69 6e 2d 75 73 65 60 20 61  ate `S in-use` a
22d0: 6e 64 20 60 53 26 54 20 69 6e 2d 75 73 65 60 20  nd `S&T in-use` 
22e0: 70 72 65 64 69 63 61 74 65 73 20 74 68 72 6f 75  predicates throu
22f0: 67 68 20 74 68 65 20 43 46 47 2e 20 54 68 61 74  gh the CFG. That
2300: 0a 2f 2f 20 77 6f 75 6c 64 20 62 65 20 70 72 65  .// would be pre
2310: 63 69 73 65 2c 20 62 75 74 20 72 65 71 75 69 72  cise, but requir
2320: 65 73 20 70 72 6f 70 61 67 61 74 69 6e 67 20 60  es propagating `
2330: 4f 28 6e 5e 32 29 60 20 64 61 74 61 66 6c 6f 77  O(n^2)` dataflow
2340: 20 66 61 63 74 73 2e 0a 2f 2f 0a 2f 2f 20 48 6f   facts..//.// Ho
2350: 77 65 76 65 72 2c 20 77 65 20 61 72 65 6e 27 74  wever, we aren't
2360: 20 69 6e 74 65 72 65 73 74 65 64 20 69 6e 20 74   interested in t
2370: 68 65 20 2a 73 65 74 2a 20 6f 66 20 70 6f 69 6e  he *set* of poin
2380: 74 73 20 6f 66 20 69 6e 74 65 72 66 65 72 65 6e  ts of interferen
2390: 63 65 0a 2f 2f 20 62 65 74 77 65 65 6e 20 32 20  ce.// between 2 
23a0: 73 74 61 63 6b 20 73 6c 6f 74 73 2c 20 6f 6e 6c  stack slots, onl
23b0: 79 20 2a 77 68 65 74 68 65 72 2a 20 74 68 65 72  y *whether* ther
23c0: 65 20 2a 69 73 2a 20 73 75 63 68 20 61 20 70 6f  e *is* such a po
23d0: 69 6e 74 2e 20 53 6f 20 77 65 0a 2f 2f 20 63 61  int. So we.// ca
23e0: 6e 20 72 65 6c 79 20 6f 6e 20 61 20 6c 69 74 74  n rely on a litt
23f0: 6c 65 20 74 72 69 63 6b 3a 20 66 6f 72 20 60 53  le trick: for `S
2400: 60 20 61 6e 64 20 60 54 60 20 74 6f 20 62 65 20  ` and `T` to be 
2410: 69 6e 2d 75 73 65 20 74 6f 67 65 74 68 65 72 2c  in-use together,
2420: 0a 2f 2f 20 6f 6e 65 20 6f 66 20 74 68 65 6d 20  .// one of them 
2430: 6e 65 65 64 73 20 74 6f 20 62 65 63 6f 6d 65 20  needs to become 
2440: 69 6e 2d 75 73 65 20 77 68 69 6c 65 20 74 68 65  in-use while the
2450: 20 6f 74 68 65 72 20 69 73 20 69 6e 2d 75 73 65   other is in-use
2460: 20 28 6f 72 0a 2f 2f 20 74 68 65 79 20 6d 69 67   (or.// they mig
2470: 68 74 20 62 6f 74 68 20 62 65 63 6f 6d 65 20 69  ht both become i
2480: 6e 20 75 73 65 20 73 69 6d 75 6c 74 61 6e 65 6f  n use simultaneo
2490: 75 73 6c 79 29 2e 20 57 65 20 63 61 6e 20 63 68  usly). We can ch
24a0: 65 63 6b 20 74 68 69 73 0a 2f 2f 20 62 79 20 61  eck this.// by a
24b0: 6c 73 6f 20 6b 65 65 70 69 6e 67 20 74 72 61 63  lso keeping trac
24c0: 6b 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 73 20  k of the points 
24d0: 61 74 20 77 68 69 63 68 20 61 20 73 74 61 63 6b  at which a stack
24e0: 20 73 6c 6f 74 20 6d 69 67 68 74 20 2a 73 74 61   slot might *sta
24f0: 72 74 2a 0a 2f 2f 20 62 65 69 6e 67 20 69 6e 2d  rt*.// being in-
2500: 75 73 65 2e 0a 2f 2f 0a 2f 2f 20 45 78 61 63 74  use..//.// Exact
2510: 20 66 69 72 73 74 20 75 73 65 3a 0a 2f 2f 20 2d   first use:.// -
2520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
2530: 2f 2f 0a 2f 2f 20 43 6f 6e 73 69 64 65 72 20 74  //.// Consider t
2540: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 6f 74  he following mot
2550: 69 76 61 74 69 6e 67 20 65 78 61 6d 70 6c 65 3a  ivating example:
2560: 0a 2f 2f 0a 2f 2f 20 20 20 20 20 69 6e 74 20 66  .//.//     int f
2570: 6f 6f 28 29 20 7b 0a 2f 2f 20 20 20 20 20 20 20  oo() {.//       
2580: 63 68 61 72 20 62 31 5b 31 30 32 34 5d 2c 20 62  char b1[1024], b
2590: 32 5b 31 30 32 34 5d 3b 0a 2f 2f 20 20 20 20 20  2[1024];.//     
25a0: 20 20 69 66 20 28 2e 2e 2e 29 20 7b 0a 2f 2f 20    if (...) {.// 
25b0: 20 20 20 20 20 20 20 20 63 68 61 72 20 62 33 5b          char b3[
25c0: 31 30 32 34 5d 3b 0a 2f 2f 20 20 20 20 20 20 20  1024];.//       
25d0: 20 20 3c 75 73 65 73 20 6f 66 20 62 31 2c 20 62    <uses of b1, b
25e0: 33 3e 3b 0a 2f 2f 20 20 20 20 20 20 20 20 20 72  3>;.//         r
25f0: 65 74 75 72 6e 20 78 3b 0a 2f 2f 20 20 20 20 20  eturn x;.//     
2600: 20 20 7d 20 65 6c 73 65 20 7b 0a 2f 2f 20 20 20    } else {.//   
2610: 20 20 20 20 20 20 63 68 61 72 20 62 34 5b 31 30        char b4[10
2620: 32 34 5d 2c 20 62 35 5b 31 30 32 34 5d 3b 0a 2f  24], b5[1024];./
2630: 2f 20 20 20 20 20 20 20 20 20 3c 75 73 65 73 20  /         <uses 
2640: 6f 66 20 62 32 2c 20 62 34 2c 20 62 35 3e 3b 0a  of b2, b4, b5>;.
2650: 2f 2f 20 20 20 20 20 20 20 20 20 72 65 74 75 72  //         retur
2660: 6e 20 79 3b 0a 2f 2f 20 20 20 20 20 20 20 7d 0a  n y;.//       }.
2670: 2f 2f 20 20 20 20 20 7d 0a 2f 2f 0a 2f 2f 20 49  //     }.//.// I
2680: 6e 20 74 68 65 20 63 6f 64 65 20 61 62 6f 76 65  n the code above
2690: 2c 20 22 62 33 22 20 61 6e 64 20 22 62 34 22 20  , "b3" and "b4" 
26a0: 61 72 65 20 64 65 63 6c 61 72 65 64 20 69 6e 20  are declared in 
26b0: 64 69 73 74 69 6e 63 74 20 6c 65 78 69 63 61 6c  distinct lexical
26c0: 0a 2f 2f 20 73 63 6f 70 65 73 2c 20 6d 65 61 6e  .// scopes, mean
26d0: 69 6e 67 20 74 68 61 74 20 69 74 20 69 73 20 65  ing that it is e
26e0: 61 73 79 20 74 6f 20 70 72 6f 76 65 20 74 68 61  asy to prove tha
26f0: 74 20 74 68 65 79 20 63 61 6e 20 73 68 61 72 65  t they can share
2700: 20 74 68 65 0a 2f 2f 20 73 61 6d 65 20 73 74 61   the.// same sta
2710: 63 6b 20 73 6c 6f 74 2e 20 56 61 72 69 61 62 6c  ck slot. Variabl
2720: 65 73 20 22 62 31 22 20 61 6e 64 20 22 62 32 22  es "b1" and "b2"
2730: 20 61 72 65 20 64 65 63 6c 61 72 65 64 20 69 6e   are declared in
2740: 20 74 68 65 20 73 61 6d 65 0a 2f 2f 20 73 63 6f   the same.// sco
2750: 70 65 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74  pe, meaning that
2760: 20 66 72 6f 6d 20 61 20 6c 65 78 69 63 61 6c 20   from a lexical 
2770: 70 6f 69 6e 74 20 6f 66 20 76 69 65 77 2c 20 74  point of view, t
2780: 68 65 69 72 20 6c 69 66 65 74 69 6d 65 73 0a 2f  heir lifetimes./
2790: 2f 20 6f 76 65 72 6c 61 70 2e 20 46 72 6f 6d 20  / overlap. From 
27a0: 61 20 63 6f 6e 74 72 6f 6c 20 66 6c 6f 77 20 70  a control flow p
27b0: 6f 69 6e 74 65 72 20 6f 66 20 76 69 65 77 2c 20  ointer of view, 
27c0: 68 6f 77 65 76 65 72 2c 20 74 68 65 20 74 77 6f  however, the two
27d0: 0a 2f 2f 20 76 61 72 69 61 62 6c 65 73 20 61 72  .// variables ar
27e0: 65 20 61 63 63 65 73 73 65 64 20 69 6e 20 64 69  e accessed in di
27f0: 73 6a 6f 69 6e 74 20 72 65 67 69 6f 6e 73 20 6f  sjoint regions o
2800: 66 20 74 68 65 20 43 46 47 2c 20 74 68 75 73 20  f the CFG, thus 
2810: 69 74 0a 2f 2f 20 73 68 6f 75 6c 64 20 62 65 20  it.// should be 
2820: 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68 65  possible for the
2830: 6d 20 74 6f 20 73 68 61 72 65 20 74 68 65 20 73  m to share the s
2840: 61 6d 65 20 73 74 61 63 6b 20 73 6c 6f 74 2e 20  ame stack slot. 
2850: 41 6e 20 69 64 65 61 6c 0a 2f 2f 20 73 74 61 63  An ideal.// stac
2860: 6b 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 6f 72  k allocation for
2870: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 61 62   the function ab
2880: 6f 76 65 20 77 6f 75 6c 64 20 6c 6f 6f 6b 20 6c  ove would look l
2890: 69 6b 65 3a 0a 2f 2f 0a 2f 2f 20 20 20 20 20 73  ike:.//.//     s
28a0: 6c 6f 74 20 30 3a 20 62 31 2c 20 62 32 0a 2f 2f  lot 0: b1, b2.//
28b0: 20 20 20 20 20 73 6c 6f 74 20 31 3a 20 62 33 2c       slot 1: b3,
28c0: 20 62 34 0a 2f 2f 20 20 20 20 20 73 6c 6f 74 20   b4.//     slot 
28d0: 32 3a 20 62 35 0a 2f 2f 0a 2f 2f 20 41 63 68 69  2: b5.//.// Achi
28e0: 65 76 69 6e 67 20 74 68 69 73 20 61 6c 6c 6f 63  eving this alloc
28f0: 61 74 69 6f 6e 20 69 73 20 74 72 69 63 6b 79 2c  ation is tricky,
2900: 20 68 6f 77 65 76 65 72 2c 20 64 75 65 20 74 6f   however, due to
2910: 20 74 68 65 20 77 61 79 0a 2f 2f 20 6c 69 66 65   the way.// life
2920: 74 69 6d 65 20 6d 61 72 6b 65 72 73 20 61 72 65  time markers are
2930: 20 69 6e 73 65 72 74 65 64 2e 20 48 65 72 65 20   inserted. Here 
2940: 69 73 20 61 20 73 69 6d 70 6c 69 66 69 65 64 20  is a simplified 
2950: 76 69 65 77 20 6f 66 20 74 68 65 0a 2f 2f 20 63  view of the.// c
2960: 6f 6e 74 72 6f 6c 20 66 6c 6f 77 20 67 72 61 70  ontrol flow grap
2970: 68 20 66 6f 72 20 74 68 65 20 63 6f 64 65 20 61  h for the code a
2980: 62 6f 76 65 3a 0a 2f 2f 0a 2f 2f 20 20 20 20 20  bove:.//.//     
2990: 20 20 20 20 20 20 20 20 20 20 20 2b 2d 2d 2d 2d             +----
29a0: 2d 2d 20 20 62 6c 6f 63 6b 20 30 20 2d 2d 2d 2d  --  block 0 ----
29b0: 2d 2d 2d 2b 0a 2f 2f 20 20 20 20 20 20 20 20 20  ---+.//         
29c0: 20 20 20 20 20 20 30 7c 20 4c 49 46 45 54 49 4d        0| LIFETIM
29d0: 45 5f 53 54 41 52 54 20 62 31 2c 20 62 32 20 7c  E_START b1, b2 |
29e0: 0a 2f 2f 20 20 20 20 20 20 20 20 20 20 20 20 20  .//             
29f0: 20 20 31 7c 20 3c 74 65 73 74 20 27 69 66 27 20    1| <test 'if' 
2a00: 63 6f 6e 64 69 74 69 6f 6e 3e 20 7c 0a 2f 2f 20  condition> |.// 
2a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b                 +
2a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2a30: 2d 2d 2d 2d 2d 2d 2d 2b 0a 2f 2f 20 20 20 20 20  -------+.//     
2a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2e 2f                ./
2a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 2e                \.
2a60: 0a 2f 2f 20 20 20 2b 2d 2d 2d 2d 2d 2d 20 20 62  .//   +------  b
2a70: 6c 6f 63 6b 20 31 20 2d 2d 2d 2d 2d 2d 2d 2b 20  lock 1 -------+ 
2a80: 20 20 2b 2d 2d 2d 2d 2d 2d 20 20 62 6c 6f 63 6b    +------  block
2a90: 20 32 20 2d 2d 2d 2d 2d 2d 2d 2b 0a 2f 2f 20 20   2 -------+.//  
2aa0: 32 7c 20 4c 49 46 45 54 49 4d 45 5f 53 54 41 52  2| LIFETIME_STAR
2ab0: 54 20 62 33 20 20 20 20 20 7c 20 20 35 7c 20 4c  T b3     |  5| L
2ac0: 49 46 45 54 49 4d 45 5f 53 54 41 52 54 20 62 34  IFETIME_START b4
2ad0: 2c 20 62 35 20 7c 0a 2f 2f 20 20 33 7c 20 3c 75  , b5 |.//  3| <u
2ae0: 73 65 73 20 6f 66 20 62 31 2c 20 62 33 3e 20 20  ses of b1, b3>  
2af0: 20 20 20 20 7c 20 20 36 7c 20 3c 75 73 65 73 20      |  6| <uses 
2b00: 6f 66 20 62 32 2c 20 62 34 2c 20 62 35 3e 20 20  of b2, b4, b5>  
2b10: 7c 0a 2f 2f 20 20 34 7c 20 4c 49 46 45 54 49 4d  |.//  4| LIFETIM
2b20: 45 5f 45 4e 44 20 62 33 20 20 20 20 20 20 20 7c  E_END b3       |
2b30: 20 20 37 7c 20 4c 49 46 45 54 49 4d 45 5f 45 4e    7| LIFETIME_EN
2b40: 44 20 62 34 2c 20 62 35 20 20 20 7c 0a 2f 2f 20  D b4, b5   |.// 
2b50: 20 20 2b 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    +-------------
2b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2b 20 20 20 2b 2d  ----------+   +-
2b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b80: 2d 2d 2d 2d 2d 2d 2b 0a 2f 2f 20 20 20 20 20 20  ------+.//      
2b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 2e 20               \. 
2ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2e 0a               /..
2bb0: 2f 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  //              
2bc0: 20 20 2b 2d 2d 2d 2d 2d 2d 20 20 62 6c 6f 63 6b    +------  block
2bd0: 20 33 20 2d 2d 2d 2d 2d 2d 2d 2b 0a 2f 2f 20 20   3 -------+.//  
2be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 38 7c 20               8| 
2bf0: 3c 63 6c 65 61 6e 75 70 63 6f 64 65 3e 20 20 20  <cleanupcode>   
2c00: 20 20 20 20 20 20 7c 0a 2f 2f 20 20 20 20 20 20        |.//      
2c10: 20 20 20 20 20 20 20 20 20 39 7c 20 4c 49 46 45           9| LIFE
2c20: 54 49 4d 45 5f 45 4e 44 20 62 31 2c 20 62 32 20  TIME_END b1, b2 
2c30: 20 20 7c 0a 2f 2f 20 20 20 20 20 20 20 20 20 20    |.//          
2c40: 20 20 20 20 31 30 7c 20 72 65 74 75 72 6e 20 20      10| return  
2c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a                |.
2c60: 2f 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  //              
2c70: 20 20 2b 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    +-------------
2c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2b 0a 2f 2f 0a 2f  ----------+.//./
2c90: 2f 20 49 66 20 77 65 20 63 72 65 61 74 65 20 6c  / If we create l
2ca0: 69 76 65 20 69 6e 74 65 72 76 61 6c 73 20 66 6f  ive intervals fo
2cb0: 72 20 74 68 65 20 76 61 72 69 61 62 6c 65 73 20  r the variables 
2cc0: 61 62 6f 76 65 20 73 74 72 69 63 74 6c 79 20 62  above strictly b
2cd0: 61 73 65 64 0a 2f 2f 20 6f 6e 20 74 68 65 20 6c  ased.// on the l
2ce0: 69 66 65 74 69 6d 65 20 6d 61 72 6b 65 72 73 2c  ifetime markers,
2cf0: 20 77 65 27 6c 6c 20 67 65 74 20 74 68 65 20 73   we'll get the s
2d00: 65 74 20 6f 66 20 69 6e 74 65 72 76 61 6c 73 20  et of intervals 
2d10: 6f 6e 20 74 68 65 0a 2f 2f 20 6c 65 66 74 2e 20  on the.// left. 
2d20: 49 66 20 77 65 20 69 67 6e 6f 72 65 20 74 68 65  If we ignore the
2d30: 20 6c 69 66 65 74 69 6d 65 20 73 74 61 72 74 20   lifetime start 
2d40: 6d 61 72 6b 65 72 73 20 61 6e 64 20 69 6e 73 74  markers and inst
2d50: 65 61 64 20 74 72 65 61 74 20 61 0a 2f 2f 20 76  ead treat a.// v
2d60: 61 72 69 61 62 6c 65 27 73 20 6c 69 66 65 74 69  ariable's lifeti
2d70: 6d 65 20 61 73 20 62 65 67 69 6e 6e 69 6e 67 20  me as beginning 
2d80: 77 69 74 68 20 74 68 65 20 66 69 72 73 74 20 72  with the first r
2d90: 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 0a  eference to the.
2da0: 2f 2f 20 76 61 72 2c 20 74 68 65 6e 20 77 65 20  // var, then we 
2db0: 67 65 74 20 74 68 65 20 69 6e 74 65 72 76 61 6c  get the interval
2dc0: 73 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2e 0a  s on the right..
2dd0: 2f 2f 0a 2f 2f 20 20 20 20 20 20 20 20 20 20 20  //.//           
2de0: 20 4c 49 46 45 54 49 4d 45 5f 53 54 41 52 54 20   LIFETIME_START 
2df0: 20 20 20 20 20 46 69 72 73 74 20 55 73 65 0a 2f       First Use./
2e00: 2f 20 20 20 20 20 62 31 3a 20 20 20 20 5b 30 2c  /     b1:    [0,
2e10: 39 5d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  9]              
2e20: 20 5b 33 2c 34 5d 20 5b 38 2c 39 5d 0a 2f 2f 20   [3,4] [8,9].// 
2e30: 20 20 20 20 62 32 3a 20 20 20 20 5b 30 2c 39 5d      b2:    [0,9]
2e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b                 [
2e50: 36 2c 39 5d 0a 2f 2f 20 20 20 20 20 62 33 3a 20  6,9].//     b3: 
2e60: 20 20 20 5b 32 2c 34 5d 20 20 20 20 20 20 20 20     [2,4]        
2e70: 20 20 20 20 20 20 20 5b 33 2c 34 5d 0a 2f 2f 20         [3,4].// 
2e80: 20 20 20 20 62 34 3a 20 20 20 20 5b 35 2c 37 5d      b4:    [5,7]
2e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b                 [
2ea0: 36 2c 37 5d 0a 2f 2f 20 20 20 20 20 62 35 3a 20  6,7].//     b5: 
2eb0: 20 20 20 5b 35 2c 37 5d 20 20 20 20 20 20 20 20     [5,7]        
2ec0: 20 20 20 20 20 20 20 5b 36 2c 37 5d 0a 2f 2f 0a         [6,7].//.
2ed0: 2f 2f 20 46 6f 72 20 74 68 65 20 69 6e 74 65 72  // For the inter
2ee0: 76 61 6c 73 20 6f 6e 20 74 68 65 20 6c 65 66 74  vals on the left
2ef0: 2c 20 74 68 65 20 62 65 73 74 20 77 65 20 63 61  , the best we ca
2f00: 6e 20 64 6f 20 69 73 20 6f 76 65 72 6c 61 70 20  n do is overlap 
2f10: 74 77 6f 0a 2f 2f 20 76 61 72 69 61 62 6c 65 73  two.// variables
2f20: 20 28 62 33 20 61 6e 64 20 62 34 2c 20 66 6f 72   (b3 and b4, for
2f30: 20 65 78 61 6d 70 6c 65 29 3b 20 74 68 69 73 20   example); this 
2f40: 67 69 76 65 73 20 75 73 20 61 20 73 74 61 63 6b  gives us a stack
2f50: 20 73 69 7a 65 20 6f 66 0a 2f 2f 20 34 2a 31 30   size of.// 4*10
2f60: 32 34 20 62 79 74 65 73 2c 20 6e 6f 74 20 69 64  24 bytes, not id
2f70: 65 61 6c 2e 20 57 68 65 6e 20 74 72 65 61 74 69  eal. When treati
2f80: 6e 67 20 66 69 72 73 74 2d 75 73 65 20 61 73 20  ng first-use as 
2f90: 74 68 65 20 73 74 61 72 74 20 6f 66 20 61 0a 2f  the start of a./
2fa0: 2f 20 6c 69 66 65 74 69 6d 65 2c 20 77 65 20 63  / lifetime, we c
2fb0: 61 6e 20 61 64 64 69 74 69 6f 6e 61 6c 6c 79 20  an additionally 
2fc0: 6f 76 65 72 6c 61 70 20 62 31 20 61 6e 64 20 62  overlap b1 and b
2fd0: 35 2c 20 67 69 76 69 6e 67 20 75 73 20 61 20 33  5, giving us a 3
2fe0: 2a 31 30 32 34 0a 2f 2f 20 62 79 74 65 20 73 74  *1024.// byte st
2ff0: 61 63 6b 20 28 62 65 74 74 65 72 29 2e 0a 2f 2f  ack (better)..//
3000: 0a 2f 2f 20 44 65 67 65 6e 65 72 61 74 65 20 53  .// Degenerate S
3010: 6c 6f 74 73 3a 0a 2f 2f 20 2d 2d 2d 2d 2d 2d 2d  lots:.// -------
3020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2f 2f 0a 2f 2f  ----------.//.//
3030: 20 52 65 6c 79 69 6e 67 20 65 6e 74 69 72 65 6c   Relying entirel
3040: 79 20 6f 6e 20 66 69 72 73 74 2d 75 73 65 20 6f  y on first-use o
3050: 66 20 73 74 61 63 6b 20 73 6c 6f 74 73 20 69 73  f stack slots is
3060: 20 70 72 6f 62 6c 65 6d 61 74 69 63 2c 0a 2f 2f   problematic,.//
3070: 20 68 6f 77 65 76 65 72 2c 20 64 75 65 20 74 6f   however, due to
3080: 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 6f   the fact that o
3090: 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 63 61 6e  ptimizations can
30a0: 20 73 6f 6d 65 74 69 6d 65 73 20 6d 69 67 72 61   sometimes migra
30b0: 74 65 0a 2f 2f 20 75 73 65 73 20 6f 66 20 61 20  te.// uses of a 
30c0: 76 61 72 69 61 62 6c 65 20 6f 75 74 73 69 64 65  variable outside
30d0: 20 6f 66 20 69 74 73 20 6c 69 66 65 74 69 6d 65   of its lifetime
30e0: 20 73 74 61 72 74 2f 65 6e 64 20 72 65 67 69 6f   start/end regio
30f0: 6e 2e 20 48 65 72 65 0a 2f 2f 20 69 73 20 61 6e  n. Here.// is an
3100: 20 65 78 61 6d 70 6c 65 3a 0a 2f 2f 0a 2f 2f 20   example:.//.// 
3110: 20 20 20 20 69 6e 74 20 62 61 72 28 29 20 7b 0a      int bar() {.
3120: 2f 2f 20 20 20 20 20 20 20 63 68 61 72 20 62 31  //       char b1
3130: 5b 31 30 32 34 5d 2c 20 62 32 5b 31 30 32 34 5d  [1024], b2[1024]
3140: 3b 0a 2f 2f 20 20 20 20 20 20 20 69 66 20 28 2e  ;.//       if (.
3150: 2e 2e 29 20 7b 0a 2f 2f 20 20 20 20 20 20 20 20  ..) {.//        
3160: 20 3c 75 73 65 73 20 6f 66 20 62 32 3e 0a 2f 2f   <uses of b2>.//
3170: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
3180: 79 3b 0a 2f 2f 20 20 20 20 20 20 20 7d 20 65 6c  y;.//       } el
3190: 73 65 20 7b 0a 2f 2f 20 20 20 20 20 20 20 20 20  se {.//         
31a0: 3c 75 73 65 73 20 6f 66 20 62 31 3e 0a 2f 2f 20  <uses of b1>.// 
31b0: 20 20 20 20 20 20 20 20 77 68 69 6c 65 20 28 2e          while (.
31c0: 2e 2e 29 20 7b 0a 2f 2f 20 20 20 20 20 20 20 20  ..) {.//        
31d0: 20 20 20 63 68 61 72 20 62 33 5b 31 30 32 34 5d     char b3[1024]
31e0: 3b 0a 2f 2f 20 20 20 20 20 20 20 20 20 20 20 3c  ;.//           <
31f0: 75 73 65 73 20 6f 66 20 62 33 3e 0a 2f 2f 20 20  uses of b3>.//  
3200: 20 20 20 20 20 20 20 7d 0a 2f 2f 20 20 20 20 20         }.//     
3210: 20 20 7d 0a 2f 2f 20 20 20 20 20 7d 0a 2f 2f 0a    }.//     }.//.
3220: 2f 2f 20 42 65 66 6f 72 65 20 6f 70 74 69 6d 69  // Before optimi
3230: 7a 61 74 69 6f 6e 2c 20 74 68 65 20 63 6f 6e 74  zation, the cont
3240: 72 6f 6c 20 66 6c 6f 77 20 67 72 61 70 68 20 66  rol flow graph f
3250: 6f 72 20 74 68 65 20 63 6f 64 65 20 61 62 6f 76  or the code abov
3260: 65 0a 2f 2f 20 6d 69 67 68 74 20 6c 6f 6f 6b 20  e.// might look 
3270: 6c 69 6b 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69  like the followi
3280: 6e 67 3a 0a 2f 2f 0a 2f 2f 20 20 20 20 20 20 20  ng:.//.//       
3290: 20 20 20 20 20 20 20 20 20 2b 2d 2d 2d 2d 2d 2d           +------
32a0: 20 20 62 6c 6f 63 6b 20 30 20 2d 2d 2d 2d 2d 2d    block 0 ------
32b0: 2d 2b 0a 2f 2f 20 20 20 20 20 20 20 20 20 20 20  -+.//           
32c0: 20 20 20 20 30 7c 20 4c 49 46 45 54 49 4d 45 5f      0| LIFETIME_
32d0: 53 54 41 52 54 20 62 31 2c 20 62 32 20 7c 0a 2f  START b1, b2 |./
32e0: 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
32f0: 31 7c 20 3c 74 65 73 74 20 27 69 66 27 20 63 6f  1| <test 'if' co
3300: 6e 64 69 74 69 6f 6e 3e 20 7c 0a 2f 2f 20 20 20  ndition> |.//   
3310: 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 2d 2d               +--
3320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3330: 2d 2d 2d 2d 2d 2b 0a 2f 2f 20 20 20 20 20 20 20  -----+.//       
3340: 20 20 20 20 20 20 20 20 20 20 20 20 2e 2f 20 20              ./  
3350: 20 20 20 20 20 20 20 20 20 20 20 20 5c 2e 0a 2f              \../
3360: 2f 20 20 20 2b 2d 2d 2d 2d 2d 2d 20 20 62 6c 6f  /   +------  blo
3370: 63 6b 20 31 20 2d 2d 2d 2d 2d 2d 2d 2b 20 20 20  ck 1 -------+   
3380: 20 2b 2d 2d 2d 2d 2d 2d 2d 20 62 6c 6f 63 6b 20   +------- block 
3390: 32 20 2d 2d 2d 2d 2d 2d 2d 2b 0a 2f 2f 20 20 32  2 -------+.//  2
33a0: 7c 20 3c 75 73 65 73 20 6f 66 20 62 32 3e 20 20  | <uses of b2>  
33b0: 20 20 20 20 20 20 20 20 7c 20 20 20 33 7c 20 3c          |   3| <
33c0: 75 73 65 73 20 6f 66 20 62 31 3e 20 20 20 20 20  uses of b1>     
33d0: 20 20 20 20 20 7c 0a 2f 2f 20 20 20 2b 2d 2d 2d       |.//   +---
33e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
33f0: 2d 2d 2d 2d 2b 20 20 20 20 2b 2d 2d 2d 2d 2d 2d  ----+    +------
3400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3410: 2d 2b 0a 2f 2f 20 20 20 20 20 20 20 20 20 20 20  -+.//           
3420: 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20     |            
3430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3440: 7c 0a 2f 2f 20 20 20 20 20 20 20 20 20 20 20 20  |.//            
3450: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
3460: 20 20 20 20 2b 2d 2d 2d 2d 2d 2d 2d 20 62 6c 6f      +------- blo
3470: 63 6b 20 33 20 2d 2d 2d 2d 2d 2d 2d 2b 20 3c 2d  ck 3 -------+ <-
3480: 5c 2e 0a 2f 2f 20 20 20 20 20 20 20 20 20 20 20  \..//           
3490: 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20     |            
34a0: 20 20 20 20 34 7c 20 3c 77 68 69 6c 65 20 63 6f      4| <while co
34b0: 6e 64 69 74 69 6f 6e 3e 20 20 20 20 20 7c 20 20  ndition>     |  
34c0: 20 20 7c 0a 2f 2f 20 20 20 20 20 20 20 20 20 20    |.//          
34d0: 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20      |           
34e0: 20 20 20 20 20 20 2b 2d 2d 2d 2d 2d 2d 2d 2d 2d        +---------
34f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2b 20  --------------+ 
3500: 20 20 20 7c 0a 2f 2f 20 20 20 20 20 20 20 20 20     |.//         
3510: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20       |          
3520: 20 20 20 20 20 2f 20 20 20 20 20 20 20 20 20 20       /          
3530: 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |               
3540: 20 20 20 20 7c 0a 2f 2f 20 20 20 20 20 20 20 20      |.//        
3550: 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20        |         
3560: 20 20 20 20 20 2f 20 20 2b 2d 2d 2d 2d 2d 2d 2d       /  +-------
3570: 20 62 6c 6f 63 6b 20 34 20 2d 2d 2d 2d 2d 2d 2d   block 4 -------
3580: 2b 0a 2f 2f 20 20 20 20 20 20 20 20 20 20 20 20  +.//            
3590: 20 20 5c 20 20 20 20 20 20 20 20 20 20 20 20 20    \             
35a0: 2f 20 20 35 7c 20 4c 49 46 45 54 49 4d 45 5f 53  /  5| LIFETIME_S
35b0: 54 41 52 54 20 62 33 20 20 20 20 20 7c 20 20 20  TART b3     |   
35c0: 20 7c 0a 2f 2f 20 20 20 20 20 20 20 20 20 20 20   |.//           
35d0: 20 20 20 20 5c 20 20 20 20 20 20 20 20 20 20 20      \           
35e0: 2f 20 20 20 36 7c 20 3c 75 73 65 73 20 6f 66 20  /   6| <uses of 
35f0: 62 33 3e 20 20 20 20 20 20 20 20 20 20 7c 20 20  b3>          |  
3600: 20 20 7c 0a 2f 2f 20 20 20 20 20 20 20 20 20 20    |.//          
3610: 20 20 20 20 20 20 5c 20 20 20 20 20 20 20 20 20        \         
3620: 2f 20 20 20 20 37 7c 20 4c 49 46 45 54 49 4d 45  /    7| LIFETIME
3630: 5f 45 4e 44 20 62 33 20 20 20 20 20 20 20 7c 20  _END b3       | 
3640: 20 20 20 7c 0a 2f 2f 20 20 20 20 20 20 20 20 20     |.//         
3650: 20 20 20 20 20 20 20 20 5c 20 20 20 20 20 20 20          \       
3660: 20 7c 20 20 20 20 2b 2d 2d 2d 2d 2d 2d 2d 2d 2d   |    +---------
3670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2b  ---------------+
3680: 20 20 20 20 7c 0a 2f 2f 20 20 20 20 20 20 20 20      |.//        
3690: 20 20 20 20 20 20 20 20 20 20 5c 20 20 20 20 20            \     
36a0: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
36b0: 20 20 20 20 5c 20 20 20 20 20 20 20 20 20 20 20      \           
36c0: 20 20 20 20 20 2f 0a 2f 2f 20 20 20 20 20 20 20       /.//       
36d0: 20 20 20 20 20 20 20 20 20 2b 2d 2d 2d 2d 2d 2d           +------
36e0: 20 20 62 6c 6f 63 6b 20 35 20 2d 2d 2d 2d 2d 2b    block 5 -----+
36f0: 20 20 20 20 20 20 5c 2d 2d 2d 2d 2d 2d 2d 2d 2d        \---------
3700: 2d 2d 2d 2d 2d 2d 0a 2f 2f 20 20 20 20 20 20 20  ------.//       
3710: 20 20 20 20 20 20 20 20 38 7c 20 3c 63 6c 65 61          8| <clea
3720: 6e 75 70 63 6f 64 65 3e 20 20 20 20 20 20 20 7c  nupcode>       |
3730: 0a 2f 2f 20 20 20 20 20 20 20 20 20 20 20 20 20  .//             
3740: 20 20 39 7c 20 4c 49 46 45 54 49 4d 45 5f 45 4e    9| LIFETIME_EN
3750: 44 20 62 31 2c 20 62 32 20 7c 0a 2f 2f 20 20 20  D b1, b2 |.//   
3760: 20 20 20 20 20 20 20 20 20 20 20 31 30 7c 20 72             10| r
3770: 65 74 75 72 6e 20 20 20 20 20 20 20 20 20 20 20  eturn           
3780: 20 20 20 7c 0a 2f 2f 20 20 20 20 20 20 20 20 20     |.//         
3790: 20 20 20 20 20 20 20 2b 2d 2d 2d 2d 2d 2d 2d 2d         +--------
37a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2b 0a 2f  -------------+./
37b0: 2f 0a 2f 2f 20 44 75 72 69 6e 67 20 6f 70 74 69  /.// During opti
37c0: 6d 69 7a 61 74 69 6f 6e 2c 20 68 6f 77 65 76 65  mization, howeve
37d0: 72 2c 20 69 74 20 63 61 6e 20 68 61 70 70 65 6e  r, it can happen
37e0: 20 74 68 61 74 20 61 6e 20 69 6e 73 74 72 75 63   that an instruc
37f0: 74 69 6f 6e 0a 2f 2f 20 63 6f 6d 70 75 74 69 6e  tion.// computin
3800: 67 20 61 6e 20 61 64 64 72 65 73 73 20 69 6e 20  g an address in 
3810: 22 62 33 22 20 28 66 6f 72 20 65 78 61 6d 70 6c  "b3" (for exampl
3820: 65 2c 20 61 20 6c 6f 6f 70 2d 69 6e 76 61 72 69  e, a loop-invari
3830: 61 6e 74 20 47 45 50 29 20 69 73 0a 2f 2f 20 68  ant GEP) is.// h
3840: 6f 69 73 74 65 64 20 75 70 20 6f 75 74 20 6f 66  oisted up out of
3850: 20 74 68 65 20 6c 6f 6f 70 20 66 72 6f 6d 20 62   the loop from b
3860: 6c 6f 63 6b 20 34 20 74 6f 20 62 6c 6f 63 6b 20  lock 4 to block 
3870: 32 2e 20 20 5b 4e 6f 74 65 20 74 68 61 74 0a 2f  2.  [Note that./
3880: 2f 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 6e  / this is not an
3890: 20 61 63 74 75 61 6c 20 6c 6f 61 64 20 66 72 6f   actual load fro
38a0: 6d 20 74 68 65 20 73 74 61 63 6b 2c 20 6f 6e 6c  m the stack, onl
38b0: 79 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e  y an instruction
38c0: 20 74 68 61 74 0a 2f 2f 20 63 6f 6d 70 75 74 65   that.// compute
38d0: 73 20 74 68 65 20 61 64 64 72 65 73 73 20 74 6f  s the address to
38e0: 20 62 65 20 6c 6f 61 64 65 64 5d 2e 20 49 66 20   be loaded]. If 
38f0: 74 68 69 73 20 68 61 70 70 65 6e 73 2c 20 74 68  this happens, th
3900: 65 72 65 20 69 73 20 6e 6f 77 20 61 0a 2f 2f 20  ere is now a.// 
3910: 70 61 74 68 20 6c 65 61 64 69 6e 67 20 66 72 6f  path leading fro
3920: 6d 20 74 68 65 20 66 69 72 73 74 20 75 73 65 20  m the first use 
3930: 6f 66 20 62 33 20 74 6f 20 74 68 65 20 72 65 74  of b3 to the ret
3940: 75 72 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a  urn instruction.
3950: 2f 2f 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  // that does not
3960: 20 65 6e 63 6f 75 6e 74 65 72 20 74 68 65 20 62   encounter the b
3970: 33 20 4c 49 46 45 54 49 4d 45 5f 45 4e 44 2c 20  3 LIFETIME_END, 
3980: 68 65 6e 63 65 20 62 33 27 73 20 6c 69 66 65 74  hence b3's lifet
3990: 69 6d 65 20 69 73 0a 2f 2f 20 6e 6f 77 20 6c 61  ime is.// now la
39a0: 72 67 65 72 20 74 68 61 6e 20 69 66 20 77 65 20  rger than if we 
39b0: 77 65 72 65 20 63 6f 6d 70 75 74 69 6e 67 20 6c  were computing l
39c0: 69 76 65 20 69 6e 74 65 72 76 61 6c 73 20 73 74  ive intervals st
39d0: 72 69 63 74 6c 79 20 62 61 73 65 64 0a 2f 2f 20  rictly based.// 
39e0: 6f 6e 20 6c 69 66 65 74 69 6d 65 20 6d 61 72 6b  on lifetime mark
39f0: 65 72 73 2e 20 49 6e 20 74 68 65 20 65 78 61 6d  ers. In the exam
3a00: 70 6c 65 20 61 62 6f 76 65 2c 20 74 68 69 73 20  ple above, this 
3a10: 6c 65 6e 67 74 68 65 6e 65 64 20 6c 69 66 65 74  lengthened lifet
3a20: 69 6d 65 0a 2f 2f 20 77 6f 75 6c 64 20 6d 65 61  ime.// would mea
3a30: 6e 20 74 68 61 74 20 69 74 20 77 6f 75 6c 64 20  n that it would 
3a40: 61 70 70 65 61 72 20 69 6c 6c 65 67 61 6c 20 74  appear illegal t
3a50: 6f 20 6f 76 65 72 6c 61 70 20 62 33 20 77 69 74  o overlap b3 wit
3a60: 68 20 62 32 2e 0a 2f 2f 0a 2f 2f 20 54 6f 20 64  h b2..//.// To d
3a70: 65 61 6c 20 77 69 74 68 20 74 68 69 73 20 73 75  eal with this su
3a80: 63 68 20 63 61 73 65 73 2c 20 74 68 65 20 63 6f  ch cases, the co
3a90: 64 65 20 69 6e 20 3a 3a 63 6f 6c 6c 65 63 74 4d  de in ::collectM
3aa0: 61 72 6b 65 72 73 28 29 20 62 65 6c 6f 77 0a 2f  arkers() below./
3ab0: 2f 20 74 72 69 65 73 20 74 6f 20 69 64 65 6e 74  / tries to ident
3ac0: 69 66 79 20 22 64 65 67 65 6e 65 72 61 74 65 22  ify "degenerate"
3ad0: 20 73 6c 6f 74 73 20 2d 2d 20 74 68 6f 73 65 20   slots -- those 
3ae0: 73 6c 6f 74 73 20 77 68 65 72 65 20 6f 6e 20 61  slots where on a
3af0: 20 73 69 6e 67 6c 65 0a 2f 2f 20 66 6f 72 77 61   single.// forwa
3b00: 72 64 20 70 61 73 73 20 74 68 72 6f 75 67 68 20  rd pass through 
3b10: 74 68 65 20 43 46 47 20 77 65 20 65 6e 63 6f 75  the CFG we encou
3b20: 6e 74 65 72 20 61 20 66 69 72 73 74 20 72 65 66  nter a first ref
3b30: 65 72 65 6e 63 65 20 74 6f 20 73 6c 6f 74 0a 2f  erence to slot./
3b40: 2f 20 4b 20 62 65 66 6f 72 65 20 77 65 20 68 69  / K before we hi
3b50: 74 20 74 68 65 20 73 6c 6f 74 20 4b 20 6c 69 66  t the slot K lif
3b60: 65 74 69 6d 65 20 73 74 61 72 74 20 6d 61 72 6b  etime start mark
3b70: 65 72 2e 20 46 6f 72 20 73 75 63 68 20 73 6c 6f  er. For such slo
3b80: 74 73 2c 0a 2f 2f 20 77 65 20 66 61 6c 6c 20 62  ts,.// we fall b
3b90: 61 63 6b 20 6f 6e 20 75 73 69 6e 67 20 74 68 65  ack on using the
3ba0: 20 6c 69 66 65 74 69 6d 65 20 73 74 61 72 74 20   lifetime start 
3bb0: 6d 61 72 6b 65 72 20 61 73 20 74 68 65 20 62 65  marker as the be
3bc0: 67 69 6e 6e 69 6e 67 20 6f 66 0a 2f 2f 20 74 68  ginning of.// th
3bd0: 65 20 76 61 72 69 61 62 6c 65 27 73 20 6c 69 66  e variable's lif
3be0: 65 74 69 6d 65 2e 20 20 4e 42 3a 20 77 69 74 68  etime.  NB: with
3bf0: 20 74 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 61   this implementa
3c00: 74 69 6f 6e 2c 20 73 6c 6f 74 73 20 63 61 6e 0a  tion, slots can.
3c10: 2f 2f 20 61 70 70 65 61 72 20 64 65 67 65 6e 65  // appear degene
3c20: 72 61 74 65 20 69 6e 20 63 61 73 65 73 20 77 68  rate in cases wh
3c30: 65 72 65 20 74 68 65 72 65 20 69 73 20 75 6e 73  ere there is uns
3c40: 74 72 75 63 74 75 72 65 64 20 63 6f 6e 74 72 6f  tructured contro
3c50: 6c 20 66 6c 6f 77 3a 0a 2f 2f 0a 2f 2f 20 20 20  l flow:.//.//   
3c60: 20 69 66 20 28 71 29 20 67 6f 74 6f 20 6d 69 64   if (q) goto mid
3c70: 3b 0a 2f 2f 20 20 20 20 69 66 20 28 78 20 3e 20  ;.//    if (x > 
3c80: 39 29 20 7b 0a 2f 2f 20 20 20 20 20 20 20 20 20  9) {.//         
3c90: 69 6e 74 20 62 5b 31 30 30 5d 3b 0a 2f 2f 20 20  int b[100];.//  
3ca0: 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 62         memcpy(&b
3cb0: 5b 30 5d 2c 20 2e 2e 2e 29 3b 0a 2f 2f 20 20 20  [0], ...);.//   
3cc0: 20 6d 69 64 3a 20 62 5b 6b 5d 20 3d 20 2e 2e 2e   mid: b[k] = ...
3cd0: 3b 0a 2f 2f 20 20 20 20 20 20 20 20 20 61 62 63  ;.//         abc
3ce0: 28 26 62 29 3b 0a 2f 2f 20 20 20 20 7d 0a 2f 2f  (&b);.//    }.//
3cf0: 0a 2f 2f 20 49 66 20 69 6e 20 52 50 4f 20 6f 72  .// If in RPO or
3d00: 64 65 72 69 6e 67 20 63 68 6f 73 65 6e 20 74 6f  dering chosen to
3d10: 20 77 61 6c 6b 20 74 68 65 20 43 46 47 20 20 77   walk the CFG  w
3d20: 65 20 68 61 70 70 65 6e 20 74 6f 20 76 69 73 69  e happen to visi
3d30: 74 20 74 68 65 20 62 5b 6b 5d 0a 2f 2f 20 62 65  t the b[k].// be
3d40: 66 6f 72 65 20 76 69 73 69 74 69 6e 67 20 74 68  fore visiting th
3d50: 65 20 6d 65 6d 63 70 79 20 62 6c 6f 63 6b 20 28  e memcpy block (
3d60: 77 68 69 63 68 20 77 69 6c 6c 20 63 6f 6e 74 61  which will conta
3d70: 69 6e 20 74 68 65 20 6c 69 66 65 74 69 6d 65 20  in the lifetime 
3d80: 73 74 61 72 74 0a 2f 2f 20 66 6f 72 20 22 62 22  start.// for "b"
3d90: 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20 61 70   then it will ap
3da0: 70 65 61 72 20 74 68 61 74 20 27 62 27 20 68 61  pear that 'b' ha
3db0: 73 20 61 20 64 65 67 65 6e 65 72 61 74 65 20 6c  s a degenerate l
3dc0: 69 66 65 74 69 6d 65 2e 0a 2f 2f 0a 0a 6e 61 6d  ifetime..//..nam
3dd0: 65 73 70 61 63 65 20 7b 0a 0a 2f 2f 2f 20 53 74  espace {../// St
3de0: 61 63 6b 43 6f 6c 6f 72 69 6e 67 20 2d 20 41 20  ackColoring - A 
3df0: 6d 61 63 68 69 6e 65 20 70 61 73 73 20 66 6f 72  machine pass for
3e00: 20 6d 65 72 67 69 6e 67 20 64 69 73 6a 6f 69 6e   merging disjoin
3e10: 74 20 73 74 61 63 6b 20 61 6c 6c 6f 63 61 74 69  t stack allocati
3e20: 6f 6e 73 2c 0a 2f 2f 2f 20 6d 61 72 6b 65 64 20  ons,./// marked 
3e30: 62 79 20 74 68 65 20 4c 49 46 45 54 49 4d 45 5f  by the LIFETIME_
3e40: 53 54 41 52 54 20 61 6e 64 20 4c 49 46 45 54 49  START and LIFETI
3e50: 4d 45 5f 45 4e 44 20 70 73 65 75 64 6f 20 69 6e  ME_END pseudo in
3e60: 73 74 72 75 63 74 69 6f 6e 73 2e 0a 63 6c 61 73  structions..clas
3e70: 73 20 53 74 61 63 6b 43 6f 6c 6f 72 69 6e 67 20  s StackColoring 
3e80: 3a 20 70 75 62 6c 69 63 20 4d 61 63 68 69 6e 65  : public Machine
3e90: 46 75 6e 63 74 69 6f 6e 50 61 73 73 20 7b 0a 20  FunctionPass {. 
3ea0: 20 4d 61 63 68 69 6e 65 46 72 61 6d 65 49 6e 66   MachineFrameInf
3eb0: 6f 20 2a 4d 46 49 3b 0a 20 20 4d 61 63 68 69 6e  o *MFI;.  Machin
3ec0: 65 46 75 6e 63 74 69 6f 6e 20 2a 4d 46 3b 0a 0a  eFunction *MF;..
3ed0: 20 20 2f 2f 2f 20 41 20 63 6c 61 73 73 20 72 65    /// A class re
3ee0: 70 72 65 73 65 6e 74 69 6e 67 20 6c 69 76 65 6e  presenting liven
3ef0: 65 73 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ess information 
3f00: 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 62 61 73  for a single bas
3f10: 69 63 20 62 6c 6f 63 6b 2e 0a 20 20 2f 2f 2f 20  ic block..  /// 
3f20: 45 61 63 68 20 62 69 74 20 69 6e 20 74 68 65 20  Each bit in the 
3f30: 42 69 74 56 65 63 74 6f 72 20 72 65 70 72 65 73  BitVector repres
3f40: 65 6e 74 73 20 74 68 65 20 6c 69 76 65 6e 65 73  ents the livenes
3f50: 73 20 70 72 6f 70 65 72 74 79 0a 20 20 2f 2f 2f  s property.  ///
3f60: 20 66 6f 72 20 61 20 64 69 66 66 65 72 65 6e 74   for a different
3f70: 20 73 74 61 63 6b 20 73 6c 6f 74 2e 0a 20 20 73   stack slot..  s
3f80: 74 72 75 63 74 20 42 6c 6f 63 6b 4c 69 66 65 74  truct BlockLifet
3f90: 69 6d 65 49 6e 66 6f 20 7b 0a 20 20 20 20 2f 2f  imeInfo {.    //
3fa0: 2f 20 57 68 69 63 68 20 73 6c 6f 74 73 20 42 45  / Which slots BE
3fb0: 47 49 4e 73 20 69 6e 20 65 61 63 68 20 62 61 73  GINs in each bas
3fc0: 69 63 20 62 6c 6f 63 6b 2e 0a 20 20 20 20 42 69  ic block..    Bi
3fd0: 74 56 65 63 74 6f 72 20 42 65 67 69 6e 3b 0a 0a  tVector Begin;..
3fe0: 20 20 20 20 2f 2f 2f 20 57 68 69 63 68 20 73 6c      /// Which sl
3ff0: 6f 74 73 20 45 4e 44 73 20 69 6e 20 65 61 63 68  ots ENDs in each
4000: 20 62 61 73 69 63 20 62 6c 6f 63 6b 2e 0a 20 20   basic block..  
4010: 20 20 42 69 74 56 65 63 74 6f 72 20 45 6e 64 3b    BitVector End;
4020: 0a 0a 20 20 20 20 2f 2f 2f 20 57 68 69 63 68 20  ..    /// Which 
4030: 73 6c 6f 74 73 20 61 72 65 20 6d 61 72 6b 65 64  slots are marked
4040: 20 61 73 20 4c 49 56 45 5f 49 4e 2c 20 63 6f 6d   as LIVE_IN, com
4050: 69 6e 67 20 69 6e 74 6f 20 65 61 63 68 20 62 61  ing into each ba
4060: 73 69 63 20 62 6c 6f 63 6b 2e 0a 20 20 20 20 42  sic block..    B
4070: 69 74 56 65 63 74 6f 72 20 4c 69 76 65 49 6e 3b  itVector LiveIn;
4080: 0a 0a 20 20 20 20 2f 2f 2f 20 57 68 69 63 68 20  ..    /// Which 
4090: 73 6c 6f 74 73 20 61 72 65 20 6d 61 72 6b 65 64  slots are marked
40a0: 20 61 73 20 4c 49 56 45 5f 4f 55 54 2c 20 63 6f   as LIVE_OUT, co
40b0: 6d 69 6e 67 20 6f 75 74 20 6f 66 20 65 61 63 68  ming out of each
40c0: 20 62 61 73 69 63 20 62 6c 6f 63 6b 2e 0a 20 20   basic block..  
40d0: 20 20 42 69 74 56 65 63 74 6f 72 20 4c 69 76 65    BitVector Live
40e0: 4f 75 74 3b 0a 20 20 7d 3b 0a 0a 20 20 2f 2f 2f  Out;.  };..  ///
40f0: 20 4d 61 70 73 20 61 63 74 69 76 65 20 73 6c 6f   Maps active slo
4100: 74 73 20 28 70 65 72 20 62 69 74 29 20 66 6f 72  ts (per bit) for
4110: 20 65 61 63 68 20 62 61 73 69 63 20 62 6c 6f 63   each basic bloc
4120: 6b 2e 0a 20 20 75 73 69 6e 67 20 4c 69 76 65 6e  k..  using Liven
4130: 65 73 73 4d 61 70 20 3d 20 44 65 6e 73 65 4d 61  essMap = DenseMa
4140: 70 3c 63 6f 6e 73 74 20 4d 61 63 68 69 6e 65 42  p<const MachineB
4150: 61 73 69 63 42 6c 6f 63 6b 20 2a 2c 20 42 6c 6f  asicBlock *, Blo
4160: 63 6b 4c 69 66 65 74 69 6d 65 49 6e 66 6f 3e 3b  ckLifetimeInfo>;
4170: 0a 20 20 4c 69 76 65 6e 65 73 73 4d 61 70 20 42  .  LivenessMap B
4180: 6c 6f 63 6b 4c 69 76 65 6e 65 73 73 3b 0a 0a 20  lockLiveness;.. 
4190: 20 2f 2f 2f 20 4d 61 70 73 20 73 65 72 69 61 6c   /// Maps serial
41a0: 20 6e 75 6d 62 65 72 73 20 74 6f 20 62 61 73 69   numbers to basi
41b0: 63 20 62 6c 6f 63 6b 73 2e 0a 20 20 44 65 6e 73  c blocks..  Dens
41c0: 65 4d 61 70 3c 63 6f 6e 73 74 20 4d 61 63 68 69  eMap<const Machi
41d0: 6e 65 42 61 73 69 63 42 6c 6f 63 6b 20 2a 2c 20  neBasicBlock *, 
41e0: 69 6e 74 3e 20 42 61 73 69 63 42 6c 6f 63 6b 73  int> BasicBlocks
41f0: 3b 0a 0a 20 20 2f 2f 2f 20 4d 61 70 73 20 62 61  ;..  /// Maps ba
4200: 73 69 63 20 62 6c 6f 63 6b 73 20 74 6f 20 61 20  sic blocks to a 
4210: 73 65 72 69 61 6c 20 6e 75 6d 62 65 72 2e 0a 20  serial number.. 
4220: 20 53 6d 61 6c 6c 56 65 63 74 6f 72 3c 63 6f 6e   SmallVector<con
4230: 73 74 20 4d 61 63 68 69 6e 65 42 61 73 69 63 42  st MachineBasicB
4240: 6c 6f 63 6b 20 2a 2c 20 38 3e 20 42 61 73 69 63  lock *, 8> Basic
4250: 42 6c 6f 63 6b 4e 75 6d 62 65 72 69 6e 67 3b 0a  BlockNumbering;.
4260: 0a 20 20 2f 2f 2f 20 4d 61 70 73 20 73 6c 6f 74  .  /// Maps slot
4270: 73 20 74 6f 20 74 68 65 69 72 20 75 73 65 20 69  s to their use i
4280: 6e 74 65 72 76 61 6c 2e 20 4f 75 74 73 69 64 65  nterval. Outside
4290: 20 6f 66 20 74 68 69 73 20 69 6e 74 65 72 76 61   of this interva
42a0: 6c 2c 20 73 6c 6f 74 73 0a 20 20 2f 2f 2f 20 76  l, slots.  /// v
42b0: 61 6c 75 65 73 20 61 72 65 20 65 69 74 68 65 72  alues are either
42c0: 20 64 65 61 64 20 6f 72 20 60 75 6e 64 65 66 60   dead or `undef`
42d0: 20 61 6e 64 20 74 68 65 79 20 77 69 6c 6c 20 6e   and they will n
42e0: 6f 74 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f  ot be written to
42f0: 2e 0a 20 20 53 6d 61 6c 6c 56 65 63 74 6f 72 3c  ..  SmallVector<
4300: 73 74 64 3a 3a 75 6e 69 71 75 65 5f 70 74 72 3c  std::unique_ptr<
4310: 4c 69 76 65 49 6e 74 65 72 76 61 6c 3e 2c 20 31  LiveInterval>, 1
4320: 36 3e 20 49 6e 74 65 72 76 61 6c 73 3b 0a 0a 20  6> Intervals;.. 
4330: 20 2f 2f 2f 20 4d 61 70 73 20 73 6c 6f 74 73 20   /// Maps slots 
4340: 74 6f 20 74 68 65 20 70 6f 69 6e 74 73 20 77 68  to the points wh
4350: 65 72 65 20 74 68 65 79 20 63 61 6e 20 62 65 63  ere they can bec
4360: 6f 6d 65 20 69 6e 2d 75 73 65 2e 0a 20 20 53 6d  ome in-use..  Sm
4370: 61 6c 6c 56 65 63 74 6f 72 3c 53 6d 61 6c 6c 56  allVector<SmallV
4380: 65 63 74 6f 72 3c 53 6c 6f 74 49 6e 64 65 78 2c  ector<SlotIndex,
4390: 20 34 3e 2c 20 31 36 3e 20 4c 69 76 65 53 74 61   4>, 16> LiveSta
43a0: 72 74 73 3b 0a 0a 20 20 2f 2f 2f 20 56 4e 49 6e  rts;..  /// VNIn
43b0: 66 6f 20 69 73 20 75 73 65 64 20 66 6f 72 20 74  fo is used for t
43c0: 68 65 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  he construction 
43d0: 6f 66 20 4c 69 76 65 49 6e 74 65 72 76 61 6c 73  of LiveIntervals
43e0: 2e 0a 20 20 56 4e 49 6e 66 6f 3a 3a 41 6c 6c 6f  ..  VNInfo::Allo
43f0: 63 61 74 6f 72 20 56 4e 49 6e 66 6f 41 6c 6c 6f  cator VNInfoAllo
4400: 63 61 74 6f 72 3b 0a 0a 20 20 2f 2f 2f 20 53 6c  cator;..  /// Sl
4410: 6f 74 49 6e 64 65 78 20 61 6e 61 6c 79 73 69 73  otIndex analysis
4420: 20 6f 62 6a 65 63 74 2e 0a 20 20 53 6c 6f 74 49   object..  SlotI
4430: 6e 64 65 78 65 73 20 2a 49 6e 64 65 78 65 73 3b  ndexes *Indexes;
4440: 0a 0a 20 20 2f 2f 2f 20 54 68 65 20 73 74 61 63  ..  /// The stac
4450: 6b 20 70 72 6f 74 65 63 74 6f 72 20 6f 62 6a 65  k protector obje
4460: 63 74 2e 0a 20 20 53 74 61 63 6b 50 72 6f 74 65  ct..  StackProte
4470: 63 74 6f 72 20 2a 53 50 3b 0a 0a 20 20 2f 2f 2f  ctor *SP;..  ///
4480: 20 54 68 65 20 6c 69 73 74 20 6f 66 20 6c 69 66   The list of lif
4490: 65 74 69 6d 65 20 6d 61 72 6b 65 72 73 20 66 6f  etime markers fo
44a0: 75 6e 64 2e 20 54 68 65 73 65 20 6d 61 72 6b 65  und. These marke
44b0: 72 73 20 61 72 65 20 74 6f 20 62 65 20 72 65 6d  rs are to be rem
44c0: 6f 76 65 64 0a 20 20 2f 2f 2f 20 6f 6e 63 65 20  oved.  /// once 
44d0: 74 68 65 20 63 6f 6c 6f 72 69 6e 67 20 69 73 20  the coloring is 
44e0: 64 6f 6e 65 2e 0a 20 20 53 6d 61 6c 6c 56 65 63  done..  SmallVec
44f0: 74 6f 72 3c 4d 61 63 68 69 6e 65 49 6e 73 74 72  tor<MachineInstr
4500: 2a 2c 20 38 3e 20 4d 61 72 6b 65 72 73 3b 0a 0a  *, 8> Markers;..
4510: 20 20 2f 2f 2f 20 52 65 63 6f 72 64 20 74 68 65    /// Record the
4520: 20 46 49 20 73 6c 6f 74 73 20 66 6f 72 20 77 68   FI slots for wh
4530: 69 63 68 20 77 65 20 68 61 76 65 20 73 65 65 6e  ich we have seen
4540: 20 73 6f 6d 65 20 73 6f 72 74 20 6f 66 0a 20 20   some sort of.  
4550: 2f 2f 2f 20 6c 69 66 65 74 69 6d 65 20 6d 61 72  /// lifetime mar
4560: 6b 65 72 20 28 65 69 74 68 65 72 20 73 74 61 72  ker (either star
4570: 74 20 6f 72 20 65 6e 64 29 2e 0a 20 20 42 69 74  t or end)..  Bit
4580: 56 65 63 74 6f 72 20 49 6e 74 65 72 65 73 74 69  Vector Interesti
4590: 6e 67 53 6c 6f 74 73 3b 0a 0a 20 20 2f 2f 2f 20  ngSlots;..  /// 
45a0: 46 49 20 73 6c 6f 74 73 20 74 68 61 74 20 6e 65  FI slots that ne
45b0: 65 64 20 74 6f 20 62 65 20 68 61 6e 64 6c 65 64  ed to be handled
45c0: 20 63 6f 6e 73 65 72 76 61 74 69 76 65 6c 79 20   conservatively 
45d0: 28 66 6f 72 20 74 68 65 73 65 0a 20 20 2f 2f 2f  (for these.  ///
45e0: 20 73 6c 6f 74 73 20 6c 69 66 65 74 69 6d 65 2d   slots lifetime-
45f0: 73 74 61 72 74 2d 6f 6e 2d 66 69 72 73 74 2d 75  start-on-first-u
4600: 73 65 20 69 73 20 64 69 73 61 62 6c 65 64 29 2e  se is disabled).
4610: 0a 20 20 42 69 74 56 65 63 74 6f 72 20 43 6f 6e  .  BitVector Con
4620: 73 65 72 76 61 74 69 76 65 53 6c 6f 74 73 3b 0a  servativeSlots;.
4630: 0a 20 20 2f 2f 2f 20 4e 75 6d 62 65 72 20 6f 66  .  /// Number of
4640: 20 69 74 65 72 61 74 69 6f 6e 73 20 74 61 6b 65   iterations take
4650: 6e 20 64 75 72 69 6e 67 20 64 61 74 61 20 66 6c  n during data fl
4660: 6f 77 20 61 6e 61 6c 79 73 69 73 2e 0a 20 20 75  ow analysis..  u
4670: 6e 73 69 67 6e 65 64 20 4e 75 6d 49 74 65 72 61  nsigned NumItera
4680: 74 69 6f 6e 73 3b 0a 0a 70 75 62 6c 69 63 3a 0a  tions;..public:.
4690: 20 20 73 74 61 74 69 63 20 63 68 61 72 20 49 44    static char ID
46a0: 3b 0a 0a 20 20 53 74 61 63 6b 43 6f 6c 6f 72 69  ;..  StackColori
46b0: 6e 67 28 29 20 3a 20 4d 61 63 68 69 6e 65 46 75  ng() : MachineFu
46c0: 6e 63 74 69 6f 6e 50 61 73 73 28 49 44 29 20 7b  nctionPass(ID) {
46d0: 0a 20 20 20 20 69 6e 69 74 69 61 6c 69 7a 65 53  .    initializeS
46e0: 74 61 63 6b 43 6f 6c 6f 72 69 6e 67 50 61 73 73  tackColoringPass
46f0: 28 2a 50 61 73 73 52 65 67 69 73 74 72 79 3a 3a  (*PassRegistry::
4700: 67 65 74 50 61 73 73 52 65 67 69 73 74 72 79 28  getPassRegistry(
4710: 29 29 3b 0a 20 20 7d 0a 0a 20 20 76 6f 69 64 20  ));.  }..  void 
4720: 67 65 74 41 6e 61 6c 79 73 69 73 55 73 61 67 65  getAnalysisUsage
4730: 28 41 6e 61 6c 79 73 69 73 55 73 61 67 65 20 26  (AnalysisUsage &
4740: 41 55 29 20 63 6f 6e 73 74 20 6f 76 65 72 72 69  AU) const overri
4750: 64 65 3b 0a 20 20 62 6f 6f 6c 20 72 75 6e 4f 6e  de;.  bool runOn
4760: 4d 61 63 68 69 6e 65 46 75 6e 63 74 69 6f 6e 28  MachineFunction(
4770: 4d 61 63 68 69 6e 65 46 75 6e 63 74 69 6f 6e 20  MachineFunction 
4780: 26 4d 46 29 20 6f 76 65 72 72 69 64 65 3b 0a 0a  &MF) override;..
4790: 70 72 69 76 61 74 65 3a 0a 20 20 2f 2f 2f 20 55  private:.  /// U
47a0: 73 65 64 20 69 6e 20 63 6f 6c 6c 65 63 74 4d 61  sed in collectMa
47b0: 72 6b 65 72 73 0a 20 20 75 73 69 6e 67 20 42 6c  rkers.  using Bl
47c0: 6f 63 6b 42 69 74 56 65 63 4d 61 70 20 3d 20 44  ockBitVecMap = D
47d0: 65 6e 73 65 4d 61 70 3c 63 6f 6e 73 74 20 4d 61  enseMap<const Ma
47e0: 63 68 69 6e 65 42 61 73 69 63 42 6c 6f 63 6b 20  chineBasicBlock 
47f0: 2a 2c 20 42 69 74 56 65 63 74 6f 72 3e 3b 0a 0a  *, BitVector>;..
4800: 20 20 2f 2f 2f 20 44 65 62 75 67 2e 0a 20 20 76    /// Debug..  v
4810: 6f 69 64 20 64 75 6d 70 28 29 20 63 6f 6e 73 74  oid dump() const
4820: 3b 0a 20 20 76 6f 69 64 20 64 75 6d 70 49 6e 74  ;.  void dumpInt
4830: 65 72 76 61 6c 73 28 29 20 63 6f 6e 73 74 3b 0a  ervals() const;.
4840: 20 20 76 6f 69 64 20 64 75 6d 70 42 42 28 4d 61    void dumpBB(Ma
4850: 63 68 69 6e 65 42 61 73 69 63 42 6c 6f 63 6b 20  chineBasicBlock 
4860: 2a 4d 42 42 29 20 63 6f 6e 73 74 3b 0a 20 20 76  *MBB) const;.  v
4870: 6f 69 64 20 64 75 6d 70 42 56 28 63 6f 6e 73 74  oid dumpBV(const
4880: 20 63 68 61 72 20 2a 74 61 67 2c 20 63 6f 6e 73   char *tag, cons
4890: 74 20 42 69 74 56 65 63 74 6f 72 20 26 42 56 29  t BitVector &BV)
48a0: 20 63 6f 6e 73 74 3b 0a 0a 20 20 2f 2f 2f 20 52   const;..  /// R
48b0: 65 6d 6f 76 65 73 20 61 6c 6c 20 6f 66 20 74 68  emoves all of th
48c0: 65 20 6c 69 66 65 74 69 6d 65 20 6d 61 72 6b 65  e lifetime marke
48d0: 72 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 66  r instructions f
48e0: 72 6f 6d 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  rom the function
48f0: 2e 0a 20 20 2f 2f 2f 20 5c 72 65 74 75 72 6e 73  ..  /// \returns
4900: 20 74 72 75 65 20 69 66 20 61 6e 79 20 6d 61 72   true if any mar
4910: 6b 65 72 73 20 77 65 72 65 20 72 65 6d 6f 76 65  kers were remove
4920: 64 2e 0a 20 20 62 6f 6f 6c 20 72 65 6d 6f 76 65  d..  bool remove
4930: 41 6c 6c 4d 61 72 6b 65 72 73 28 29 3b 0a 0a 20  AllMarkers();.. 
4940: 20 2f 2f 2f 20 53 63 61 6e 20 74 68 65 20 6d 61   /// Scan the ma
4950: 63 68 69 6e 65 20 66 75 6e 63 74 69 6f 6e 20 61  chine function a
4960: 6e 64 20 66 69 6e 64 20 61 6c 6c 20 6f 66 20 74  nd find all of t
4970: 68 65 20 6c 69 66 65 74 69 6d 65 20 6d 61 72 6b  he lifetime mark
4980: 65 72 73 2e 0a 20 20 2f 2f 2f 20 52 65 63 6f 72  ers..  /// Recor
4990: 64 20 74 68 65 20 66 69 6e 64 69 6e 67 73 20 69  d the findings i
49a0: 6e 20 74 68 65 20 42 45 47 49 4e 20 61 6e 64 20  n the BEGIN and 
49b0: 45 4e 44 20 76 65 63 74 6f 72 73 2e 0a 20 20 2f  END vectors..  /
49c0: 2f 2f 20 5c 72 65 74 75 72 6e 73 20 74 68 65 20  // \returns the 
49d0: 6e 75 6d 62 65 72 20 6f 66 20 6d 61 72 6b 65 72  number of marker
49e0: 73 20 66 6f 75 6e 64 2e 0a 20 20 75 6e 73 69 67  s found..  unsig
49f0: 6e 65 64 20 63 6f 6c 6c 65 63 74 4d 61 72 6b 65  ned collectMarke
4a00: 72 73 28 75 6e 73 69 67 6e 65 64 20 4e 75 6d 53  rs(unsigned NumS
4a10: 6c 6f 74 29 3b 0a 0a 20 20 2f 2f 2f 20 50 65 72  lot);..  /// Per
4a20: 66 6f 72 6d 20 74 68 65 20 64 61 74 61 66 6c 6f  form the dataflo
4a30: 77 20 63 61 6c 63 75 6c 61 74 69 6f 6e 20 61 6e  w calculation an
4a40: 64 20 63 61 6c 63 75 6c 61 74 65 20 74 68 65 20  d calculate the 
4a50: 6c 69 66 65 74 69 6d 65 20 66 6f 72 20 65 61 63  lifetime for eac
4a60: 68 20 6f 66 0a 20 20 2f 2f 2f 20 74 68 65 20 73  h of.  /// the s
4a70: 6c 6f 74 73 2c 20 62 61 73 65 64 20 6f 6e 20 74  lots, based on t
4a80: 68 65 20 42 45 47 49 4e 2f 45 4e 44 20 76 65 63  he BEGIN/END vec
4a90: 74 6f 72 73 2e 20 53 65 74 20 74 68 65 20 4c 69  tors. Set the Li
4aa0: 66 65 74 69 6d 65 4c 49 56 45 5f 49 4e 20 61 6e  fetimeLIVE_IN an
4ab0: 64 0a 20 20 2f 2f 2f 20 4c 69 66 65 74 69 6d 65  d.  /// Lifetime
4ac0: 4c 49 56 45 5f 4f 55 54 20 6d 61 70 73 20 74 68  LIVE_OUT maps th
4ad0: 61 74 20 72 65 70 72 65 73 65 6e 74 20 77 68 69  at represent whi
4ae0: 63 68 20 73 74 61 63 6b 20 73 6c 6f 74 73 20 61  ch stack slots a
4af0: 72 65 20 6c 69 76 65 20 63 6f 6d 69 6e 67 0a 20  re live coming. 
4b00: 20 2f 2f 2f 20 69 6e 20 61 6e 64 20 6f 75 74 20   /// in and out 
4b10: 62 6c 6f 63 6b 73 2e 0a 20 20 76 6f 69 64 20 63  blocks..  void c
4b20: 61 6c 63 75 6c 61 74 65 4c 6f 63 61 6c 4c 69 76  alculateLocalLiv
4b30: 65 6e 65 73 73 28 29 3b 0a 0a 20 20 2f 2f 2f 20  eness();..  /// 
4b40: 52 65 74 75 72 6e 73 20 54 52 55 45 20 69 66 20  Returns TRUE if 
4b50: 77 65 27 72 65 20 75 73 69 6e 67 20 74 68 65 20  we're using the 
4b60: 66 69 72 73 74 2d 75 73 65 2d 62 65 67 69 6e 73  first-use-begins
4b70: 2d 6c 69 66 65 74 69 6d 65 20 6d 65 74 68 6f 64  -lifetime method
4b80: 20 66 6f 72 0a 20 20 2f 2f 2f 20 74 68 69 73 20   for.  /// this 
4b90: 73 6c 6f 74 20 28 69 66 20 46 41 4c 53 45 2c 20  slot (if FALSE, 
4ba0: 74 68 65 6e 20 74 68 65 20 73 74 61 72 74 20 6d  then the start m
4bb0: 61 72 6b 65 72 20 69 73 20 74 72 65 61 74 65 64  arker is treated
4bc0: 20 61 73 20 73 74 61 72 74 20 6f 66 20 6c 69 66   as start of lif
4bd0: 65 74 69 6d 65 29 2e 0a 20 20 62 6f 6f 6c 20 61  etime)..  bool a
4be0: 70 70 6c 79 46 69 72 73 74 55 73 65 28 69 6e 74  pplyFirstUse(int
4bf0: 20 53 6c 6f 74 29 20 7b 0a 20 20 20 20 69 66 20   Slot) {.    if 
4c00: 28 21 4c 69 66 65 74 69 6d 65 53 74 61 72 74 4f  (!LifetimeStartO
4c10: 6e 46 69 72 73 74 55 73 65 20 7c 7c 20 50 72 6f  nFirstUse || Pro
4c20: 74 65 63 74 46 72 6f 6d 45 73 63 61 70 65 64 41  tectFromEscapedA
4c30: 6c 6c 6f 63 61 73 29 0a 20 20 20 20 20 20 72 65  llocas).      re
4c40: 74 75 72 6e 20 66 61 6c 73 65 3b 0a 20 20 20 20  turn false;.    
4c50: 69 66 20 28 43 6f 6e 73 65 72 76 61 74 69 76 65  if (Conservative
4c60: 53 6c 6f 74 73 2e 74 65 73 74 28 53 6c 6f 74 29  Slots.test(Slot)
4c70: 29 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 66  ).      return f
4c80: 61 6c 73 65 3b 0a 20 20 20 20 72 65 74 75 72 6e  alse;.    return
4c90: 20 74 72 75 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2f   true;.  }..  //
4ca0: 2f 20 45 78 61 6d 69 6e 65 73 20 74 68 65 20 73  / Examines the s
4cb0: 70 65 63 69 66 69 65 64 20 69 6e 73 74 72 75 63  pecified instruc
4cc0: 74 69 6f 6e 20 61 6e 64 20 72 65 74 75 72 6e 73  tion and returns
4cd0: 20 54 52 55 45 20 69 66 20 74 68 65 20 69 6e 73   TRUE if the ins
4ce0: 74 72 75 63 74 69 6f 6e 0a 20 20 2f 2f 2f 20 72  truction.  /// r
4cf0: 65 70 72 65 73 65 6e 74 73 20 74 68 65 20 73 74  epresents the st
4d00: 61 72 74 20 6f 72 20 65 6e 64 20 6f 66 20 61 6e  art or end of an
4d10: 20 69 6e 74 65 72 65 73 74 69 6e 67 20 6c 69 66   interesting lif
4d20: 65 74 69 6d 65 2e 20 54 68 65 20 73 6c 6f 74 20  etime. The slot 
4d30: 6f 72 20 73 6c 6f 74 73 0a 20 20 2f 2f 2f 20 73  or slots.  /// s
4d40: 74 61 72 74 69 6e 67 20 6f 72 20 65 6e 64 69 6e  tarting or endin
4d50: 67 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 74  g are added to t
4d60: 68 65 20 76 65 63 74 6f 72 20 22 73 6c 6f 74 73  he vector "slots
4d70: 22 20 61 6e 64 20 22 69 73 53 74 61 72 74 22 20  " and "isStart" 
4d80: 69 73 20 73 65 74 0a 20 20 2f 2f 2f 20 61 63 63  is set.  /// acc
4d90: 6f 72 64 69 6e 67 6c 79 2e 0a 20 20 2f 2f 2f 20  ordingly..  /// 
4da0: 5c 72 65 74 75 72 6e 73 20 54 72 75 65 20 69 66  \returns True if
4db0: 20 69 6e 73 74 20 63 6f 6e 74 61 69 6e 73 20 61   inst contains a
4dc0: 20 6c 69 66 65 74 69 6d 65 20 73 74 61 72 74 20   lifetime start 
4dd0: 6f 72 20 65 6e 64 0a 20 20 62 6f 6f 6c 20 69 73  or end.  bool is
4de0: 4c 69 66 65 74 69 6d 65 53 74 61 72 74 4f 72 45  LifetimeStartOrE
4df0: 6e 64 28 63 6f 6e 73 74 20 4d 61 63 68 69 6e 65  nd(const Machine
4e00: 49 6e 73 74 72 20 26 4d 49 2c 0a 20 20 20 20 20  Instr &MI,.     
4e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e20: 20 20 20 20 20 20 20 53 6d 61 6c 6c 56 65 63 74         SmallVect
4e30: 6f 72 3c 69 6e 74 2c 20 34 3e 20 26 73 6c 6f 74  or<int, 4> &slot
4e40: 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s,.             
4e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
4e60: 6f 6f 6c 20 26 69 73 53 74 61 72 74 29 3b 0a 0a  ool &isStart);..
4e70: 20 20 2f 2f 2f 20 43 6f 6e 73 74 72 75 63 74 20    /// Construct 
4e80: 74 68 65 20 4c 69 76 65 49 6e 74 65 72 76 61 6c  the LiveInterval
4e90: 73 20 66 6f 72 20 74 68 65 20 73 6c 6f 74 73 2e  s for the slots.
4ea0: 0a 20 20 76 6f 69 64 20 63 61 6c 63 75 6c 61 74  .  void calculat
4eb0: 65 4c 69 76 65 49 6e 74 65 72 76 61 6c 73 28 75  eLiveIntervals(u
4ec0: 6e 73 69 67 6e 65 64 20 4e 75 6d 53 6c 6f 74 73  nsigned NumSlots
4ed0: 29 3b 0a 0a 20 20 2f 2f 2f 20 47 6f 20 6f 76 65  );..  /// Go ove
4ee0: 72 20 74 68 65 20 6d 61 63 68 69 6e 65 20 66 75  r the machine fu
4ef0: 6e 63 74 69 6f 6e 20 61 6e 64 20 63 68 61 6e 67  nction and chang
4f00: 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 77  e instructions w
4f10: 68 69 63 68 20 75 73 65 20 73 74 61 63 6b 0a 20  hich use stack. 
4f20: 20 2f 2f 2f 20 73 6c 6f 74 73 20 74 6f 20 75 73   /// slots to us
4f30: 65 20 74 68 65 20 6a 6f 69 6e 74 20 73 6c 6f 74  e the joint slot
4f40: 73 2e 0a 20 20 76 6f 69 64 20 72 65 6d 61 70 49  s..  void remapI
4f50: 6e 73 74 72 75 63 74 69 6f 6e 73 28 44 65 6e 73  nstructions(Dens
4f60: 65 4d 61 70 3c 69 6e 74 2c 20 69 6e 74 3e 20 26  eMap<int, int> &
4f70: 53 6c 6f 74 52 65 6d 61 70 29 3b 0a 0a 20 20 2f  SlotRemap);..  /
4f80: 2f 2f 20 54 68 65 20 69 6e 70 75 74 20 70 72 6f  // The input pro
4f90: 67 72 61 6d 20 6d 61 79 20 63 6f 6e 74 61 69 6e  gram may contain
4fa0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 77 68   instructions wh
4fb0: 69 63 68 20 61 72 65 20 6e 6f 74 20 69 6e 73 69  ich are not insi
4fc0: 64 65 20 6c 69 66 65 74 69 6d 65 0a 20 20 2f 2f  de lifetime.  //
4fd0: 2f 20 6d 61 72 6b 65 72 73 2e 20 54 68 69 73 20  / markers. This 
4fe0: 63 61 6e 20 68 61 70 70 65 6e 20 64 75 65 20 74  can happen due t
4ff0: 6f 20 61 20 62 75 67 20 69 6e 20 74 68 65 20 63  o a bug in the c
5000: 6f 6d 70 69 6c 65 72 20 6f 72 20 64 75 65 20 74  ompiler or due t
5010: 6f 20 61 20 62 75 67 20 69 6e 0a 20 20 2f 2f 2f  o a bug in.  ///
5020: 20 75 73 65 72 20 63 6f 64 65 20 28 66 6f 72 20   user code (for 
5030: 65 78 61 6d 70 6c 65 2c 20 72 65 74 75 72 6e 69  example, returni
5040: 6e 67 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  ng a reference t
5050: 6f 20 61 20 6c 6f 63 61 6c 20 76 61 72 69 61 62  o a local variab
5060: 6c 65 29 2e 0a 20 20 2f 2f 2f 20 54 68 69 73 20  le)..  /// This 
5070: 70 72 6f 63 65 64 75 72 65 20 63 68 65 63 6b 73  procedure checks
5080: 20 61 6c 6c 20 6f 66 20 74 68 65 20 69 6e 73 74   all of the inst
5090: 72 75 63 74 69 6f 6e 73 20 69 6e 20 74 68 65 20  ructions in the 
50a0: 66 75 6e 63 74 69 6f 6e 20 61 6e 64 0a 20 20 2f  function and.  /
50b0: 2f 2f 20 69 6e 76 61 6c 69 64 61 74 65 73 20 6c  // invalidates l
50c0: 69 66 65 74 69 6d 65 20 72 61 6e 67 65 73 20 77  ifetime ranges w
50d0: 68 69 63 68 20 64 6f 20 6e 6f 74 20 63 6f 6e 74  hich do not cont
50e0: 61 69 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 69  ain all of the i
50f0: 6e 73 74 72 75 63 74 69 6f 6e 73 0a 20 20 2f 2f  nstructions.  //
5100: 2f 20 77 68 69 63 68 20 61 63 63 65 73 73 20 74  / which access t
5110: 68 61 74 20 66 72 61 6d 65 20 73 6c 6f 74 2e 0a  hat frame slot..
5120: 20 20 76 6f 69 64 20 72 65 6d 6f 76 65 49 6e 76    void removeInv
5130: 61 6c 69 64 53 6c 6f 74 52 61 6e 67 65 73 28 29  alidSlotRanges()
5140: 3b 0a 0a 20 20 2f 2f 2f 20 4d 61 70 20 65 6e 74  ;..  /// Map ent
5150: 72 69 65 73 20 77 68 69 63 68 20 70 6f 69 6e 74  ries which point
5160: 20 74 6f 20 6f 74 68 65 72 20 65 6e 74 72 69 65   to other entrie
5170: 73 20 74 6f 20 74 68 65 69 72 20 64 65 73 74 69  s to their desti
5180: 6e 61 74 69 6f 6e 2e 0a 20 20 2f 2f 2f 20 20 20  nation..  ///   
5190: 41 2d 3e 42 2d 3e 43 20 62 65 63 6f 6d 65 73 20  A->B->C becomes 
51a0: 41 2d 3e 43 2e 0a 20 20 76 6f 69 64 20 65 78 70  A->C..  void exp
51b0: 75 6e 67 65 53 6c 6f 74 4d 61 70 28 44 65 6e 73  ungeSlotMap(Dens
51c0: 65 4d 61 70 3c 69 6e 74 2c 20 69 6e 74 3e 20 26  eMap<int, int> &
51d0: 53 6c 6f 74 52 65 6d 61 70 2c 20 75 6e 73 69 67  SlotRemap, unsig
51e0: 6e 65 64 20 4e 75 6d 53 6c 6f 74 73 29 3b 0a 7d  ned NumSlots);.}
51f0: 3b 0a 0a 7d 20 2f 2f 20 65 6e 64 20 61 6e 6f 6e  ;..} // end anon
5200: 79 6d 6f 75 73 20 6e 61 6d 65 73 70 61 63 65 0a  ymous namespace.
5210: 0a 63 68 61 72 20 53 74 61 63 6b 43 6f 6c 6f 72  .char StackColor
5220: 69 6e 67 3a 3a 49 44 20 3d 20 30 3b 0a 0a 63 68  ing::ID = 0;..ch
5230: 61 72 20 26 6c 6c 76 6d 3a 3a 53 74 61 63 6b 43  ar &llvm::StackC
5240: 6f 6c 6f 72 69 6e 67 49 44 20 3d 20 53 74 61 63  oloringID = Stac
5250: 6b 43 6f 6c 6f 72 69 6e 67 3a 3a 49 44 3b 0a 0a  kColoring::ID;..
5260: 49 4e 49 54 49 41 4c 49 5a 45 5f 50 41 53 53 5f  INITIALIZE_PASS_
5270: 42 45 47 49 4e 28 53 74 61 63 6b 43 6f 6c 6f 72  BEGIN(StackColor
5280: 69 6e 67 2c 20 44 45 42 55 47 5f 54 59 50 45 2c  ing, DEBUG_TYPE,
5290: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
52a0: 20 20 20 20 20 20 20 22 4d 65 72 67 65 20 64 69         "Merge di
52b0: 73 6a 6f 69 6e 74 20 73 74 61 63 6b 20 73 6c 6f  sjoint stack slo
52c0: 74 73 22 2c 20 66 61 6c 73 65 2c 20 66 61 6c 73  ts", false, fals
52d0: 65 29 0a 49 4e 49 54 49 41 4c 49 5a 45 5f 50 41  e).INITIALIZE_PA
52e0: 53 53 5f 44 45 50 45 4e 44 45 4e 43 59 28 53 6c  SS_DEPENDENCY(Sl
52f0: 6f 74 49 6e 64 65 78 65 73 29 0a 49 4e 49 54 49  otIndexes).INITI
5300: 41 4c 49 5a 45 5f 50 41 53 53 5f 44 45 50 45 4e  ALIZE_PASS_DEPEN
5310: 44 45 4e 43 59 28 53 74 61 63 6b 50 72 6f 74 65  DENCY(StackProte
5320: 63 74 6f 72 29 0a 49 4e 49 54 49 41 4c 49 5a 45  ctor).INITIALIZE
5330: 5f 50 41 53 53 5f 45 4e 44 28 53 74 61 63 6b 43  _PASS_END(StackC
5340: 6f 6c 6f 72 69 6e 67 2c 20 44 45 42 55 47 5f 54  oloring, DEBUG_T
5350: 59 50 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20  YPE,.           
5360: 20 20 20 20 20 20 20 20 20 22 4d 65 72 67 65 20           "Merge 
5370: 64 69 73 6a 6f 69 6e 74 20 73 74 61 63 6b 20 73  disjoint stack s
5380: 6c 6f 74 73 22 2c 20 66 61 6c 73 65 2c 20 66 61  lots", false, fa
5390: 6c 73 65 29 0a 0a 76 6f 69 64 20 53 74 61 63 6b  lse)..void Stack
53a0: 43 6f 6c 6f 72 69 6e 67 3a 3a 67 65 74 41 6e 61  Coloring::getAna
53b0: 6c 79 73 69 73 55 73 61 67 65 28 41 6e 61 6c 79  lysisUsage(Analy
53c0: 73 69 73 55 73 61 67 65 20 26 41 55 29 20 63 6f  sisUsage &AU) co
53d0: 6e 73 74 20 7b 0a 20 20 41 55 2e 61 64 64 52 65  nst {.  AU.addRe
53e0: 71 75 69 72 65 64 3c 53 6c 6f 74 49 6e 64 65 78  quired<SlotIndex
53f0: 65 73 3e 28 29 3b 0a 20 20 41 55 2e 61 64 64 52  es>();.  AU.addR
5400: 65 71 75 69 72 65 64 3c 53 74 61 63 6b 50 72 6f  equired<StackPro
5410: 74 65 63 74 6f 72 3e 28 29 3b 0a 20 20 4d 61 63  tector>();.  Mac
5420: 68 69 6e 65 46 75 6e 63 74 69 6f 6e 50 61 73 73  hineFunctionPass
5430: 3a 3a 67 65 74 41 6e 61 6c 79 73 69 73 55 73 61  ::getAnalysisUsa
5440: 67 65 28 41 55 29 3b 0a 7d 0a 0a 23 69 66 20 21  ge(AU);.}..#if !
5450: 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20  defined(NDEBUG) 
5460: 7c 7c 20 64 65 66 69 6e 65 64 28 4c 4c 56 4d 5f  || defined(LLVM_
5470: 45 4e 41 42 4c 45 5f 44 55 4d 50 29 0a 4c 4c 56  ENABLE_DUMP).LLV
5480: 4d 5f 44 55 4d 50 5f 4d 45 54 48 4f 44 20 76 6f  M_DUMP_METHOD vo
5490: 69 64 20 53 74 61 63 6b 43 6f 6c 6f 72 69 6e 67  id StackColoring
54a0: 3a 3a 64 75 6d 70 42 56 28 63 6f 6e 73 74 20 63  ::dumpBV(const c
54b0: 68 61 72 20 2a 74 61 67 2c 0a 20 20 20 20 20 20  har *tag,.      
54c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
54d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
54e0: 20 20 20 20 20 20 63 6f 6e 73 74 20 42 69 74 56        const BitV
54f0: 65 63 74 6f 72 20 26 42 56 29 20 63 6f 6e 73 74  ector &BV) const
5500: 20 7b 0a 20 20 64 62 67 73 28 29 20 3c 3c 20 74   {.  dbgs() << t
5510: 61 67 20 3c 3c 20 22 20 3a 20 7b 20 22 3b 0a 20  ag << " : { ";. 
5520: 20 66 6f 72 20 28 75 6e 73 69 67 6e 65 64 20 49   for (unsigned I
5530: 20 3d 20 30 2c 20 45 20 3d 20 42 56 2e 73 69 7a   = 0, E = BV.siz
5540: 65 28 29 3b 20 49 20 21 3d 20 45 3b 20 2b 2b 49  e(); I != E; ++I
5550: 29 0a 20 20 20 20 64 62 67 73 28 29 20 3c 3c 20  ).    dbgs() << 
5560: 42 56 2e 74 65 73 74 28 49 29 20 3c 3c 20 22 20  BV.test(I) << " 
5570: 22 3b 0a 20 20 64 62 67 73 28 29 20 3c 3c 20 22  ";.  dbgs() << "
5580: 7d 5c 6e 22 3b 0a 7d 0a 0a 4c 4c 56 4d 5f 44 55  }\n";.}..LLVM_DU
5590: 4d 50 5f 4d 45 54 48 4f 44 20 76 6f 69 64 20 53  MP_METHOD void S
55a0: 74 61 63 6b 43 6f 6c 6f 72 69 6e 67 3a 3a 64 75  tackColoring::du
55b0: 6d 70 42 42 28 4d 61 63 68 69 6e 65 42 61 73 69  mpBB(MachineBasi
55c0: 63 42 6c 6f 63 6b 20 2a 4d 42 42 29 20 63 6f 6e  cBlock *MBB) con
55d0: 73 74 20 7b 0a 20 20 4c 69 76 65 6e 65 73 73 4d  st {.  LivenessM
55e0: 61 70 3a 3a 63 6f 6e 73 74 5f 69 74 65 72 61 74  ap::const_iterat
55f0: 6f 72 20 42 49 20 3d 20 42 6c 6f 63 6b 4c 69 76  or BI = BlockLiv
5600: 65 6e 65 73 73 2e 66 69 6e 64 28 4d 42 42 29 3b  eness.find(MBB);
5610: 0a 20 20 61 73 73 65 72 74 28 42 49 20 21 3d 20  .  assert(BI != 
5620: 42 6c 6f 63 6b 4c 69 76 65 6e 65 73 73 2e 65 6e  BlockLiveness.en
5630: 64 28 29 20 26 26 20 22 42 6c 6f 63 6b 20 6e 6f  d() && "Block no
5640: 74 20 66 6f 75 6e 64 22 29 3b 0a 20 20 63 6f 6e  t found");.  con
5650: 73 74 20 42 6c 6f 63 6b 4c 69 66 65 74 69 6d 65  st BlockLifetime
5660: 49 6e 66 6f 20 26 42 6c 6f 63 6b 49 6e 66 6f 20  Info &BlockInfo 
5670: 3d 20 42 49 2d 3e 73 65 63 6f 6e 64 3b 0a 0a 20  = BI->second;.. 
5680: 20 64 75 6d 70 42 56 28 22 42 45 47 49 4e 22 2c   dumpBV("BEGIN",
5690: 20 42 6c 6f 63 6b 49 6e 66 6f 2e 42 65 67 69 6e   BlockInfo.Begin
56a0: 29 3b 0a 20 20 64 75 6d 70 42 56 28 22 45 4e 44  );.  dumpBV("END
56b0: 22 2c 20 42 6c 6f 63 6b 49 6e 66 6f 2e 45 6e 64  ", BlockInfo.End
56c0: 29 3b 0a 20 20 64 75 6d 70 42 56 28 22 4c 49 56  );.  dumpBV("LIV
56d0: 45 5f 49 4e 22 2c 20 42 6c 6f 63 6b 49 6e 66 6f  E_IN", BlockInfo
56e0: 2e 4c 69 76 65 49 6e 29 3b 0a 20 20 64 75 6d 70  .LiveIn);.  dump
56f0: 42 56 28 22 4c 49 56 45 5f 4f 55 54 22 2c 20 42  BV("LIVE_OUT", B
5700: 6c 6f 63 6b 49 6e 66 6f 2e 4c 69 76 65 4f 75 74  lockInfo.LiveOut
5710: 29 3b 0a 7d 0a 0a 4c 4c 56 4d 5f 44 55 4d 50 5f  );.}..LLVM_DUMP_
5720: 4d 45 54 48 4f 44 20 76 6f 69 64 20 53 74 61 63  METHOD void Stac
5730: 6b 43 6f 6c 6f 72 69 6e 67 3a 3a 64 75 6d 70 28  kColoring::dump(
5740: 29 20 63 6f 6e 73 74 20 7b 0a 20 20 66 6f 72 20  ) const {.  for 
5750: 28 4d 61 63 68 69 6e 65 42 61 73 69 63 42 6c 6f  (MachineBasicBlo
5760: 63 6b 20 2a 4d 42 42 20 3a 20 64 65 70 74 68 5f  ck *MBB : depth_
5770: 66 69 72 73 74 28 4d 46 29 29 20 7b 0a 20 20 20  first(MF)) {.   
5780: 20 64 62 67 73 28 29 20 3c 3c 20 22 49 6e 73 70   dbgs() << "Insp
5790: 65 63 74 69 6e 67 20 62 6c 6f 63 6b 20 23 22 20  ecting block #" 
57a0: 3c 3c 20 4d 42 42 2d 3e 67 65 74 4e 75 6d 62 65  << MBB->getNumbe
57b0: 72 28 29 20 3c 3c 20 22 20 5b 22 0a 20 20 20 20  r() << " [".    
57c0: 20 20 20 20 20 20 20 3c 3c 20 4d 42 42 2d 3e 67         << MBB->g
57d0: 65 74 4e 61 6d 65 28 29 20 3c 3c 20 22 5d 5c 6e  etName() << "]\n
57e0: 22 3b 0a 20 20 20 20 64 75 6d 70 42 42 28 4d 42  ";.    dumpBB(MB
57f0: 42 29 3b 0a 20 20 7d 0a 7d 0a 0a 4c 4c 56 4d 5f  B);.  }.}..LLVM_
5800: 44 55 4d 50 5f 4d 45 54 48 4f 44 20 76 6f 69 64  DUMP_METHOD void
5810: 20 53 74 61 63 6b 43 6f 6c 6f 72 69 6e 67 3a 3a   StackColoring::
5820: 64 75 6d 70 49 6e 74 65 72 76 61 6c 73 28 29 20  dumpIntervals() 
5830: 63 6f 6e 73 74 20 7b 0a 20 20 66 6f 72 20 28 75  const {.  for (u
5840: 6e 73 69 67 6e 65 64 20 49 20 3d 20 30 2c 20 45  nsigned I = 0, E
5850: 20 3d 20 49 6e 74 65 72 76 61 6c 73 2e 73 69 7a   = Intervals.siz
5860: 65 28 29 3b 20 49 20 21 3d 20 45 3b 20 2b 2b 49  e(); I != E; ++I
5870: 29 20 7b 0a 20 20 20 20 64 62 67 73 28 29 20 3c  ) {.    dbgs() <
5880: 3c 20 22 49 6e 74 65 72 76 61 6c 5b 22 20 3c 3c  < "Interval[" <<
5890: 20 49 20 3c 3c 20 22 5d 3a 5c 6e 22 3b 0a 20 20   I << "]:\n";.  
58a0: 20 20 49 6e 74 65 72 76 61 6c 73 5b 49 5d 2d 3e    Intervals[I]->
58b0: 64 75 6d 70 28 29 3b 0a 20 20 7d 0a 7d 0a 23 65  dump();.  }.}.#e
58c0: 6e 64 69 66 0a 0a 73 74 61 74 69 63 20 69 6e 6c  ndif..static inl
58d0: 69 6e 65 20 69 6e 74 20 67 65 74 53 74 61 72 74  ine int getStart
58e0: 4f 72 45 6e 64 53 6c 6f 74 28 63 6f 6e 73 74 20  OrEndSlot(const 
58f0: 4d 61 63 68 69 6e 65 49 6e 73 74 72 20 26 4d 49  MachineInstr &MI
5900: 29 0a 7b 0a 20 20 61 73 73 65 72 74 28 28 4d 49  ).{.  assert((MI
5910: 2e 67 65 74 4f 70 63 6f 64 65 28 29 20 3d 3d 20  .getOpcode() == 
5920: 54 61 72 67 65 74 4f 70 63 6f 64 65 3a 3a 4c 49  TargetOpcode::LI
5930: 46 45 54 49 4d 45 5f 53 54 41 52 54 20 7c 7c 0a  FETIME_START ||.
5940: 20 20 20 20 20 20 20 20 20 20 4d 49 2e 67 65 74            MI.get
5950: 4f 70 63 6f 64 65 28 29 20 3d 3d 20 54 61 72 67  Opcode() == Targ
5960: 65 74 4f 70 63 6f 64 65 3a 3a 4c 49 46 45 54 49  etOpcode::LIFETI
5970: 4d 45 5f 45 4e 44 29 20 26 26 0a 20 20 20 20 20  ME_END) &&.     
5980: 20 20 20 20 22 45 78 70 65 63 74 65 64 20 4c 49      "Expected LI
5990: 46 45 54 49 4d 45 5f 53 54 41 52 54 20 6f 72 20  FETIME_START or 
59a0: 4c 49 46 45 54 49 4d 45 5f 45 4e 44 20 6f 70 22  LIFETIME_END op"
59b0: 29 3b 0a 20 20 63 6f 6e 73 74 20 4d 61 63 68 69  );.  const Machi
59c0: 6e 65 4f 70 65 72 61 6e 64 20 26 4d 4f 20 3d 20  neOperand &MO = 
59d0: 4d 49 2e 67 65 74 4f 70 65 72 61 6e 64 28 30 29  MI.getOperand(0)
59e0: 3b 0a 20 20 69 6e 74 20 53 6c 6f 74 20 3d 20 4d  ;.  int Slot = M
59f0: 4f 2e 67 65 74 49 6e 64 65 78 28 29 3b 0a 20 20  O.getIndex();.  
5a00: 69 66 20 28 53 6c 6f 74 20 3e 3d 20 30 29 0a 20  if (Slot >= 0). 
5a10: 20 20 20 72 65 74 75 72 6e 20 53 6c 6f 74 3b 0a     return Slot;.
5a20: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a    return -1;.}..
5a30: 2f 2f 20 41 74 20 74 68 65 20 6d 6f 6d 65 6e 74  // At the moment
5a40: 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 6f   the only way to
5a50: 20 65 6e 64 20 61 20 76 61 72 69 61 62 6c 65 20   end a variable 
5a60: 6c 69 66 65 74 69 6d 65 20 69 73 20 77 69 74 68  lifetime is with
5a70: 0a 2f 2f 20 61 20 56 41 52 49 41 42 4c 45 5f 4c  .// a VARIABLE_L
5a80: 49 46 45 54 49 4d 45 20 6f 70 20 28 77 68 69 63  IFETIME op (whic
5a90: 68 20 63 61 6e 27 74 20 63 6f 6e 74 61 69 6e 20  h can't contain 
5aa0: 61 20 73 74 61 72 74 29 2e 20 49 66 20 74 68 69  a start). If thi
5ab0: 6e 67 73 0a 2f 2f 20 63 68 61 6e 67 65 20 61 6e  ngs.// change an
5ac0: 64 20 74 68 65 20 49 52 20 61 6c 6c 6f 77 73 20  d the IR allows 
5ad0: 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 69 6e 73  for a single ins
5ae0: 74 20 74 68 61 74 20 62 6f 74 68 20 62 65 67 69  t that both begi
5af0: 6e 73 0a 2f 2f 20 61 6e 64 20 65 6e 64 73 20 6c  ns.// and ends l
5b00: 69 66 65 74 69 6d 65 28 73 29 2c 20 74 68 69 73  ifetime(s), this
5b10: 20 69 6e 74 65 72 66 61 63 65 20 77 69 6c 6c 20   interface will 
5b20: 6e 65 65 64 20 74 6f 20 62 65 20 72 65 77 6f 72  need to be rewor
5b30: 6b 65 64 2e 0a 62 6f 6f 6c 20 53 74 61 63 6b 43  ked..bool StackC
5b40: 6f 6c 6f 72 69 6e 67 3a 3a 69 73 4c 69 66 65 74  oloring::isLifet
5b50: 69 6d 65 53 74 61 72 74 4f 72 45 6e 64 28 63 6f  imeStartOrEnd(co
5b60: 6e 73 74 20 4d 61 63 68 69 6e 65 49 6e 73 74 72  nst MachineInstr
5b70: 20 26 4d 49 2c 0a 20 20 20 20 20 20 20 20 20 20   &MI,.          
5b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
5ba0: 6d 61 6c 6c 56 65 63 74 6f 72 3c 69 6e 74 2c 20  mallVector<int, 
5bb0: 34 3e 20 26 73 6c 6f 74 73 2c 0a 20 20 20 20 20  4> &slots,.     
5bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5be0: 20 20 20 20 62 6f 6f 6c 20 26 69 73 53 74 61 72      bool &isStar
5bf0: 74 29 20 7b 0a 20 20 69 66 20 28 4d 49 2e 67 65  t) {.  if (MI.ge
5c00: 74 4f 70 63 6f 64 65 28 29 20 3d 3d 20 54 61 72  tOpcode() == Tar
5c10: 67 65 74 4f 70 63 6f 64 65 3a 3a 4c 49 46 45 54  getOpcode::LIFET
5c20: 49 4d 45 5f 53 54 41 52 54 20 7c 7c 0a 20 20 20  IME_START ||.   
5c30: 20 20 20 4d 49 2e 67 65 74 4f 70 63 6f 64 65 28     MI.getOpcode(
5c40: 29 20 3d 3d 20 54 61 72 67 65 74 4f 70 63 6f 64  ) == TargetOpcod
5c50: 65 3a 3a 4c 49 46 45 54 49 4d 45 5f 45 4e 44 29  e::LIFETIME_END)
5c60: 20 7b 0a 20 20 20 20 69 6e 74 20 53 6c 6f 74 20   {.    int Slot 
5c70: 3d 20 67 65 74 53 74 61 72 74 4f 72 45 6e 64 53  = getStartOrEndS
5c80: 6c 6f 74 28 4d 49 29 3b 0a 20 20 20 20 69 66 20  lot(MI);.    if 
5c90: 28 53 6c 6f 74 20 3c 20 30 29 0a 20 20 20 20 20  (Slot < 0).     
5ca0: 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0a 20   return false;. 
5cb0: 20 20 20 69 66 20 28 21 49 6e 74 65 72 65 73 74     if (!Interest
5cc0: 69 6e 67 53 6c 6f 74 73 2e 74 65 73 74 28 53 6c  ingSlots.test(Sl
5cd0: 6f 74 29 29 0a 20 20 20 20 20 20 72 65 74 75 72  ot)).      retur
5ce0: 6e 20 66 61 6c 73 65 3b 0a 20 20 20 20 73 6c 6f  n false;.    slo
5cf0: 74 73 2e 70 75 73 68 5f 62 61 63 6b 28 53 6c 6f  ts.push_back(Slo
5d00: 74 29 3b 0a 20 20 20 20 69 66 20 28 4d 49 2e 67  t);.    if (MI.g
5d10: 65 74 4f 70 63 6f 64 65 28 29 20 3d 3d 20 54 61  etOpcode() == Ta
5d20: 72 67 65 74 4f 70 63 6f 64 65 3a 3a 4c 49 46 45  rgetOpcode::LIFE
5d30: 54 49 4d 45 5f 45 4e 44 29 20 7b 0a 20 20 20 20  TIME_END) {.    
5d40: 20 20 69 73 53 74 61 72 74 20 3d 20 66 61 6c 73    isStart = fals
5d50: 65 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  e;.      return 
5d60: 74 72 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  true;.    }.    
5d70: 69 66 20 28 21 20 61 70 70 6c 79 46 69 72 73 74  if (! applyFirst
5d80: 55 73 65 28 53 6c 6f 74 29 29 20 7b 0a 20 20 20  Use(Slot)) {.   
5d90: 20 20 20 69 73 53 74 61 72 74 20 3d 20 74 72 75     isStart = tru
5da0: 65 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  e;.      return 
5db0: 74 72 75 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 20  true;.    }.  } 
5dc0: 65 6c 73 65 20 69 66 20 28 4c 69 66 65 74 69 6d  else if (Lifetim
5dd0: 65 53 74 61 72 74 4f 6e 46 69 72 73 74 55 73 65  eStartOnFirstUse
5de0: 20 26 26 20 21 50 72 6f 74 65 63 74 46 72 6f 6d   && !ProtectFrom
5df0: 45 73 63 61 70 65 64 41 6c 6c 6f 63 61 73 29 20  EscapedAllocas) 
5e00: 7b 0a 20 20 20 20 69 66 20 28 21 20 4d 49 2e 69  {.    if (! MI.i
5e10: 73 44 65 62 75 67 56 61 6c 75 65 28 29 29 20 7b  sDebugValue()) {
5e20: 0a 20 20 20 20 20 20 62 6f 6f 6c 20 66 6f 75 6e  .      bool foun
5e30: 64 20 3d 20 66 61 6c 73 65 3b 0a 20 20 20 20 20  d = false;.     
5e40: 20 66 6f 72 20 28 63 6f 6e 73 74 20 4d 61 63 68   for (const Mach
5e50: 69 6e 65 4f 70 65 72 61 6e 64 20 26 4d 4f 20 3a  ineOperand &MO :
5e60: 20 4d 49 2e 6f 70 65 72 61 6e 64 73 28 29 29 20   MI.operands()) 
5e70: 7b 0a 20 20 20 20 20 20 20 20 69 66 20 28 21 4d  {.        if (!M
5e80: 4f 2e 69 73 46 49 28 29 29 0a 20 20 20 20 20 20  O.isFI()).      
5e90: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
5ea0: 20 20 20 20 20 20 69 6e 74 20 53 6c 6f 74 20 3d        int Slot =
5eb0: 20 4d 4f 2e 67 65 74 49 6e 64 65 78 28 29 3b 0a   MO.getIndex();.
5ec0: 20 20 20 20 20 20 20 20 69 66 20 28 53 6c 6f 74          if (Slot
5ed0: 3c 30 29 0a 20 20 20 20 20 20 20 20 20 20 63 6f  <0).          co
5ee0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
5ef0: 69 66 20 28 49 6e 74 65 72 65 73 74 69 6e 67 53  if (InterestingS
5f00: 6c 6f 74 73 2e 74 65 73 74 28 53 6c 6f 74 29 20  lots.test(Slot) 
5f10: 26 26 20 61 70 70 6c 79 46 69 72 73 74 55 73 65  && applyFirstUse
5f20: 28 53 6c 6f 74 29 29 20 7b 0a 20 20 20 20 20 20  (Slot)) {.      
5f30: 20 20 20 20 73 6c 6f 74 73 2e 70 75 73 68 5f 62      slots.push_b
5f40: 61 63 6b 28 53 6c 6f 74 29 3b 0a 20 20 20 20 20  ack(Slot);.     
5f50: 20 20 20 20 20 66 6f 75 6e 64 20 3d 20 74 72 75       found = tru
5f60: 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
5f70: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28 66     }.      if (f
5f80: 6f 75 6e 64 29 20 7b 0a 20 20 20 20 20 20 20 20  ound) {.        
5f90: 69 73 53 74 61 72 74 20 3d 20 74 72 75 65 3b 0a  isStart = true;.
5fa0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74          return t
5fb0: 72 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rue;.      }.   
5fc0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
5fd0: 66 61 6c 73 65 3b 0a 7d 0a 0a 75 6e 73 69 67 6e  false;.}..unsign
5fe0: 65 64 20 53 74 61 63 6b 43 6f 6c 6f 72 69 6e 67  ed StackColoring
5ff0: 3a 3a 63 6f 6c 6c 65 63 74 4d 61 72 6b 65 72 73  ::collectMarkers
6000: 28 75 6e 73 69 67 6e 65 64 20 4e 75 6d 53 6c 6f  (unsigned NumSlo
6010: 74 29 20 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  t) {.  unsigned 
6020: 4d 61 72 6b 65 72 73 46 6f 75 6e 64 20 3d 20 30  MarkersFound = 0
6030: 3b 0a 20 20 42 6c 6f 63 6b 42 69 74 56 65 63 4d  ;.  BlockBitVecM
6040: 61 70 20 53 65 65 6e 53 74 61 72 74 4d 61 70 3b  ap SeenStartMap;
6050: 0a 20 20 49 6e 74 65 72 65 73 74 69 6e 67 53 6c  .  InterestingSl
6060: 6f 74 73 2e 63 6c 65 61 72 28 29 3b 0a 20 20 49  ots.clear();.  I
6070: 6e 74 65 72 65 73 74 69 6e 67 53 6c 6f 74 73 2e  nterestingSlots.
6080: 72 65 73 69 7a 65 28 4e 75 6d 53 6c 6f 74 29 3b  resize(NumSlot);
6090: 0a 20 20 43 6f 6e 73 65 72 76 61 74 69 76 65 53  .  ConservativeS
60a0: 6c 6f 74 73 2e 63 6c 65 61 72 28 29 3b 0a 20 20  lots.clear();.  
60b0: 43 6f 6e 73 65 72 76 61 74 69 76 65 53 6c 6f 74  ConservativeSlot
60c0: 73 2e 72 65 73 69 7a 65 28 4e 75 6d 53 6c 6f 74  s.resize(NumSlot
60d0: 29 3b 0a 0a 20 20 2f 2f 20 6e 75 6d 62 65 72 20  );..  // number 
60e0: 6f 66 20 73 74 61 72 74 20 61 6e 64 20 65 6e 64  of start and end
60f0: 20 6c 69 66 65 74 69 6d 65 20 6f 70 73 20 66 6f   lifetime ops fo
6100: 72 20 65 61 63 68 20 73 6c 6f 74 0a 20 20 53 6d  r each slot.  Sm
6110: 61 6c 6c 56 65 63 74 6f 72 3c 69 6e 74 2c 20 38  allVector<int, 8
6120: 3e 20 4e 75 6d 53 74 61 72 74 4c 69 66 65 74 69  > NumStartLifeti
6130: 6d 65 73 28 4e 75 6d 53 6c 6f 74 2c 20 30 29 3b  mes(NumSlot, 0);
6140: 0a 20 20 53 6d 61 6c 6c 56 65 63 74 6f 72 3c 69  .  SmallVector<i
6150: 6e 74 2c 20 38 3e 20 4e 75 6d 45 6e 64 4c 69 66  nt, 8> NumEndLif
6160: 65 74 69 6d 65 73 28 4e 75 6d 53 6c 6f 74 2c 20  etimes(NumSlot, 
6170: 30 29 3b 0a 0a 20 20 2f 2f 20 53 74 65 70 20 31  0);..  // Step 1
6180: 3a 20 63 6f 6c 6c 65 63 74 20 6d 61 72 6b 65 72  : collect marker
6190: 73 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 74  s and populate t
61a0: 68 65 20 22 49 6e 74 65 72 65 73 74 69 6e 67 53  he "InterestingS
61b0: 6c 6f 74 73 22 0a 20 20 2f 2f 20 61 6e 64 20 22  lots".  // and "
61c0: 43 6f 6e 73 65 72 76 61 74 69 76 65 53 6c 6f 74  ConservativeSlot
61d0: 73 22 20 73 65 74 73 2e 0a 20 20 66 6f 72 20 28  s" sets..  for (
61e0: 4d 61 63 68 69 6e 65 42 61 73 69 63 42 6c 6f 63  MachineBasicBloc
61f0: 6b 20 2a 4d 42 42 20 3a 20 64 65 70 74 68 5f 66  k *MBB : depth_f
6200: 69 72 73 74 28 4d 46 29 29 20 7b 0a 20 20 20 20  irst(MF)) {.    
6210: 2f 2f 20 43 6f 6d 70 75 74 65 20 74 68 65 20 73  // Compute the s
6220: 65 74 20 6f 66 20 73 6c 6f 74 73 20 66 6f 72 20  et of slots for 
6230: 77 68 69 63 68 20 77 65 27 76 65 20 73 65 65 6e  which we've seen
6240: 20 61 20 53 54 41 52 54 20 6d 61 72 6b 65 72 20   a START marker 
6250: 62 75 74 20 68 61 76 65 0a 20 20 20 20 2f 2f 20  but have.    // 
6260: 6e 6f 74 20 79 65 74 20 73 65 65 6e 20 61 6e 20  not yet seen an 
6270: 45 4e 44 20 6d 61 72 6b 65 72 20 61 74 20 74 68  END marker at th
6280: 69 73 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20  is point in the 
6290: 77 61 6c 6b 20 28 65 2e 67 2e 20 6f 6e 20 65 6e  walk (e.g. on en
62a0: 74 72 79 0a 20 20 20 20 2f 2f 20 74 6f 20 74 68  try.    // to th
62b0: 69 73 20 62 62 29 2e 0a 20 20 20 20 42 69 74 56  is bb)..    BitV
62c0: 65 63 74 6f 72 20 42 65 74 77 65 65 6e 53 74 61  ector BetweenSta
62d0: 72 74 45 6e 64 3b 0a 20 20 20 20 42 65 74 77 65  rtEnd;.    Betwe
62e0: 65 6e 53 74 61 72 74 45 6e 64 2e 72 65 73 69 7a  enStartEnd.resiz
62f0: 65 28 4e 75 6d 53 6c 6f 74 29 3b 0a 20 20 20 20  e(NumSlot);.    
6300: 66 6f 72 20 28 4d 61 63 68 69 6e 65 42 61 73 69  for (MachineBasi
6310: 63 42 6c 6f 63 6b 3a 3a 63 6f 6e 73 74 5f 70 72  cBlock::const_pr
6320: 65 64 5f 69 74 65 72 61 74 6f 72 20 50 49 20 3d  ed_iterator PI =
6330: 20 4d 42 42 2d 3e 70 72 65 64 5f 62 65 67 69 6e   MBB->pred_begin
6340: 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  (),.            
6350: 20 50 45 20 3d 20 4d 42 42 2d 3e 70 72 65 64 5f   PE = MBB->pred_
6360: 65 6e 64 28 29 3b 20 50 49 20 21 3d 20 50 45 3b  end(); PI != PE;
6370: 20 2b 2b 50 49 29 20 7b 0a 20 20 20 20 20 20 42   ++PI) {.      B
6380: 6c 6f 63 6b 42 69 74 56 65 63 4d 61 70 3a 3a 63  lockBitVecMap::c
6390: 6f 6e 73 74 5f 69 74 65 72 61 74 6f 72 20 49 20  onst_iterator I 
63a0: 3d 20 53 65 65 6e 53 74 61 72 74 4d 61 70 2e 66  = SeenStartMap.f
63b0: 69 6e 64 28 2a 50 49 29 3b 0a 20 20 20 20 20 20  ind(*PI);.      
63c0: 69 66 20 28 49 20 21 3d 20 53 65 65 6e 53 74 61  if (I != SeenSta
63d0: 72 74 4d 61 70 2e 65 6e 64 28 29 29 20 7b 0a 20  rtMap.end()) {. 
63e0: 20 20 20 20 20 20 20 42 65 74 77 65 65 6e 53 74         BetweenSt
63f0: 61 72 74 45 6e 64 20 7c 3d 20 49 2d 3e 73 65 63  artEnd |= I->sec
6400: 6f 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ond;.      }.   
6410: 20 7d 0a 0a 20 20 20 20 2f 2f 20 57 61 6c 6b 20   }..    // Walk 
6420: 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 73  the instructions
6430: 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b 20 74 6f   in the block to
6440: 20 6c 6f 6f 6b 20 66 6f 72 20 73 74 61 72 74 2f   look for start/
6450: 65 6e 64 20 6f 70 73 2e 0a 20 20 20 20 66 6f 72  end ops..    for
6460: 20 28 4d 61 63 68 69 6e 65 49 6e 73 74 72 20 26   (MachineInstr &
6470: 4d 49 20 3a 20 2a 4d 42 42 29 20 7b 0a 20 20 20  MI : *MBB) {.   
6480: 20 20 20 69 66 20 28 4d 49 2e 67 65 74 4f 70 63     if (MI.getOpc
6490: 6f 64 65 28 29 20 3d 3d 20 54 61 72 67 65 74 4f  ode() == TargetO
64a0: 70 63 6f 64 65 3a 3a 4c 49 46 45 54 49 4d 45 5f  pcode::LIFETIME_
64b0: 53 54 41 52 54 20 7c 7c 0a 20 20 20 20 20 20 20  START ||.       
64c0: 20 20 20 4d 49 2e 67 65 74 4f 70 63 6f 64 65 28     MI.getOpcode(
64d0: 29 20 3d 3d 20 54 61 72 67 65 74 4f 70 63 6f 64  ) == TargetOpcod
64e0: 65 3a 3a 4c 49 46 45 54 49 4d 45 5f 45 4e 44 29  e::LIFETIME_END)
64f0: 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 53   {.        int S
6500: 6c 6f 74 20 3d 20 67 65 74 53 74 61 72 74 4f 72  lot = getStartOr
6510: 45 6e 64 53 6c 6f 74 28 4d 49 29 3b 0a 20 20 20  EndSlot(MI);.   
6520: 20 20 20 20 20 69 66 20 28 53 6c 6f 74 20 3c 20       if (Slot < 
6530: 30 29 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  0).          con
6540: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 49  tinue;.        I
6550: 6e 74 65 72 65 73 74 69 6e 67 53 6c 6f 74 73 2e  nterestingSlots.
6560: 73 65 74 28 53 6c 6f 74 29 3b 0a 20 20 20 20 20  set(Slot);.     
6570: 20 20 20 69 66 20 28 4d 49 2e 67 65 74 4f 70 63     if (MI.getOpc
6580: 6f 64 65 28 29 20 3d 3d 20 54 61 72 67 65 74 4f  ode() == TargetO
6590: 70 63 6f 64 65 3a 3a 4c 49 46 45 54 49 4d 45 5f  pcode::LIFETIME_
65a0: 53 54 41 52 54 29 20 7b 0a 20 20 20 20 20 20 20  START) {.       
65b0: 20 20 20 42 65 74 77 65 65 6e 53 74 61 72 74 45     BetweenStartE
65c0: 6e 64 2e 73 65 74 28 53 6c 6f 74 29 3b 0a 20 20  nd.set(Slot);.  
65d0: 20 20 20 20 20 20 20 20 4e 75 6d 53 74 61 72 74          NumStart
65e0: 4c 69 66 65 74 69 6d 65 73 5b 53 6c 6f 74 5d 20  Lifetimes[Slot] 
65f0: 2b 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 20  += 1;.        } 
6600: 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20  else {.         
6610: 20 42 65 74 77 65 65 6e 53 74 61 72 74 45 6e 64   BetweenStartEnd
6620: 2e 72 65 73 65 74 28 53 6c 6f 74 29 3b 0a 20 20  .reset(Slot);.  
6630: 20 20 20 20 20 20 20 20 4e 75 6d 45 6e 64 4c 69          NumEndLi
6640: 66 65 74 69 6d 65 73 5b 53 6c 6f 74 5d 20 2b 3d  fetimes[Slot] +=
6650: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
6660: 20 20 20 20 20 20 63 6f 6e 73 74 20 41 6c 6c 6f        const Allo
6670: 63 61 49 6e 73 74 20 2a 41 6c 6c 6f 63 61 74 69  caInst *Allocati
6680: 6f 6e 20 3d 20 4d 46 49 2d 3e 67 65 74 4f 62 6a  on = MFI->getObj
6690: 65 63 74 41 6c 6c 6f 63 61 74 69 6f 6e 28 53 6c  ectAllocation(Sl
66a0: 6f 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 20  ot);.        if 
66b0: 28 41 6c 6c 6f 63 61 74 69 6f 6e 29 20 7b 0a 20  (Allocation) {. 
66c0: 20 20 20 20 20 20 20 20 20 44 45 42 55 47 28 64           DEBUG(d
66d0: 62 67 73 28 29 20 3c 3c 20 22 46 6f 75 6e 64 20  bgs() << "Found 
66e0: 61 20 6c 69 66 65 74 69 6d 65 20 22 29 3b 0a 20  a lifetime ");. 
66f0: 20 20 20 20 20 20 20 20 20 44 45 42 55 47 28 64           DEBUG(d
6700: 62 67 73 28 29 20 3c 3c 20 28 4d 49 2e 67 65 74  bgs() << (MI.get
6710: 4f 70 63 6f 64 65 28 29 20 3d 3d 20 54 61 72 67  Opcode() == Targ
6720: 65 74 4f 70 63 6f 64 65 3a 3a 4c 49 46 45 54 49  etOpcode::LIFETI
6730: 4d 45 5f 53 54 41 52 54 0a 20 20 20 20 20 20 20  ME_START.       
6740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6750: 20 20 20 20 20 20 20 20 3f 20 22 73 74 61 72 74          ? "start
6760: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
6770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6780: 20 3a 20 22 65 6e 64 22 29 29 3b 0a 20 20 20 20   : "end"));.    
6790: 20 20 20 20 20 20 44 45 42 55 47 28 64 62 67 73        DEBUG(dbgs
67a0: 28 29 20 3c 3c 20 22 20 6d 61 72 6b 65 72 20 66  () << " marker f
67b0: 6f 72 20 73 6c 6f 74 20 23 22 20 3c 3c 20 53 6c  or slot #" << Sl
67c0: 6f 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 44  ot);.          D
67d0: 45 42 55 47 28 64 62 67 73 28 29 20 3c 3c 20 22  EBUG(dbgs() << "
67e0: 20 77 69 74 68 20 61 6c 6c 6f 63 61 74 69 6f 6e   with allocation
67f0: 3a 20 22 20 3c 3c 20 41 6c 6c 6f 63 61 74 69 6f  : " << Allocatio
6800: 6e 2d 3e 67 65 74 4e 61 6d 65 28 29 0a 20 20 20  n->getName().   
6810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6820: 20 20 20 20 3c 3c 20 22 5c 6e 22 29 3b 0a 20 20      << "\n");.  
6830: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6840: 4d 61 72 6b 65 72 73 2e 70 75 73 68 5f 62 61 63  Markers.push_bac
6850: 6b 28 26 4d 49 29 3b 0a 20 20 20 20 20 20 20 20  k(&MI);.        
6860: 4d 61 72 6b 65 72 73 46 6f 75 6e 64 20 2b 3d 20  MarkersFound += 
6870: 31 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  1;.      } else 
6880: 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 20 28 63  {.        for (c
6890: 6f 6e 73 74 20 4d 61 63 68 69 6e 65 4f 70 65 72  onst MachineOper
68a0: 61 6e 64 20 26 4d 4f 20 3a 20 4d 49 2e 6f 70 65  and &MO : MI.ope
68b0: 72 61 6e 64 73 28 29 29 20 7b 0a 20 20 20 20 20  rands()) {.     
68c0: 20 20 20 20 20 69 66 20 28 21 4d 4f 2e 69 73 46       if (!MO.isF
68d0: 49 28 29 29 0a 20 20 20 20 20 20 20 20 20 20 20  I()).           
68e0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
68f0: 20 20 20 20 20 69 6e 74 20 53 6c 6f 74 20 3d 20       int Slot = 
6900: 4d 4f 2e 67 65 74 49 6e 64 65 78 28 29 3b 0a 20  MO.getIndex();. 
6910: 20 20 20 20 20 20 20 20 20 69 66 20 28 53 6c 6f           if (Slo
6920: 74 20 3c 20 30 29 0a 20 20 20 20 20 20 20 20 20  t < 0).         
6930: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
6940: 20 20 20 20 20 20 20 69 66 20 28 21 20 42 65 74         if (! Bet
6950: 77 65 65 6e 53 74 61 72 74 45 6e 64 2e 74 65 73  weenStartEnd.tes
6960: 74 28 53 6c 6f 74 29 29 20 7b 0a 20 20 20 20 20  t(Slot)) {.     
6970: 20 20 20 20 20 20 20 43 6f 6e 73 65 72 76 61 74         Conservat
6980: 69 76 65 53 6c 6f 74 73 2e 73 65 74 28 53 6c 6f  iveSlots.set(Slo
6990: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  t);.          }.
69a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
69b0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 42 69 74 56  }.    }.    BitV
69c0: 65 63 74 6f 72 20 26 53 65 65 6e 53 74 61 72 74  ector &SeenStart
69d0: 20 3d 20 53 65 65 6e 53 74 61 72 74 4d 61 70 5b   = SeenStartMap[
69e0: 4d 42 42 5d 3b 0a 20 20 20 20 53 65 65 6e 53 74  MBB];.    SeenSt
69f0: 61 72 74 20 7c 3d 20 42 65 74 77 65 65 6e 53 74  art |= BetweenSt
6a00: 61 72 74 45 6e 64 3b 0a 20 20 7d 0a 20 20 69 66  artEnd;.  }.  if
6a10: 20 28 21 4d 61 72 6b 65 72 73 46 6f 75 6e 64 29   (!MarkersFound)
6a20: 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b   {.    return 0;
6a30: 0a 20 20 7d 0a 0a 20 20 2f 2f 20 50 52 32 37 39  .  }..  // PR279
6a40: 30 33 3a 20 73 6c 6f 74 73 20 77 69 74 68 20 6d  03: slots with m
6a50: 75 6c 74 69 70 6c 65 20 73 74 61 72 74 20 6f 72  ultiple start or
6a60: 20 65 6e 64 20 6c 69 66 65 74 69 6d 65 20 6f 70   end lifetime op
6a70: 73 20 61 72 65 20 6e 6f 74 0a 20 20 2f 2f 20 73  s are not.  // s
6a80: 61 66 65 20 74 6f 20 65 6e 61 62 6c 65 20 66 6f  afe to enable fo
6a90: 72 20 22 6c 69 66 65 74 69 6d 65 2d 73 74 61 72  r "lifetime-star
6aa0: 74 2d 6f 6e 2d 66 69 72 73 74 2d 75 73 65 22 2e  t-on-first-use".
6ab0: 0a 20 20 66 6f 72 20 28 75 6e 73 69 67 6e 65 64  .  for (unsigned
6ac0: 20 73 6c 6f 74 20 3d 20 30 3b 20 73 6c 6f 74 20   slot = 0; slot 
6ad0: 3c 20 4e 75 6d 53 6c 6f 74 3b 20 2b 2b 73 6c 6f  < NumSlot; ++slo
6ae0: 74 29 0a 20 20 20 20 69 66 20 28 4e 75 6d 53 74  t).    if (NumSt
6af0: 61 72 74 4c 69 66 65 74 69 6d 65 73 5b 73 6c 6f  artLifetimes[slo
6b00: 74 5d 20 3e 20 31 20 7c 7c 20 4e 75 6d 45 6e 64  t] > 1 || NumEnd
6b10: 4c 69 66 65 74 69 6d 65 73 5b 73 6c 6f 74 5d 20  Lifetimes[slot] 
6b20: 3e 20 31 29 0a 20 20 20 20 20 20 43 6f 6e 73 65  > 1).      Conse
6b30: 72 76 61 74 69 76 65 53 6c 6f 74 73 2e 73 65 74  rvativeSlots.set
6b40: 28 73 6c 6f 74 29 3b 0a 20 20 44 45 42 55 47 28  (slot);.  DEBUG(
6b50: 64 75 6d 70 42 56 28 22 43 6f 6e 73 65 72 76 61  dumpBV("Conserva
6b60: 74 69 76 65 20 73 6c 6f 74 73 22 2c 20 43 6f 6e  tive slots", Con
6b70: 73 65 72 76 61 74 69 76 65 53 6c 6f 74 73 29 29  servativeSlots))
6b80: 3b 0a 0a 20 20 2f 2f 20 53 74 65 70 20 32 3a 20  ;..  // Step 2: 
6b90: 63 6f 6d 70 75 74 65 20 62 65 67 69 6e 2f 65 6e  compute begin/en
6ba0: 64 20 73 65 74 73 20 66 6f 72 20 65 61 63 68 20  d sets for each 
6bb0: 62 6c 6f 63 6b 0a 0a 20 20 2f 2f 20 4e 4f 54 45  block..  // NOTE
6bc0: 3a 20 57 65 20 75 73 65 20 61 20 64 65 70 74 68  : We use a depth
6bd0: 2d 66 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e  -first iteration
6be0: 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20   to ensure that 
6bf0: 77 65 20 6f 62 74 61 69 6e 20 61 0a 20 20 2f 2f  we obtain a.  //
6c00: 20 64 65 74 65 72 6d 69 6e 69 73 74 69 63 20 6e   deterministic n
6c10: 75 6d 62 65 72 69 6e 67 2e 0a 20 20 66 6f 72 20  umbering..  for 
6c20: 28 4d 61 63 68 69 6e 65 42 61 73 69 63 42 6c 6f  (MachineBasicBlo
6c30: 63 6b 20 2a 4d 42 42 20 3a 20 64 65 70 74 68 5f  ck *MBB : depth_
6c40: 66 69 72 73 74 28 4d 46 29 29 20 7b 0a 20 20 20  first(MF)) {.   
6c50: 20 2f 2f 20 41 73 73 69 67 6e 20 61 20 73 65 72   // Assign a ser
6c60: 69 61 6c 20 6e 75 6d 62 65 72 20 74 6f 20 74 68  ial number to th
6c70: 69 73 20 62 61 73 69 63 20 62 6c 6f 63 6b 2e 0a  is basic block..
6c80: 20 20 20 20 42 61 73 69 63 42 6c 6f 63 6b 73 5b      BasicBlocks[
6c90: 4d 42 42 5d 20 3d 20 42 61 73 69 63 42 6c 6f 63  MBB] = BasicBloc
6ca0: 6b 4e 75 6d 62 65 72 69 6e 67 2e 73 69 7a 65 28  kNumbering.size(
6cb0: 29 3b 0a 20 20 20 20 42 61 73 69 63 42 6c 6f 63  );.    BasicBloc
6cc0: 6b 4e 75 6d 62 65 72 69 6e 67 2e 70 75 73 68 5f  kNumbering.push_
6cd0: 62 61 63 6b 28 4d 42 42 29 3b 0a 0a 20 20 20 20  back(MBB);..    
6ce0: 2f 2f 20 4b 65 65 70 20 61 20 72 65 66 65 72 65  // Keep a refere
6cf0: 6e 63 65 20 74 6f 20 61 76 6f 69 64 20 72 65 70  nce to avoid rep
6d00: 65 61 74 65 64 20 6c 6f 6f 6b 75 70 73 2e 0a 20  eated lookups.. 
6d10: 20 20 20 42 6c 6f 63 6b 4c 69 66 65 74 69 6d 65     BlockLifetime
6d20: 49 6e 66 6f 20 26 42 6c 6f 63 6b 49 6e 66 6f 20  Info &BlockInfo 
6d30: 3d 20 42 6c 6f 63 6b 4c 69 76 65 6e 65 73 73 5b  = BlockLiveness[
6d40: 4d 42 42 5d 3b 0a 0a 20 20 20 20 42 6c 6f 63 6b  MBB];..    Block
6d50: 49 6e 66 6f 2e 42 65 67 69 6e 2e 72 65 73 69 7a  Info.Begin.resiz
6d60: 65 28 4e 75 6d 53 6c 6f 74 29 3b 0a 20 20 20 20  e(NumSlot);.    
6d70: 42 6c 6f 63 6b 49 6e 66 6f 2e 45 6e 64 2e 72 65  BlockInfo.End.re
6d80: 73 69 7a 65 28 4e 75 6d 53 6c 6f 74 29 3b 0a 0a  size(NumSlot);..
6d90: 20 20 20 20 53 6d 61 6c 6c 56 65 63 74 6f 72 3c      SmallVector<
6da0: 69 6e 74 2c 20 34 3e 20 73 6c 6f 74 73 3b 0a 20  int, 4> slots;. 
6db0: 20 20 20 66 6f 72 20 28 4d 61 63 68 69 6e 65 49     for (MachineI
6dc0: 6e 73 74 72 20 26 4d 49 20 3a 20 2a 4d 42 42 29  nstr &MI : *MBB)
6dd0: 20 7b 0a 20 20 20 20 20 20 62 6f 6f 6c 20 69 73   {.      bool is
6de0: 53 74 61 72 74 20 3d 20 66 61 6c 73 65 3b 0a 20  Start = false;. 
6df0: 20 20 20 20 20 73 6c 6f 74 73 2e 63 6c 65 61 72       slots.clear
6e00: 28 29 3b 0a 20 20 20 20 20 20 69 66 20 28 69 73  ();.      if (is
6e10: 4c 69 66 65 74 69 6d 65 53 74 61 72 74 4f 72 45  LifetimeStartOrE
6e20: 6e 64 28 4d 49 2c 20 73 6c 6f 74 73 2c 20 69 73  nd(MI, slots, is
6e30: 53 74 61 72 74 29 29 20 7b 0a 20 20 20 20 20 20  Start)) {.      
6e40: 20 20 69 66 20 28 21 69 73 53 74 61 72 74 29 20    if (!isStart) 
6e50: 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
6e60: 72 74 28 73 6c 6f 74 73 2e 73 69 7a 65 28 29 20  rt(slots.size() 
6e70: 3d 3d 20 31 20 26 26 20 22 75 6e 65 78 70 65 63  == 1 && "unexpec
6e80: 74 65 64 3a 20 4d 49 20 65 6e 64 73 20 6d 75 6c  ted: MI ends mul
6e90: 74 69 70 6c 65 20 73 6c 6f 74 73 22 29 3b 0a 20  tiple slots");. 
6ea0: 20 20 20 20 20 20 20 20 20 69 6e 74 20 53 6c 6f           int Slo
6eb0: 74 20 3d 20 73 6c 6f 74 73 5b 30 5d 3b 0a 20 20  t = slots[0];.  
6ec0: 20 20 20 20 20 20 20 20 69 66 20 28 42 6c 6f 63          if (Bloc
6ed0: 6b 49 6e 66 6f 2e 42 65 67 69 6e 2e 74 65 73 74  kInfo.Begin.test
6ee0: 28 53 6c 6f 74 29 29 20 7b 0a 20 20 20 20 20 20  (Slot)) {.      
6ef0: 20 20 20 20 20 20 42 6c 6f 63 6b 49 6e 66 6f 2e        BlockInfo.
6f00: 42 65 67 69 6e 2e 72 65 73 65 74 28 53 6c 6f 74  Begin.reset(Slot
6f10: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
6f20: 20 20 20 20 20 20 20 20 20 42 6c 6f 63 6b 49 6e           BlockIn
6f30: 66 6f 2e 45 6e 64 2e 73 65 74 28 53 6c 6f 74 29  fo.End.set(Slot)
6f40: 3b 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  ;.        } else
6f50: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72   {.          for
6f60: 20 28 61 75 74 6f 20 53 6c 6f 74 20 3a 20 73 6c   (auto Slot : sl
6f70: 6f 74 73 29 20 7b 0a 20 20 20 20 20 20 20 20 20  ots) {.         
6f80: 20 20 20 44 45 42 55 47 28 64 62 67 73 28 29 20     DEBUG(dbgs() 
6f90: 3c 3c 20 22 46 6f 75 6e 64 20 61 20 75 73 65 20  << "Found a use 
6fa0: 6f 66 20 73 6c 6f 74 20 23 22 20 3c 3c 20 53 6c  of slot #" << Sl
6fb0: 6f 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ot);.           
6fc0: 20 44 45 42 55 47 28 64 62 67 73 28 29 20 3c 3c   DEBUG(dbgs() <<
6fd0: 20 22 20 61 74 20 22 20 3c 3c 20 70 72 69 6e 74   " at " << print
6fe0: 4d 42 42 52 65 66 65 72 65 6e 63 65 28 2a 4d 42  MBBReference(*MB
6ff0: 42 29 20 3c 3c 20 22 20 69 6e 64 65 78 20 22 29  B) << " index ")
7000: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 44 45  ;.            DE
7010: 42 55 47 28 49 6e 64 65 78 65 73 2d 3e 67 65 74  BUG(Indexes->get
7020: 49 6e 73 74 72 75 63 74 69 6f 6e 49 6e 64 65 78  InstructionIndex
7030: 28 4d 49 29 2e 70 72 69 6e 74 28 64 62 67 73 28  (MI).print(dbgs(
7040: 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  )));.           
7050: 20 63 6f 6e 73 74 20 41 6c 6c 6f 63 61 49 6e 73   const AllocaIns
7060: 74 20 2a 41 6c 6c 6f 63 61 74 69 6f 6e 20 3d 20  t *Allocation = 
7070: 4d 46 49 2d 3e 67 65 74 4f 62 6a 65 63 74 41 6c  MFI->getObjectAl
7080: 6c 6f 63 61 74 69 6f 6e 28 53 6c 6f 74 29 3b 0a  location(Slot);.
7090: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
70a0: 41 6c 6c 6f 63 61 74 69 6f 6e 29 20 7b 0a 20 20  Allocation) {.  
70b0: 20 20 20 20 20 20 20 20 20 20 20 20 44 45 42 55              DEBU
70c0: 47 28 64 62 67 73 28 29 20 3c 3c 20 22 20 77 69  G(dbgs() << " wi
70d0: 74 68 20 61 6c 6c 6f 63 61 74 69 6f 6e 3a 20 22  th allocation: "
70e0: 3c 3c 20 41 6c 6c 6f 63 61 74 69 6f 6e 2d 3e 67  << Allocation->g
70f0: 65 74 4e 61 6d 65 28 29 29 3b 0a 20 20 20 20 20  etName());.     
7100: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7110: 20 20 20 20 20 44 45 42 55 47 28 64 62 67 73 28       DEBUG(dbgs(
7120: 29 20 3c 3c 20 22 5c 6e 22 29 3b 0a 20 20 20 20  ) << "\n");.    
7130: 20 20 20 20 20 20 20 20 69 66 20 28 42 6c 6f 63          if (Bloc
7140: 6b 49 6e 66 6f 2e 45 6e 64 2e 74 65 73 74 28 53  kInfo.End.test(S
7150: 6c 6f 74 29 29 20 7b 0a 20 20 20 20 20 20 20 20  lot)) {.        
7160: 20 20 20 20 20 20 42 6c 6f 63 6b 49 6e 66 6f 2e        BlockInfo.
7170: 45 6e 64 2e 72 65 73 65 74 28 53 6c 6f 74 29 3b  End.reset(Slot);
7180: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
7190: 20 20 20 20 20 20 20 20 20 20 20 42 6c 6f 63 6b             Block
71a0: 49 6e 66 6f 2e 42 65 67 69 6e 2e 73 65 74 28 53  Info.Begin.set(S
71b0: 6c 6f 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  lot);.          
71c0: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
71d0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
71e0: 20 2f 2f 20 55 70 64 61 74 65 20 73 74 61 74 69   // Update stati
71f0: 73 74 69 63 73 2e 0a 20 20 4e 75 6d 4d 61 72 6b  stics..  NumMark
7200: 65 72 53 65 65 6e 20 2b 3d 20 4d 61 72 6b 65 72  erSeen += Marker
7210: 73 46 6f 75 6e 64 3b 0a 20 20 72 65 74 75 72 6e  sFound;.  return
7220: 20 4d 61 72 6b 65 72 73 46 6f 75 6e 64 3b 0a 7d   MarkersFound;.}
7230: 0a 0a 76 6f 69 64 20 53 74 61 63 6b 43 6f 6c 6f  ..void StackColo
7240: 72 69 6e 67 3a 3a 63 61 6c 63 75 6c 61 74 65 4c  ring::calculateL
7250: 6f 63 61 6c 4c 69 76 65 6e 65 73 73 28 29 20 7b  ocalLiveness() {
7260: 0a 20 20 75 6e 73 69 67 6e 65 64 20 4e 75 6d 49  .  unsigned NumI
7270: 74 65 72 73 20 3d 20 30 3b 0a 20 20 62 6f 6f 6c  ters = 0;.  bool
7280: 20 63 68 61 6e 67 65 64 20 3d 20 74 72 75 65 3b   changed = true;
7290: 0a 20 20 77 68 69 6c 65 20 28 63 68 61 6e 67 65  .  while (change
72a0: 64 29 20 7b 0a 20 20 20 20 63 68 61 6e 67 65 64  d) {.    changed
72b0: 20 3d 20 66 61 6c 73 65 3b 0a 20 20 20 20 2b 2b   = false;.    ++
72c0: 4e 75 6d 49 74 65 72 73 3b 0a 0a 20 20 20 20 66  NumIters;..    f
72d0: 6f 72 20 28 63 6f 6e 73 74 20 4d 61 63 68 69 6e  or (const Machin
72e0: 65 42 61 73 69 63 42 6c 6f 63 6b 20 2a 42 42 20  eBasicBlock *BB 
72f0: 3a 20 42 61 73 69 63 42 6c 6f 63 6b 4e 75 6d 62  : BasicBlockNumb
7300: 65 72 69 6e 67 29 20 7b 0a 20 20 20 20 20 20 2f  ering) {.      /
7310: 2f 20 55 73 65 20 61 6e 20 69 74 65 72 61 74 6f  / Use an iterato
7320: 72 20 74 6f 20 61 76 6f 69 64 20 72 65 70 65 61  r to avoid repea
7330: 74 65 64 20 6c 6f 6f 6b 75 70 73 2e 0a 20 20 20  ted lookups..   
7340: 20 20 20 4c 69 76 65 6e 65 73 73 4d 61 70 3a 3a     LivenessMap::
7350: 69 74 65 72 61 74 6f 72 20 42 49 20 3d 20 42 6c  iterator BI = Bl
7360: 6f 63 6b 4c 69 76 65 6e 65 73 73 2e 66 69 6e 64  ockLiveness.find
7370: 28 42 42 29 3b 0a 20 20 20 20 20 20 61 73 73 65  (BB);.      asse
7380: 72 74 28 42 49 20 21 3d 20 42 6c 6f 63 6b 4c 69  rt(BI != BlockLi
7390: 76 65 6e 65 73 73 2e 65 6e 64 28 29 20 26 26 20  veness.end() && 
73a0: 22 42 6c 6f 63 6b 20 6e 6f 74 20 66 6f 75 6e 64  "Block not found
73b0: 22 29 3b 0a 20 20 20 20 20 20 42 6c 6f 63 6b 4c  ");.      BlockL
73c0: 69 66 65 74 69 6d 65 49 6e 66 6f 20 26 42 6c 6f  ifetimeInfo &Blo
73d0: 63 6b 49 6e 66 6f 20 3d 20 42 49 2d 3e 73 65 63  ckInfo = BI->sec
73e0: 6f 6e 64 3b 0a 0a 20 20 20 20 20 20 2f 2f 20 43  ond;..      // C
73f0: 6f 6d 70 75 74 65 20 4c 69 76 65 49 6e 20 62 79  ompute LiveIn by
7400: 20 75 6e 69 6f 6e 69 6e 67 20 74 6f 67 65 74 68   unioning togeth
7410: 65 72 20 74 68 65 20 4c 69 76 65 4f 75 74 20 73  er the LiveOut s
7420: 65 74 73 20 6f 66 20 61 6c 6c 20 70 72 65 64 73  ets of all preds
7430: 2e 0a 20 20 20 20 20 20 42 69 74 56 65 63 74 6f  ..      BitVecto
7440: 72 20 4c 6f 63 61 6c 4c 69 76 65 49 6e 3b 0a 20  r LocalLiveIn;. 
7450: 20 20 20 20 20 66 6f 72 20 28 4d 61 63 68 69 6e       for (Machin
7460: 65 42 61 73 69 63 42 6c 6f 63 6b 3a 3a 63 6f 6e  eBasicBlock::con
7470: 73 74 5f 70 72 65 64 5f 69 74 65 72 61 74 6f 72  st_pred_iterator
7480: 20 50 49 20 3d 20 42 42 2d 3e 70 72 65 64 5f 62   PI = BB->pred_b
7490: 65 67 69 6e 28 29 2c 0a 20 20 20 20 20 20 20 20  egin(),.        
74a0: 20 20 20 50 45 20 3d 20 42 42 2d 3e 70 72 65 64     PE = BB->pred
74b0: 5f 65 6e 64 28 29 3b 20 50 49 20 21 3d 20 50 45  _end(); PI != PE
74c0: 3b 20 2b 2b 50 49 29 20 7b 0a 20 20 20 20 20 20  ; ++PI) {.      
74d0: 20 20 4c 69 76 65 6e 65 73 73 4d 61 70 3a 3a 63    LivenessMap::c
74e0: 6f 6e 73 74 5f 69 74 65 72 61 74 6f 72 20 49 20  onst_iterator I 
74f0: 3d 20 42 6c 6f 63 6b 4c 69 76 65 6e 65 73 73 2e  = BlockLiveness.
7500: 66 69 6e 64 28 2a 50 49 29 3b 0a 20 20 20 20 20  find(*PI);.     
7510: 20 20 20 61 73 73 65 72 74 28 49 20 21 3d 20 42     assert(I != B
7520: 6c 6f 63 6b 4c 69 76 65 6e 65 73 73 2e 65 6e 64  lockLiveness.end
7530: 28 29 20 26 26 20 22 50 72 65 64 65 63 65 73 73  () && "Predecess
7540: 6f 72 20 6e 6f 74 20 66 6f 75 6e 64 22 29 3b 0a  or not found");.
7550: 20 20 20 20 20 20 20 20 4c 6f 63 61 6c 4c 69 76          LocalLiv
7560: 65 49 6e 20 7c 3d 20 49 2d 3e 73 65 63 6f 6e 64  eIn |= I->second
7570: 2e 4c 69 76 65 4f 75 74 3b 0a 20 20 20 20 20 20  .LiveOut;.      
7580: 7d 0a 0a 20 20 20 20 20 20 2f 2f 20 43 6f 6d 70  }..      // Comp
7590: 75 74 65 20 4c 69 76 65 4f 75 74 20 62 79 20 73  ute LiveOut by s
75a0: 75 62 74 72 61 63 74 69 6e 67 20 6f 75 74 20 6c  ubtracting out l
75b0: 69 66 65 74 69 6d 65 73 20 74 68 61 74 20 65 6e  ifetimes that en
75c0: 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20 20 20  d in this.      
75d0: 2f 2f 20 62 6c 6f 63 6b 2c 20 74 68 65 6e 20 61  // block, then a
75e0: 64 64 69 6e 67 20 69 6e 20 6c 69 66 65 74 69 6d  dding in lifetim
75f0: 65 73 20 74 68 61 74 20 62 65 67 69 6e 20 69 6e  es that begin in
7600: 20 74 68 69 73 20 62 6c 6f 63 6b 2e 20 20 49 66   this block.  If
7610: 0a 20 20 20 20 20 20 2f 2f 20 77 65 20 68 61 76  .      // we hav
7620: 65 20 62 6f 74 68 20 42 45 47 49 4e 20 61 6e 64  e both BEGIN and
7630: 20 45 4e 44 20 6d 61 72 6b 65 72 73 20 69 6e 20   END markers in 
7640: 74 68 65 20 73 61 6d 65 20 62 61 73 69 63 20 62  the same basic b
7650: 6c 6f 63 6b 0a 20 20 20 20 20 20 2f 2f 20 74 68  lock.      // th
7660: 65 6e 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20  en we know that 
7670: 74 68 65 20 42 45 47 49 4e 20 6d 61 72 6b 65 72  the BEGIN marker
7680: 20 63 6f 6d 65 73 20 61 66 74 65 72 20 74 68 65   comes after the
7690: 20 45 4e 44 2c 0a 20 20 20 20 20 20 2f 2f 20 62   END,.      // b
76a0: 65 63 61 75 73 65 20 77 65 20 61 6c 72 65 61 64  ecause we alread
76b0: 79 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73  y handle the cas
76c0: 65 20 77 68 65 72 65 20 74 68 65 20 42 45 47 49  e where the BEGI
76d0: 4e 20 63 6f 6d 65 73 0a 20 20 20 20 20 20 2f 2f  N comes.      //
76e0: 20 62 65 66 6f 72 65 20 74 68 65 20 45 4e 44 20   before the END 
76f0: 77 68 65 6e 20 63 6f 6c 6c 65 63 74 69 6e 67 20  when collecting 
7700: 74 68 65 20 6d 61 72 6b 65 72 73 20 28 61 6e 64  the markers (and
7710: 20 62 75 69 6c 64 69 6e 67 20 74 68 65 0a 20 20   building the.  
7720: 20 20 20 20 2f 2f 20 42 45 47 49 4e 2f 45 4e 44      // BEGIN/END
7730: 20 76 65 63 74 6f 72 73 29 2e 0a 20 20 20 20 20   vectors)..     
7740: 20 42 69 74 56 65 63 74 6f 72 20 4c 6f 63 61 6c   BitVector Local
7750: 4c 69 76 65 4f 75 74 20 3d 20 4c 6f 63 61 6c 4c  LiveOut = LocalL
7760: 69 76 65 49 6e 3b 0a 20 20 20 20 20 20 4c 6f 63  iveIn;.      Loc
7770: 61 6c 4c 69 76 65 4f 75 74 2e 72 65 73 65 74 28  alLiveOut.reset(
7780: 42 6c 6f 63 6b 49 6e 66 6f 2e 45 6e 64 29 3b 0a  BlockInfo.End);.
7790: 20 20 20 20 20 20 4c 6f 63 61 6c 4c 69 76 65 4f        LocalLiveO
77a0: 75 74 20 7c 3d 20 42 6c 6f 63 6b 49 6e 66 6f 2e  ut |= BlockInfo.
77b0: 42 65 67 69 6e 3b 0a 0a 20 20 20 20 20 20 2f 2f  Begin;..      //
77c0: 20 55 70 64 61 74 65 20 62 6c 6f 63 6b 20 4c 69   Update block Li
77d0: 76 65 49 6e 20 73 65 74 2c 20 6e 6f 74 69 6e 67  veIn set, noting
77e0: 20 77 68 65 74 68 65 72 20 69 74 20 68 61 73 20   whether it has 
77f0: 63 68 61 6e 67 65 64 2e 0a 20 20 20 20 20 20 69  changed..      i
7800: 66 20 28 4c 6f 63 61 6c 4c 69 76 65 49 6e 2e 74  f (LocalLiveIn.t
7810: 65 73 74 28 42 6c 6f 63 6b 49 6e 66 6f 2e 4c 69  est(BlockInfo.Li
7820: 76 65 49 6e 29 29 20 7b 0a 20 20 20 20 20 20 20  veIn)) {.       
7830: 20 63 68 61 6e 67 65 64 20 3d 20 74 72 75 65 3b   changed = true;
7840: 0a 20 20 20 20 20 20 20 20 42 6c 6f 63 6b 49 6e  .        BlockIn
7850: 66 6f 2e 4c 69 76 65 49 6e 20 7c 3d 20 4c 6f 63  fo.LiveIn |= Loc
7860: 61 6c 4c 69 76 65 49 6e 3b 0a 20 20 20 20 20 20  alLiveIn;.      
7870: 7d 0a 0a 20 20 20 20 20 20 2f 2f 20 55 70 64 61  }..      // Upda
7880: 74 65 20 62 6c 6f 63 6b 20 4c 69 76 65 4f 75 74  te block LiveOut
7890: 20 73 65 74 2c 20 6e 6f 74 69 6e 67 20 77 68 65   set, noting whe
78a0: 74 68 65 72 20 69 74 20 68 61 73 20 63 68 61 6e  ther it has chan
78b0: 67 65 64 2e 0a 20 20 20 20 20 20 69 66 20 28 4c  ged..      if (L
78c0: 6f 63 61 6c 4c 69 76 65 4f 75 74 2e 74 65 73 74  ocalLiveOut.test
78d0: 28 42 6c 6f 63 6b 49 6e 66 6f 2e 4c 69 76 65 4f  (BlockInfo.LiveO
78e0: 75 74 29 29 20 7b 0a 20 20 20 20 20 20 20 20 63  ut)) {.        c
78f0: 68 61 6e 67 65 64 20 3d 20 74 72 75 65 3b 0a 20  hanged = true;. 
7900: 20 20 20 20 20 20 20 42 6c 6f 63 6b 49 6e 66 6f         BlockInfo
7910: 2e 4c 69 76 65 4f 75 74 20 7c 3d 20 4c 6f 63 61  .LiveOut |= Loca
7920: 6c 4c 69 76 65 4f 75 74 3b 0a 20 20 20 20 20 20  lLiveOut;.      
7930: 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 2f 2f 20 77  }.    }.  } // w
7940: 68 69 6c 65 20 63 68 61 6e 67 65 64 2e 0a 0a 20  hile changed... 
7950: 20 4e 75 6d 49 74 65 72 61 74 69 6f 6e 73 20 3d   NumIterations =
7960: 20 4e 75 6d 49 74 65 72 73 3b 0a 7d 0a 0a 76 6f   NumIters;.}..vo
7970: 69 64 20 53 74 61 63 6b 43 6f 6c 6f 72 69 6e 67  id StackColoring
7980: 3a 3a 63 61 6c 63 75 6c 61 74 65 4c 69 76 65 49  ::calculateLiveI
7990: 6e 74 65 72 76 61 6c 73 28 75 6e 73 69 67 6e 65  ntervals(unsigne
79a0: 64 20 4e 75 6d 53 6c 6f 74 73 29 20 7b 0a 20 20  d NumSlots) {.  
79b0: 53 6d 61 6c 6c 56 65 63 74 6f 72 3c 53 6c 6f 74  SmallVector<Slot
79c0: 49 6e 64 65 78 2c 20 31 36 3e 20 53 74 61 72 74  Index, 16> Start
79d0: 73 3b 0a 20 20 53 6d 61 6c 6c 56 65 63 74 6f 72  s;.  SmallVector
79e0: 3c 62 6f 6f 6c 2c 20 31 36 3e 20 44 65 66 69 6e  <bool, 16> Defin
79f0: 69 74 65 6c 79 49 6e 55 73 65 3b 0a 0a 20 20 2f  itelyInUse;..  /
7a00: 2f 20 46 6f 72 20 65 61 63 68 20 62 6c 6f 63 6b  / For each block
7a10: 2c 20 66 69 6e 64 20 77 68 69 63 68 20 73 6c 6f  , find which slo
7a20: 74 73 20 61 72 65 20 61 63 74 69 76 65 20 77 69  ts are active wi
7a30: 74 68 69 6e 20 74 68 69 73 20 62 6c 6f 63 6b 0a  thin this block.
7a40: 20 20 2f 2f 20 61 6e 64 20 75 70 64 61 74 65 20    // and update 
7a50: 74 68 65 20 6c 69 76 65 20 69 6e 74 65 72 76 61  the live interva
7a60: 6c 73 2e 0a 20 20 66 6f 72 20 28 63 6f 6e 73 74  ls..  for (const
7a70: 20 4d 61 63 68 69 6e 65 42 61 73 69 63 42 6c 6f   MachineBasicBlo
7a80: 63 6b 20 26 4d 42 42 20 3a 20 2a 4d 46 29 20 7b  ck &MBB : *MF) {
7a90: 0a 20 20 20 20 53 74 61 72 74 73 2e 63 6c 65 61  .    Starts.clea
7aa0: 72 28 29 3b 0a 20 20 20 20 53 74 61 72 74 73 2e  r();.    Starts.
7ab0: 72 65 73 69 7a 65 28 4e 75 6d 53 6c 6f 74 73 29  resize(NumSlots)
7ac0: 3b 0a 20 20 20 20 44 65 66 69 6e 69 74 65 6c 79  ;.    Definitely
7ad0: 49 6e 55 73 65 2e 63 6c 65 61 72 28 29 3b 0a 20  InUse.clear();. 
7ae0: 20 20 20 44 65 66 69 6e 69 74 65 6c 79 49 6e 55     DefinitelyInU
7af0: 73 65 2e 72 65 73 69 7a 65 28 4e 75 6d 53 6c 6f  se.resize(NumSlo
7b00: 74 73 29 3b 0a 0a 20 20 20 20 2f 2f 20 53 74 61  ts);..    // Sta
7b10: 72 74 20 74 68 65 20 69 6e 74 65 72 76 61 6c 20  rt the interval 
7b20: 6f 66 20 74 68 65 20 73 6c 6f 74 73 20 74 68 61  of the slots tha
7b30: 74 20 77 65 20 70 72 65 76 69 6f 75 73 6c 79 20  t we previously 
7b40: 66 6f 75 6e 64 20 74 6f 20 62 65 20 27 69 6e 2d  found to be 'in-
7b50: 75 73 65 27 2e 0a 20 20 20 20 42 6c 6f 63 6b 4c  use'..    BlockL
7b60: 69 66 65 74 69 6d 65 49 6e 66 6f 20 26 4d 42 42  ifetimeInfo &MBB
7b70: 4c 69 76 65 6e 65 73 73 20 3d 20 42 6c 6f 63 6b  Liveness = Block
7b80: 4c 69 76 65 6e 65 73 73 5b 26 4d 42 42 5d 3b 0a  Liveness[&MBB];.
7b90: 20 20 20 20 66 6f 72 20 28 69 6e 74 20 70 6f 73      for (int pos
7ba0: 20 3d 20 4d 42 42 4c 69 76 65 6e 65 73 73 2e 4c   = MBBLiveness.L
7bb0: 69 76 65 49 6e 2e 66 69 6e 64 5f 66 69 72 73 74  iveIn.find_first
7bc0: 28 29 3b 20 70 6f 73 20 21 3d 20 2d 31 3b 0a 20  (); pos != -1;. 
7bd0: 20 20 20 20 20 20 20 20 70 6f 73 20 3d 20 4d 42          pos = MB
7be0: 42 4c 69 76 65 6e 65 73 73 2e 4c 69 76 65 49 6e  BLiveness.LiveIn
7bf0: 2e 66 69 6e 64 5f 6e 65 78 74 28 70 6f 73 29 29  .find_next(pos))
7c00: 20 7b 0a 20 20 20 20 20 20 53 74 61 72 74 73 5b   {.      Starts[
7c10: 70 6f 73 5d 20 3d 20 49 6e 64 65 78 65 73 2d 3e  pos] = Indexes->
7c20: 67 65 74 4d 42 42 53 74 61 72 74 49 64 78 28 26  getMBBStartIdx(&
7c30: 4d 42 42 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  MBB);.    }..   
7c40: 20 2f 2f 20 43 72 65 61 74 65 20 74 68 65 20 69   // Create the i
7c50: 6e 74 65 72 76 61 6c 20 66 6f 72 20 74 68 65 20  nterval for the 
7c60: 62 61 73 69 63 20 62 6c 6f 63 6b 73 20 63 6f 6e  basic blocks con
7c70: 74 61 69 6e 69 6e 67 20 6c 69 66 65 74 69 6d 65  taining lifetime
7c80: 20 62 65 67 69 6e 2f 65 6e 64 2e 0a 20 20 20 20   begin/end..    
7c90: 66 6f 72 20 28 63 6f 6e 73 74 20 4d 61 63 68 69  for (const Machi
7ca0: 6e 65 49 6e 73 74 72 20 26 4d 49 20 3a 20 4d 42  neInstr &MI : MB
7cb0: 42 29 20 7b 0a 20 20 20 20 20 20 53 6d 61 6c 6c  B) {.      Small
7cc0: 56 65 63 74 6f 72 3c 69 6e 74 2c 20 34 3e 20 73  Vector<int, 4> s
7cd0: 6c 6f 74 73 3b 0a 20 20 20 20 20 20 62 6f 6f 6c  lots;.      bool
7ce0: 20 49 73 53 74 61 72 74 20 3d 20 66 61 6c 73 65   IsStart = false
7cf0: 3b 0a 20 20 20 20 20 20 69 66 20 28 21 69 73 4c  ;.      if (!isL
7d00: 69 66 65 74 69 6d 65 53 74 61 72 74 4f 72 45 6e  ifetimeStartOrEn
7d10: 64 28 4d 49 2c 20 73 6c 6f 74 73 2c 20 49 73 53  d(MI, slots, IsS
7d20: 74 61 72 74 29 29 0a 20 20 20 20 20 20 20 20 63  tart)).        c
7d30: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 53  ontinue;.      S
7d40: 6c 6f 74 49 6e 64 65 78 20 54 68 69 73 49 6e 64  lotIndex ThisInd
7d50: 65 78 20 3d 20 49 6e 64 65 78 65 73 2d 3e 67 65  ex = Indexes->ge
7d60: 74 49 6e 73 74 72 75 63 74 69 6f 6e 49 6e 64 65  tInstructionInde
7d70: 78 28 4d 49 29 3b 0a 20 20 20 20 20 20 66 6f 72  x(MI);.      for
7d80: 20 28 61 75 74 6f 20 53 6c 6f 74 20 3a 20 73 6c   (auto Slot : sl
7d90: 6f 74 73 29 20 7b 0a 20 20 20 20 20 20 20 20 69  ots) {.        i
7da0: 66 20 28 49 73 53 74 61 72 74 29 20 7b 0a 20 20  f (IsStart) {.  
7db0: 20 20 20 20 20 20 20 20 2f 2f 20 49 66 20 61 20          // If a 
7dc0: 73 6c 6f 74 20 69 73 20 61 6c 72 65 61 64 79 20  slot is already 
7dd0: 64 65 66 69 6e 69 74 65 6c 79 20 69 6e 20 75 73  definitely in us
7de0: 65 2c 20 77 65 20 64 6f 6e 27 74 20 68 61 76 65  e, we don't have
7df0: 20 74 6f 20 65 6d 69 74 0a 20 20 20 20 20 20 20   to emit.       
7e00: 20 20 20 2f 2f 20 61 20 6e 65 77 20 73 74 61 72     // a new star
7e10: 74 20 6d 61 72 6b 65 72 20 62 65 63 61 75 73 65  t marker because
7e20: 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64   there is alread
7e30: 79 20 61 20 70 72 65 2d 65 78 69 73 74 69 6e 67  y a pre-existing
7e40: 0a 20 20 20 20 20 20 20 20 20 20 2f 2f 20 6f 6e  .          // on
7e50: 65 2e 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  e..          if 
7e60: 28 21 44 65 66 69 6e 69 74 65 6c 79 49 6e 55 73  (!DefinitelyInUs
7e70: 65 5b 53 6c 6f 74 5d 29 20 7b 0a 20 20 20 20 20  e[Slot]) {.     
7e80: 20 20 20 20 20 20 20 4c 69 76 65 53 74 61 72 74         LiveStart
7e90: 73 5b 53 6c 6f 74 5d 2e 70 75 73 68 5f 62 61 63  s[Slot].push_bac
7ea0: 6b 28 54 68 69 73 49 6e 64 65 78 29 3b 0a 20 20  k(ThisIndex);.  
7eb0: 20 20 20 20 20 20 20 20 20 20 44 65 66 69 6e 69            Defini
7ec0: 74 65 6c 79 49 6e 55 73 65 5b 53 6c 6f 74 5d 20  telyInUse[Slot] 
7ed0: 3d 20 74 72 75 65 3b 0a 20 20 20 20 20 20 20 20  = true;.        
7ee0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
7ef0: 20 28 21 53 74 61 72 74 73 5b 53 6c 6f 74 5d 2e   (!Starts[Slot].
7f00: 69 73 56 61 6c 69 64 28 29 29 0a 20 20 20 20 20  isValid()).     
7f10: 20 20 20 20 20 20 20 53 74 61 72 74 73 5b 53 6c         Starts[Sl
7f20: 6f 74 5d 20 3d 20 54 68 69 73 49 6e 64 65 78 3b  ot] = ThisIndex;
7f30: 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20  .        } else 
7f40: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 28  {.          if (
7f50: 53 74 61 72 74 73 5b 53 6c 6f 74 5d 2e 69 73 56  Starts[Slot].isV
7f60: 61 6c 69 64 28 29 29 20 7b 0a 20 20 20 20 20 20  alid()) {.      
7f70: 20 20 20 20 20 20 56 4e 49 6e 66 6f 20 2a 56 4e        VNInfo *VN
7f80: 49 20 3d 20 49 6e 74 65 72 76 61 6c 73 5b 53 6c  I = Intervals[Sl
7f90: 6f 74 5d 2d 3e 67 65 74 56 61 6c 4e 75 6d 49 6e  ot]->getValNumIn
7fa0: 66 6f 28 30 29 3b 0a 20 20 20 20 20 20 20 20 20  fo(0);.         
7fb0: 20 20 20 49 6e 74 65 72 76 61 6c 73 5b 53 6c 6f     Intervals[Slo
7fc0: 74 5d 2d 3e 61 64 64 53 65 67 6d 65 6e 74 28 0a  t]->addSegment(.
7fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7fe0: 4c 69 76 65 49 6e 74 65 72 76 61 6c 3a 3a 53 65  LiveInterval::Se
7ff0: 67 6d 65 6e 74 28 53 74 61 72 74 73 5b 53 6c 6f  gment(Starts[Slo
8000: 74 5d 2c 20 54 68 69 73 49 6e 64 65 78 2c 20 56  t], ThisIndex, V
8010: 4e 49 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  NI));.          
8020: 20 20 53 74 61 72 74 73 5b 53 6c 6f 74 5d 20 3d    Starts[Slot] =
8030: 20 53 6c 6f 74 49 6e 64 65 78 28 29 3b 20 2f 2f   SlotIndex(); //
8040: 20 49 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20   Invalidate the 
8050: 73 74 61 72 74 20 69 6e 64 65 78 0a 20 20 20 20  start index.    
8060: 20 20 20 20 20 20 20 20 44 65 66 69 6e 69 74 65          Definite
8070: 6c 79 49 6e 55 73 65 5b 53 6c 6f 74 5d 20 3d 20  lyInUse[Slot] = 
8080: 66 61 6c 73 65 3b 0a 20 20 20 20 20 20 20 20 20  false;.         
8090: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
80a0: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
80b0: 2f 2f 20 46 69 6e 69 73 68 20 75 70 20 73 74 61  // Finish up sta
80c0: 72 74 65 64 20 73 65 67 6d 65 6e 74 73 0a 20 20  rted segments.  
80d0: 20 20 66 6f 72 20 28 75 6e 73 69 67 6e 65 64 20    for (unsigned 
80e0: 69 20 3d 20 30 3b 20 69 20 3c 20 4e 75 6d 53 6c  i = 0; i < NumSl
80f0: 6f 74 73 3b 20 2b 2b 69 29 20 7b 0a 20 20 20 20  ots; ++i) {.    
8100: 20 20 69 66 20 28 21 53 74 61 72 74 73 5b 69 5d    if (!Starts[i]
8110: 2e 69 73 56 61 6c 69 64 28 29 29 0a 20 20 20 20  .isValid()).    
8120: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20      continue;.. 
8130: 20 20 20 20 20 53 6c 6f 74 49 6e 64 65 78 20 45       SlotIndex E
8140: 6e 64 49 64 78 20 3d 20 49 6e 64 65 78 65 73 2d  ndIdx = Indexes-
8150: 3e 67 65 74 4d 42 42 45 6e 64 49 64 78 28 26 4d  >getMBBEndIdx(&M
8160: 42 42 29 3b 0a 20 20 20 20 20 20 56 4e 49 6e 66  BB);.      VNInf
8170: 6f 20 2a 56 4e 49 20 3d 20 49 6e 74 65 72 76 61  o *VNI = Interva
8180: 6c 73 5b 69 5d 2d 3e 67 65 74 56 61 6c 4e 75 6d  ls[i]->getValNum
8190: 49 6e 66 6f 28 30 29 3b 0a 20 20 20 20 20 20 49  Info(0);.      I
81a0: 6e 74 65 72 76 61 6c 73 5b 69 5d 2d 3e 61 64 64  ntervals[i]->add
81b0: 53 65 67 6d 65 6e 74 28 4c 69 76 65 49 6e 74 65  Segment(LiveInte
81c0: 72 76 61 6c 3a 3a 53 65 67 6d 65 6e 74 28 53 74  rval::Segment(St
81d0: 61 72 74 73 5b 69 5d 2c 20 45 6e 64 49 64 78 2c  arts[i], EndIdx,
81e0: 20 56 4e 49 29 29 3b 0a 20 20 20 20 7d 0a 20 20   VNI));.    }.  
81f0: 7d 0a 7d 0a 0a 62 6f 6f 6c 20 53 74 61 63 6b 43  }.}..bool StackC
8200: 6f 6c 6f 72 69 6e 67 3a 3a 72 65 6d 6f 76 65 41  oloring::removeA
8210: 6c 6c 4d 61 72 6b 65 72 73 28 29 20 7b 0a 20 20  llMarkers() {.  
8220: 75 6e 73 69 67 6e 65 64 20 43 6f 75 6e 74 20 3d  unsigned Count =
8230: 20 30 3b 0a 20 20 66 6f 72 20 28 4d 61 63 68 69   0;.  for (Machi
8240: 6e 65 49 6e 73 74 72 20 2a 4d 49 20 3a 20 4d 61  neInstr *MI : Ma
8250: 72 6b 65 72 73 29 20 7b 0a 20 20 20 20 4d 49 2d  rkers) {.    MI-
8260: 3e 65 72 61 73 65 46 72 6f 6d 50 61 72 65 6e 74  >eraseFromParent
8270: 28 29 3b 0a 20 20 20 20 43 6f 75 6e 74 2b 2b 3b  ();.    Count++;
8280: 0a 20 20 7d 0a 20 20 4d 61 72 6b 65 72 73 2e 63  .  }.  Markers.c
8290: 6c 65 61 72 28 29 3b 0a 0a 20 20 44 45 42 55 47  lear();..  DEBUG
82a0: 28 64 62 67 73 28 29 3c 3c 22 52 65 6d 6f 76 65  (dbgs()<<"Remove
82b0: 64 20 22 3c 3c 43 6f 75 6e 74 3c 3c 22 20 6d 61  d "<<Count<<" ma
82c0: 72 6b 65 72 73 2e 5c 6e 22 29 3b 0a 20 20 72 65  rkers.\n");.  re
82d0: 74 75 72 6e 20 43 6f 75 6e 74 3b 0a 7d 0a 0a 76  turn Count;.}..v
82e0: 6f 69 64 20 53 74 61 63 6b 43 6f 6c 6f 72 69 6e  oid StackColorin
82f0: 67 3a 3a 72 65 6d 61 70 49 6e 73 74 72 75 63 74  g::remapInstruct
8300: 69 6f 6e 73 28 44 65 6e 73 65 4d 61 70 3c 69 6e  ions(DenseMap<in
8310: 74 2c 20 69 6e 74 3e 20 26 53 6c 6f 74 52 65 6d  t, int> &SlotRem
8320: 61 70 29 20 7b 0a 20 20 75 6e 73 69 67 6e 65 64  ap) {.  unsigned
8330: 20 46 69 78 65 64 49 6e 73 74 72 20 3d 20 30 3b   FixedInstr = 0;
8340: 0a 20 20 75 6e 73 69 67 6e 65 64 20 46 69 78 65  .  unsigned Fixe
8350: 64 4d 65 6d 4f 70 20 3d 20 30 3b 0a 20 20 75 6e  dMemOp = 0;.  un
8360: 73 69 67 6e 65 64 20 46 69 78 65 64 44 62 67 20  signed FixedDbg 
8370: 3d 20 30 3b 0a 0a 20 20 2f 2f 20 52 65 6d 61 70  = 0;..  // Remap
8380: 20 64 65 62 75 67 20 69 6e 66 6f 72 6d 61 74 69   debug informati
8390: 6f 6e 20 74 68 61 74 20 72 65 66 65 72 73 20 74  on that refers t
83a0: 6f 20 73 74 61 63 6b 20 73 6c 6f 74 73 2e 0a 20  o stack slots.. 
83b0: 20 66 6f 72 20 28 61 75 74 6f 20 26 56 49 20 3a   for (auto &VI :
83c0: 20 4d 46 2d 3e 67 65 74 56 61 72 69 61 62 6c 65   MF->getVariable
83d0: 44 62 67 49 6e 66 6f 28 29 29 20 7b 0a 20 20 20  DbgInfo()) {.   
83e0: 20 69 66 20 28 21 56 49 2e 56 61 72 29 0a 20 20   if (!VI.Var).  
83f0: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
8400: 20 20 69 66 20 28 53 6c 6f 74 52 65 6d 61 70 2e    if (SlotRemap.
8410: 63 6f 75 6e 74 28 56 49 2e 53 6c 6f 74 29 29 20  count(VI.Slot)) 
8420: 7b 0a 20 20 20 20 20 20 44 45 42 55 47 28 64 62  {.      DEBUG(db
8430: 67 73 28 29 20 3c 3c 20 22 52 65 6d 61 70 70 69  gs() << "Remappi
8440: 6e 67 20 64 65 62 75 67 20 69 6e 66 6f 20 66 6f  ng debug info fo
8450: 72 20 5b 22 0a 20 20 20 20 20 20 20 20 20 20 20  r [".           
8460: 20 20 20 20 20 20 20 20 3c 3c 20 63 61 73 74 3c          << cast<
8470: 44 49 4c 6f 63 61 6c 56 61 72 69 61 62 6c 65 3e  DILocalVariable>
8480: 28 56 49 2e 56 61 72 29 2d 3e 67 65 74 4e 61 6d  (VI.Var)->getNam
8490: 65 28 29 20 3c 3c 20 22 5d 2e 5c 6e 22 29 3b 0a  e() << "].\n");.
84a0: 20 20 20 20 20 20 56 49 2e 53 6c 6f 74 20 3d 20        VI.Slot = 
84b0: 53 6c 6f 74 52 65 6d 61 70 5b 56 49 2e 53 6c 6f  SlotRemap[VI.Slo
84c0: 74 5d 3b 0a 20 20 20 20 20 20 46 69 78 65 64 44  t];.      FixedD
84d0: 62 67 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  bg++;.    }.  }.
84e0: 0a 20 20 2f 2f 20 4b 65 65 70 20 61 20 6c 69 73  .  // Keep a lis
84f0: 74 20 6f 66 20 2a 61 6c 6c 6f 63 61 73 2a 20 77  t of *allocas* w
8500: 68 69 63 68 20 6e 65 65 64 20 74 6f 20 62 65 20  hich need to be 
8510: 72 65 6d 61 70 70 65 64 2e 0a 20 20 44 65 6e 73  remapped..  Dens
8520: 65 4d 61 70 3c 63 6f 6e 73 74 20 41 6c 6c 6f 63  eMap<const Alloc
8530: 61 49 6e 73 74 2a 2c 20 63 6f 6e 73 74 20 41 6c  aInst*, const Al
8540: 6c 6f 63 61 49 6e 73 74 2a 3e 20 41 6c 6c 6f 63  locaInst*> Alloc
8550: 61 73 3b 0a 0a 20 20 2f 2f 20 4b 65 65 70 20 61  as;..  // Keep a
8560: 20 6c 69 73 74 20 6f 66 20 61 6c 6c 6f 63 61 73   list of allocas
8570: 20 77 68 69 63 68 20 68 61 73 20 62 65 65 6e 20   which has been 
8580: 61 66 66 65 63 74 65 64 20 62 79 20 74 68 65 20  affected by the 
8590: 72 65 6d 61 70 2e 0a 20 20 53 6d 61 6c 6c 50 74  remap..  SmallPt
85a0: 72 53 65 74 3c 63 6f 6e 73 74 20 41 6c 6c 6f 63  rSet<const Alloc
85b0: 61 49 6e 73 74 2a 2c 20 33 32 3e 20 4d 65 72 67  aInst*, 32> Merg
85c0: 65 64 41 6c 6c 6f 63 61 73 3b 0a 0a 20 20 66 6f  edAllocas;..  fo
85d0: 72 20 28 63 6f 6e 73 74 20 73 74 64 3a 3a 70 61  r (const std::pa
85e0: 69 72 3c 69 6e 74 2c 20 69 6e 74 3e 20 26 53 49  ir<int, int> &SI
85f0: 20 3a 20 53 6c 6f 74 52 65 6d 61 70 29 20 7b 0a   : SlotRemap) {.
8600: 20 20 20 20 63 6f 6e 73 74 20 41 6c 6c 6f 63 61      const Alloca
8610: 49 6e 73 74 20 2a 46 72 6f 6d 20 3d 20 4d 46 49  Inst *From = MFI
8620: 2d 3e 67 65 74 4f 62 6a 65 63 74 41 6c 6c 6f 63  ->getObjectAlloc
8630: 61 74 69 6f 6e 28 53 49 2e 66 69 72 73 74 29 3b  ation(SI.first);
8640: 0a 20 20 20 20 63 6f 6e 73 74 20 41 6c 6c 6f 63  .    const Alloc
8650: 61 49 6e 73 74 20 2a 54 6f 20 3d 20 4d 46 49 2d  aInst *To = MFI-
8660: 3e 67 65 74 4f 62 6a 65 63 74 41 6c 6c 6f 63 61  >getObjectAlloca
8670: 74 69 6f 6e 28 53 49 2e 73 65 63 6f 6e 64 29 3b  tion(SI.second);
8680: 0a 20 20 20 20 61 73 73 65 72 74 28 54 6f 20 26  .    assert(To &
8690: 26 20 46 72 6f 6d 20 26 26 20 22 49 6e 76 61 6c  & From && "Inval
86a0: 69 64 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 62  id allocation ob
86b0: 6a 65 63 74 22 29 3b 0a 20 20 20 20 41 6c 6c 6f  ject");.    Allo
86c0: 63 61 73 5b 46 72 6f 6d 5d 20 3d 20 54 6f 3b 0a  cas[From] = To;.
86d0: 0a 20 20 20 20 2f 2f 20 41 41 20 6d 69 67 68 74  .    // AA might
86e0: 20 62 65 20 75 73 65 64 20 6c 61 74 65 72 20 66   be used later f
86f0: 6f 72 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 73  or instruction s
8700: 63 68 65 64 75 6c 69 6e 67 2c 20 61 6e 64 20 77  cheduling, and w
8710: 65 20 6e 65 65 64 20 69 74 20 74 6f 20 62 65 0a  e need it to be.
8720: 20 20 20 20 2f 2f 20 61 62 6c 65 20 74 6f 20 64      // able to d
8730: 65 64 75 63 65 20 74 68 65 20 63 6f 72 72 65 63  educe the correc
8740: 74 20 61 6c 69 61 73 69 6e 67 20 72 65 6c 65 61  t aliasing relea
8750: 74 69 6f 6e 73 68 69 70 73 20 62 65 74 77 65 65  tionships betwee
8760: 6e 20 70 6f 69 6e 74 65 72 73 0a 20 20 20 20 2f  n pointers.    /
8770: 2f 20 64 65 72 69 76 65 64 20 66 72 6f 6d 20 74  / derived from t
8780: 68 65 20 61 6c 6c 6f 63 61 20 62 65 69 6e 67 20  he alloca being 
8790: 72 65 6d 61 70 70 65 64 20 61 6e 64 20 74 68 65  remapped and the
87a0: 20 74 61 72 67 65 74 20 6f 66 20 74 68 61 74 20   target of that 
87b0: 72 65 6d 61 70 70 69 6e 67 2e 0a 20 20 20 20 2f  remapping..    /
87c0: 2f 20 54 68 65 20 6f 6e 6c 79 20 73 61 66 65 20  / The only safe 
87d0: 77 61 79 2c 20 77 69 74 68 6f 75 74 20 64 69 72  way, without dir
87e0: 65 63 74 6c 79 20 69 6e 66 6f 72 6d 69 6e 67 20  ectly informing 
87f0: 41 41 20 61 62 6f 75 74 20 74 68 65 20 72 65 6d  AA about the rem
8800: 61 70 70 69 6e 67 0a 20 20 20 20 2f 2f 20 73 6f  apping.    // so
8810: 6d 65 68 6f 77 2c 20 69 73 20 74 6f 20 64 69 72  mehow, is to dir
8820: 65 63 74 6c 79 20 75 70 64 61 74 65 20 74 68 65  ectly update the
8830: 20 49 52 20 74 6f 20 72 65 66 6c 65 63 74 20 74   IR to reflect t
8840: 68 65 20 63 68 61 6e 67 65 20 62 65 69 6e 67 20  he change being 
8850: 6d 61 64 65 0a 20 20 20 20 2f 2f 20 68 65 72 65  made.    // here
8860: 2e 0a 20 20 20 20 49 6e 73 74 72 75 63 74 69 6f  ..    Instructio
8870: 6e 20 2a 49 6e 73 74 20 3d 20 63 6f 6e 73 74 5f  n *Inst = const_
8880: 63 61 73 74 3c 41 6c 6c 6f 63 61 49 6e 73 74 20  cast<AllocaInst 
8890: 2a 3e 28 54 6f 29 3b 0a 20 20 20 20 69 66 20 28  *>(To);.    if (
88a0: 46 72 6f 6d 2d 3e 67 65 74 54 79 70 65 28 29 20  From->getType() 
88b0: 21 3d 20 54 6f 2d 3e 67 65 74 54 79 70 65 28 29  != To->getType()
88c0: 29 20 7b 0a 20 20 20 20 20 20 42 69 74 43 61 73  ) {.      BitCas
88d0: 74 49 6e 73 74 20 2a 43 61 73 74 20 3d 20 6e 65  tInst *Cast = ne
88e0: 77 20 42 69 74 43 61 73 74 49 6e 73 74 28 49 6e  w BitCastInst(In
88f0: 73 74 2c 20 46 72 6f 6d 2d 3e 67 65 74 54 79 70  st, From->getTyp
8900: 65 28 29 29 3b 0a 20 20 20 20 20 20 43 61 73 74  e());.      Cast
8910: 2d 3e 69 6e 73 65 72 74 41 66 74 65 72 28 49 6e  ->insertAfter(In
8920: 73 74 29 3b 0a 20 20 20 20 20 20 49 6e 73 74 20  st);.      Inst 
8930: 3d 20 43 61 73 74 3b 0a 20 20 20 20 7d 0a 0a 20  = Cast;.    }.. 
8940: 20 20 20 2f 2f 20 57 65 20 6b 65 65 70 20 62 6f     // We keep bo
8950: 74 68 20 73 6c 6f 74 73 20 74 6f 20 6d 61 69 6e  th slots to main
8960: 74 61 69 6e 20 41 6c 69 61 73 41 6e 61 6c 79 73  tain AliasAnalys
8970: 69 73 20 6d 65 74 61 64 61 74 61 20 6c 61 74 65  is metadata late
8980: 72 2e 0a 20 20 20 20 4d 65 72 67 65 64 41 6c 6c  r..    MergedAll
8990: 6f 63 61 73 2e 69 6e 73 65 72 74 28 46 72 6f 6d  ocas.insert(From
89a0: 29 3b 0a 20 20 20 20 4d 65 72 67 65 64 41 6c 6c  );.    MergedAll
89b0: 6f 63 61 73 2e 69 6e 73 65 72 74 28 54 6f 29 3b  ocas.insert(To);
89c0: 0a 0a 20 20 20 20 2f 2f 20 41 6c 6c 6f 77 20 74  ..    // Allow t
89d0: 68 65 20 73 74 61 63 6b 20 70 72 6f 74 65 63 74  he stack protect
89e0: 6f 72 20 74 6f 20 61 64 6a 75 73 74 20 69 74 73  or to adjust its
89f0: 20 76 61 6c 75 65 20 6d 61 70 20 74 6f 20 61 63   value map to ac
8a00: 63 6f 75 6e 74 20 66 6f 72 20 74 68 65 0a 20 20  count for the.  
8a10: 20 20 2f 2f 20 75 70 63 6f 6d 69 6e 67 20 72 65    // upcoming re
8a20: 70 6c 61 63 65 6d 65 6e 74 2e 0a 20 20 20 20 53  placement..    S
8a30: 50 2d 3e 61 64 6a 75 73 74 46 6f 72 43 6f 6c 6f  P->adjustForColo
8a40: 72 69 6e 67 28 46 72 6f 6d 2c 20 54 6f 29 3b 0a  ring(From, To);.
8a50: 0a 20 20 20 20 2f 2f 20 54 68 65 20 6e 65 77 20  .    // The new 
8a60: 61 6c 6c 6f 63 61 20 6d 69 67 68 74 20 6e 6f 74  alloca might not
8a70: 20 62 65 20 76 61 6c 69 64 20 69 6e 20 61 20 6c   be valid in a l
8a80: 6c 76 6d 2e 64 62 67 2e 64 65 63 6c 61 72 65 20  lvm.dbg.declare 
8a90: 66 6f 72 20 74 68 69 73 0a 20 20 20 20 2f 2f 20  for this.    // 
8aa0: 76 61 72 69 61 62 6c 65 2c 20 73 6f 20 75 6e 64  variable, so und
8ab0: 65 66 20 6f 75 74 20 74 68 65 20 75 73 65 20 74  ef out the use t
8ac0: 6f 20 6d 61 6b 65 20 74 68 65 20 76 65 72 69 66  o make the verif
8ad0: 69 65 72 20 68 61 70 70 79 2e 0a 20 20 20 20 41  ier happy..    A
8ae0: 6c 6c 6f 63 61 49 6e 73 74 20 2a 46 72 6f 6d 41  llocaInst *FromA
8af0: 49 20 3d 20 63 6f 6e 73 74 5f 63 61 73 74 3c 41  I = const_cast<A
8b00: 6c 6c 6f 63 61 49 6e 73 74 20 2a 3e 28 46 72 6f  llocaInst *>(Fro
8b10: 6d 29 3b 0a 20 20 20 20 69 66 20 28 46 72 6f 6d  m);.    if (From
8b20: 41 49 2d 3e 69 73 55 73 65 64 42 79 4d 65 74 61  AI->isUsedByMeta
8b30: 64 61 74 61 28 29 29 0a 20 20 20 20 20 20 56 61  data()).      Va
8b40: 6c 75 65 41 73 4d 65 74 61 64 61 74 61 3a 3a 68  lueAsMetadata::h
8b50: 61 6e 64 6c 65 52 41 55 57 28 46 72 6f 6d 41 49  andleRAUW(FromAI
8b60: 2c 20 55 6e 64 65 66 56 61 6c 75 65 3a 3a 67 65  , UndefValue::ge
8b70: 74 28 46 72 6f 6d 41 49 2d 3e 67 65 74 54 79 70  t(FromAI->getTyp
8b80: 65 28 29 29 29 3b 0a 20 20 20 20 66 6f 72 20 28  e()));.    for (
8b90: 61 75 74 6f 20 26 55 73 65 20 3a 20 46 72 6f 6d  auto &Use : From
8ba0: 41 49 2d 3e 75 73 65 73 28 29 29 20 7b 0a 20 20  AI->uses()) {.  
8bb0: 20 20 20 20 69 66 20 28 42 69 74 43 61 73 74 49      if (BitCastI
8bc0: 6e 73 74 20 2a 42 43 49 20 3d 20 64 79 6e 5f 63  nst *BCI = dyn_c
8bd0: 61 73 74 3c 42 69 74 43 61 73 74 49 6e 73 74 3e  ast<BitCastInst>
8be0: 28 55 73 65 2e 67 65 74 28 29 29 29 0a 20 20 20  (Use.get())).   
8bf0: 20 20 20 20 20 69 66 20 28 42 43 49 2d 3e 69 73       if (BCI->is
8c00: 55 73 65 64 42 79 4d 65 74 61 64 61 74 61 28 29  UsedByMetadata()
8c10: 29 0a 20 20 20 20 20 20 20 20 20 20 56 61 6c 75  ).          Valu
8c20: 65 41 73 4d 65 74 61 64 61 74 61 3a 3a 68 61 6e  eAsMetadata::han
8c30: 64 6c 65 52 41 55 57 28 42 43 49 2c 20 55 6e 64  dleRAUW(BCI, Und
8c40: 65 66 56 61 6c 75 65 3a 3a 67 65 74 28 42 43 49  efValue::get(BCI
8c50: 2d 3e 67 65 74 54 79 70 65 28 29 29 29 3b 0a 20  ->getType()));. 
8c60: 20 20 20 7d 0a 0a 20 20 20 20 2f 2f 20 4e 6f 74     }..    // Not
8c70: 65 20 74 68 61 74 20 74 68 69 73 20 77 69 6c 6c  e that this will
8c80: 20 6e 6f 74 20 72 65 70 6c 61 63 65 20 75 73 65   not replace use
8c90: 73 20 69 6e 20 4d 4d 4f 73 20 28 77 68 69 63 68  s in MMOs (which
8ca0: 20 77 65 27 6c 6c 20 75 70 64 61 74 65 20 62 65   we'll update be
8cb0: 6c 6f 77 29 2c 0a 20 20 20 20 2f 2f 20 6f 72 20  low),.    // or 
8cc0: 61 6e 79 77 68 65 72 65 20 65 6c 73 65 20 28 77  anywhere else (w
8cd0: 68 69 63 68 20 69 73 20 77 68 79 20 77 65 20 77  hich is why we w
8ce0: 6f 6e 27 74 20 64 65 6c 65 74 65 20 74 68 65 20  on't delete the 
8cf0: 6f 72 69 67 69 6e 61 6c 0a 20 20 20 20 2f 2f 20  original.    // 
8d00: 69 6e 73 74 72 75 63 74 69 6f 6e 29 2e 0a 20 20  instruction)..  
8d10: 20 20 46 72 6f 6d 41 49 2d 3e 72 65 70 6c 61 63    FromAI->replac
8d20: 65 41 6c 6c 55 73 65 73 57 69 74 68 28 49 6e 73  eAllUsesWith(Ins
8d30: 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2f 20 52 65  t);.  }..  // Re
8d40: 6d 61 70 20 61 6c 6c 20 69 6e 73 74 72 75 63 74  map all instruct
8d50: 69 6f 6e 73 20 74 6f 20 74 68 65 20 6e 65 77 20  ions to the new 
8d60: 73 74 61 63 6b 20 73 6c 6f 74 73 2e 0a 20 20 66  stack slots..  f
8d70: 6f 72 20 28 4d 61 63 68 69 6e 65 42 61 73 69 63  or (MachineBasic
8d80: 42 6c 6f 63 6b 20 26 42 42 20 3a 20 2a 4d 46 29  Block &BB : *MF)
8d90: 0a 20 20 20 20 66 6f 72 20 28 4d 61 63 68 69 6e  .    for (Machin
8da0: 65 49 6e 73 74 72 20 26 49 20 3a 20 42 42 29 20  eInstr &I : BB) 
8db0: 7b 0a 20 20 20 20 20 20 2f 2f 20 53 6b 69 70 20  {.      // Skip 
8dc0: 6c 69 66 65 74 69 6d 65 20 6d 61 72 6b 65 72 73  lifetime markers
8dd0: 2e 20 57 65 27 6c 6c 20 72 65 6d 6f 76 65 20 74  . We'll remove t
8de0: 68 65 6d 20 73 6f 6f 6e 2e 0a 20 20 20 20 20 20  hem soon..      
8df0: 69 66 20 28 49 2e 67 65 74 4f 70 63 6f 64 65 28  if (I.getOpcode(
8e00: 29 20 3d 3d 20 54 61 72 67 65 74 4f 70 63 6f 64  ) == TargetOpcod
8e10: 65 3a 3a 4c 49 46 45 54 49 4d 45 5f 53 54 41 52  e::LIFETIME_STAR
8e20: 54 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 49  T ||.          I
8e30: 2e 67 65 74 4f 70 63 6f 64 65 28 29 20 3d 3d 20  .getOpcode() == 
8e40: 54 61 72 67 65 74 4f 70 63 6f 64 65 3a 3a 4c 49  TargetOpcode::LI
8e50: 46 45 54 49 4d 45 5f 45 4e 44 29 0a 20 20 20 20  FETIME_END).    
8e60: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20      continue;.. 
8e70: 20 20 20 20 20 2f 2f 20 55 70 64 61 74 65 20 74       // Update t
8e80: 68 65 20 4d 61 63 68 69 6e 65 4d 65 6d 4f 70 65  he MachineMemOpe
8e90: 72 61 6e 64 20 74 6f 20 75 73 65 20 74 68 65 20  rand to use the 
8ea0: 6e 65 77 20 61 6c 6c 6f 63 61 2e 0a 20 20 20 20  new alloca..    
8eb0: 20 20 66 6f 72 20 28 4d 61 63 68 69 6e 65 4d 65    for (MachineMe
8ec0: 6d 4f 70 65 72 61 6e 64 20 2a 4d 4d 4f 20 3a 20  mOperand *MMO : 
8ed0: 49 2e 6d 65 6d 6f 70 65 72 61 6e 64 73 28 29 29  I.memoperands())
8ee0: 20 7b 0a 20 20 20 20 20 20 20 20 2f 2f 20 57 65   {.        // We
8ef0: 27 76 65 20 72 65 70 6c 61 63 65 64 20 49 52 2d  've replaced IR-
8f00: 6c 65 76 65 6c 20 75 73 65 73 20 6f 66 20 74 68  level uses of th
8f10: 65 20 72 65 6d 61 70 70 65 64 20 61 6c 6c 6f 63  e remapped alloc
8f20: 61 73 2c 20 73 6f 20 77 65 20 6f 6e 6c 79 0a 20  as, so we only. 
8f30: 20 20 20 20 20 20 20 2f 2f 20 6e 65 65 64 20 74         // need t
8f40: 6f 20 72 65 70 6c 61 63 65 20 64 69 72 65 63 74  o replace direct
8f50: 20 75 73 65 73 20 68 65 72 65 2e 0a 20 20 20 20   uses here..    
8f60: 20 20 20 20 63 6f 6e 73 74 20 41 6c 6c 6f 63 61      const Alloca
8f70: 49 6e 73 74 20 2a 41 49 20 3d 20 64 79 6e 5f 63  Inst *AI = dyn_c
8f80: 61 73 74 5f 6f 72 5f 6e 75 6c 6c 3c 41 6c 6c 6f  ast_or_null<Allo
8f90: 63 61 49 6e 73 74 3e 28 4d 4d 4f 2d 3e 67 65 74  caInst>(MMO->get
8fa0: 56 61 6c 75 65 28 29 29 3b 0a 20 20 20 20 20 20  Value());.      
8fb0: 20 20 69 66 20 28 21 41 49 29 0a 20 20 20 20 20    if (!AI).     
8fc0: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a       continue;..
8fd0: 20 20 20 20 20 20 20 20 69 66 20 28 21 41 6c 6c          if (!All
8fe0: 6f 63 61 73 2e 63 6f 75 6e 74 28 41 49 29 29 0a  ocas.count(AI)).
8ff0: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
9000: 75 65 3b 0a 0a 20 20 20 20 20 20 20 20 4d 4d 4f  ue;..        MMO
9010: 2d 3e 73 65 74 56 61 6c 75 65 28 41 6c 6c 6f 63  ->setValue(Alloc
9020: 61 73 5b 41 49 5d 29 3b 0a 20 20 20 20 20 20 20  as[AI]);.       
9030: 20 46 69 78 65 64 4d 65 6d 4f 70 2b 2b 3b 0a 20   FixedMemOp++;. 
9040: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2f       }..      //
9050: 20 55 70 64 61 74 65 20 61 6c 6c 20 6f 66 20 74   Update all of t
9060: 68 65 20 6d 61 63 68 69 6e 65 20 69 6e 73 74 72  he machine instr
9070: 75 63 74 69 6f 6e 20 6f 70 65 72 61 6e 64 73 2e  uction operands.
9080: 0a 20 20 20 20 20 20 66 6f 72 20 28 4d 61 63 68  .      for (Mach
9090: 69 6e 65 4f 70 65 72 61 6e 64 20 26 4d 4f 20 3a  ineOperand &MO :
90a0: 20 49 2e 6f 70 65 72 61 6e 64 73 28 29 29 20 7b   I.operands()) {
90b0: 0a 20 20 20 20 20 20 20 20 69 66 20 28 21 4d 4f  .        if (!MO
90c0: 2e 69 73 46 49 28 29 29 0a 20 20 20 20 20 20 20  .isFI()).       
90d0: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
90e0: 20 20 20 20 20 69 6e 74 20 46 72 6f 6d 53 6c 6f       int FromSlo
90f0: 74 20 3d 20 4d 4f 2e 67 65 74 49 6e 64 65 78 28  t = MO.getIndex(
9100: 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2f 20 44  );..        // D
9110: 6f 6e 27 74 20 74 6f 75 63 68 20 61 72 67 75 6d  on't touch argum
9120: 65 6e 74 73 2e 0a 20 20 20 20 20 20 20 20 69 66  ents..        if
9130: 20 28 46 72 6f 6d 53 6c 6f 74 3c 30 29 0a 20 20   (FromSlot<0).  
9140: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
9150: 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2f 20 4f 6e  ;..        // On
9160: 6c 79 20 6c 6f 6f 6b 20 61 74 20 6d 61 70 70 65  ly look at mappe
9170: 64 20 73 6c 6f 74 73 2e 0a 20 20 20 20 20 20 20  d slots..       
9180: 20 69 66 20 28 21 53 6c 6f 74 52 65 6d 61 70 2e   if (!SlotRemap.
9190: 63 6f 75 6e 74 28 46 72 6f 6d 53 6c 6f 74 29 29  count(FromSlot))
91a0: 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
91b0: 6e 75 65 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2f  nue;..        //
91c0: 20 49 6e 20 61 20 64 65 62 75 67 20 62 75 69 6c   In a debug buil
91d0: 64 2c 20 63 68 65 63 6b 20 74 68 61 74 20 74 68  d, check that th
91e0: 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68  e instruction th
91f0: 61 74 20 77 65 20 61 72 65 20 6d 6f 64 69 66 79  at we are modify
9200: 69 6e 67 20 69 73 0a 20 20 20 20 20 20 20 20 2f  ing is.        /
9210: 2f 20 69 6e 73 69 64 65 20 74 68 65 20 65 78 70  / inside the exp
9220: 65 63 74 65 64 20 6c 69 76 65 20 72 61 6e 67 65  ected live range
9230: 2e 20 49 66 20 74 68 65 20 69 6e 73 74 72 75 63  . If the instruc
9240: 74 69 6f 6e 20 69 73 20 6e 6f 74 20 69 6e 73 69  tion is not insi
9250: 64 65 0a 20 20 20 20 20 20 20 20 2f 2f 20 74 68  de.        // th
9260: 65 20 63 61 6c 63 75 6c 61 74 65 64 20 72 61 6e  e calculated ran
9270: 67 65 20 74 68 65 6e 20 69 74 20 6d 65 61 6e 73  ge then it means
9280: 20 74 68 61 74 20 74 68 65 20 61 6c 6c 6f 63 61   that the alloca
9290: 20 75 73 61 67 65 20 6d 6f 76 65 64 0a 20 20 20   usage moved.   
92a0: 20 20 20 20 20 2f 2f 20 6f 75 74 73 69 64 65 20       // outside 
92b0: 6f 66 20 74 68 65 20 6c 69 66 65 74 69 6d 65 20  of the lifetime 
92c0: 6d 61 72 6b 65 72 73 2c 20 6f 72 20 74 68 61 74  markers, or that
92d0: 20 74 68 65 20 75 73 65 72 20 68 61 73 20 61 20   the user has a 
92e0: 62 75 67 2e 0a 20 20 20 20 20 20 20 20 2f 2f 20  bug..        // 
92f0: 4e 4f 54 45 3a 20 41 6c 6c 6f 63 61 20 61 64 64  NOTE: Alloca add
9300: 72 65 73 73 20 63 61 6c 63 75 6c 61 74 69 6f 6e  ress calculation
9310: 73 20 77 68 69 63 68 20 68 61 70 70 65 6e 20 6f  s which happen o
9320: 75 74 73 69 64 65 20 74 68 65 20 6c 69 66 65 74  utside the lifet
9330: 69 6d 65 0a 20 20 20 20 20 20 20 20 2f 2f 20 7a  ime.        // z
9340: 6f 6e 65 20 61 72 65 20 61 72 65 20 6f 6b 61 79  one are are okay
9350: 2c 20 64 65 73 70 69 74 65 20 74 68 65 20 66 61  , despite the fa
9360: 63 74 20 74 68 61 74 20 77 65 20 64 6f 6e 27 74  ct that we don't
9370: 20 68 61 76 65 20 61 20 67 6f 6f 64 20 77 61 79   have a good way
9380: 0a 20 20 20 20 20 20 20 20 2f 2f 20 66 6f 72 20  .        // for 
9390: 76 61 6c 69 64 61 74 69 6e 67 20 61 6c 6c 20 6f  validating all o
93a0: 66 20 74 68 65 20 75 73 61 67 65 73 20 6f 66 20  f the usages of 
93b0: 74 68 65 20 63 61 6c 63 75 6c 61 74 69 6f 6e 2e  the calculation.
93c0: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
93d0: 20 20 20 20 20 20 20 20 62 6f 6f 6c 20 54 6f 75          bool Tou
93e0: 63 68 65 73 4d 65 6d 6f 72 79 20 3d 20 49 2e 6d  chesMemory = I.m
93f0: 61 79 4c 6f 61 64 28 29 20 7c 7c 20 49 2e 6d 61  ayLoad() || I.ma
9400: 79 53 74 6f 72 65 28 29 3b 0a 20 20 20 20 20 20  yStore();.      
9410: 20 20 2f 2f 20 49 66 20 77 65 20 2a 64 6f 6e 27    // If we *don'
9420: 74 2a 20 70 72 6f 74 65 63 74 20 74 68 65 20 75  t* protect the u
9430: 73 65 72 20 66 72 6f 6d 20 65 73 63 61 70 65 64  ser from escaped
9440: 20 61 6c 6c 6f 63 61 73 2c 20 64 6f 6e 27 74 20   allocas, don't 
9450: 62 6f 74 68 65 72 0a 20 20 20 20 20 20 20 20 2f  bother.        /
9460: 2f 20 76 61 6c 69 64 61 74 69 6e 67 20 74 68 65  / validating the
9470: 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 2e 0a 20   instructions.. 
9480: 20 20 20 20 20 20 20 69 66 20 28 21 49 2e 69 73         if (!I.is
9490: 44 65 62 75 67 56 61 6c 75 65 28 29 20 26 26 20  DebugValue() && 
94a0: 54 6f 75 63 68 65 73 4d 65 6d 6f 72 79 20 26 26  TouchesMemory &&
94b0: 20 50 72 6f 74 65 63 74 46 72 6f 6d 45 73 63 61   ProtectFromEsca
94c0: 70 65 64 41 6c 6c 6f 63 61 73 29 20 7b 0a 20 20  pedAllocas) {.  
94d0: 20 20 20 20 20 20 20 20 53 6c 6f 74 49 6e 64 65          SlotInde
94e0: 78 20 49 6e 64 65 78 20 3d 20 49 6e 64 65 78 65  x Index = Indexe
94f0: 73 2d 3e 67 65 74 49 6e 73 74 72 75 63 74 69 6f  s->getInstructio
9500: 6e 49 6e 64 65 78 28 49 29 3b 0a 20 20 20 20 20  nIndex(I);.     
9510: 20 20 20 20 20 63 6f 6e 73 74 20 4c 69 76 65 49       const LiveI
9520: 6e 74 65 72 76 61 6c 20 2a 49 6e 74 65 72 76 61  nterval *Interva
9530: 6c 20 3d 20 26 2a 49 6e 74 65 72 76 61 6c 73 5b  l = &*Intervals[
9540: 46 72 6f 6d 53 6c 6f 74 5d 3b 0a 20 20 20 20 20  FromSlot];.     
9550: 20 20 20 20 20 61 73 73 65 72 74 28 49 6e 74 65       assert(Inte
9560: 72 76 61 6c 2d 3e 66 69 6e 64 28 49 6e 64 65 78  rval->find(Index
9570: 29 20 21 3d 20 49 6e 74 65 72 76 61 6c 2d 3e 65  ) != Interval->e
9580: 6e 64 28 29 20 26 26 0a 20 20 20 20 20 20 20 20  nd() &&.        
9590: 20 20 20 20 20 20 20 20 20 22 46 6f 75 6e 64 20           "Found 
95a0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 75 73 61 67  instruction usag
95b0: 65 20 6f 75 74 73 69 64 65 20 6f 66 20 6c 69 76  e outside of liv
95c0: 65 20 72 61 6e 67 65 2e 22 29 3b 0a 20 20 20 20  e range.");.    
95d0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
95e0: 20 20 20 20 20 20 2f 2f 20 46 69 78 20 74 68 65        // Fix the
95f0: 20 6d 61 63 68 69 6e 65 20 69 6e 73 74 72 75 63   machine instruc
9600: 74 69 6f 6e 73 2e 0a 20 20 20 20 20 20 20 20 69  tions..        i
9610: 6e 74 20 54 6f 53 6c 6f 74 20 3d 20 53 6c 6f 74  nt ToSlot = Slot
9620: 52 65 6d 61 70 5b 46 72 6f 6d 53 6c 6f 74 5d 3b  Remap[FromSlot];
9630: 0a 20 20 20 20 20 20 20 20 4d 4f 2e 73 65 74 49  .        MO.setI
9640: 6e 64 65 78 28 54 6f 53 6c 6f 74 29 3b 0a 20 20  ndex(ToSlot);.  
9650: 20 20 20 20 20 20 46 69 78 65 64 49 6e 73 74 72        FixedInstr
9660: 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ++;.      }..   
9670: 20 20 20 2f 2f 20 57 65 20 61 64 6a 75 73 74 20     // We adjust 
9680: 41 6c 69 61 73 41 6e 61 6c 79 73 69 73 20 69 6e  AliasAnalysis in
9690: 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 6d 65  formation for me
96a0: 72 67 65 64 20 73 74 61 63 6b 20 73 6c 6f 74 73  rged stack slots
96b0: 2e 0a 20 20 20 20 20 20 4d 61 63 68 69 6e 65 53  ..      MachineS
96c0: 44 4e 6f 64 65 3a 3a 6d 6d 6f 5f 69 74 65 72 61  DNode::mmo_itera
96d0: 74 6f 72 20 4e 65 77 4d 65 6d 4f 70 73 20 3d 0a  tor NewMemOps =.
96e0: 20 20 20 20 20 20 20 20 20 20 4d 46 2d 3e 61 6c            MF->al
96f0: 6c 6f 63 61 74 65 4d 65 6d 52 65 66 73 41 72 72  locateMemRefsArr
9700: 61 79 28 49 2e 67 65 74 4e 75 6d 4d 65 6d 4f 70  ay(I.getNumMemOp
9710: 65 72 61 6e 64 73 28 29 29 3b 0a 20 20 20 20 20  erands());.     
9720: 20 75 6e 73 69 67 6e 65 64 20 4d 65 6d 4f 70 49   unsigned MemOpI
9730: 64 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 6f  dx = 0;.      bo
9740: 6f 6c 20 52 65 70 6c 61 63 65 4d 65 6d 4f 70 73  ol ReplaceMemOps
9750: 20 3d 20 66 61 6c 73 65 3b 0a 20 20 20 20 20 20   = false;.      
9760: 66 6f 72 20 28 4d 61 63 68 69 6e 65 4d 65 6d 4f  for (MachineMemO
9770: 70 65 72 61 6e 64 20 2a 4d 4d 4f 20 3a 20 49 2e  perand *MMO : I.
9780: 6d 65 6d 6f 70 65 72 61 6e 64 73 28 29 29 20 7b  memoperands()) {
9790: 0a 20 20 20 20 20 20 20 20 2f 2f 20 49 66 20 74  .        // If t
97a0: 68 69 73 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74  his memory locat
97b0: 69 6f 6e 20 63 61 6e 20 62 65 20 61 20 73 6c 6f  ion can be a slo
97c0: 74 20 72 65 6d 61 70 70 65 64 20 68 65 72 65 2c  t remapped here,
97d0: 0a 20 20 20 20 20 20 20 20 2f 2f 20 77 65 20 72  .        // we r
97e0: 65 6d 6f 76 65 20 41 41 20 69 6e 66 6f 72 6d 61  emove AA informa
97f0: 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 62 6f  tion..        bo
9800: 6f 6c 20 4d 61 79 48 61 76 65 43 6f 6e 66 6c 69  ol MayHaveConfli
9810: 63 74 69 6e 67 41 41 4d 44 20 3d 20 66 61 6c 73  ctingAAMD = fals
9820: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 20 28 4d  e;.        if (M
9830: 4d 4f 2d 3e 67 65 74 41 41 49 6e 66 6f 28 29 29  MO->getAAInfo())
9840: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 20   {.          if 
9850: 28 63 6f 6e 73 74 20 56 61 6c 75 65 20 2a 4d 4d  (const Value *MM
9860: 4f 56 20 3d 20 4d 4d 4f 2d 3e 67 65 74 56 61 6c  OV = MMO->getVal
9870: 75 65 28 29 29 20 7b 0a 20 20 20 20 20 20 20 20  ue()) {.        
9880: 20 20 20 20 53 6d 61 6c 6c 56 65 63 74 6f 72 3c      SmallVector<
9890: 56 61 6c 75 65 20 2a 2c 20 34 3e 20 4f 62 6a 73  Value *, 4> Objs
98a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 65  ;.            ge
98b0: 74 55 6e 64 65 72 6c 79 69 6e 67 4f 62 6a 65 63  tUnderlyingObjec
98c0: 74 73 46 6f 72 43 6f 64 65 47 65 6e 28 4d 4d 4f  tsForCodeGen(MMO
98d0: 56 2c 20 4f 62 6a 73 2c 20 4d 46 2d 3e 67 65 74  V, Objs, MF->get
98e0: 44 61 74 61 4c 61 79 6f 75 74 28 29 29 3b 0a 0a  DataLayout());..
98f0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
9900: 4f 62 6a 73 2e 65 6d 70 74 79 28 29 29 0a 20 20  Objs.empty()).  
9910: 20 20 20 20 20 20 20 20 20 20 20 20 4d 61 79 48              MayH
9920: 61 76 65 43 6f 6e 66 6c 69 63 74 69 6e 67 41 41  aveConflictingAA
9930: 4d 44 20 3d 20 74 72 75 65 3b 0a 20 20 20 20 20  MD = true;.     
9940: 20 20 20 20 20 20 20 65 6c 73 65 0a 20 20 20 20         else.    
9950: 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 28 56            for (V
9960: 61 6c 75 65 20 2a 56 20 3a 20 4f 62 6a 73 29 20  alue *V : Objs) 
9970: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
9980: 20 20 2f 2f 20 49 66 20 74 68 69 73 20 6d 65 6d    // If this mem
9990: 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 63 6f 6d  ory location com
99a0: 65 73 20 66 72 6f 6d 20 61 20 6b 6e 6f 77 6e 20  es from a known 
99b0: 73 74 61 63 6b 20 73 6c 6f 74 0a 20 20 20 20 20  stack slot.     
99c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 74 68             // th
99d0: 61 74 20 69 73 20 6e 6f 74 20 72 65 6d 61 70 70  at is not remapp
99e0: 65 64 2c 20 77 65 20 63 6f 6e 74 69 6e 75 65 20  ed, we continue 
99f0: 63 68 65 63 6b 69 6e 67 2e 0a 20 20 20 20 20 20  checking..      
9a00: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 4f 74 68            // Oth
9a10: 65 72 77 69 73 65 2c 20 77 65 20 6e 65 65 64 20  erwise, we need 
9a20: 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20 41 41  to invalidate AA
9a30: 20 69 6e 66 6f 6d 61 74 69 6f 6e 2e 0a 20 20 20   infomation..   
9a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
9a50: 73 74 20 41 6c 6c 6f 63 61 49 6e 73 74 20 2a 41  st AllocaInst *A
9a60: 49 20 3d 20 64 79 6e 5f 63 61 73 74 5f 6f 72 5f  I = dyn_cast_or_
9a70: 6e 75 6c 6c 3c 41 6c 6c 6f 63 61 49 6e 73 74 3e  null<AllocaInst>
9a80: 28 56 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (V);.           
9a90: 20 20 20 20 20 69 66 20 28 41 49 20 26 26 20 4d       if (AI && M
9aa0: 65 72 67 65 64 41 6c 6c 6f 63 61 73 2e 63 6f 75  ergedAllocas.cou
9ab0: 6e 74 28 41 49 29 29 20 7b 0a 20 20 20 20 20 20  nt(AI)) {.      
9ac0: 20 20 20 20 20 20 20 20 20 20 20 20 4d 61 79 48              MayH
9ad0: 61 76 65 43 6f 6e 66 6c 69 63 74 69 6e 67 41 41  aveConflictingAA
9ae0: 4d 44 20 3d 20 74 72 75 65 3b 0a 20 20 20 20 20  MD = true;.     
9af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
9b00: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
9b10: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
9b20: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
9b30: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
9b40: 20 20 20 20 69 66 20 28 4d 61 79 48 61 76 65 43      if (MayHaveC
9b50: 6f 6e 66 6c 69 63 74 69 6e 67 41 41 4d 44 29 20  onflictingAAMD) 
9b60: 7b 0a 20 20 20 20 20 20 20 20 20 20 4e 65 77 4d  {.          NewM
9b70: 65 6d 4f 70 73 5b 4d 65 6d 4f 70 49 64 78 2b 2b  emOps[MemOpIdx++
9b80: 5d 20 3d 20 4d 46 2d 3e 67 65 74 4d 61 63 68 69  ] = MF->getMachi
9b90: 6e 65 4d 65 6d 4f 70 65 72 61 6e 64 28 4d 4d 4f  neMemOperand(MMO
9ba0: 2c 20 41 41 4d 44 4e 6f 64 65 73 28 29 29 3b 0a  , AAMDNodes());.
9bb0: 20 20 20 20 20 20 20 20 20 20 52 65 70 6c 61 63            Replac
9bc0: 65 4d 65 6d 4f 70 73 20 3d 20 74 72 75 65 3b 0a  eMemOps = true;.
9bd0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9be0: 20 20 65 6c 73 65 0a 20 20 20 20 20 20 20 20 20    else.         
9bf0: 20 4e 65 77 4d 65 6d 4f 70 73 5b 4d 65 6d 4f 70   NewMemOps[MemOp
9c00: 49 64 78 2b 2b 5d 20 3d 20 4d 4d 4f 3b 0a 20 20  Idx++] = MMO;.  
9c10: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2f 20      }..      // 
9c20: 49 66 20 61 6e 79 20 6d 65 6d 6f 72 79 20 6f 70  If any memory op
9c30: 65 72 61 6e 64 20 69 73 20 75 70 64 61 74 65 64  erand is updated
9c40: 2c 20 73 65 74 20 6d 65 6d 6f 72 79 20 72 65 66  , set memory ref
9c50: 65 72 65 6e 63 65 73 20 6f 66 0a 20 20 20 20 20  erences of.     
9c60: 20 2f 2f 20 74 68 69 73 20 69 6e 73 74 72 75 63   // this instruc
9c70: 74 69 6f 6e 2e 0a 20 20 20 20 20 20 69 66 20 28  tion..      if (
9c80: 52 65 70 6c 61 63 65 4d 65 6d 4f 70 73 29 0a 20  ReplaceMemOps). 
9c90: 20 20 20 20 20 20 20 49 2e 73 65 74 4d 65 6d 52         I.setMemR
9ca0: 65 66 73 28 73 74 64 3a 3a 6d 61 6b 65 5f 70 61  efs(std::make_pa
9cb0: 69 72 28 4e 65 77 4d 65 6d 4f 70 73 2c 20 49 2e  ir(NewMemOps, I.
9cc0: 67 65 74 4e 75 6d 4d 65 6d 4f 70 65 72 61 6e 64  getNumMemOperand
9cd0: 73 28 29 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  s()));.    }..  
9ce0: 2f 2f 20 55 70 64 61 74 65 20 74 68 65 20 6c 6f  // Update the lo
9cf0: 63 61 74 69 6f 6e 20 6f 66 20 43 2b 2b 20 63 61  cation of C++ ca
9d00: 74 63 68 20 6f 62 6a 65 63 74 73 20 66 6f 72 20  tch objects for 
9d10: 74 68 65 20 4d 53 56 43 20 70 65 72 73 6f 6e 61  the MSVC persona
9d20: 6c 69 74 79 20 72 6f 75 74 69 6e 65 2e 0a 20 20  lity routine..  
9d30: 69 66 20 28 57 69 6e 45 48 46 75 6e 63 49 6e 66  if (WinEHFuncInf
9d40: 6f 20 2a 45 48 49 6e 66 6f 20 3d 20 4d 46 2d 3e  o *EHInfo = MF->
9d50: 67 65 74 57 69 6e 45 48 46 75 6e 63 49 6e 66 6f  getWinEHFuncInfo
9d60: 28 29 29 0a 20 20 20 20 66 6f 72 20 28 57 69 6e  ()).    for (Win
9d70: 45 48 54 72 79 42 6c 6f 63 6b 4d 61 70 45 6e 74  EHTryBlockMapEnt
9d80: 72 79 20 26 54 42 4d 45 20 3a 20 45 48 49 6e 66  ry &TBME : EHInf
9d90: 6f 2d 3e 54 72 79 42 6c 6f 63 6b 4d 61 70 29 0a  o->TryBlockMap).
9da0: 20 20 20 20 20 20 66 6f 72 20 28 57 69 6e 45 48        for (WinEH
9db0: 48 61 6e 64 6c 65 72 54 79 70 65 20 26 48 20 3a  HandlerType &H :
9dc0: 20 54 42 4d 45 2e 48 61 6e 64 6c 65 72 41 72 72   TBME.HandlerArr
9dd0: 61 79 29 0a 20 20 20 20 20 20 20 20 69 66 20 28  ay).        if (
9de0: 48 2e 43 61 74 63 68 4f 62 6a 2e 46 72 61 6d 65  H.CatchObj.Frame
9df0: 49 6e 64 65 78 20 21 3d 20 73 74 64 3a 3a 6e 75  Index != std::nu
9e00: 6d 65 72 69 63 5f 6c 69 6d 69 74 73 3c 69 6e 74  meric_limits<int
9e10: 3e 3a 3a 6d 61 78 28 29 20 26 26 0a 20 20 20 20  >::max() &&.    
9e20: 20 20 20 20 20 20 20 20 53 6c 6f 74 52 65 6d 61          SlotRema
9e30: 70 2e 63 6f 75 6e 74 28 48 2e 43 61 74 63 68 4f  p.count(H.CatchO
9e40: 62 6a 2e 46 72 61 6d 65 49 6e 64 65 78 29 29 0a  bj.FrameIndex)).
9e50: 20 20 20 20 20 20 20 20 20 20 48 2e 43 61 74 63            H.Catc
9e60: 68 4f 62 6a 2e 46 72 61 6d 65 49 6e 64 65 78 20  hObj.FrameIndex 
9e70: 3d 20 53 6c 6f 74 52 65 6d 61 70 5b 48 2e 43 61  = SlotRemap[H.Ca
9e80: 74 63 68 4f 62 6a 2e 46 72 61 6d 65 49 6e 64 65  tchObj.FrameInde
9e90: 78 5d 3b 0a 0a 20 20 44 45 42 55 47 28 64 62 67  x];..  DEBUG(dbg
9ea0: 73 28 29 3c 3c 22 46 69 78 65 64 20 22 3c 3c 46  s()<<"Fixed "<<F
9eb0: 69 78 65 64 4d 65 6d 4f 70 3c 3c 22 20 6d 61 63  ixedMemOp<<" mac
9ec0: 68 69 6e 65 20 6d 65 6d 6f 72 79 20 6f 70 65 72  hine memory oper
9ed0: 61 6e 64 73 2e 5c 6e 22 29 3b 0a 20 20 44 45 42  ands.\n");.  DEB
9ee0: 55 47 28 64 62 67 73 28 29 3c 3c 22 46 69 78 65  UG(dbgs()<<"Fixe
9ef0: 64 20 22 3c 3c 46 69 78 65 64 44 62 67 3c 3c 22  d "<<FixedDbg<<"
9f00: 20 64 65 62 75 67 20 6c 6f 63 61 74 69 6f 6e 73   debug locations
9f10: 2e 5c 6e 22 29 3b 0a 20 20 44 45 42 55 47 28 64  .\n");.  DEBUG(d
9f20: 62 67 73 28 29 3c 3c 22 46 69 78 65 64 20 22 3c  bgs()<<"Fixed "<
9f30: 3c 46 69 78 65 64 49 6e 73 74 72 3c 3c 22 20 6d  <FixedInstr<<" m
9f40: 61 63 68 69 6e 65 20 69 6e 73 74 72 75 63 74 69  achine instructi
9f50: 6f 6e 73 2e 5c 6e 22 29 3b 0a 7d 0a 0a 76 6f 69  ons.\n");.}..voi
9f60: 64 20 53 74 61 63 6b 43 6f 6c 6f 72 69 6e 67 3a  d StackColoring:
9f70: 3a 72 65 6d 6f 76 65 49 6e 76 61 6c 69 64 53 6c  :removeInvalidSl
9f80: 6f 74 52 61 6e 67 65 73 28 29 20 7b 0a 20 20 66  otRanges() {.  f
9f90: 6f 72 20 28 4d 61 63 68 69 6e 65 42 61 73 69 63  or (MachineBasic
9fa0: 42 6c 6f 63 6b 20 26 42 42 20 3a 20 2a 4d 46 29  Block &BB : *MF)
9fb0: 0a 20 20 20 20 66 6f 72 20 28 4d 61 63 68 69 6e  .    for (Machin
9fc0: 65 49 6e 73 74 72 20 26 49 20 3a 20 42 42 29 20  eInstr &I : BB) 
9fd0: 7b 0a 20 20 20 20 20 20 69 66 20 28 49 2e 67 65  {.      if (I.ge
9fe0: 74 4f 70 63 6f 64 65 28 29 20 3d 3d 20 54 61 72  tOpcode() == Tar
9ff0: 67 65 74 4f 70 63 6f 64 65 3a 3a 4c 49 46 45 54  getOpcode::LIFET
a000: 49 4d 45 5f 53 54 41 52 54 20 7c 7c 0a 20 20 20  IME_START ||.   
a010: 20 20 20 20 20 20 20 49 2e 67 65 74 4f 70 63 6f         I.getOpco
a020: 64 65 28 29 20 3d 3d 20 54 61 72 67 65 74 4f 70  de() == TargetOp
a030: 63 6f 64 65 3a 3a 4c 49 46 45 54 49 4d 45 5f 45  code::LIFETIME_E
a040: 4e 44 20 7c 7c 20 49 2e 69 73 44 65 62 75 67 56  ND || I.isDebugV
a050: 61 6c 75 65 28 29 29 0a 20 20 20 20 20 20 20 20  alue()).        
a060: 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 20  continue;..     
a070: 20 2f 2f 20 53 6f 6d 65 20 69 6e 74 65 72 76 61   // Some interva
a080: 6c 73 20 61 72 65 20 73 75 73 70 69 63 69 6f 75  ls are suspiciou
a090: 73 21 20 49 6e 20 73 6f 6d 65 20 63 61 73 65 73  s! In some cases
a0a0: 20 77 65 20 66 69 6e 64 20 61 64 64 72 65 73 73   we find address
a0b0: 0a 20 20 20 20 20 20 2f 2f 20 63 61 6c 63 75 6c  .      // calcul
a0c0: 61 74 69 6f 6e 73 20 6f 75 74 73 69 64 65 20 6f  ations outside o
a0d0: 66 20 74 68 65 20 6c 69 66 65 74 69 6d 65 20 7a  f the lifetime z
a0e0: 6f 6e 65 2c 20 62 75 74 20 6e 6f 74 20 61 63 74  one, but not act
a0f0: 75 61 6c 20 6d 65 6d 6f 72 79 0a 20 20 20 20 20  ual memory.     
a100: 20 2f 2f 20 72 65 61 64 20 6f 72 20 77 72 69 74   // read or writ
a110: 65 2e 20 4d 65 6d 6f 72 79 20 61 63 63 65 73 73  e. Memory access
a120: 65 73 20 6f 75 74 73 69 64 65 20 6f 66 20 74 68  es outside of th
a130: 65 20 6c 69 66 65 74 69 6d 65 20 7a 6f 6e 65 20  e lifetime zone 
a140: 61 72 65 20 61 20 63 6c 65 61 72 0a 20 20 20 20  are a clear.    
a150: 20 20 2f 2f 20 76 69 6f 6c 61 74 69 6f 6e 2c 20    // violation, 
a160: 62 75 74 20 61 64 64 72 65 73 73 20 63 61 6c 63  but address calc
a170: 75 6c 61 74 69 6f 6e 73 20 61 72 65 20 6f 6b 61  ulations are oka
a180: 79 2e 20 54 68 69 73 20 63 61 6e 20 68 61 70 70  y. This can happ
a190: 65 6e 20 77 68 65 6e 0a 20 20 20 20 20 20 2f 2f  en when.      //
a1a0: 20 47 45 50 73 20 61 72 65 20 68 6f 69 73 74 65   GEPs are hoiste
a1b0: 64 20 6f 75 74 73 69 64 65 20 6f 66 20 74 68 65  d outside of the
a1c0: 20 6c 69 66 65 74 69 6d 65 20 7a 6f 6e 65 2e 0a   lifetime zone..
a1d0: 20 20 20 20 20 20 2f 2f 20 53 6f 2c 20 69 6e 20        // So, in 
a1e0: 68 65 72 65 20 77 65 20 6f 6e 6c 79 20 63 68 65  here we only che
a1f0: 63 6b 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20  ck instructions 
a200: 77 68 69 63 68 20 63 61 6e 20 72 65 61 64 20 6f  which can read o
a210: 72 20 77 72 69 74 65 20 6d 65 6d 6f 72 79 2e 0a  r write memory..
a220: 20 20 20 20 20 20 69 66 20 28 21 49 2e 6d 61 79        if (!I.may
a230: 4c 6f 61 64 28 29 20 26 26 20 21 49 2e 6d 61 79  Load() && !I.may
a240: 53 74 6f 72 65 28 29 29 0a 20 20 20 20 20 20 20  Store()).       
a250: 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20   continue;..    
a260: 20 20 2f 2f 20 43 68 65 63 6b 20 61 6c 6c 20 6f    // Check all o
a270: 66 20 74 68 65 20 6d 61 63 68 69 6e 65 20 6f 70  f the machine op
a280: 65 72 61 6e 64 73 2e 0a 20 20 20 20 20 20 66 6f  erands..      fo
a290: 72 20 28 63 6f 6e 73 74 20 4d 61 63 68 69 6e 65  r (const Machine
a2a0: 4f 70 65 72 61 6e 64 20 26 4d 4f 20 3a 20 49 2e  Operand &MO : I.
a2b0: 6f 70 65 72 61 6e 64 73 28 29 29 20 7b 0a 20 20  operands()) {.  
a2c0: 20 20 20 20 20 20 69 66 20 28 21 4d 4f 2e 69 73        if (!MO.is
a2d0: 46 49 28 29 29 0a 20 20 20 20 20 20 20 20 20 20  FI()).          
a2e0: 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 20  continue;..     
a2f0: 20 20 20 69 6e 74 20 53 6c 6f 74 20 3d 20 4d 4f     int Slot = MO
a300: 2e 67 65 74 49 6e 64 65 78 28 29 3b 0a 0a 20 20  .getIndex();..  
a310: 20 20 20 20 20 20 69 66 20 28 53 6c 6f 74 3c 30        if (Slot<0
a320: 29 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74  ).          cont
a330: 69 6e 75 65 3b 0a 0a 20 20 20 20 20 20 20 20 69  inue;..        i
a340: 66 20 28 49 6e 74 65 72 76 61 6c 73 5b 53 6c 6f  f (Intervals[Slo
a350: 74 5d 2d 3e 65 6d 70 74 79 28 29 29 0a 20 20 20  t]->empty()).   
a360: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
a370: 0a 0a 20 20 20 20 20 20 20 20 2f 2f 20 43 68 65  ..        // Che
a380: 63 6b 20 74 68 61 74 20 74 68 65 20 75 73 65 64  ck that the used
a390: 20 73 6c 6f 74 20 69 73 20 69 6e 73 69 64 65 20   slot is inside 
a3a0: 74 68 65 20 63 61 6c 63 75 6c 61 74 65 64 20 6c  the calculated l
a3b0: 69 66 65 74 69 6d 65 20 72 61 6e 67 65 2e 0a 20  ifetime range.. 
a3c0: 20 20 20 20 20 20 20 2f 2f 20 49 66 20 69 74 20         // If it 
a3d0: 69 73 20 6e 6f 74 2c 20 77 61 72 6e 20 61 62 6f  is not, warn abo
a3e0: 75 74 20 69 74 20 61 6e 64 20 69 6e 76 61 6c 69  ut it and invali
a3f0: 64 61 74 65 20 74 68 65 20 72 61 6e 67 65 2e 0a  date the range..
a400: 20 20 20 20 20 20 20 20 4c 69 76 65 49 6e 74 65          LiveInte
a410: 72 76 61 6c 20 2a 49 6e 74 65 72 76 61 6c 20 3d  rval *Interval =
a420: 20 26 2a 49 6e 74 65 72 76 61 6c 73 5b 53 6c 6f   &*Intervals[Slo
a430: 74 5d 3b 0a 20 20 20 20 20 20 20 20 53 6c 6f 74  t];.        Slot
a440: 49 6e 64 65 78 20 49 6e 64 65 78 20 3d 20 49 6e  Index Index = In
a450: 64 65 78 65 73 2d 3e 67 65 74 49 6e 73 74 72 75  dexes->getInstru
a460: 63 74 69 6f 6e 49 6e 64 65 78 28 49 29 3b 0a 20  ctionIndex(I);. 
a470: 20 20 20 20 20 20 20 69 66 20 28 49 6e 74 65 72         if (Inter
a480: 76 61 6c 2d 3e 66 69 6e 64 28 49 6e 64 65 78 29  val->find(Index)
a490: 20 3d 3d 20 49 6e 74 65 72 76 61 6c 2d 3e 65 6e   == Interval->en
a4a0: 64 28 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20  d()) {.         
a4b0: 20 49 6e 74 65 72 76 61 6c 2d 3e 63 6c 65 61 72   Interval->clear
a4c0: 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20 44 45  ();.          DE
a4d0: 42 55 47 28 64 62 67 73 28 29 3c 3c 22 49 6e 76  BUG(dbgs()<<"Inv
a4e0: 61 6c 69 64 61 74 69 6e 67 20 72 61 6e 67 65 20  alidating range 
a4f0: 23 22 3c 3c 53 6c 6f 74 3c 3c 22 5c 6e 22 29 3b  #"<<Slot<<"\n");
a500: 0a 20 20 20 20 20 20 20 20 20 20 45 73 63 61 70  .          Escap
a510: 65 64 41 6c 6c 6f 63 61 73 2b 2b 3b 0a 20 20 20  edAllocas++;.   
a520: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
a530: 20 20 20 7d 0a 7d 0a 0a 76 6f 69 64 20 53 74 61     }.}..void Sta
a540: 63 6b 43 6f 6c 6f 72 69 6e 67 3a 3a 65 78 70 75  ckColoring::expu
a550: 6e 67 65 53 6c 6f 74 4d 61 70 28 44 65 6e 73 65  ngeSlotMap(Dense
a560: 4d 61 70 3c 69 6e 74 2c 20 69 6e 74 3e 20 26 53  Map<int, int> &S
a570: 6c 6f 74 52 65 6d 61 70 2c 0a 20 20 20 20 20 20  lotRemap,.      
a580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a590: 20 20 20 20 20 20 20 20 20 20 20 20 20 75 6e 73               uns
a5a0: 69 67 6e 65 64 20 4e 75 6d 53 6c 6f 74 73 29 20  igned NumSlots) 
a5b0: 7b 0a 20 20 2f 2f 20 45 78 70 75 6e 67 65 20 73  {.  // Expunge s
a5c0: 6c 6f 74 20 72 65 6d 61 70 20 6d 61 70 2e 0a 20  lot remap map.. 
a5d0: 20 66 6f 72 20 28 75 6e 73 69 67 6e 65 64 20 69   for (unsigned i
a5e0: 3d 30 3b 20 69 20 3c 20 4e 75 6d 53 6c 6f 74 73  =0; i < NumSlots
a5f0: 3b 20 2b 2b 69 29 20 7b 0a 20 20 20 20 2f 2f 20  ; ++i) {.    // 
a600: 49 66 20 77 65 20 61 72 65 20 72 65 6d 61 70 70  If we are remapp
a610: 69 6e 67 20 69 0a 20 20 20 20 69 66 20 28 53 6c  ing i.    if (Sl
a620: 6f 74 52 65 6d 61 70 2e 63 6f 75 6e 74 28 69 29  otRemap.count(i)
a630: 29 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 54 61  ) {.      int Ta
a640: 72 67 65 74 20 3d 20 53 6c 6f 74 52 65 6d 61 70  rget = SlotRemap
a650: 5b 69 5d 3b 0a 20 20 20 20 20 20 2f 2f 20 41 73  [i];.      // As
a660: 20 6c 6f 6e 67 20 61 73 20 6f 75 72 20 74 61 72   long as our tar
a670: 67 65 74 20 69 73 20 6d 61 70 70 65 64 20 74 6f  get is mapped to
a680: 20 73 6f 6d 65 74 68 69 6e 67 20 65 6c 73 65 2c   something else,
a690: 20 66 6f 6c 6c 6f 77 20 69 74 2e 0a 20 20 20 20   follow it..    
a6a0: 20 20 77 68 69 6c 65 20 28 53 6c 6f 74 52 65 6d    while (SlotRem
a6b0: 61 70 2e 63 6f 75 6e 74 28 54 61 72 67 65 74 29  ap.count(Target)
a6c0: 29 20 7b 0a 20 20 20 20 20 20 20 20 54 61 72 67  ) {.        Targ
a6d0: 65 74 20 3d 20 53 6c 6f 74 52 65 6d 61 70 5b 54  et = SlotRemap[T
a6e0: 61 72 67 65 74 5d 3b 0a 20 20 20 20 20 20 20 20  arget];.        
a6f0: 53 6c 6f 74 52 65 6d 61 70 5b 69 5d 20 3d 20 54  SlotRemap[i] = T
a700: 61 72 67 65 74 3b 0a 20 20 20 20 20 20 7d 0a 20  arget;.      }. 
a710: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 62 6f 6f 6c     }.  }.}..bool
a720: 20 53 74 61 63 6b 43 6f 6c 6f 72 69 6e 67 3a 3a   StackColoring::
a730: 72 75 6e 4f 6e 4d 61 63 68 69 6e 65 46 75 6e 63  runOnMachineFunc
a740: 74 69 6f 6e 28 4d 61 63 68 69 6e 65 46 75 6e 63  tion(MachineFunc
a750: 74 69 6f 6e 20 26 46 75 6e 63 29 20 7b 0a 20 20  tion &Func) {.  
a760: 44 45 42 55 47 28 64 62 67 73 28 29 20 3c 3c 20  DEBUG(dbgs() << 
a770: 22 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 53 74 61 63  "********** Stac
a780: 6b 20 43 6f 6c 6f 72 69 6e 67 20 2a 2a 2a 2a 2a  k Coloring *****
a790: 2a 2a 2a 2a 2a 5c 6e 22 0a 20 20 20 20 20 20 20  *****\n".       
a7a0: 20 20 20 20 20 20 20 20 3c 3c 20 22 2a 2a 2a 2a          << "****
a7b0: 2a 2a 2a 2a 2a 2a 20 46 75 6e 63 74 69 6f 6e 3a  ****** Function:
a7c0: 20 22 20 3c 3c 20 46 75 6e 63 2e 67 65 74 4e 61   " << Func.getNa
a7d0: 6d 65 28 29 20 3c 3c 20 27 5c 6e 27 29 3b 0a 20  me() << '\n');. 
a7e0: 20 4d 46 20 3d 20 26 46 75 6e 63 3b 0a 20 20 4d   MF = &Func;.  M
a7f0: 46 49 20 3d 20 26 4d 46 2d 3e 67 65 74 46 72 61  FI = &MF->getFra
a800: 6d 65 49 6e 66 6f 28 29 3b 0a 20 20 49 6e 64 65  meInfo();.  Inde
a810: 78 65 73 20 3d 20 26 67 65 74 41 6e 61 6c 79 73  xes = &getAnalys
a820: 69 73 3c 53 6c 6f 74 49 6e 64 65 78 65 73 3e 28  is<SlotIndexes>(
a830: 29 3b 0a 20 20 53 50 20 3d 20 26 67 65 74 41 6e  );.  SP = &getAn
a840: 61 6c 79 73 69 73 3c 53 74 61 63 6b 50 72 6f 74  alysis<StackProt
a850: 65 63 74 6f 72 3e 28 29 3b 0a 20 20 42 6c 6f 63  ector>();.  Bloc
a860: 6b 4c 69 76 65 6e 65 73 73 2e 63 6c 65 61 72 28  kLiveness.clear(
a870: 29 3b 0a 20 20 42 61 73 69 63 42 6c 6f 63 6b 73  );.  BasicBlocks
a880: 2e 63 6c 65 61 72 28 29 3b 0a 20 20 42 61 73 69  .clear();.  Basi
a890: 63 42 6c 6f 63 6b 4e 75 6d 62 65 72 69 6e 67 2e  cBlockNumbering.
a8a0: 63 6c 65 61 72 28 29 3b 0a 20 20 4d 61 72 6b 65  clear();.  Marke
a8b0: 72 73 2e 63 6c 65 61 72 28 29 3b 0a 20 20 49 6e  rs.clear();.  In
a8c0: 74 65 72 76 61 6c 73 2e 63 6c 65 61 72 28 29 3b  tervals.clear();
a8d0: 0a 20 20 4c 69 76 65 53 74 61 72 74 73 2e 63 6c  .  LiveStarts.cl
a8e0: 65 61 72 28 29 3b 0a 20 20 56 4e 49 6e 66 6f 41  ear();.  VNInfoA
a8f0: 6c 6c 6f 63 61 74 6f 72 2e 52 65 73 65 74 28 29  llocator.Reset()
a900: 3b 0a 0a 20 20 75 6e 73 69 67 6e 65 64 20 4e 75  ;..  unsigned Nu
a910: 6d 53 6c 6f 74 73 20 3d 20 4d 46 49 2d 3e 67 65  mSlots = MFI->ge
a920: 74 4f 62 6a 65 63 74 49 6e 64 65 78 45 6e 64 28  tObjectIndexEnd(
a930: 29 3b 0a 0a 20 20 2f 2f 20 49 66 20 74 68 65 72  );..  // If ther
a940: 65 20 61 72 65 20 6e 6f 20 73 74 61 63 6b 20 73  e are no stack s
a950: 6c 6f 74 73 20 74 68 65 6e 20 74 68 65 72 65 20  lots then there 
a960: 61 72 65 20 6e 6f 20 6d 61 72 6b 65 72 73 20 74  are no markers t
a970: 6f 20 72 65 6d 6f 76 65 2e 0a 20 20 69 66 20 28  o remove..  if (
a980: 21 4e 75 6d 53 6c 6f 74 73 29 0a 20 20 20 20 72  !NumSlots).    r
a990: 65 74 75 72 6e 20 66 61 6c 73 65 3b 0a 0a 20 20  eturn false;..  
a9a0: 53 6d 61 6c 6c 56 65 63 74 6f 72 3c 69 6e 74 2c  SmallVector<int,
a9b0: 20 38 3e 20 53 6f 72 74 65 64 53 6c 6f 74 73 3b   8> SortedSlots;
a9c0: 0a 20 20 53 6f 72 74 65 64 53 6c 6f 74 73 2e 72  .  SortedSlots.r
a9d0: 65 73 65 72 76 65 28 4e 75 6d 53 6c 6f 74 73 29  eserve(NumSlots)
a9e0: 3b 0a 20 20 49 6e 74 65 72 76 61 6c 73 2e 72 65  ;.  Intervals.re
a9f0: 73 65 72 76 65 28 4e 75 6d 53 6c 6f 74 73 29 3b  serve(NumSlots);
aa00: 0a 20 20 4c 69 76 65 53 74 61 72 74 73 2e 72 65  .  LiveStarts.re
aa10: 73 69 7a 65 28 4e 75 6d 53 6c 6f 74 73 29 3b 0a  size(NumSlots);.
aa20: 0a 20 20 75 6e 73 69 67 6e 65 64 20 4e 75 6d 4d  .  unsigned NumM
aa30: 61 72 6b 65 72 73 20 3d 20 63 6f 6c 6c 65 63 74  arkers = collect
aa40: 4d 61 72 6b 65 72 73 28 4e 75 6d 53 6c 6f 74 73  Markers(NumSlots
aa50: 29 3b 0a 0a 20 20 75 6e 73 69 67 6e 65 64 20 54  );..  unsigned T
aa60: 6f 74 61 6c 53 69 7a 65 20 3d 20 30 3b 0a 20 20  otalSize = 0;.  
aa70: 44 45 42 55 47 28 64 62 67 73 28 29 3c 3c 22 46  DEBUG(dbgs()<<"F
aa80: 6f 75 6e 64 20 22 3c 3c 4e 75 6d 4d 61 72 6b 65  ound "<<NumMarke
aa90: 72 73 3c 3c 22 20 6d 61 72 6b 65 72 73 20 61 6e  rs<<" markers an
aaa0: 64 20 22 3c 3c 4e 75 6d 53 6c 6f 74 73 3c 3c 22  d "<<NumSlots<<"
aab0: 20 73 6c 6f 74 73 5c 6e 22 29 3b 0a 20 20 44 45   slots\n");.  DE
aac0: 42 55 47 28 64 62 67 73 28 29 3c 3c 22 53 6c 6f  BUG(dbgs()<<"Slo
aad0: 74 20 73 74 72 75 63 74 75 72 65 3a 5c 6e 22 29  t structure:\n")
aae0: 3b 0a 0a 20 20 66 6f 72 20 28 69 6e 74 20 69 3d  ;..  for (int i=
aaf0: 30 3b 20 69 20 3c 20 4d 46 49 2d 3e 67 65 74 4f  0; i < MFI->getO
ab00: 62 6a 65 63 74 49 6e 64 65 78 45 6e 64 28 29 3b  bjectIndexEnd();
ab10: 20 2b 2b 69 29 20 7b 0a 20 20 20 20 44 45 42 55   ++i) {.    DEBU
ab20: 47 28 64 62 67 73 28 29 3c 3c 22 53 6c 6f 74 20  G(dbgs()<<"Slot 
ab30: 23 22 3c 3c 69 3c 3c 22 20 2d 20 22 3c 3c 4d 46  #"<<i<<" - "<<MF
ab40: 49 2d 3e 67 65 74 4f 62 6a 65 63 74 53 69 7a 65  I->getObjectSize
ab50: 28 69 29 3c 3c 22 20 62 79 74 65 73 2e 5c 6e 22  (i)<<" bytes.\n"
ab60: 29 3b 0a 20 20 20 20 54 6f 74 61 6c 53 69 7a 65  );.    TotalSize
ab70: 20 2b 3d 20 4d 46 49 2d 3e 67 65 74 4f 62 6a 65   += MFI->getObje
ab80: 63 74 53 69 7a 65 28 69 29 3b 0a 20 20 7d 0a 0a  ctSize(i);.  }..
ab90: 20 20 44 45 42 55 47 28 64 62 67 73 28 29 3c 3c    DEBUG(dbgs()<<
aba0: 22 54 6f 74 61 6c 20 53 74 61 63 6b 20 73 69 7a  "Total Stack siz
abb0: 65 3a 20 22 3c 3c 54 6f 74 61 6c 53 69 7a 65 3c  e: "<<TotalSize<
abc0: 3c 22 20 62 79 74 65 73 5c 6e 5c 6e 22 29 3b 0a  <" bytes\n\n");.
abd0: 0a 20 20 2f 2f 20 44 6f 6e 27 74 20 63 6f 6e 74  .  // Don't cont
abe0: 69 6e 75 65 20 62 65 63 61 75 73 65 20 74 68 65  inue because the
abf0: 72 65 20 61 72 65 20 6e 6f 74 20 65 6e 6f 75 67  re are not enoug
ac00: 68 20 6c 69 66 65 74 69 6d 65 20 6d 61 72 6b 65  h lifetime marke
ac10: 72 73 2c 20 6f 72 20 74 68 65 0a 20 20 2f 2f 20  rs, or the.  // 
ac20: 73 74 61 63 6b 20 69 73 20 74 6f 6f 20 73 6d 61  stack is too sma
ac30: 6c 6c 2c 20 6f 72 20 77 65 20 61 72 65 20 74 6f  ll, or we are to
ac40: 6c 64 20 6e 6f 74 20 74 6f 20 6f 70 74 69 6d 69  ld not to optimi
ac50: 7a 65 20 74 68 65 20 73 6c 6f 74 73 2e 0a 20 20  ze the slots..  
ac60: 69 66 20 28 4e 75 6d 4d 61 72 6b 65 72 73 20 3c  if (NumMarkers <
ac70: 20 32 20 7c 7c 20 54 6f 74 61 6c 53 69 7a 65 20   2 || TotalSize 
ac80: 3c 20 31 36 20 7c 7c 20 44 69 73 61 62 6c 65 43  < 16 || DisableC
ac90: 6f 6c 6f 72 69 6e 67 20 7c 7c 0a 20 20 20 20 20  oloring ||.     
aca0: 20 73 6b 69 70 46 75 6e 63 74 69 6f 6e 28 46 75   skipFunction(Fu
acb0: 6e 63 2e 67 65 74 46 75 6e 63 74 69 6f 6e 28 29  nc.getFunction()
acc0: 29 29 20 7b 0a 20 20 20 20 44 45 42 55 47 28 64  )) {.    DEBUG(d
acd0: 62 67 73 28 29 3c 3c 22 57 69 6c 6c 20 6e 6f 74  bgs()<<"Will not
ace0: 20 74 72 79 20 74 6f 20 6d 65 72 67 65 20 73 6c   try to merge sl
acf0: 6f 74 73 2e 5c 6e 22 29 3b 0a 20 20 20 20 72 65  ots.\n");.    re
ad00: 74 75 72 6e 20 72 65 6d 6f 76 65 41 6c 6c 4d 61  turn removeAllMa
ad10: 72 6b 65 72 73 28 29 3b 0a 20 20 7d 0a 0a 20 20  rkers();.  }..  
ad20: 66 6f 72 20 28 75 6e 73 69 67 6e 65 64 20 69 3d  for (unsigned i=
ad30: 30 3b 20 69 20 3c 20 4e 75 6d 53 6c 6f 74 73 3b  0; i < NumSlots;
ad40: 20 2b 2b 69 29 20 7b 0a 20 20 20 20 73 74 64 3a   ++i) {.    std:
ad50: 3a 75 6e 69 71 75 65 5f 70 74 72 3c 4c 69 76 65  :unique_ptr<Live
ad60: 49 6e 74 65 72 76 61 6c 3e 20 4c 49 28 6e 65 77  Interval> LI(new
ad70: 20 4c 69 76 65 49 6e 74 65 72 76 61 6c 28 69 2c   LiveInterval(i,
ad80: 20 30 29 29 3b 0a 20 20 20 20 4c 49 2d 3e 67 65   0));.    LI->ge
ad90: 74 4e 65 78 74 56 61 6c 75 65 28 49 6e 64 65 78  tNextValue(Index
ada0: 65 73 2d 3e 67 65 74 5a 65 72 6f 49 6e 64 65 78  es->getZeroIndex
adb0: 28 29 2c 20 56 4e 49 6e 66 6f 41 6c 6c 6f 63 61  (), VNInfoAlloca
adc0: 74 6f 72 29 3b 0a 20 20 20 20 49 6e 74 65 72 76  tor);.    Interv
add0: 61 6c 73 2e 70 75 73 68 5f 62 61 63 6b 28 73 74  als.push_back(st
ade0: 64 3a 3a 6d 6f 76 65 28 4c 49 29 29 3b 0a 20 20  d::move(LI));.  
adf0: 20 20 53 6f 72 74 65 64 53 6c 6f 74 73 2e 70 75    SortedSlots.pu
ae00: 73 68 5f 62 61 63 6b 28 69 29 3b 0a 20 20 7d 0a  sh_back(i);.  }.
ae10: 0a 20 20 2f 2f 20 43 61 6c 63 75 6c 61 74 65 20  .  // Calculate 
ae20: 74 68 65 20 6c 69 76 65 6e 65 73 73 20 6f 66 20  the liveness of 
ae30: 65 61 63 68 20 62 6c 6f 63 6b 2e 0a 20 20 63 61  each block..  ca
ae40: 6c 63 75 6c 61 74 65 4c 6f 63 61 6c 4c 69 76 65  lculateLocalLive
ae50: 6e 65 73 73 28 29 3b 0a 20 20 44 45 42 55 47 28  ness();.  DEBUG(
ae60: 64 62 67 73 28 29 20 3c 3c 20 22 44 61 74 61 66  dbgs() << "Dataf
ae70: 6c 6f 77 20 69 74 65 72 61 74 69 6f 6e 73 3a 20  low iterations: 
ae80: 22 20 3c 3c 20 4e 75 6d 49 74 65 72 61 74 69 6f  " << NumIteratio
ae90: 6e 73 20 3c 3c 20 22 5c 6e 22 29 3b 0a 20 20 44  ns << "\n");.  D
aea0: 45 42 55 47 28 64 75 6d 70 28 29 29 3b 0a 0a 20  EBUG(dump());.. 
aeb0: 20 2f 2f 20 50 72 6f 70 61 67 61 74 65 20 74 68   // Propagate th
aec0: 65 20 6c 69 76 65 6e 65 73 73 20 69 6e 66 6f 72  e liveness infor
aed0: 6d 61 74 69 6f 6e 2e 0a 20 20 63 61 6c 63 75 6c  mation..  calcul
aee0: 61 74 65 4c 69 76 65 49 6e 74 65 72 76 61 6c 73  ateLiveIntervals
aef0: 28 4e 75 6d 53 6c 6f 74 73 29 3b 0a 20 20 44 45  (NumSlots);.  DE
af00: 42 55 47 28 64 75 6d 70 49 6e 74 65 72 76 61 6c  BUG(dumpInterval
af10: 73 28 29 29 3b 0a 0a 20 20 2f 2f 20 53 65 61 72  s());..  // Sear
af20: 63 68 20 66 6f 72 20 61 6c 6c 6f 63 61 73 20 77  ch for allocas w
af30: 68 69 63 68 20 61 72 65 20 75 73 65 64 20 6f 75  hich are used ou
af40: 74 73 69 64 65 20 6f 66 20 74 68 65 20 64 65 63  tside of the dec
af50: 6c 61 72 65 64 20 6c 69 66 65 74 69 6d 65 0a 20  lared lifetime. 
af60: 20 2f 2f 20 6d 61 72 6b 65 72 73 2e 0a 20 20 69   // markers..  i
af70: 66 20 28 50 72 6f 74 65 63 74 46 72 6f 6d 45 73  f (ProtectFromEs
af80: 63 61 70 65 64 41 6c 6c 6f 63 61 73 29 0a 20 20  capedAllocas).  
af90: 20 20 72 65 6d 6f 76 65 49 6e 76 61 6c 69 64 53    removeInvalidS
afa0: 6c 6f 74 52 61 6e 67 65 73 28 29 3b 0a 0a 20 20  lotRanges();..  
afb0: 2f 2f 20 4d 61 70 73 20 6f 6c 64 20 73 6c 6f 74  // Maps old slot
afc0: 73 20 74 6f 20 6e 65 77 20 73 6c 6f 74 73 2e 0a  s to new slots..
afd0: 20 20 44 65 6e 73 65 4d 61 70 3c 69 6e 74 2c 20    DenseMap<int, 
afe0: 69 6e 74 3e 20 53 6c 6f 74 52 65 6d 61 70 3b 0a  int> SlotRemap;.
aff0: 20 20 75 6e 73 69 67 6e 65 64 20 52 65 6d 6f 76    unsigned Remov
b000: 65 64 53 6c 6f 74 73 20 3d 20 30 3b 0a 20 20 75  edSlots = 0;.  u
b010: 6e 73 69 67 6e 65 64 20 52 65 64 75 63 65 64 53  nsigned ReducedS
b020: 69 7a 65 20 3d 20 30 3b 0a 0a 20 20 2f 2f 20 44  ize = 0;..  // D
b030: 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 6c 6f 6f  o not bother loo
b040: 6b 69 6e 67 20 61 74 20 65 6d 70 74 79 20 69 6e  king at empty in
b050: 74 65 72 76 61 6c 73 2e 0a 20 20 66 6f 72 20 28  tervals..  for (
b060: 75 6e 73 69 67 6e 65 64 20 49 20 3d 20 30 3b 20  unsigned I = 0; 
b070: 49 20 3c 20 4e 75 6d 53 6c 6f 74 73 3b 20 2b 2b  I < NumSlots; ++
b080: 49 29 20 7b 0a 20 20 20 20 69 66 20 28 49 6e 74  I) {.    if (Int
b090: 65 72 76 61 6c 73 5b 53 6f 72 74 65 64 53 6c 6f  ervals[SortedSlo
b0a0: 74 73 5b 49 5d 5d 2d 3e 65 6d 70 74 79 28 29 29  ts[I]]->empty())
b0b0: 0a 20 20 20 20 20 20 53 6f 72 74 65 64 53 6c 6f  .      SortedSlo
b0c0: 74 73 5b 49 5d 20 3d 20 2d 31 3b 0a 20 20 7d 0a  ts[I] = -1;.  }.
b0d0: 0a 20 20 2f 2f 20 54 68 69 73 20 69 73 20 61 20  .  // This is a 
b0e0: 73 69 6d 70 6c 65 20 67 72 65 65 64 79 20 61 6c  simple greedy al
b0f0: 67 6f 72 69 74 68 6d 20 66 6f 72 20 6d 65 72 67  gorithm for merg
b100: 69 6e 67 20 61 6c 6c 6f 63 61 73 2e 20 46 69 72  ing allocas. Fir
b110: 73 74 2c 20 73 6f 72 74 20 74 68 65 0a 20 20 2f  st, sort the.  /
b120: 2f 20 73 6c 6f 74 73 2c 20 70 6c 61 63 69 6e 67  / slots, placing
b130: 20 74 68 65 20 6c 61 72 67 65 73 74 20 73 6c 6f   the largest slo
b140: 74 73 20 66 69 72 73 74 2e 20 4e 65 78 74 2c 20  ts first. Next, 
b150: 70 65 72 66 6f 72 6d 20 61 6e 20 6e 5e 32 20 73  perform an n^2 s
b160: 63 61 6e 20 61 6e 64 20 6c 6f 6f 6b 0a 20 20 2f  can and look.  /
b170: 2f 20 66 6f 72 20 64 69 73 6a 6f 69 6e 74 20 73  / for disjoint s
b180: 6c 6f 74 73 2e 20 57 68 65 6e 20 79 6f 75 20 66  lots. When you f
b190: 69 6e 64 20 64 69 73 6a 6f 69 6e 74 20 73 6c 6f  ind disjoint slo
b1a0: 74 73 2c 20 6d 65 72 67 65 20 74 68 65 20 73 61  ts, merge the sa
b1b0: 6d 6c 6c 65 72 20 6f 6e 65 0a 20 20 2f 2f 20 69  mller one.  // i
b1c0: 6e 74 6f 20 74 68 65 20 62 69 67 67 65 72 20 6f  nto the bigger o
b1d0: 6e 65 20 61 6e 64 20 75 70 64 61 74 65 20 74 68  ne and update th
b1e0: 65 20 6c 69 76 65 20 69 6e 74 65 72 76 61 6c 2e  e live interval.
b1f0: 20 52 65 6d 6f 76 65 20 74 68 65 20 73 6d 61 6c   Remove the smal
b200: 6c 20 61 6c 6c 6f 63 61 0a 20 20 2f 2f 20 61 6e  l alloca.  // an
b210: 64 20 63 6f 6e 74 69 6e 75 65 2e 0a 0a 20 20 2f  d continue...  /
b220: 2f 20 53 6f 72 74 20 74 68 65 20 73 6c 6f 74 73  / Sort the slots
b230: 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68   according to th
b240: 65 69 72 20 73 69 7a 65 2e 20 50 6c 61 63 65 20  eir size. Place 
b250: 75 6e 75 73 65 64 20 73 6c 6f 74 73 20 61 74 20  unused slots at 
b260: 74 68 65 20 65 6e 64 2e 0a 20 20 2f 2f 20 55 73  the end..  // Us
b270: 65 20 73 74 61 62 6c 65 20 73 6f 72 74 20 74 6f  e stable sort to
b280: 20 67 75 61 72 61 6e 74 65 65 20 64 65 74 65 72   guarantee deter
b290: 6d 69 6e 69 73 74 69 63 20 63 6f 64 65 20 67 65  ministic code ge
b2a0: 6e 65 72 61 74 69 6f 6e 2e 0a 20 20 73 74 64 3a  neration..  std:
b2b0: 3a 73 74 61 62 6c 65 5f 73 6f 72 74 28 53 6f 72  :stable_sort(Sor
b2c0: 74 65 64 53 6c 6f 74 73 2e 62 65 67 69 6e 28 29  tedSlots.begin()
b2d0: 2c 20 53 6f 72 74 65 64 53 6c 6f 74 73 2e 65 6e  , SortedSlots.en
b2e0: 64 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  d(),.           
b2f0: 20 20 20 20 20 20 20 20 5b 74 68 69 73 5d 28 69          [this](i
b300: 6e 74 20 4c 48 53 2c 20 69 6e 74 20 52 48 53 29  nt LHS, int RHS)
b310: 20 7b 0a 20 20 20 20 2f 2f 20 57 65 20 75 73 65   {.    // We use
b320: 20 2d 31 20 74 6f 20 64 65 6e 6f 74 65 20 61 20   -1 to denote a 
b330: 75 6e 69 6e 74 65 72 65 73 74 69 6e 67 20 73 6c  uninteresting sl
b340: 6f 74 2e 20 50 6c 61 63 65 20 74 68 65 73 65 20  ot. Place these 
b350: 73 6c 6f 74 73 20 61 74 20 74 68 65 20 65 6e 64  slots at the end
b360: 2e 0a 20 20 20 20 69 66 20 28 4c 48 53 20 3d 3d  ..    if (LHS ==
b370: 20 2d 31 29 20 72 65 74 75 72 6e 20 66 61 6c 73   -1) return fals
b380: 65 3b 0a 20 20 20 20 69 66 20 28 52 48 53 20 3d  e;.    if (RHS =
b390: 3d 20 2d 31 29 20 72 65 74 75 72 6e 20 74 72 75  = -1) return tru
b3a0: 65 3b 0a 20 20 20 20 2f 2f 20 53 6f 72 74 20 61  e;.    // Sort a
b3b0: 63 63 6f 72 64 69 6e 67 20 74 6f 20 73 69 7a 65  ccording to size
b3c0: 2e 0a 20 20 20 20 72 65 74 75 72 6e 20 4d 46 49  ..    return MFI
b3d0: 2d 3e 67 65 74 4f 62 6a 65 63 74 53 69 7a 65 28  ->getObjectSize(
b3e0: 4c 48 53 29 20 3e 20 4d 46 49 2d 3e 67 65 74 4f  LHS) > MFI->getO
b3f0: 62 6a 65 63 74 53 69 7a 65 28 52 48 53 29 3b 0a  bjectSize(RHS);.
b400: 20 20 7d 29 3b 0a 0a 20 20 66 6f 72 20 28 61 75    });..  for (au
b410: 74 6f 20 26 73 20 3a 20 4c 69 76 65 53 74 61 72  to &s : LiveStar
b420: 74 73 29 0a 20 20 20 20 73 74 64 3a 3a 73 6f 72  ts).    std::sor
b430: 74 28 73 2e 62 65 67 69 6e 28 29 2c 20 73 2e 65  t(s.begin(), s.e
b440: 6e 64 28 29 29 3b 0a 0a 20 20 62 6f 6f 6c 20 43  nd());..  bool C
b450: 68 61 6e 67 65 64 20 3d 20 74 72 75 65 3b 0a 20  hanged = true;. 
b460: 20 77 68 69 6c 65 20 28 43 68 61 6e 67 65 64 29   while (Changed)
b470: 20 7b 0a 20 20 20 20 43 68 61 6e 67 65 64 20 3d   {.    Changed =
b480: 20 66 61 6c 73 65 3b 0a 20 20 20 20 66 6f 72 20   false;.    for 
b490: 28 75 6e 73 69 67 6e 65 64 20 49 20 3d 20 30 3b  (unsigned I = 0;
b4a0: 20 49 20 3c 20 4e 75 6d 53 6c 6f 74 73 3b 20 2b   I < NumSlots; +
b4b0: 2b 49 29 20 7b 0a 20 20 20 20 20 20 69 66 20 28  +I) {.      if (
b4c0: 53 6f 72 74 65 64 53 6c 6f 74 73 5b 49 5d 20 3d  SortedSlots[I] =
b4d0: 3d 20 2d 31 29 0a 20 20 20 20 20 20 20 20 63 6f  = -1).        co
b4e0: 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 20 20 66  ntinue;..      f
b4f0: 6f 72 20 28 75 6e 73 69 67 6e 65 64 20 4a 3d 49  or (unsigned J=I
b500: 2b 31 3b 20 4a 20 3c 20 4e 75 6d 53 6c 6f 74 73  +1; J < NumSlots
b510: 3b 20 2b 2b 4a 29 20 7b 0a 20 20 20 20 20 20 20  ; ++J) {.       
b520: 20 69 66 20 28 53 6f 72 74 65 64 53 6c 6f 74 73   if (SortedSlots
b530: 5b 4a 5d 20 3d 3d 20 2d 31 29 0a 20 20 20 20 20  [J] == -1).     
b540: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a       continue;..
b550: 20 20 20 20 20 20 20 20 69 6e 74 20 46 69 72 73          int Firs
b560: 74 53 6c 6f 74 20 3d 20 53 6f 72 74 65 64 53 6c  tSlot = SortedSl
b570: 6f 74 73 5b 49 5d 3b 0a 20 20 20 20 20 20 20 20  ots[I];.        
b580: 69 6e 74 20 53 65 63 6f 6e 64 53 6c 6f 74 20 3d  int SecondSlot =
b590: 20 53 6f 72 74 65 64 53 6c 6f 74 73 5b 4a 5d 3b   SortedSlots[J];
b5a0: 0a 20 20 20 20 20 20 20 20 4c 69 76 65 49 6e 74  .        LiveInt
b5b0: 65 72 76 61 6c 20 2a 46 69 72 73 74 20 3d 20 26  erval *First = &
b5c0: 2a 49 6e 74 65 72 76 61 6c 73 5b 46 69 72 73 74  *Intervals[First
b5d0: 53 6c 6f 74 5d 3b 0a 20 20 20 20 20 20 20 20 4c  Slot];.        L
b5e0: 69 76 65 49 6e 74 65 72 76 61 6c 20 2a 53 65 63  iveInterval *Sec
b5f0: 6f 6e 64 20 3d 20 26 2a 49 6e 74 65 72 76 61 6c  ond = &*Interval
b600: 73 5b 53 65 63 6f 6e 64 53 6c 6f 74 5d 3b 0a 20  s[SecondSlot];. 
b610: 20 20 20 20 20 20 20 61 75 74 6f 20 26 46 69 72         auto &Fir
b620: 73 74 53 20 3d 20 4c 69 76 65 53 74 61 72 74 73  stS = LiveStarts
b630: 5b 46 69 72 73 74 53 6c 6f 74 5d 3b 0a 20 20 20  [FirstSlot];.   
b640: 20 20 20 20 20 61 75 74 6f 20 26 53 65 63 6f 6e       auto &Secon
b650: 64 53 20 3d 20 4c 69 76 65 53 74 61 72 74 73 5b  dS = LiveStarts[
b660: 53 65 63 6f 6e 64 53 6c 6f 74 5d 3b 0a 20 20 20  SecondSlot];.   
b670: 20 20 20 20 20 61 73 73 65 72 74 28 21 46 69 72       assert(!Fir
b680: 73 74 2d 3e 65 6d 70 74 79 28 29 20 26 26 20 21  st->empty() && !
b690: 53 65 63 6f 6e 64 2d 3e 65 6d 70 74 79 28 29 20  Second->empty() 
b6a0: 26 26 20 22 46 6f 75 6e 64 20 61 6e 20 65 6d 70  && "Found an emp
b6b0: 74 79 20 72 61 6e 67 65 22 29 3b 0a 0a 20 20 20  ty range");..   
b6c0: 20 20 20 20 20 2f 2f 20 4d 65 72 67 65 20 64 69       // Merge di
b6d0: 73 6a 6f 69 6e 74 20 73 6c 6f 74 73 2e 20 54 68  sjoint slots. Th
b6e0: 69 73 20 69 73 20 61 20 6c 69 74 74 6c 65 20 62  is is a little b
b6f0: 69 74 20 74 72 69 63 6b 79 20 2d 20 73 65 65 20  it tricky - see 
b700: 74 68 65 0a 20 20 20 20 20 20 20 20 2f 2f 20 49  the.        // I
b710: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 4e 6f  mplementation No
b720: 74 65 73 20 73 65 63 74 69 6f 6e 20 66 6f 72 20  tes section for 
b730: 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 2e 0a  an explanation..
b740: 20 20 20 20 20 20 20 20 69 66 20 28 21 46 69 72          if (!Fir
b750: 73 74 2d 3e 69 73 4c 69 76 65 41 74 49 6e 64 65  st->isLiveAtInde
b760: 78 65 73 28 53 65 63 6f 6e 64 53 29 20 26 26 0a  xes(SecondS) &&.
b770: 20 20 20 20 20 20 20 20 20 20 20 20 21 53 65 63              !Sec
b780: 6f 6e 64 2d 3e 69 73 4c 69 76 65 41 74 49 6e 64  ond->isLiveAtInd
b790: 65 78 65 73 28 46 69 72 73 74 53 29 29 20 7b 0a  exes(FirstS)) {.
b7a0: 20 20 20 20 20 20 20 20 20 20 43 68 61 6e 67 65            Change
b7b0: 64 20 3d 20 74 72 75 65 3b 0a 20 20 20 20 20 20  d = true;.      
b7c0: 20 20 20 20 46 69 72 73 74 2d 3e 4d 65 72 67 65      First->Merge
b7d0: 53 65 67 6d 65 6e 74 73 49 6e 41 73 56 61 6c 75  SegmentsInAsValu
b7e0: 65 28 2a 53 65 63 6f 6e 64 2c 20 46 69 72 73 74  e(*Second, First
b7f0: 2d 3e 67 65 74 56 61 6c 4e 75 6d 49 6e 66 6f 28  ->getValNumInfo(
b800: 30 29 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  0));..          
b810: 69 6e 74 20 4f 6c 64 53 69 7a 65 20 3d 20 46 69  int OldSize = Fi
b820: 72 73 74 53 2e 73 69 7a 65 28 29 3b 0a 20 20 20  rstS.size();.   
b830: 20 20 20 20 20 20 20 46 69 72 73 74 53 2e 61 70         FirstS.ap
b840: 70 65 6e 64 28 53 65 63 6f 6e 64 53 2e 62 65 67  pend(SecondS.beg
b850: 69 6e 28 29 2c 20 53 65 63 6f 6e 64 53 2e 65 6e  in(), SecondS.en
b860: 64 28 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  d());.          
b870: 61 75 74 6f 20 4d 69 64 20 3d 20 46 69 72 73 74  auto Mid = First
b880: 53 2e 62 65 67 69 6e 28 29 20 2b 20 4f 6c 64 53  S.begin() + OldS
b890: 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ize;.          s
b8a0: 74 64 3a 3a 69 6e 70 6c 61 63 65 5f 6d 65 72 67  td::inplace_merg
b8b0: 65 28 46 69 72 73 74 53 2e 62 65 67 69 6e 28 29  e(FirstS.begin()
b8c0: 2c 20 4d 69 64 2c 20 46 69 72 73 74 53 2e 65 6e  , Mid, FirstS.en
b8d0: 64 28 29 29 3b 0a 0a 20 20 20 20 20 20 20 20 20  d());..         
b8e0: 20 53 6c 6f 74 52 65 6d 61 70 5b 53 65 63 6f 6e   SlotRemap[Secon
b8f0: 64 53 6c 6f 74 5d 20 3d 20 46 69 72 73 74 53 6c  dSlot] = FirstSl
b900: 6f 74 3b 0a 20 20 20 20 20 20 20 20 20 20 53 6f  ot;.          So
b910: 72 74 65 64 53 6c 6f 74 73 5b 4a 5d 20 3d 20 2d  rtedSlots[J] = -
b920: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 44 45 42  1;.          DEB
b930: 55 47 28 64 62 67 73 28 29 3c 3c 22 4d 65 72 67  UG(dbgs()<<"Merg
b940: 69 6e 67 20 23 22 3c 3c 46 69 72 73 74 53 6c 6f  ing #"<<FirstSlo
b950: 74 3c 3c 22 20 61 6e 64 20 73 6c 6f 74 73 20 23  t<<" and slots #
b960: 22 3c 3c 0a 20 20 20 20 20 20 20 20 20 20 20 20  "<<.            
b970: 20 20 20 20 53 65 63 6f 6e 64 53 6c 6f 74 3c 3c      SecondSlot<<
b980: 22 20 74 6f 67 65 74 68 65 72 2e 5c 6e 22 29 3b  " together.\n");
b990: 0a 20 20 20 20 20 20 20 20 20 20 75 6e 73 69 67  .          unsig
b9a0: 6e 65 64 20 4d 61 78 41 6c 69 67 6e 6d 65 6e 74  ned MaxAlignment
b9b0: 20 3d 20 73 74 64 3a 3a 6d 61 78 28 4d 46 49 2d   = std::max(MFI-
b9c0: 3e 67 65 74 4f 62 6a 65 63 74 41 6c 69 67 6e 6d  >getObjectAlignm
b9d0: 65 6e 74 28 46 69 72 73 74 53 6c 6f 74 29 2c 0a  ent(FirstSlot),.
b9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba00: 20 20 20 20 20 20 20 20 20 20 20 4d 46 49 2d 3e             MFI->
ba10: 67 65 74 4f 62 6a 65 63 74 41 6c 69 67 6e 6d 65  getObjectAlignme
ba20: 6e 74 28 53 65 63 6f 6e 64 53 6c 6f 74 29 29 3b  nt(SecondSlot));
ba30: 0a 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ..          asse
ba40: 72 74 28 4d 46 49 2d 3e 67 65 74 4f 62 6a 65 63  rt(MFI->getObjec
ba50: 74 53 69 7a 65 28 46 69 72 73 74 53 6c 6f 74 29  tSize(FirstSlot)
ba60: 20 3e 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20   >=.            
ba70: 20 20 20 20 20 4d 46 49 2d 3e 67 65 74 4f 62 6a       MFI->getObj
ba80: 65 63 74 53 69 7a 65 28 53 65 63 6f 6e 64 53 6c  ectSize(SecondSl
ba90: 6f 74 29 20 26 26 0a 20 20 20 20 20 20 20 20 20  ot) &&.         
baa0: 20 20 20 20 20 20 20 20 22 4d 65 72 67 69 6e 67          "Merging
bab0: 20 61 20 73 6d 61 6c 6c 20 6f 62 6a 65 63 74 20   a small object 
bac0: 69 6e 74 6f 20 61 20 6c 61 72 67 65 72 20 6f 6e  into a larger on
bad0: 65 22 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  e");..          
bae0: 52 65 6d 6f 76 65 64 53 6c 6f 74 73 2b 3d 31 3b  RemovedSlots+=1;
baf0: 0a 20 20 20 20 20 20 20 20 20 20 52 65 64 75 63  .          Reduc
bb00: 65 64 53 69 7a 65 20 2b 3d 20 4d 46 49 2d 3e 67  edSize += MFI->g
bb10: 65 74 4f 62 6a 65 63 74 53 69 7a 65 28 53 65 63  etObjectSize(Sec
bb20: 6f 6e 64 53 6c 6f 74 29 3b 0a 20 20 20 20 20 20  ondSlot);.      
bb30: 20 20 20 20 4d 46 49 2d 3e 73 65 74 4f 62 6a 65      MFI->setObje
bb40: 63 74 41 6c 69 67 6e 6d 65 6e 74 28 46 69 72 73  ctAlignment(Firs
bb50: 74 53 6c 6f 74 2c 20 4d 61 78 41 6c 69 67 6e 6d  tSlot, MaxAlignm
bb60: 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ent);.          
bb70: 4d 46 49 2d 3e 52 65 6d 6f 76 65 53 74 61 63 6b  MFI->RemoveStack
bb80: 4f 62 6a 65 63 74 28 53 65 63 6f 6e 64 53 6c 6f  Object(SecondSlo
bb90: 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
bba0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 2f      }.    }.  }/
bbb0: 2f 20 57 68 69 6c 65 20 63 68 61 6e 67 65 64 2e  / While changed.
bbc0: 0a 0a 20 20 2f 2f 20 52 65 63 6f 72 64 20 73 74  ..  // Record st
bbd0: 61 74 69 73 74 69 63 73 2e 0a 20 20 53 74 61 63  atistics..  Stac
bbe0: 6b 53 70 61 63 65 53 61 76 65 64 20 2b 3d 20 52  kSpaceSaved += R
bbf0: 65 64 75 63 65 64 53 69 7a 65 3b 0a 20 20 53 74  educedSize;.  St
bc00: 61 63 6b 53 6c 6f 74 4d 65 72 67 65 64 20 2b 3d  ackSlotMerged +=
bc10: 20 52 65 6d 6f 76 65 64 53 6c 6f 74 73 3b 0a 20   RemovedSlots;. 
bc20: 20 44 45 42 55 47 28 64 62 67 73 28 29 3c 3c 22   DEBUG(dbgs()<<"
bc30: 4d 65 72 67 65 20 22 3c 3c 52 65 6d 6f 76 65 64  Merge "<<Removed
bc40: 53 6c 6f 74 73 3c 3c 22 20 73 6c 6f 74 73 2e 20  Slots<<" slots. 
bc50: 53 61 76 65 64 20 22 3c 3c 0a 20 20 20 20 20 20  Saved "<<.      
bc60: 20 20 52 65 64 75 63 65 64 53 69 7a 65 3c 3c 22    ReducedSize<<"
bc70: 20 62 79 74 65 73 5c 6e 22 29 3b 0a 0a 20 20 2f   bytes\n");..  /
bc80: 2f 20 53 63 61 6e 20 74 68 65 20 65 6e 74 69 72  / Scan the entir
bc90: 65 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 75  e function and u
bca0: 70 64 61 74 65 20 61 6c 6c 20 6d 61 63 68 69 6e  pdate all machin
bcb0: 65 20 6f 70 65 72 61 6e 64 73 20 74 68 61 74 20  e operands that 
bcc0: 75 73 65 20 66 72 61 6d 65 0a 20 20 2f 2f 20 69  use frame.  // i
bcd0: 6e 64 69 63 65 73 20 74 6f 20 75 73 65 20 74 68  ndices to use th
bce0: 65 20 72 65 6d 61 70 70 65 64 20 66 72 61 6d 65  e remapped frame
bcf0: 20 69 6e 64 65 78 2e 0a 20 20 65 78 70 75 6e 67   index..  expung
bd00: 65 53 6c 6f 74 4d 61 70 28 53 6c 6f 74 52 65 6d  eSlotMap(SlotRem
bd10: 61 70 2c 20 4e 75 6d 53 6c 6f 74 73 29 3b 0a 20  ap, NumSlots);. 
bd20: 20 72 65 6d 61 70 49 6e 73 74 72 75 63 74 69 6f   remapInstructio
bd30: 6e 73 28 53 6c 6f 74 52 65 6d 61 70 29 3b 0a 0a  ns(SlotRemap);..
bd40: 20 20 72 65 74 75 72 6e 20 72 65 6d 6f 76 65 41    return removeA
bd50: 6c 6c 4d 61 72 6b 65 72 73 28 29 3b 0a 7d 0a     llMarkers();.}.