| OLD | NEW |
| 1 //===- subzero/src/IceRegAlloc.cpp - Linear-scan implementation -----------===// | 1 //===- subzero/src/IceRegAlloc.cpp - Linear-scan implementation -----------===// |
| 2 // | 2 // |
| 3 // The Subzero Code Generator | 3 // The Subzero Code Generator |
| 4 // | 4 // |
| 5 // This file is distributed under the University of Illinois Open Source | 5 // This file is distributed under the University of Illinois Open Source |
| 6 // License. See LICENSE.TXT for details. | 6 // License. See LICENSE.TXT for details. |
| 7 // | 7 // |
| 8 //===----------------------------------------------------------------------===// | 8 //===----------------------------------------------------------------------===// |
| 9 /// | 9 /// |
| 10 /// \file | 10 /// \file |
| 11 /// \brief Implements the LinearScan class, which performs the linear-scan | 11 /// \brief Implements the LinearScan class, which performs the linear-scan |
| 12 /// register allocation after liveness analysis has been performed. | 12 /// register allocation after liveness analysis has been performed. |
| 13 /// | 13 /// |
| 14 //===----------------------------------------------------------------------===// | 14 //===----------------------------------------------------------------------===// |
| 15 | 15 |
| 16 #include "IceRegAlloc.h" | 16 #include "IceRegAlloc.h" |
| 17 | 17 |
| 18 #include "IceBitVector.h" | 18 #include "IceBitVector.h" |
| 19 #include "IceCfg.h" | 19 #include "IceCfg.h" |
| 20 #include "IceCfgNode.h" | 20 #include "IceCfgNode.h" |
| 21 #include "IceInst.h" | 21 #include "IceInst.h" |
| 22 #include "IceInstVarIter.h" | 22 #include "IceInstVarIter.h" |
| 23 #include "IceOperand.h" | 23 #include "IceOperand.h" |
| 24 #include "IceTargetLowering.h" | 24 #include "IceTargetLowering.h" |
| 25 | 25 |
| 26 #include "llvm/Support/Format.h" |
| 27 |
| 26 namespace Ice { | 28 namespace Ice { |
| 27 | 29 |
| 28 namespace { | 30 namespace { |
| 29 | 31 |
| 30 // Returns true if Var has any definitions within Item's live range. | 32 // Returns true if Var has any definitions within Item's live range. |
| 31 // TODO(stichnot): Consider trimming the Definitions list similar to how the | 33 // TODO(stichnot): Consider trimming the Definitions list similar to how the |
| 32 // live ranges are trimmed, since all the overlapsDefs() tests are whether some | 34 // live ranges are trimmed, since all the overlapsDefs() tests are whether some |
| 33 // variable's definitions overlap Cur, and trimming is with respect Cur.start. | 35 // variable's definitions overlap Cur, and trimming is with respect Cur.start. |
| 34 // Initial tests show no measurable performance difference, so we'll keep the | 36 // Initial tests show no measurable performance difference, so we'll keep the |
| 35 // code simple for now. | 37 // code simple for now. |
| (...skipping 27 matching lines...) Expand all Loading... |
| 63 for (size_t i = 0; i < Defs.size(); ++i) { | 65 for (size_t i = 0; i < Defs.size(); ++i) { |
| 64 Str << "," << Defs[i]->getNumber(); | 66 Str << "," << Defs[i]->getNumber(); |
| 65 } | 67 } |
| 66 Str << "\n"; | 68 Str << "\n"; |
| 67 } | 69 } |
| 68 | 70 |
| 69 void dumpLiveRange(const Variable *Var, const Cfg *Func) { | 71 void dumpLiveRange(const Variable *Var, const Cfg *Func) { |
| 70 if (!BuildDefs::dump()) | 72 if (!BuildDefs::dump()) |
| 71 return; | 73 return; |
| 72 Ostream &Str = Func->getContext()->getStrDump(); | 74 Ostream &Str = Func->getContext()->getStrDump(); |
| 73 char buf[30]; | 75 Str << "R="; |
| 74 snprintf(buf, llvm::array_lengthof(buf), "%2u", | 76 if (Var->hasRegTmp()) { |
| 75 unsigned(Var->getRegNumTmp())); | 77 Str << llvm::format("%2d", Var->getRegNumTmp()); |
| 76 Str << "R=" << buf << " V="; | 78 } else { |
| 79 Str << "NA"; |
| 80 } |
| 81 Str << " V="; |
| 77 Var->dump(Func); | 82 Var->dump(Func); |
| 78 Str << " Range=" << Var->getLiveRange(); | 83 Str << " Range=" << Var->getLiveRange(); |
| 79 } | 84 } |
| 80 | 85 |
| 81 int32_t findMinWeightIndex( | 86 int32_t findMinWeightIndex( |
| 82 const SmallBitVector &RegMask, | 87 const SmallBitVector &RegMask, |
| 83 const llvm::SmallVector<RegWeight, LinearScan::REGS_SIZE> &Weights) { | 88 const llvm::SmallVector<RegWeight, LinearScan::REGS_SIZE> &Weights) { |
| 84 int MinWeightIndex = -1; | 89 int MinWeightIndex = -1; |
| 85 for (RegNumT i : RegNumBVIter(RegMask)) { | 90 for (RegNumT i : RegNumBVIter(RegMask)) { |
| 86 if (MinWeightIndex < 0 || Weights[i] < Weights[MinWeightIndex]) | 91 if (MinWeightIndex < 0 || Weights[i] < Weights[MinWeightIndex]) |
| (...skipping 922 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1009 Str << "\n"; | 1014 Str << "\n"; |
| 1010 } | 1015 } |
| 1011 Str << "++++++ Inactive:\n"; | 1016 Str << "++++++ Inactive:\n"; |
| 1012 for (const Variable *Item : Inactive) { | 1017 for (const Variable *Item : Inactive) { |
| 1013 dumpLiveRange(Item, Func); | 1018 dumpLiveRange(Item, Func); |
| 1014 Str << "\n"; | 1019 Str << "\n"; |
| 1015 } | 1020 } |
| 1016 } | 1021 } |
| 1017 | 1022 |
| 1018 } // end of namespace Ice | 1023 } // end of namespace Ice |
| OLD | NEW |