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->getRegistersForClass(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 |