OLD | NEW |
---|---|
1 //===- subzero/src/IceCfgNode.cpp - Basic block (node) implementation -----===// | 1 //===- subzero/src/IceCfgNode.cpp - Basic block (node) 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 // This file implements the CfgNode class, including the complexities | 10 // This file implements the CfgNode class, including the complexities |
(...skipping 867 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
878 | 878 |
879 void CfgNode::emit(Cfg *Func) const { | 879 void CfgNode::emit(Cfg *Func) const { |
880 if (!ALLOW_DUMP) | 880 if (!ALLOW_DUMP) |
881 return; | 881 return; |
882 Func->setCurrentNode(this); | 882 Func->setCurrentNode(this); |
883 Ostream &Str = Func->getContext()->getStrEmit(); | 883 Ostream &Str = Func->getContext()->getStrEmit(); |
884 Liveness *Liveness = Func->getLiveness(); | 884 Liveness *Liveness = Func->getLiveness(); |
885 bool DecorateAsm = | 885 bool DecorateAsm = |
886 Liveness && Func->getContext()->getFlags().getDecorateAsm(); | 886 Liveness && Func->getContext()->getFlags().getDecorateAsm(); |
887 Str << getAsmName() << ":\n"; | 887 Str << getAsmName() << ":\n"; |
888 // LiveRegCount keeps track of the number of currently live | |
889 // variables that each register is assigned to. Normally that would | |
890 // be only 0 or 1, but the register allocator's AllowOverlap | |
891 // inference allows it to be greater than 1 for short periods. | |
888 std::vector<SizeT> LiveRegCount(Func->getTarget()->getNumRegisters()); | 892 std::vector<SizeT> LiveRegCount(Func->getTarget()->getNumRegisters()); |
889 if (DecorateAsm) { | 893 if (DecorateAsm) { |
890 const bool IsLiveIn = true; | 894 const bool IsLiveIn = true; |
891 emitRegisterUsage(Str, Func, this, IsLiveIn, LiveRegCount); | 895 emitRegisterUsage(Str, Func, this, IsLiveIn, LiveRegCount); |
892 } | 896 } |
893 | 897 |
894 for (const Inst &I : Phis) { | 898 for (const Inst &I : Phis) { |
895 if (I.isDeleted()) | 899 if (I.isDeleted()) |
896 continue; | 900 continue; |
897 // Emitting a Phi instruction should cause an error. | 901 // Emitting a Phi instruction should cause an error. |
898 I.emit(Func); | 902 I.emit(Func); |
899 } | 903 } |
900 for (const Inst &I : Insts) { | 904 for (const Inst &I : Insts) { |
901 if (I.isDeleted()) | 905 if (I.isDeleted()) |
902 continue; | 906 continue; |
903 if (I.isRedundantAssign()) | 907 if (I.isRedundantAssign()) { |
908 // Usually, redundant assignments end the live range of the src | |
909 // variable and begin the live range of the dest variable, with | |
910 // no net effect on the liveness of their register. However, if | |
911 // the register allocator infers the AllowOverlap condition, | |
912 // then this may be a redundant assignment that does not end the | |
913 // src variable's live range, in which case the active variable | |
914 // count for that register needs to be bumped. That normally | |
915 // would have happened as part of emitLiveRangesEnded(), but | |
916 // that isn't called for redundant assignments. | |
917 Variable *Dest = I.getDest(); | |
918 if (DecorateAsm && Dest->hasReg() && !I.isLastUse(I.getSrc(0))) | |
jvoung (off chromium)
2015/05/27 15:58:56
Just checking -- this checks !I.isLastUse(I.getSrc
Jim Stichnoth
2015/05/27 16:08:55
Sorry - I discovered that problem yesterday and up
| |
919 ++LiveRegCount[Dest->getRegNum()]; | |
904 continue; | 920 continue; |
921 } | |
905 I.emit(Func); | 922 I.emit(Func); |
906 if (DecorateAsm) | 923 if (DecorateAsm) |
907 emitLiveRangesEnded(Str, Func, &I, LiveRegCount); | 924 emitLiveRangesEnded(Str, Func, &I, LiveRegCount); |
908 Str << "\n"; | 925 Str << "\n"; |
909 updateStats(Func, &I); | 926 updateStats(Func, &I); |
910 } | 927 } |
911 if (DecorateAsm) { | 928 if (DecorateAsm) { |
912 const bool IsLiveIn = false; | 929 const bool IsLiveIn = false; |
913 emitRegisterUsage(Str, Func, this, IsLiveIn, LiveRegCount); | 930 emitRegisterUsage(Str, Func, this, IsLiveIn, LiveRegCount); |
914 } | 931 } |
(...skipping 300 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1215 if (!First) | 1232 if (!First) |
1216 Str << ", "; | 1233 Str << ", "; |
1217 First = false; | 1234 First = false; |
1218 Str << "%" << I->getName(); | 1235 Str << "%" << I->getName(); |
1219 } | 1236 } |
1220 Str << "\n"; | 1237 Str << "\n"; |
1221 } | 1238 } |
1222 } | 1239 } |
1223 | 1240 |
1224 } // end of namespace Ice | 1241 } // end of namespace Ice |
OLD | NEW |