| OLD | NEW |
| 1 //===- subzero/src/IceTargetLoweringX86BaseImpl.h - x86 lowering -*- C++ -*-==// | 1 //===- subzero/src/IceTargetLoweringX86BaseImpl.h - x86 lowering -*- C++ -*-==// |
| 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 /// This file implements the TargetLoweringX86Base class, which | 11 /// This file implements the TargetLoweringX86Base class, which |
| 12 /// consists almost entirely of the lowering sequence for each | 12 /// consists almost entirely of the lowering sequence for each |
| 13 /// high-level instruction. | 13 /// high-level instruction. |
| 14 /// | 14 /// |
| 15 //===----------------------------------------------------------------------===// | 15 //===----------------------------------------------------------------------===// |
| 16 | 16 |
| 17 #ifndef SUBZERO_SRC_ICETARGETLOWERINGX86BASEIMPL_H | 17 #ifndef SUBZERO_SRC_ICETARGETLOWERINGX86BASEIMPL_H |
| 18 #define SUBZERO_SRC_ICETARGETLOWERINGX86BASEIMPL_H | 18 #define SUBZERO_SRC_ICETARGETLOWERINGX86BASEIMPL_H |
| 19 | 19 |
| 20 #include "IceCfg.h" | 20 #include "IceCfg.h" |
| 21 #include "IceCfgNode.h" | 21 #include "IceCfgNode.h" |
| 22 #include "IceClFlags.h" | 22 #include "IceClFlags.h" |
| 23 #include "IceDefs.h" | 23 #include "IceDefs.h" |
| 24 #include "IceELFObjectWriter.h" | 24 #include "IceELFObjectWriter.h" |
| 25 #include "IceGlobalInits.h" | 25 #include "IceGlobalInits.h" |
| 26 #include "IceLiveness.h" | 26 #include "IceLiveness.h" |
| 27 #include "IceOperand.h" | 27 #include "IceOperand.h" |
| 28 #include "IcePhiLoweringImpl.h" |
| 28 #include "IceUtils.h" | 29 #include "IceUtils.h" |
| 29 #include "llvm/Support/MathExtras.h" | 30 #include "llvm/Support/MathExtras.h" |
| 30 | 31 |
| 31 namespace Ice { | 32 namespace Ice { |
| 32 namespace X86Internal { | 33 namespace X86Internal { |
| 33 | 34 |
| 34 /// A helper class to ease the settings of RandomizationPoolingPause to disable | 35 /// A helper class to ease the settings of RandomizationPoolingPause to disable |
| 35 /// constant blinding or pooling for some translation phases. | 36 /// constant blinding or pooling for some translation phases. |
| 36 class BoolFlagSaver { | 37 class BoolFlagSaver { |
| 37 BoolFlagSaver() = delete; | 38 BoolFlagSaver() = delete; |
| (...skipping 4651 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4689 } | 4690 } |
| 4690 | 4691 |
| 4691 /// Turn an i64 Phi instruction into a pair of i32 Phi instructions, to | 4692 /// Turn an i64 Phi instruction into a pair of i32 Phi instructions, to |
| 4692 /// preserve integrity of liveness analysis. Undef values are also | 4693 /// preserve integrity of liveness analysis. Undef values are also |
| 4693 /// turned into zeroes, since loOperand() and hiOperand() don't expect | 4694 /// turned into zeroes, since loOperand() and hiOperand() don't expect |
| 4694 /// Undef input. | 4695 /// Undef input. |
| 4695 template <class Machine> void TargetX86Base<Machine>::prelowerPhis() { | 4696 template <class Machine> void TargetX86Base<Machine>::prelowerPhis() { |
| 4696 // Pause constant blinding or pooling, blinding or pooling will be done later | 4697 // Pause constant blinding or pooling, blinding or pooling will be done later |
| 4697 // during phi lowering assignments | 4698 // during phi lowering assignments |
| 4698 BoolFlagSaver B(RandomizationPoolingPaused, true); | 4699 BoolFlagSaver B(RandomizationPoolingPaused, true); |
| 4699 | 4700 PhiLowering::prelowerPhis32Bit<TargetX86Base<Machine>>( |
| 4700 CfgNode *Node = Context.getNode(); | 4701 this, Context.getNode(), Func); |
| 4701 for (Inst &I : Node->getPhis()) { | |
| 4702 auto Phi = llvm::dyn_cast<InstPhi>(&I); | |
| 4703 if (Phi->isDeleted()) | |
| 4704 continue; | |
| 4705 Variable *Dest = Phi->getDest(); | |
| 4706 if (Dest->getType() == IceType_i64) { | |
| 4707 Variable *DestLo = llvm::cast<Variable>(loOperand(Dest)); | |
| 4708 Variable *DestHi = llvm::cast<Variable>(hiOperand(Dest)); | |
| 4709 InstPhi *PhiLo = InstPhi::create(Func, Phi->getSrcSize(), DestLo); | |
| 4710 InstPhi *PhiHi = InstPhi::create(Func, Phi->getSrcSize(), DestHi); | |
| 4711 for (SizeT I = 0; I < Phi->getSrcSize(); ++I) { | |
| 4712 Operand *Src = Phi->getSrc(I); | |
| 4713 CfgNode *Label = Phi->getLabel(I); | |
| 4714 Src = legalizeUndef(Src); | |
| 4715 PhiLo->addArgument(loOperand(Src), Label); | |
| 4716 PhiHi->addArgument(hiOperand(Src), Label); | |
| 4717 } | |
| 4718 Node->getPhis().push_back(PhiLo); | |
| 4719 Node->getPhis().push_back(PhiHi); | |
| 4720 Phi->setDeleted(); | |
| 4721 } | |
| 4722 } | |
| 4723 } | 4702 } |
| 4724 | 4703 |
| 4725 bool isMemoryOperand(const Operand *Opnd) { | 4704 bool isMemoryOperand(const Operand *Opnd) { |
| 4726 if (const auto Var = llvm::dyn_cast<Variable>(Opnd)) | 4705 if (const auto Var = llvm::dyn_cast<Variable>(Opnd)) |
| 4727 return !Var->hasReg(); | 4706 return !Var->hasReg(); |
| 4728 // We treat vector undef values the same as a memory operand, | 4707 // We treat vector undef values the same as a memory operand, |
| 4729 // because they do in fact need a register to materialize the vector | 4708 // because they do in fact need a register to materialize the vector |
| 4730 // of zeroes into. | 4709 // of zeroes into. |
| 4731 if (llvm::isa<ConstantUndef>(Opnd)) | 4710 if (llvm::isa<ConstantUndef>(Opnd)) |
| 4732 return isScalarFloatingType(Opnd->getType()) || | 4711 return isScalarFloatingType(Opnd->getType()) || |
| (...skipping 694 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5427 } | 5406 } |
| 5428 // the offset is not eligible for blinding or pooling, return the original | 5407 // the offset is not eligible for blinding or pooling, return the original |
| 5429 // mem operand | 5408 // mem operand |
| 5430 return MemOperand; | 5409 return MemOperand; |
| 5431 } | 5410 } |
| 5432 | 5411 |
| 5433 } // end of namespace X86Internal | 5412 } // end of namespace X86Internal |
| 5434 } // end of namespace Ice | 5413 } // end of namespace Ice |
| 5435 | 5414 |
| 5436 #endif // SUBZERO_SRC_ICETARGETLOWERINGX86BASEIMPL_H | 5415 #endif // SUBZERO_SRC_ICETARGETLOWERINGX86BASEIMPL_H |
| OLD | NEW |