OLD | NEW |
1 //===- subzero/src/IceInst.cpp - High-level instruction implementation ----===// | 1 //===- subzero/src/IceInst.cpp - High-level instruction 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 188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
199 setLastUse(IndexOfVarInInst(Var)); | 199 setLastUse(IndexOfVarInInst(Var)); |
200 } | 200 } |
201 } | 201 } |
202 | 202 |
203 bool Inst::liveness(InstNumberT InstNumber, LivenessBV &Live, | 203 bool Inst::liveness(InstNumberT InstNumber, LivenessBV &Live, |
204 Liveness *Liveness, LiveBeginEndMap *LiveBegin, | 204 Liveness *Liveness, LiveBeginEndMap *LiveBegin, |
205 LiveBeginEndMap *LiveEnd) { | 205 LiveBeginEndMap *LiveEnd) { |
206 assert(!isDeleted()); | 206 assert(!isDeleted()); |
207 | 207 |
208 Dead = false; | 208 Dead = false; |
209 if (Dest) { | 209 if (Dest && !Dest->isRematerializable()) { |
210 SizeT VarNum = Liveness->getLiveIndex(Dest->getIndex()); | 210 SizeT VarNum = Liveness->getLiveIndex(Dest->getIndex()); |
211 if (Live[VarNum]) { | 211 if (Live[VarNum]) { |
212 if (!isDestRedefined()) { | 212 if (!isDestRedefined()) { |
213 Live[VarNum] = false; | 213 Live[VarNum] = false; |
214 if (LiveBegin && Liveness->getRangeMask(Dest->getIndex())) { | 214 if (LiveBegin && Liveness->getRangeMask(Dest->getIndex())) { |
215 LiveBegin->push_back(std::make_pair(VarNum, InstNumber)); | 215 LiveBegin->push_back(std::make_pair(VarNum, InstNumber)); |
216 } | 216 } |
217 } | 217 } |
218 } else { | 218 } else { |
219 if (!hasSideEffects()) | 219 if (!hasSideEffects()) |
220 Dead = true; | 220 Dead = true; |
221 } | 221 } |
222 } | 222 } |
223 if (Dead) | 223 if (Dead) |
224 return false; | 224 return false; |
225 // Phi arguments only get added to Live in the predecessor node, but we still | 225 // Phi arguments only get added to Live in the predecessor node, but we still |
226 // need to update LiveRangesEnded. | 226 // need to update LiveRangesEnded. |
227 bool IsPhi = llvm::isa<InstPhi>(this); | 227 bool IsPhi = llvm::isa<InstPhi>(this); |
228 resetLastUses(); | 228 resetLastUses(); |
229 FOREACH_VAR_IN_INST(Var, *this) { | 229 FOREACH_VAR_IN_INST(Var, *this) { |
| 230 if (Var->isRematerializable()) |
| 231 continue; |
230 SizeT VarNum = Liveness->getLiveIndex(Var->getIndex()); | 232 SizeT VarNum = Liveness->getLiveIndex(Var->getIndex()); |
231 if (!Live[VarNum]) { | 233 if (!Live[VarNum]) { |
232 setLastUse(IndexOfVarInInst(Var)); | 234 setLastUse(IndexOfVarInInst(Var)); |
233 if (!IsPhi) { | 235 if (!IsPhi) { |
234 Live[VarNum] = true; | 236 Live[VarNum] = true; |
235 // For a variable in SSA form, its live range can end at most once in a | 237 // For a variable in SSA form, its live range can end at most once in a |
236 // basic block. However, after lowering to two-address instructions, we | 238 // basic block. However, after lowering to two-address instructions, we |
237 // end up with sequences like "t=b;t+=c;a=t" where t's live range | 239 // end up with sequences like "t=b;t+=c;a=t" where t's live range |
238 // begins and ends twice. ICE only allows a variable to have a single | 240 // begins and ends twice. ICE only allows a variable to have a single |
239 // liveness interval in a basic block (except for blocks where a | 241 // liveness interval in a basic block (except for blocks where a |
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
404 // Updates liveness for a particular operand based on the given predecessor | 406 // Updates liveness for a particular operand based on the given predecessor |
405 // edge. Doesn't mark the operand as live if the Phi instruction is dead or | 407 // edge. Doesn't mark the operand as live if the Phi instruction is dead or |
406 // deleted. | 408 // deleted. |
407 void InstPhi::livenessPhiOperand(LivenessBV &Live, CfgNode *Target, | 409 void InstPhi::livenessPhiOperand(LivenessBV &Live, CfgNode *Target, |
408 Liveness *Liveness) { | 410 Liveness *Liveness) { |
409 if (isDeleted() || Dead) | 411 if (isDeleted() || Dead) |
410 return; | 412 return; |
411 for (SizeT I = 0; I < getSrcSize(); ++I) { | 413 for (SizeT I = 0; I < getSrcSize(); ++I) { |
412 if (Labels[I] == Target) { | 414 if (Labels[I] == Target) { |
413 if (auto *Var = llvm::dyn_cast<Variable>(getSrc(I))) { | 415 if (auto *Var = llvm::dyn_cast<Variable>(getSrc(I))) { |
414 SizeT SrcIndex = Liveness->getLiveIndex(Var->getIndex()); | 416 if (!Var->isRematerializable()) { |
415 if (!Live[SrcIndex]) { | 417 SizeT SrcIndex = Liveness->getLiveIndex(Var->getIndex()); |
416 setLastUse(I); | 418 if (!Live[SrcIndex]) { |
417 Live[SrcIndex] = true; | 419 setLastUse(I); |
| 420 Live[SrcIndex] = true; |
| 421 } |
418 } | 422 } |
419 } | 423 } |
420 return; | 424 return; |
421 } | 425 } |
422 } | 426 } |
423 llvm_unreachable("Phi operand not found for specified target node"); | 427 llvm_unreachable("Phi operand not found for specified target node"); |
424 } | 428 } |
425 | 429 |
426 // Change "a=phi(...)" to "a_phi=phi(...)" and return a new instruction | 430 // Change "a=phi(...)" to "a_phi=phi(...)" and return a new instruction |
427 // "a=a_phi". | 431 // "a=a_phi". |
(...skipping 583 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1011 // upper 32 bits of rax. We need to recognize and preserve these. | 1015 // upper 32 bits of rax. We need to recognize and preserve these. |
1012 return true; | 1016 return true; |
1013 } | 1017 } |
1014 if (!Dest->hasReg() && !SrcVar->hasReg() && | 1018 if (!Dest->hasReg() && !SrcVar->hasReg() && |
1015 Dest->getStackOffset() == SrcVar->getStackOffset()) | 1019 Dest->getStackOffset() == SrcVar->getStackOffset()) |
1016 return true; | 1020 return true; |
1017 return false; | 1021 return false; |
1018 } | 1022 } |
1019 | 1023 |
1020 } // end of namespace Ice | 1024 } // end of namespace Ice |
OLD | NEW |