Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 //===- subzero/src/IceTargetLowering.cpp - Basic lowering implementation --===// | 1 //===- subzero/src/IceTargetLowering.cpp - Basic lowering 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 |
| 11 /// \brief Implements the skeleton of the TargetLowering class. | 11 /// \brief Implements the skeleton of the TargetLowering class. |
| 12 /// | 12 /// |
| 13 /// Specifically this invokes the appropriate lowering method for a given | 13 /// Specifically this invokes the appropriate lowering method for a given |
| 14 /// instruction kind and driving global register allocation. It also implements | 14 /// instruction kind and driving global register allocation. It also implements |
| 15 /// the non-deleted instruction iteration in LoweringContext. | 15 /// the non-deleted instruction iteration in LoweringContext. |
| 16 /// | 16 /// |
| 17 //===----------------------------------------------------------------------===// | 17 //===----------------------------------------------------------------------===// |
| 18 | 18 |
| 19 #include "IceTargetLowering.h" | 19 #include "IceTargetLowering.h" |
| 20 #include "IceTargetLowering.def" | |
| 20 | 21 |
| 21 #include "IceBitVector.h" | 22 #include "IceBitVector.h" |
| 22 #include "IceCfg.h" // setError() | 23 #include "IceCfg.h" // setError() |
| 23 #include "IceCfgNode.h" | 24 #include "IceCfgNode.h" |
| 24 #include "IceGlobalContext.h" | 25 #include "IceGlobalContext.h" |
| 25 #include "IceGlobalInits.h" | 26 #include "IceGlobalInits.h" |
| 26 #include "IceInstVarIter.h" | 27 #include "IceInstVarIter.h" |
| 27 #include "IceOperand.h" | 28 #include "IceOperand.h" |
| 28 #include "IceRegAlloc.h" | 29 #include "IceRegAlloc.h" |
| 29 | 30 |
| (...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 252 #define SUBZERO_TARGET(X) \ | 253 #define SUBZERO_TARGET(X) \ |
| 253 case Target_##X: \ | 254 case Target_##X: \ |
| 254 return ::X::createTargetLowering(Func); | 255 return ::X::createTargetLowering(Func); |
| 255 #include "llvm/Config/SZTargets.def" | 256 #include "llvm/Config/SZTargets.def" |
| 256 #undef SUBZERO_TARGET | 257 #undef SUBZERO_TARGET |
| 257 } | 258 } |
| 258 } | 259 } |
| 259 | 260 |
| 260 void TargetLowering::staticInit(GlobalContext *Ctx) { | 261 void TargetLowering::staticInit(GlobalContext *Ctx) { |
| 261 const TargetArch Target = Ctx->getFlags().getTargetArch(); | 262 const TargetArch Target = Ctx->getFlags().getTargetArch(); |
| 263 // Define zero constants used in translation. | |
| 264 { | |
| 265 #define X(Ty) \ | |
|
John
2016/03/09 23:26:56
This looks dangerous in the context of the browser
Karl
2016/03/16 22:50:52
Done.
| |
| 266 ConstZeroForType[IceType_##Ty] = Ctx->getConstantZero(IceType_##Ty); | |
|
John
2016/03/09 23:26:56
It would be better if this used ICETYPE_TABLE... Y
Karl
2016/03/16 22:50:52
Since I moved the caching within method getConstan
| |
| 267 CONSTANT_ZERO_BY_TYPE_TABLE | |
| 268 #undef X | |
| 269 } | |
| 270 // Define runtime helper functions. | |
|
Karl
2016/03/16 22:50:52
Moved initialization of helper function names to g
| |
| 271 { | |
| 272 #define X(Tag, Name) \ | |
| 273 RuntimeHelperFunc[H_##Tag] = Ctx->getConstantExternSym(Name); | |
| 274 RUNTIME_HELPER_FUNCTIONS_TABLE | |
| 275 #undef X | |
| 276 } | |
| 262 // Call the specified target's static initializer. | 277 // Call the specified target's static initializer. |
| 263 switch (Target) { | 278 switch (Target) { |
| 264 default: | 279 default: |
| 265 badTargetFatalError(Target); | 280 badTargetFatalError(Target); |
| 266 #define SUBZERO_TARGET(X) \ | 281 #define SUBZERO_TARGET(X) \ |
| 267 case Target_##X: { \ | 282 case Target_##X: { \ |
| 268 static bool InitGuard##X = false; \ | 283 static bool InitGuard##X = false; \ |
| 269 if (InitGuard##X) { \ | 284 if (InitGuard##X) { \ |
| 270 return; \ | 285 return; \ |
| 271 } \ | 286 } \ |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 282 assert(!Flags.getUseSandboxing() || !Flags.getUseNonsfi()); | 297 assert(!Flags.getUseSandboxing() || !Flags.getUseNonsfi()); |
| 283 if (Flags.getUseNonsfi()) { | 298 if (Flags.getUseNonsfi()) { |
| 284 return TargetLowering::ST_Nonsfi; | 299 return TargetLowering::ST_Nonsfi; |
| 285 } | 300 } |
| 286 if (Flags.getUseSandboxing()) { | 301 if (Flags.getUseSandboxing()) { |
| 287 return TargetLowering::ST_NaCl; | 302 return TargetLowering::ST_NaCl; |
| 288 } | 303 } |
| 289 return TargetLowering::ST_None; | 304 return TargetLowering::ST_None; |
| 290 } | 305 } |
| 291 | 306 |
| 307 Constant *TargetLowering::ConstZeroForType[IceType_NUM] = { | |
|
Karl
2016/03/16 22:50:52
Removed these initializations and moved to the con
| |
| 308 #define X(tag, sizeLog2, align, elts, elty, str, rcstr) nullptr, | |
| 309 ICETYPE_TABLE | |
| 310 #undef X | |
| 311 }; | |
| 312 | |
| 313 Constant *TargetLowering::RuntimeHelperFunc[H_Num] = { | |
| 314 #define X(Tag, Name) nullptr, | |
| 315 RUNTIME_HELPER_FUNCTIONS_TABLE | |
| 316 #undef X | |
| 317 }; | |
| 318 | |
| 292 TargetLowering::TargetLowering(Cfg *Func) | 319 TargetLowering::TargetLowering(Cfg *Func) |
| 293 : Func(Func), Ctx(Func->getContext()), | 320 : Func(Func), Ctx(Func->getContext()), |
| 294 SandboxingType(determineSandboxTypeFromFlags(Ctx->getFlags())) {} | 321 SandboxingType(determineSandboxTypeFromFlags(Ctx->getFlags())) {} |
| 295 | 322 |
| 296 TargetLowering::AutoBundle::AutoBundle(TargetLowering *Target, | 323 TargetLowering::AutoBundle::AutoBundle(TargetLowering *Target, |
| 297 InstBundleLock::Option Option) | 324 InstBundleLock::Option Option) |
| 298 : Target(Target), | 325 : Target(Target), |
| 299 NeedSandboxing(Target->Ctx->getFlags().getUseSandboxing()) { | 326 NeedSandboxing(Target->Ctx->getFlags().getUseSandboxing()) { |
| 300 assert(!Target->AutoBundling); | 327 assert(!Target->AutoBundling); |
| 301 Target->AutoBundling = true; | 328 Target->AutoBundling = true; |
| (...skipping 385 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 687 } else { | 714 } else { |
| 688 NextStackOffset += Increment; | 715 NextStackOffset += Increment; |
| 689 } | 716 } |
| 690 if (UsesFramePointer) | 717 if (UsesFramePointer) |
| 691 Var->setStackOffset(-NextStackOffset); | 718 Var->setStackOffset(-NextStackOffset); |
| 692 else | 719 else |
| 693 Var->setStackOffset(SpillAreaSizeBytes - NextStackOffset); | 720 Var->setStackOffset(SpillAreaSizeBytes - NextStackOffset); |
| 694 } | 721 } |
| 695 } | 722 } |
| 696 | 723 |
| 697 InstCall *TargetLowering::makeHelperCall(const IceString &Name, Variable *Dest, | 724 InstCall *TargetLowering::makeHelperCall(RuntimeHelperFuncKind Target, |
| 698 SizeT MaxSrcs) { | 725 Variable *Dest, SizeT MaxSrcs) { |
| 699 constexpr bool HasTailCall = false; | 726 constexpr bool HasTailCall = false; |
| 700 Constant *CallTarget = Ctx->getConstantExternSym(Name); | 727 Operand *CallTarget = getRuntimeHelperFunc(Target); |
| 701 InstCall *Call = | 728 InstCall *Call = |
| 702 InstCall::create(Func, MaxSrcs, Dest, CallTarget, HasTailCall); | 729 InstCall::create(Func, MaxSrcs, Dest, CallTarget, HasTailCall); |
| 703 return Call; | 730 return Call; |
| 704 } | 731 } |
| 705 | 732 |
| 706 bool TargetLowering::shouldOptimizeMemIntrins() { | 733 bool TargetLowering::shouldOptimizeMemIntrins() { |
| 707 return Ctx->getFlags().getOptLevel() >= Opt_1 || | 734 return Ctx->getFlags().getOptLevel() >= Opt_1 || |
| 708 Ctx->getFlags().getForceMemIntrinOpt(); | 735 Ctx->getFlags().getForceMemIntrinOpt(); |
| 709 } | 736 } |
| 710 | 737 |
| (...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 879 case Target_##X: \ | 906 case Target_##X: \ |
| 880 return ::X::createTargetHeaderLowering(Ctx); | 907 return ::X::createTargetHeaderLowering(Ctx); |
| 881 #include "llvm/Config/SZTargets.def" | 908 #include "llvm/Config/SZTargets.def" |
| 882 #undef SUBZERO_TARGET | 909 #undef SUBZERO_TARGET |
| 883 } | 910 } |
| 884 } | 911 } |
| 885 | 912 |
| 886 TargetHeaderLowering::~TargetHeaderLowering() = default; | 913 TargetHeaderLowering::~TargetHeaderLowering() = default; |
| 887 | 914 |
| 888 } // end of namespace Ice | 915 } // end of namespace Ice |
| OLD | NEW |