| OLD | NEW |
| 1 //===- subzero/src/IceCfg.cpp - Control flow graph implementation ---------===// | 1 //===- subzero/src/IceCfg.cpp - Control flow graph 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 Cfg class, including constant pool | 10 // This file implements the Cfg class, including constant pool |
| (...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 212 Node->livenessPostprocess(Mode, getLiveness()); | 212 Node->livenessPostprocess(Mode, getLiveness()); |
| 213 if (Mode == Liveness_Intervals) { | 213 if (Mode == Liveness_Intervals) { |
| 214 // Special treatment for live in-args. Their liveness needs to | 214 // Special treatment for live in-args. Their liveness needs to |
| 215 // extend beyond the beginning of the function, otherwise an arg | 215 // extend beyond the beginning of the function, otherwise an arg |
| 216 // whose only use is in the first instruction will end up having | 216 // whose only use is in the first instruction will end up having |
| 217 // the trivial live range [1,1) and will *not* interfere with | 217 // the trivial live range [1,1) and will *not* interfere with |
| 218 // other arguments. So if the first instruction of the method is | 218 // other arguments. So if the first instruction of the method is |
| 219 // "r=arg1+arg2", both args may be assigned the same register. | 219 // "r=arg1+arg2", both args may be assigned the same register. |
| 220 for (SizeT I = 0; I < Args.size(); ++I) { | 220 for (SizeT I = 0; I < Args.size(); ++I) { |
| 221 Variable *Arg = Args[I]; | 221 Variable *Arg = Args[I]; |
| 222 if (!Live->getLiveRange(Arg).isEmpty()) { | 222 if (!Arg->getLiveRange().isEmpty()) { |
| 223 // Add live range [-1,0) with weight 0. TODO: Here and below, | 223 // Add live range [-1,0) with weight 0. TODO: Here and below, |
| 224 // use better symbolic constants along the lines of | 224 // use better symbolic constants along the lines of |
| 225 // Inst::NumberDeleted and Inst::NumberSentinel instead of -1 | 225 // Inst::NumberDeleted and Inst::NumberSentinel instead of -1 |
| 226 // and 0. | 226 // and 0. |
| 227 Live->addLiveRange(Arg, -1, 0, 0); | 227 Arg->addLiveRange(-1, 0, 0); |
| 228 } | 228 } |
| 229 // Do the same for i64 args that may have been lowered into i32 | 229 // Do the same for i64 args that may have been lowered into i32 |
| 230 // Lo and Hi components. | 230 // Lo and Hi components. |
| 231 Variable *Lo = Arg->getLo(); | 231 Variable *Lo = Arg->getLo(); |
| 232 if (Lo && !Live->getLiveRange(Lo).isEmpty()) | 232 if (Lo && !Lo->getLiveRange().isEmpty()) |
| 233 Live->addLiveRange(Lo, -1, 0, 0); | 233 Lo->addLiveRange(-1, 0, 0); |
| 234 Variable *Hi = Arg->getHi(); | 234 Variable *Hi = Arg->getHi(); |
| 235 if (Hi && !Live->getLiveRange(Hi).isEmpty()) | 235 if (Hi && !Hi->getLiveRange().isEmpty()) |
| 236 Live->addLiveRange(Hi, -1, 0, 0); | 236 Hi->addLiveRange(-1, 0, 0); |
| 237 } | |
| 238 // Copy Liveness::LiveRanges into individual variables. TODO: | |
| 239 // Remove Variable::LiveRange and redirect to | |
| 240 // Liveness::LiveRanges. TODO: make sure Variable weights | |
| 241 // are applied properly. | |
| 242 SizeT NumVars = Variables.size(); | |
| 243 for (SizeT i = 0; i < NumVars; ++i) { | |
| 244 Variable *Var = Variables[i]; | |
| 245 Var->setLiveRange(Live->getLiveRange(Var)); | |
| 246 if (Var->getWeight().isInf()) | |
| 247 Var->setLiveRangeInfiniteWeight(); | |
| 248 } | 237 } |
| 249 } | 238 } |
| 250 } | 239 } |
| 251 | 240 |
| 252 // Traverse every Variable of every Inst and verify that it | 241 // Traverse every Variable of every Inst and verify that it |
| 253 // appears within the Variable's computed live range. | 242 // appears within the Variable's computed live range. |
| 254 bool Cfg::validateLiveness() const { | 243 bool Cfg::validateLiveness() const { |
| 255 TimerMarker T(TimerStack::TT_validateLiveness, this); | 244 TimerMarker T(TimerStack::TT_validateLiveness, this); |
| 256 bool Valid = true; | 245 bool Valid = true; |
| 257 Ostream &Str = Ctx->getStrDump(); | 246 Ostream &Str = Ctx->getStrDump(); |
| (...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 388 } | 377 } |
| 389 } | 378 } |
| 390 // Print each basic block | 379 // Print each basic block |
| 391 for (CfgNode *Node : Nodes) | 380 for (CfgNode *Node : Nodes) |
| 392 Node->dump(this); | 381 Node->dump(this); |
| 393 if (getContext()->isVerbose(IceV_Instructions)) | 382 if (getContext()->isVerbose(IceV_Instructions)) |
| 394 Str << "}\n"; | 383 Str << "}\n"; |
| 395 } | 384 } |
| 396 | 385 |
| 397 } // end of namespace Ice | 386 } // end of namespace Ice |
| OLD | NEW |