| 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 |
| (...skipping 815 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 826 | 826 |
| 827 // Allocate memory once outside the loop | 827 // Allocate memory once outside the loop |
| 828 IterationState Iter; | 828 IterationState Iter; |
| 829 Iter.Weights.reserve(NumRegisters); | 829 Iter.Weights.reserve(NumRegisters); |
| 830 Iter.PrecoloredUnhandledMask.reserve(NumRegisters); | 830 Iter.PrecoloredUnhandledMask.reserve(NumRegisters); |
| 831 | 831 |
| 832 while (!Unhandled.empty()) { | 832 while (!Unhandled.empty()) { |
| 833 Iter.Cur = Unhandled.back(); | 833 Iter.Cur = Unhandled.back(); |
| 834 Unhandled.pop_back(); | 834 Unhandled.pop_back(); |
| 835 dumpLiveRangeTrace("\nConsidering ", Iter.Cur); | 835 dumpLiveRangeTrace("\nConsidering ", Iter.Cur); |
| 836 Iter.RegMask = | 836 Iter.RegMask = RegMaskFull & Target->getRegistersForVariable(Iter.Cur); |
| 837 RegMaskFull & Target->getRegisterSetForType(Iter.Cur->getType()); | |
| 838 KillsRange.trim(Iter.Cur->getLiveRange().getStart()); | 837 KillsRange.trim(Iter.Cur->getLiveRange().getStart()); |
| 839 | 838 |
| 840 // Check for pre-colored ranges. If Cur is pre-colored, it definitely gets | 839 // Check for pre-colored ranges. If Cur is pre-colored, it definitely gets |
| 841 // that register. Previously processed live ranges would have avoided that | 840 // that register. Previously processed live ranges would have avoided that |
| 842 // register due to it being pre-colored. Future processed live ranges won't | 841 // register due to it being pre-colored. Future processed live ranges won't |
| 843 // evict that register because the live range has infinite weight. | 842 // evict that register because the live range has infinite weight. |
| 844 if (Iter.Cur->hasReg()) { | 843 if (Iter.Cur->hasReg()) { |
| 845 allocatePrecoloredRegister(Iter.Cur); | 844 allocatePrecoloredRegister(Iter.Cur); |
| 846 continue; | 845 continue; |
| 847 } | 846 } |
| 848 | 847 |
| 849 handleActiveRangeExpiredOrInactive(Iter.Cur); | 848 handleActiveRangeExpiredOrInactive(Iter.Cur); |
| 850 handleInactiveRangeExpiredOrReactivated(Iter.Cur); | 849 handleInactiveRangeExpiredOrReactivated(Iter.Cur); |
| 851 | 850 |
| 852 // Calculate available registers into Free[]. | 851 // Calculate available registers into Free[]. |
| 853 Iter.Free = Iter.RegMask; | 852 Iter.Free = Iter.RegMask; |
| 854 for (SizeT i = 0; i < Iter.RegMask.size(); ++i) { | 853 for (SizeT i = 0; i < Iter.RegMask.size(); ++i) { |
| 855 if (RegUses[i] > 0) | 854 if (RegUses[i] > 0) |
| 856 Iter.Free[i] = false; | 855 Iter.Free[i] = false; |
| 857 } | 856 } |
| 858 | 857 |
| 859 findRegisterPreference(Iter); | 858 findRegisterPreference(Iter); |
| 860 filterFreeWithInactiveRanges(Iter); | 859 filterFreeWithInactiveRanges(Iter); |
| 861 | 860 |
| 862 // Disable AllowOverlap if an Active variable, which is not Prefer, shares | 861 // Disable AllowOverlap if an Active variable, which is not Prefer, shares |
| 863 // Prefer's register, and has a definition within Cur's live range. | 862 // Prefer's register, and has a definition within Cur's live range. |
| 864 if (Iter.AllowOverlap) { | 863 if (Iter.AllowOverlap) { |
| 864 const llvm::SmallBitVector &Aliases = *RegAliases[Iter.PreferReg]; |
| 865 for (const Variable *Item : Active) { | 865 for (const Variable *Item : Active) { |
| 866 int32_t RegNum = Item->getRegNumTmp(); | 866 int32_t RegNum = Item->getRegNumTmp(); |
| 867 // TODO(stichnot): Consider aliases of RegNum. This is probably a | 867 if (Item != Iter.Prefer && Aliases[RegNum] && |
| 868 // correctness issue. | |
| 869 if (Item != Iter.Prefer && RegNum == Iter.PreferReg && | |
| 870 overlapsDefs(Func, Iter.Cur, Item)) { | 868 overlapsDefs(Func, Iter.Cur, Item)) { |
| 871 Iter.AllowOverlap = false; | 869 Iter.AllowOverlap = false; |
| 872 dumpDisableOverlap(Func, Item, "Active"); | 870 dumpDisableOverlap(Func, Item, "Active"); |
| 873 } | 871 } |
| 874 } | 872 } |
| 875 } | 873 } |
| 876 | 874 |
| 877 Iter.Weights.resize(Iter.RegMask.size()); | 875 Iter.Weights.resize(Iter.RegMask.size()); |
| 878 std::fill(Iter.Weights.begin(), Iter.Weights.end(), RegWeight()); | 876 std::fill(Iter.Weights.begin(), Iter.Weights.end(), RegWeight()); |
| 879 | 877 |
| (...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 984 Str << "\n"; | 982 Str << "\n"; |
| 985 } | 983 } |
| 986 Str << "++++++ Inactive:\n"; | 984 Str << "++++++ Inactive:\n"; |
| 987 for (const Variable *Item : Inactive) { | 985 for (const Variable *Item : Inactive) { |
| 988 dumpLiveRange(Item, Func); | 986 dumpLiveRange(Item, Func); |
| 989 Str << "\n"; | 987 Str << "\n"; |
| 990 } | 988 } |
| 991 } | 989 } |
| 992 | 990 |
| 993 } // end of namespace Ice | 991 } // end of namespace Ice |
| OLD | NEW |