| Index: src/IceInstX86BaseImpl.h
|
| diff --git a/src/IceInstX86BaseImpl.h b/src/IceInstX86BaseImpl.h
|
| index a6ce132fc8f2e9ce056e4d621088ee52b4df1551..3de3296038adeea34be2247e7ef90ef3623fd6fc 100644
|
| --- a/src/IceInstX86BaseImpl.h
|
| +++ b/src/IceInstX86BaseImpl.h
|
| @@ -94,16 +94,14 @@ template <typename TraitsType>
|
| InstImpl<TraitsType>::InstX86Label::InstX86Label(Cfg *Func,
|
| TargetLowering *Target)
|
| : InstX86Base(Func, InstX86Base::Label, 0, nullptr),
|
| - Number(Target->makeNextLabelNumber()) {}
|
| -
|
| -template <typename TraitsType>
|
| -IceString InstImpl<TraitsType>::InstX86Label::getName(const Cfg *Func) const {
|
| - // TODO(stichnot): Returning an empty string in a non-DUMP build can cause a
|
| - // huge degradation in ConstantRelocatable hashing. Investigate and fix, but
|
| - // for now return something reasonably unique.
|
| - if (!BuildDefs::dump())
|
| - return Func->getFunctionName() + std::to_string(Number);
|
| - return ".L" + Func->getFunctionName() + "$local$__" + std::to_string(Number);
|
| + LabelNumber(Target->makeNextLabelNumber()) {
|
| + if (BuildDefs::dump()) {
|
| + Name = GlobalString::createWithString(
|
| + Func->getContext(), ".L" + Func->getFunctionName() + "$local$__" +
|
| + std::to_string(LabelNumber));
|
| + } else {
|
| + Name = GlobalString::createWithoutString(Func->getContext());
|
| + }
|
| }
|
|
|
| template <typename TraitsType>
|
| @@ -441,13 +439,13 @@ void InstImpl<TraitsType>::InstX86Label::emit(const Cfg *Func) const {
|
| if (!BuildDefs::dump())
|
| return;
|
| Ostream &Str = Func->getContext()->getStrEmit();
|
| - Str << getName(Func) << ":";
|
| + Str << getLabelName() << ":";
|
| }
|
|
|
| template <typename TraitsType>
|
| void InstImpl<TraitsType>::InstX86Label::emitIAS(const Cfg *Func) const {
|
| Assembler *Asm = Func->getAssembler<Assembler>();
|
| - Asm->bindLocalLabel(Number);
|
| + Asm->bindLocalLabel(LabelNumber);
|
| if (OffsetReloc != nullptr) {
|
| Asm->bindRelocOffset(OffsetReloc);
|
| }
|
| @@ -458,7 +456,7 @@ void InstImpl<TraitsType>::InstX86Label::dump(const Cfg *Func) const {
|
| if (!BuildDefs::dump())
|
| return;
|
| Ostream &Str = Func->getContext()->getStrDump();
|
| - Str << getName(Func) << ":";
|
| + Str << getLabelName() << ":";
|
| }
|
|
|
| template <typename TraitsType>
|
| @@ -475,7 +473,7 @@ void InstImpl<TraitsType>::InstX86Br::emit(const Cfg *Func) const {
|
| }
|
|
|
| if (Label) {
|
| - Str << "\t" << Label->getName(Func);
|
| + Str << "\t" << Label->getLabelName();
|
| } else {
|
| if (Condition == Cond::Br_None) {
|
| Str << "\t" << getTargetFalse()->getAsmName();
|
| @@ -493,7 +491,7 @@ template <typename TraitsType>
|
| void InstImpl<TraitsType>::InstX86Br::emitIAS(const Cfg *Func) const {
|
| Assembler *Asm = Func->getAssembler<Assembler>();
|
| if (Label) {
|
| - auto *L = Asm->getOrCreateLocalLabel(Label->getNumber());
|
| + auto *L = Asm->getOrCreateLocalLabel(Label->getLabelNumber());
|
| if (Condition == Cond::Br_None) {
|
| Asm->jmp(L, isNear());
|
| } else {
|
| @@ -523,14 +521,17 @@ void InstImpl<TraitsType>::InstX86Br::dump(const Cfg *Func) const {
|
| Str << "br ";
|
|
|
| if (Condition == Cond::Br_None) {
|
| - Str << "label %"
|
| - << (Label ? Label->getName(Func) : getTargetFalse()->getName());
|
| + if (Label) {
|
| + Str << "label %" << Label->getLabelName();
|
| + } else {
|
| + Str << "label %" << getTargetFalse()->getName();
|
| + }
|
| return;
|
| }
|
|
|
| Str << Traits::InstBrAttributes[Condition].DisplayString;
|
| if (Label) {
|
| - Str << ", label %" << Label->getName(Func);
|
| + Str << ", label %" << Label->getLabelName();
|
| } else {
|
| Str << ", label %" << getTargetTrue()->getName();
|
| if (getTargetFalse()) {
|
| @@ -661,7 +662,7 @@ void InstImpl<TraitsType>::InstX86Call::dump(const Cfg *Func) const {
|
| getCallTarget()->dump(Func);
|
| }
|
|
|
| -// The this->Opcode parameter needs to be char* and not IceString because of
|
| +// The this->Opcode parameter needs to be char* and not std::string because of
|
| // template issues.
|
| template <typename TraitsType>
|
| void InstImpl<TraitsType>::InstX86Base::emitTwoAddress(
|
| @@ -734,7 +735,8 @@ void InstImpl<TraitsType>::emitIASRegOpTyGPR(const Cfg *Func, bool IsLea,
|
| } else if (const auto *Imm = llvm::dyn_cast<ConstantInteger32>(Src)) {
|
| (Asm->*(Emitter.GPRImm))(Ty, VarReg, AssemblerImmediate(Imm->getValue()));
|
| } else if (const auto *Reloc = llvm::dyn_cast<ConstantRelocatable>(Src)) {
|
| - const auto FixupKind = Reloc->getName() == GlobalOffsetTable
|
| + const auto FixupKind = (Reloc->getName().hasStdString() &&
|
| + Reloc->getName().toString() == GlobalOffsetTable)
|
| ? Traits::FK_GotPC
|
| : Traits::TargetLowering::getAbsFixup();
|
| AssemblerFixup *Fixup = Asm->createFixup(FixupKind, Reloc);
|
| @@ -760,7 +762,8 @@ void InstImpl<TraitsType>::emitIASAddrOpTyGPR(const Cfg *Func, Type Ty,
|
| } else if (const auto *Imm = llvm::dyn_cast<ConstantInteger32>(Src)) {
|
| (Asm->*(Emitter.AddrImm))(Ty, Addr, AssemblerImmediate(Imm->getValue()));
|
| } else if (const auto *Reloc = llvm::dyn_cast<ConstantRelocatable>(Src)) {
|
| - const auto FixupKind = Reloc->getName() == GlobalOffsetTable
|
| + const auto FixupKind = (Reloc->getName().hasStdString() &&
|
| + Reloc->getName().toString() == GlobalOffsetTable)
|
| ? Traits::FK_GotPC
|
| : Traits::TargetLowering::getAbsFixup();
|
| AssemblerFixup *Fixup = Asm->createFixup(FixupKind, Reloc);
|
| @@ -1992,7 +1995,8 @@ void InstImpl<TraitsType>::InstX86Lea::emit(const Cfg *Func) const {
|
| Type Ty = Src0Var->getType();
|
| // lea on x86-32 doesn't accept mem128 operands, so cast VSrc0 to an
|
| // acceptable type.
|
| - Src0Var->asType(isVectorType(Ty) ? IceType_i32 : Ty, RegNumT())->emit(Func);
|
| + Src0Var->asType(Func, isVectorType(Ty) ? IceType_i32 : Ty, RegNumT())
|
| + ->emit(Func);
|
| } else {
|
| Src0->emit(Func);
|
| }
|
| @@ -2033,7 +2037,7 @@ void InstImpl<TraitsType>::InstX86Mov::emit(const Cfg *Func) const {
|
| if (SrcVar->hasReg())
|
| NewRegNum = Traits::getGprForType(DestTy, SrcVar->getRegNum());
|
| if (SrcTy != DestTy)
|
| - NewSrc = SrcVar->asType(DestTy, NewRegNum);
|
| + NewSrc = SrcVar->asType(Func, DestTy, NewRegNum);
|
| }
|
| NewSrc->emit(Func);
|
| Str << ", ";
|
| @@ -2311,7 +2315,7 @@ void InstImpl<TraitsType>::InstX86Movzx::emit(const Cfg *Func) const {
|
| "\t";
|
| Src->emit(Func);
|
| Str << ", ";
|
| - Dest->asType(IceType_i32,
|
| + Dest->asType(Func, IceType_i32,
|
| Traits::getGprForType(IceType_i32, Dest->getRegNum()))
|
| ->emit(Func);
|
| Str << " /* movzx */";
|
| @@ -2519,7 +2523,7 @@ void InstImpl<TraitsType>::InstX86Pextr::emit(const Cfg *Func) const {
|
| // memory dest, but we aren't using it. For uniformity, just restrict them
|
| // all to have a register dest for now.
|
| assert(Dest->hasReg());
|
| - Dest->asType(IceType_i32, Dest->getRegNum())->emit(Func);
|
| + Dest->asType(Func, IceType_i32, Dest->getRegNum())->emit(Func);
|
| }
|
|
|
| template <typename TraitsType>
|
| @@ -2556,7 +2560,7 @@ void InstImpl<TraitsType>::InstX86Pinsr::emit(const Cfg *Func) const {
|
| // If src1 is a register, it should always be r32.
|
| if (Src1Var->hasReg()) {
|
| const auto NewRegNum = Traits::getBaseReg(Src1Var->getRegNum());
|
| - const Variable *NewSrc = Src1Var->asType(IceType_i32, NewRegNum);
|
| + const Variable *NewSrc = Src1Var->asType(Func, IceType_i32, NewRegNum);
|
| NewSrc->emit(Func);
|
| } else {
|
| Src1Var->emit(Func);
|
|
|