[llvm] r240300 - Avoid a Symbol -> Name -> Symbol conversion.
Reid Kleckner
rnk at google.com
Tue Jun 30 14:53:37 PDT 2015
Thanks for doing this! I had a patch in tree for getting rid of this hack,
but I didn't like it and wasn't confident that it was the right way to go.
On Mon, Jun 22, 2015 at 10:46 AM, Rafael Espindola <
rafael.espindola at gmail.com> wrote:
> Author: rafael
> Date: Mon Jun 22 12:46:53 2015
> New Revision: 240300
>
> URL: http://llvm.org/viewvc/llvm-project?rev=240300&view=rev
> Log:
> Avoid a Symbol -> Name -> Symbol conversion.
>
> Before this we were producing a TargetExternalSymbol from a MCSymbol.
> That meant extracting the symbol name and fetching the symbol again
> down the pipeline.
>
> This patch adds a DAG.getMCSymbol that lets the MCSymbol pass unchanged on
> the
> DAG.
>
> Doing so removes the need for MO_NOPREFIX and fixes the root cause of
> pr23900,
> allowing r240130 to be committed again.
>
> Modified:
> llvm/trunk/include/llvm/CodeGen/ISDOpcodes.h
> llvm/trunk/include/llvm/CodeGen/MachineOperand.h
> llvm/trunk/include/llvm/CodeGen/SelectionDAG.h
> llvm/trunk/include/llvm/CodeGen/SelectionDAGNodes.h
> llvm/trunk/include/llvm/Target/TargetSelectionDAG.td
> llvm/trunk/lib/CodeGen/SelectionDAG/InstrEmitter.cpp
> llvm/trunk/lib/CodeGen/SelectionDAG/ScheduleDAGSDNodes.h
> llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
> llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
> llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGDumper.cpp
> llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
> llvm/trunk/lib/Target/X86/MCTargetDesc/X86BaseInfo.h
> llvm/trunk/lib/Target/X86/X86ISelDAGToDAG.cpp
> llvm/trunk/lib/Target/X86/X86ISelLowering.cpp
> llvm/trunk/lib/Target/X86/X86InstrCompiler.td
> llvm/trunk/lib/Target/X86/X86MCInstLower.cpp
> llvm/trunk/utils/TableGen/CodeGenDAGPatterns.cpp
>
> Modified: llvm/trunk/include/llvm/CodeGen/ISDOpcodes.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/ISDOpcodes.h?rev=240300&r1=240299&r2=240300&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/CodeGen/ISDOpcodes.h (original)
> +++ llvm/trunk/include/llvm/CodeGen/ISDOpcodes.h Mon Jun 22 12:46:53 2015
> @@ -124,6 +124,8 @@ namespace ISD {
> TargetExternalSymbol,
> TargetBlockAddress,
>
> + MCSymbol,
> +
> /// TargetIndex - Like a constant pool entry, but with completely
> /// target-dependent semantics. Holds target flags, a 32-bit index,
> and a
> /// 64-bit index. Targets can use this however they like.
>
> Modified: llvm/trunk/include/llvm/CodeGen/MachineOperand.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/MachineOperand.h?rev=240300&r1=240299&r2=240300&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/CodeGen/MachineOperand.h (original)
> +++ llvm/trunk/include/llvm/CodeGen/MachineOperand.h Mon Jun 22 12:46:53
> 2015
> @@ -450,11 +450,12 @@ public:
> return Contents.CFIIndex;
> }
>
> - /// getOffset - Return the offset from the symbol in this operand. This
> always
> - /// returns 0 for ExternalSymbol operands.
> + /// Return the offset from the symbol in this operand. This always
> returns 0
> + /// for ExternalSymbol operands.
> int64_t getOffset() const {
> - assert((isGlobal() || isSymbol() || isCPI() || isTargetIndex() ||
> - isBlockAddress()) && "Wrong MachineOperand accessor");
> + assert((isGlobal() || isSymbol() || isMCSymbol() || isCPI() ||
> + isTargetIndex() || isBlockAddress()) &&
> + "Wrong MachineOperand accessor");
> return int64_t(uint64_t(Contents.OffsetedInfo.OffsetHi) << 32) |
> SmallContents.OffsetLo;
> }
> @@ -512,8 +513,9 @@ public:
> }
>
> void setOffset(int64_t Offset) {
> - assert((isGlobal() || isSymbol() || isCPI() || isTargetIndex() ||
> - isBlockAddress()) && "Wrong MachineOperand accessor");
> + assert((isGlobal() || isSymbol() || isMCSymbol() || isCPI() ||
> + isTargetIndex() || isBlockAddress()) &&
> + "Wrong MachineOperand accessor");
> SmallContents.OffsetLo = unsigned(Offset);
> Contents.OffsetedInfo.OffsetHi = int(Offset >> 32);
> }
> @@ -706,6 +708,7 @@ public:
> static MachineOperand CreateMCSymbol(MCSymbol *Sym) {
> MachineOperand Op(MachineOperand::MO_MCSymbol);
> Op.Contents.Sym = Sym;
> + Op.setOffset(0);
> return Op;
> }
>
>
> Modified: llvm/trunk/include/llvm/CodeGen/SelectionDAG.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/SelectionDAG.h?rev=240300&r1=240299&r2=240300&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/CodeGen/SelectionDAG.h (original)
> +++ llvm/trunk/include/llvm/CodeGen/SelectionDAG.h Mon Jun 22 12:46:53 2015
> @@ -495,6 +495,8 @@ public:
> SDValue getExternalSymbol(const char *Sym, SDLoc dl, EVT VT);
> SDValue getTargetExternalSymbol(const char *Sym, EVT VT,
> unsigned char TargetFlags = 0);
> + SDValue getMCSymbol(MCSymbol *Sym, EVT VT);
> +
> SDValue getValueType(EVT);
> SDValue getRegister(unsigned Reg, EVT VT);
> SDValue getRegisterMask(const uint32_t *RegMask);
> @@ -1278,6 +1280,7 @@ private:
> StringMap<SDNode*> ExternalSymbols;
>
> std::map<std::pair<std::string, unsigned char>,SDNode*>
> TargetExternalSymbols;
> + DenseMap<MCSymbol *, SDNode *> MCSymbols;
> };
>
> template <> struct GraphTraits<SelectionDAG*> : public
> GraphTraits<SDNode*> {
>
> Modified: llvm/trunk/include/llvm/CodeGen/SelectionDAGNodes.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/SelectionDAGNodes.h?rev=240300&r1=240299&r2=240300&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/CodeGen/SelectionDAGNodes.h (original)
> +++ llvm/trunk/include/llvm/CodeGen/SelectionDAGNodes.h Mon Jun 22
> 12:46:53 2015
> @@ -1810,6 +1810,21 @@ public:
> }
> };
>
> +class MCSymbolSDNode : public SDNode {
> + MCSymbol *Symbol;
> +
> + friend class SelectionDAG;
> + MCSymbolSDNode(MCSymbol *Symbol, EVT VT)
> + : SDNode(ISD::MCSymbol, 0, DebugLoc(), getSDVTList(VT)),
> Symbol(Symbol) {}
> +
> +public:
> + MCSymbol *getMCSymbol() const { return Symbol; }
> +
> + static bool classof(const SDNode *N) {
> + return N->getOpcode() == ISD::MCSymbol;
> + }
> +};
> +
> class CondCodeSDNode : public SDNode {
> ISD::CondCode Condition;
> friend class SelectionDAG;
>
> Modified: llvm/trunk/include/llvm/Target/TargetSelectionDAG.td
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Target/TargetSelectionDAG.td?rev=240300&r1=240299&r2=240300&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/Target/TargetSelectionDAG.td (original)
> +++ llvm/trunk/include/llvm/Target/TargetSelectionDAG.td Mon Jun 22
> 12:46:53 2015
> @@ -341,6 +341,7 @@ def externalsym : SDNode<"ISD::ExternalS
> "ExternalSymbolSDNode">;
> def texternalsym: SDNode<"ISD::TargetExternalSymbol", SDTPtrLeaf, [],
> "ExternalSymbolSDNode">;
> +def mcsym: SDNode<"ISD::MCSymbol", SDTPtrLeaf, [], "MCSymbolSDNode">;
> def blockaddress : SDNode<"ISD::BlockAddress", SDTPtrLeaf, [],
> "BlockAddressSDNode">;
> def tblockaddress: SDNode<"ISD::TargetBlockAddress", SDTPtrLeaf, [],
>
> Modified: llvm/trunk/lib/CodeGen/SelectionDAG/InstrEmitter.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/InstrEmitter.cpp?rev=240300&r1=240299&r2=240300&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/SelectionDAG/InstrEmitter.cpp (original)
> +++ llvm/trunk/lib/CodeGen/SelectionDAG/InstrEmitter.cpp Mon Jun 22
> 12:46:53 2015
> @@ -422,6 +422,8 @@ void InstrEmitter::AddOperand(MachineIns
> MIB.addConstantPoolIndex(Idx, Offset, CP->getTargetFlags());
> } else if (ExternalSymbolSDNode *ES =
> dyn_cast<ExternalSymbolSDNode>(Op)) {
> MIB.addExternalSymbol(ES->getSymbol(), ES->getTargetFlags());
> + } else if (auto *SymNode = dyn_cast<MCSymbolSDNode>(Op)) {
> + MIB.addSym(SymNode->getMCSymbol());
> } else if (BlockAddressSDNode *BA = dyn_cast<BlockAddressSDNode>(Op)) {
> MIB.addBlockAddress(BA->getBlockAddress(),
> BA->getOffset(),
>
> Modified: llvm/trunk/lib/CodeGen/SelectionDAG/ScheduleDAGSDNodes.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/ScheduleDAGSDNodes.h?rev=240300&r1=240299&r2=240300&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/SelectionDAG/ScheduleDAGSDNodes.h (original)
> +++ llvm/trunk/lib/CodeGen/SelectionDAG/ScheduleDAGSDNodes.h Mon Jun 22
> 12:46:53 2015
> @@ -64,6 +64,7 @@ namespace llvm {
> if (isa<TargetIndexSDNode>(Node)) return true;
> if (isa<JumpTableSDNode>(Node)) return true;
> if (isa<ExternalSymbolSDNode>(Node)) return true;
> + if (isa<MCSymbolSDNode>(Node)) return true;
> if (isa<BlockAddressSDNode>(Node)) return true;
> if (Node->getOpcode() == ISD::EntryToken ||
> isa<MDNodeSDNode>(Node)) return true;
>
> Modified: llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp?rev=240300&r1=240299&r2=240300&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp (original)
> +++ llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp Mon Jun 22
> 12:46:53 2015
> @@ -427,12 +427,12 @@ static void AddNodeIDNode(FoldingSetNode
> AddNodeIDOperands(ID, OpList);
> }
>
> -/// AddNodeIDCustom - If this is an SDNode with special info, add this
> info to
> -/// the NodeID data.
> +/// If this is an SDNode with special info, add this info to the NodeID
> data.
> static void AddNodeIDCustom(FoldingSetNodeID &ID, const SDNode *N) {
> switch (N->getOpcode()) {
> case ISD::TargetExternalSymbol:
> case ISD::ExternalSymbol:
> + case ISD::MCSymbol:
> llvm_unreachable("Should only be used on nodes with operands");
> default: break; // Normal nodes don't need extra info.
> case ISD::TargetConstant:
> @@ -797,6 +797,11 @@ bool SelectionDAG::RemoveNodeFromCSEMaps
>
> ESN->getTargetFlags()));
> break;
> }
> + case ISD::MCSymbol: {
> + auto *MCSN = cast<MCSymbolSDNode>(N);
> + Erased = MCSymbols.erase(MCSN->getMCSymbol());
> + break;
> + }
> case ISD::VALUETYPE: {
> EVT VT = cast<VTSDNode>(N)->getVT();
> if (VT.isExtended()) {
> @@ -1014,6 +1019,7 @@ void SelectionDAG::clear() {
> ExtendedValueTypeNodes.clear();
> ExternalSymbols.clear();
> TargetExternalSymbols.clear();
> + MCSymbols.clear();
> std::fill(CondCodeNodes.begin(), CondCodeNodes.end(),
> static_cast<CondCodeSDNode*>(nullptr));
> std::fill(ValueTypeNodes.begin(), ValueTypeNodes.end(),
> @@ -1468,6 +1474,15 @@ SDValue SelectionDAG::getExternalSymbol(
> InsertNode(N);
> return SDValue(N, 0);
> }
> +
> +SDValue SelectionDAG::getMCSymbol(MCSymbol *Sym, EVT VT) {
> + SDNode *&N = MCSymbols[Sym];
> + if (N)
> + return SDValue(N, 0);
> + N = new (NodeAllocator) MCSymbolSDNode(Sym, VT);
> + InsertNode(N);
> + return SDValue(N, 0);
> +}
>
> SDValue SelectionDAG::getTargetExternalSymbol(const char *Sym, EVT VT,
> unsigned char TargetFlags) {
>
> Modified: llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp?rev=240300&r1=240299&r2=240300&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp (original)
> +++ llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp Mon Jun 22
> 12:46:53 2015
> @@ -4976,11 +4976,9 @@ SelectionDAGBuilder::visitIntrinsicCall(
> MF.getMMI().getContext().getOrCreateFrameAllocSymbol(
> GlobalValue::getRealLinkageName(Fn->getName()), IdxVal);
>
> - // Create a TargetExternalSymbol for the label to avoid any target
> lowering
> + // Create a MCSymbol for the label to avoid any target lowering
> // that would make this PC relative.
> - StringRef Name = FrameAllocSym->getName();
> - assert(Name.data()[Name.size()] == '\0' && "not null terminated");
> - SDValue OffsetSym = DAG.getTargetExternalSymbol(Name.data(), PtrVT);
> + SDValue OffsetSym = DAG.getMCSymbol(FrameAllocSym, PtrVT);
> SDValue OffsetVal =
> DAG.getNode(ISD::FRAME_ALLOC_RECOVER, sdl, PtrVT, OffsetSym);
>
>
> Modified: llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGDumper.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGDumper.cpp?rev=240300&r1=240299&r2=240300&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGDumper.cpp (original)
> +++ llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGDumper.cpp Mon Jun 22
> 12:46:53 2015
> @@ -130,6 +130,7 @@ std::string SDNode::getOperationName(con
> case ISD::TargetJumpTable: return "TargetJumpTable";
> case ISD::TargetConstantPool: return "TargetConstantPool";
> case ISD::TargetExternalSymbol: return "TargetExternalSymbol";
> + case ISD::MCSymbol: return "MCSymbol";
> case ISD::TargetBlockAddress: return "TargetBlockAddress";
>
> case ISD::CopyToReg: return "CopyToReg";
>
> Modified: llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp?rev=240300&r1=240299&r2=240300&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp (original)
> +++ llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Mon Jun 22
> 12:46:53 2015
> @@ -2562,6 +2562,7 @@ SelectCodeCommon(SDNode *NodeToMatch, co
> case ISD::TargetConstantPool:
> case ISD::TargetFrameIndex:
> case ISD::TargetExternalSymbol:
> + case ISD::MCSymbol:
> case ISD::TargetBlockAddress:
> case ISD::TargetJumpTable:
> case ISD::TargetGlobalTLSAddress:
>
> Modified: llvm/trunk/lib/Target/X86/MCTargetDesc/X86BaseInfo.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/MCTargetDesc/X86BaseInfo.h?rev=240300&r1=240299&r2=240300&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/X86/MCTargetDesc/X86BaseInfo.h (original)
> +++ llvm/trunk/lib/Target/X86/MCTargetDesc/X86BaseInfo.h Mon Jun 22
> 12:46:53 2015
> @@ -213,11 +213,7 @@ namespace X86II {
> /// the offset from beginning of section.
> ///
> /// This is the TLS offset for the COFF/Windows TLS mechanism.
> - MO_SECREL,
> -
> - /// MO_NOPREFIX - On a symbol operand this indicates that the symbol
> should
> - /// not be mangled with a prefix.
> - MO_NOPREFIX,
> + MO_SECREL
> };
>
> enum : uint64_t {
>
> Modified: llvm/trunk/lib/Target/X86/X86ISelDAGToDAG.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86ISelDAGToDAG.cpp?rev=240300&r1=240299&r2=240300&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/X86/X86ISelDAGToDAG.cpp (original)
> +++ llvm/trunk/lib/Target/X86/X86ISelDAGToDAG.cpp Mon Jun 22 12:46:53 2015
> @@ -67,19 +67,19 @@ namespace {
> const Constant *CP;
> const BlockAddress *BlockAddr;
> const char *ES;
> + MCSymbol *MCSym;
> int JT;
> unsigned Align; // CP alignment.
> unsigned char SymbolFlags; // X86II::MO_*
>
> X86ISelAddressMode()
> - : BaseType(RegBase), Base_FrameIndex(0), Scale(1), IndexReg(),
> Disp(0),
> - Segment(), GV(nullptr), CP(nullptr), BlockAddr(nullptr),
> ES(nullptr),
> - JT(-1), Align(0), SymbolFlags(X86II::MO_NO_FLAG) {
> - }
> + : BaseType(RegBase), Base_FrameIndex(0), Scale(1), IndexReg(),
> Disp(0),
> + Segment(), GV(nullptr), CP(nullptr), BlockAddr(nullptr),
> ES(nullptr),
> + MCSym(nullptr), JT(-1), Align(0),
> SymbolFlags(X86II::MO_NO_FLAG) {}
>
> bool hasSymbolicDisplacement() const {
> return GV != nullptr || CP != nullptr || ES != nullptr ||
> - JT != -1 || BlockAddr != nullptr;
> + MCSym != nullptr || JT != -1 || BlockAddr != nullptr;
> }
>
> bool hasBaseOrIndexReg() const {
> @@ -134,6 +134,11 @@ namespace {
> dbgs() << ES;
> else
> dbgs() << "nul";
> + dbgs() << " MCSym ";
> + if (MCSym)
> + dbgs() << MCSym;
> + else
> + dbgs() << "nul";
> dbgs() << " JT" << JT << " Align" << Align << '\n';
> }
> #endif
> @@ -258,6 +263,10 @@ namespace {
> else if (AM.ES) {
> assert(!AM.Disp && "Non-zero displacement is ignored with ES.");
> Disp = CurDAG->getTargetExternalSymbol(AM.ES, MVT::i32,
> AM.SymbolFlags);
> + } else if (AM.MCSym) {
> + assert(!AM.Disp && "Non-zero displacement is ignored with
> MCSym.");
> + assert(AM.SymbolFlags == 0 && "oo");
> + Disp = CurDAG->getMCSymbol(AM.MCSym, MVT::i32);
> } else if (AM.JT != -1) {
> assert(!AM.Disp && "Non-zero displacement is ignored with JT.");
> Disp = CurDAG->getTargetJumpTable(AM.JT, MVT::i32,
> AM.SymbolFlags);
> @@ -604,7 +613,7 @@ static bool isDispSafeForFrameIndex(int6
> bool X86DAGToDAGISel::FoldOffsetIntoAddress(uint64_t Offset,
> X86ISelAddressMode &AM) {
> // Cannot combine ExternalSymbol displacements with integer offsets.
> - if (Offset != 0 && AM.ES)
> + if (Offset != 0 && (AM.ES || AM.MCSym))
> return true;
> int64_t Val = AM.Disp + Offset;
> CodeModel::Model M = TM.getCodeModel();
> @@ -690,6 +699,8 @@ bool X86DAGToDAGISel::MatchWrapper(SDVal
> } else if (ExternalSymbolSDNode *S =
> dyn_cast<ExternalSymbolSDNode>(N0)) {
> AM.ES = S->getSymbol();
> AM.SymbolFlags = S->getTargetFlags();
> + } else if (auto *S = dyn_cast<MCSymbolSDNode>(N0)) {
> + AM.MCSym = S->getMCSymbol();
> } else if (JumpTableSDNode *J = dyn_cast<JumpTableSDNode>(N0)) {
> AM.JT = J->getIndex();
> AM.SymbolFlags = J->getTargetFlags();
> @@ -728,6 +739,8 @@ bool X86DAGToDAGISel::MatchWrapper(SDVal
> } else if (ExternalSymbolSDNode *S =
> dyn_cast<ExternalSymbolSDNode>(N0)) {
> AM.ES = S->getSymbol();
> AM.SymbolFlags = S->getTargetFlags();
> + } else if (auto *S = dyn_cast<MCSymbolSDNode>(N0)) {
> + AM.MCSym = S->getMCSymbol();
> } else if (JumpTableSDNode *J = dyn_cast<JumpTableSDNode>(N0)) {
> AM.JT = J->getIndex();
> AM.SymbolFlags = J->getTargetFlags();
> @@ -1001,7 +1014,8 @@ bool X86DAGToDAGISel::MatchAddressRecurs
> // FIXME: JumpTable and ExternalSymbol address currently don't like
> // displacements. It isn't very important, but this should be fixed
> for
> // consistency.
> - if (!AM.ES && AM.JT != -1) return true;
> + if (!(AM.ES || AM.MCSym) && AM.JT != -1)
> + return true;
>
> if (ConstantSDNode *Cst = dyn_cast<ConstantSDNode>(N))
> if (!FoldOffsetIntoAddress(Cst->getSExtValue(), AM))
> @@ -1013,13 +1027,11 @@ bool X86DAGToDAGISel::MatchAddressRecurs
> default: break;
> case ISD::FRAME_ALLOC_RECOVER: {
> if (!AM.hasSymbolicDisplacement() && AM.Disp == 0)
> - if (const auto *ESNode =
> dyn_cast<ExternalSymbolSDNode>(N.getOperand(0)))
> - if (ESNode->getOpcode() == ISD::TargetExternalSymbol) {
> - // Use the symbol and don't prefix it.
> - AM.ES = ESNode->getSymbol();
> - AM.SymbolFlags = X86II::MO_NOPREFIX;
> - return false;
> - }
> + if (const auto *ESNode = dyn_cast<MCSymbolSDNode>(N.getOperand(0)))
> {
> + // Use the symbol and don't prefix it.
> + AM.MCSym = ESNode->getMCSymbol();
> + return false;
> + }
> break;
> }
> case ISD::Constant: {
> @@ -1473,6 +1485,7 @@ bool X86DAGToDAGISel::SelectMOV64Imm32(S
> N->getOpcode() != ISD::TargetJumpTable &&
> N->getOpcode() != ISD::TargetGlobalAddress &&
> N->getOpcode() != ISD::TargetExternalSymbol &&
> + N->getOpcode() != ISD::MCSymbol &&
> N->getOpcode() != ISD::TargetBlockAddress)
> return false;
>
>
> Modified: llvm/trunk/lib/Target/X86/X86ISelLowering.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86ISelLowering.cpp?rev=240300&r1=240299&r2=240300&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/X86/X86ISelLowering.cpp (original)
> +++ llvm/trunk/lib/Target/X86/X86ISelLowering.cpp Mon Jun 22 12:46:53 2015
> @@ -15409,13 +15409,10 @@ static SDValue LowerINTRINSIC_WO_CHAIN(S
> auto *Fn =
> cast<Function>(cast<GlobalAddressSDNode>(Op1)->getGlobal());
> MCSymbol *LSDASym = MF.getMMI().getContext().getOrCreateLSDASymbol(
> GlobalValue::getRealLinkageName(Fn->getName()));
> - StringRef Name = LSDASym->getName();
> - assert(Name.data()[Name.size()] == '\0' && "not null terminated");
>
> // Generate a simple absolute symbol reference. This intrinsic is only
> // supported on 32-bit Windows, which isn't PIC.
> - SDValue Result =
> - DAG.getTargetExternalSymbol(Name.data(), VT, X86II::MO_NOPREFIX);
> + SDValue Result = DAG.getMCSymbol(LSDASym, VT);
> return DAG.getNode(X86ISD::Wrapper, dl, VT, Result);
> }
> }
> @@ -15615,13 +15612,11 @@ static SDValue LowerEXCEPTIONINFO(SDValu
> MCSymbol *ParentFrameSym =
> MF.getMMI().getContext().getOrCreateParentFrameOffsetSymbol(
> GlobalValue::getRealLinkageName(Fn->getName()));
> - StringRef Name = ParentFrameSym->getName();
> - assert(Name.data()[Name.size()] == '\0' && "not null terminated");
>
> // Create a TargetExternalSymbol for the label to avoid any target
> lowering
> // that would make this PC relative.
> MVT PtrVT = Op.getSimpleValueType();
> - SDValue OffsetSym = DAG.getTargetExternalSymbol(Name.data(), PtrVT);
> + SDValue OffsetSym = DAG.getMCSymbol(ParentFrameSym, PtrVT);
> SDValue OffsetVal =
> DAG.getNode(ISD::FRAME_ALLOC_RECOVER, dl, PtrVT, OffsetSym);
>
>
> Modified: llvm/trunk/lib/Target/X86/X86InstrCompiler.td
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86InstrCompiler.td?rev=240300&r1=240299&r2=240300&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/X86/X86InstrCompiler.td (original)
> +++ llvm/trunk/lib/Target/X86/X86InstrCompiler.td Mon Jun 22 12:46:53 2015
> @@ -869,6 +869,7 @@ def : Pat<(i32 (X86Wrapper tjumptable :
> def : Pat<(i32 (X86Wrapper tglobaltlsaddr:$dst)),(MOV32ri
> tglobaltlsaddr:$dst)>;
> def : Pat<(i32 (X86Wrapper tglobaladdr :$dst)), (MOV32ri tglobaladdr
> :$dst)>;
> def : Pat<(i32 (X86Wrapper texternalsym:$dst)), (MOV32ri
> texternalsym:$dst)>;
> +def : Pat<(i32 (X86Wrapper mcsym:$dst)), (MOV32ri mcsym:$dst)>;
> def : Pat<(i32 (X86Wrapper tblockaddress:$dst)), (MOV32ri
> tblockaddress:$dst)>;
>
> def : Pat<(add GR32:$src1, (X86Wrapper tconstpool:$src2)),
> @@ -879,6 +880,8 @@ def : Pat<(add GR32:$src1, (X86Wrapper t
> (ADD32ri GR32:$src1, tglobaladdr:$src2)>;
> def : Pat<(add GR32:$src1, (X86Wrapper texternalsym:$src2)),
> (ADD32ri GR32:$src1, texternalsym:$src2)>;
> +def : Pat<(add GR32:$src1, (X86Wrapper mcsym:$src2)),
> + (ADD32ri GR32:$src1, mcsym:$src2)>;
> def : Pat<(add GR32:$src1, (X86Wrapper tblockaddress:$src2)),
> (ADD32ri GR32:$src1, tblockaddress:$src2)>;
>
> @@ -886,6 +889,8 @@ def : Pat<(store (i32 (X86Wrapper tgloba
> (MOV32mi addr:$dst, tglobaladdr:$src)>;
> def : Pat<(store (i32 (X86Wrapper texternalsym:$src)), addr:$dst),
> (MOV32mi addr:$dst, texternalsym:$src)>;
> +def : Pat<(store (i32 (X86Wrapper mcsym:$src)), addr:$dst),
> + (MOV32mi addr:$dst, mcsym:$src)>;
> def : Pat<(store (i32 (X86Wrapper tblockaddress:$src)), addr:$dst),
> (MOV32mi addr:$dst, tblockaddress:$src)>;
>
> @@ -900,6 +905,8 @@ def : Pat<(i64 (X86Wrapper tglobaladdr :
> (MOV64ri tglobaladdr :$dst)>, Requires<[FarData]>;
> def : Pat<(i64 (X86Wrapper texternalsym:$dst)),
> (MOV64ri texternalsym:$dst)>, Requires<[FarData]>;
> +def : Pat<(i64 (X86Wrapper mcsym:$dst)),
> + (MOV64ri mcsym:$dst)>, Requires<[FarData]>;
> def : Pat<(i64 (X86Wrapper tblockaddress:$dst)),
> (MOV64ri tblockaddress:$dst)>, Requires<[FarData]>;
>
> @@ -914,6 +921,8 @@ def : Pat<(i64 (X86Wrapper tglobaladdr :
> (MOV64ri32 tglobaladdr :$dst)>, Requires<[KernelCode]>;
> def : Pat<(i64 (X86Wrapper texternalsym:$dst)),
> (MOV64ri32 texternalsym:$dst)>, Requires<[KernelCode]>;
> +def : Pat<(i64 (X86Wrapper mcsym:$dst)),
> + (MOV64ri32 mcsym:$dst)>, Requires<[KernelCode]>;
> def : Pat<(i64 (X86Wrapper tblockaddress:$dst)),
> (MOV64ri32 tblockaddress:$dst)>, Requires<[KernelCode]>;
>
> @@ -932,12 +941,15 @@ def : Pat<(store (i64 (X86Wrapper tgloba
> def : Pat<(store (i64 (X86Wrapper texternalsym:$src)), addr:$dst),
> (MOV64mi32 addr:$dst, texternalsym:$src)>,
> Requires<[NearData, IsStatic]>;
> +def : Pat<(store (i64 (X86Wrapper mcsym:$src)), addr:$dst),
> + (MOV64mi32 addr:$dst, mcsym:$src)>,
> + Requires<[NearData, IsStatic]>;
> def : Pat<(store (i64 (X86Wrapper tblockaddress:$src)), addr:$dst),
> (MOV64mi32 addr:$dst, tblockaddress:$src)>,
> Requires<[NearData, IsStatic]>;
>
> -def : Pat<(i32 (X86RecoverFrameAlloc texternalsym:$dst)), (MOV32ri
> texternalsym:$dst)>;
> -def : Pat<(i64 (X86RecoverFrameAlloc texternalsym:$dst)), (MOV64ri
> texternalsym:$dst)>;
> +def : Pat<(i32 (X86RecoverFrameAlloc mcsym:$dst)), (MOV32ri mcsym:$dst)>;
> +def : Pat<(i64 (X86RecoverFrameAlloc mcsym:$dst)), (MOV64ri mcsym:$dst)>;
>
> // Calls
>
>
> Modified: llvm/trunk/lib/Target/X86/X86MCInstLower.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86MCInstLower.cpp?rev=240300&r1=240299&r2=240300&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/X86/X86MCInstLower.cpp (original)
> +++ llvm/trunk/lib/Target/X86/X86MCInstLower.cpp Mon Jun 22 12:46:53 2015
> @@ -159,10 +159,7 @@ GetSymbolFromOperand(const MachineOperan
> const GlobalValue *GV = MO.getGlobal();
> AsmPrinter.getNameWithPrefix(Name, GV);
> } else if (MO.isSymbol()) {
> - if (MO.getTargetFlags() == X86II::MO_NOPREFIX)
> - Name += MO.getSymbolName();
> - else
> - getMang()->getNameWithPrefix(Name, MO.getSymbolName());
> + getMang()->getNameWithPrefix(Name, MO.getSymbolName());
> } else if (MO.isMBB()) {
> assert(Suffix.empty());
> Sym = MO.getMBB()->getSymbol();
> @@ -241,7 +238,6 @@ MCOperand X86MCInstLower::LowerSymbolOpe
> case X86II::MO_DARWIN_NONLAZY:
> case X86II::MO_DLLIMPORT:
> case X86II::MO_DARWIN_STUB:
> - case X86II::MO_NOPREFIX:
> break;
>
> case X86II::MO_TLVP: RefKind = MCSymbolRefExpr::VK_TLVP; break;
> @@ -423,6 +419,8 @@ X86MCInstLower::LowerMachineOperand(cons
> case MachineOperand::MO_GlobalAddress:
> case MachineOperand::MO_ExternalSymbol:
> return LowerSymbolOperand(MO, GetSymbolFromOperand(MO));
> + case MachineOperand::MO_MCSymbol:
> + return LowerSymbolOperand(MO, MO.getMCSymbol());
> case MachineOperand::MO_JumpTableIndex:
> return LowerSymbolOperand(MO, AsmPrinter.GetJTISymbol(MO.getIndex()));
> case MachineOperand::MO_ConstantPoolIndex:
>
> Modified: llvm/trunk/utils/TableGen/CodeGenDAGPatterns.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/CodeGenDAGPatterns.cpp?rev=240300&r1=240299&r2=240300&view=diff
>
> ==============================================================================
> --- llvm/trunk/utils/TableGen/CodeGenDAGPatterns.cpp (original)
> +++ llvm/trunk/utils/TableGen/CodeGenDAGPatterns.cpp Mon Jun 22 12:46:53
> 2015
> @@ -2143,7 +2143,8 @@ TreePatternNode *TreePattern::ParseTreeP
> Operator->getName() != "tblockaddress" &&
> Operator->getName() != "tglobaladdr" &&
> Operator->getName() != "bb" &&
> - Operator->getName() != "vt")
> + Operator->getName() != "vt" &&
> + Operator->getName() != "mcsym")
> error("Cannot use '" + Operator->getName() + "' in an output
> pattern!");
> }
>
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150630/ee53d1db/attachment.html>
More information about the llvm-commits
mailing list