From 9500a24fce02fdbe30f7b22334edded76ee7feb4 Mon Sep 17 00:00:00 2001 From: Krzysztof Parzyszek Date: Mon, 23 Jul 2018 18:30:17 +0000 Subject: [Hexagon] Handle unnamed globals in HexagonConstExpr Instead of comparing names, compare positions in the parent module. llvm-svn: 337723 --- llvm/lib/Target/Hexagon/HexagonConstExtenders.cpp | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) (limited to 'llvm/lib/Target') diff --git a/llvm/lib/Target/Hexagon/HexagonConstExtenders.cpp b/llvm/lib/Target/Hexagon/HexagonConstExtenders.cpp index 8b024fad4f8..cbce61bc63c 100644 --- a/llvm/lib/Target/Hexagon/HexagonConstExtenders.cpp +++ b/llvm/lib/Target/Hexagon/HexagonConstExtenders.cpp @@ -730,9 +730,21 @@ bool HCE::ExtRoot::operator< (const HCE::ExtRoot &ER) const { } case MachineOperand::MO_ExternalSymbol: return StringRef(V.SymbolName) < StringRef(ER.V.SymbolName); - case MachineOperand::MO_GlobalAddress: - assert(V.GV->hasName() && ER.V.GV->hasName()); - return V.GV->getName() < ER.V.GV->getName(); + case MachineOperand::MO_GlobalAddress: { + // Global values may not have names, so compare their positions + // in the parent module. + const Module &M = *V.GV->getParent(); + auto FindPos = [&M] (const GlobalValue &V) { + unsigned P = 0; + for (const GlobalValue &T : M.global_values()) { + if (&T == &V) + return P; + P++; + } + llvm_unreachable("Global value not found in module"); + }; + return FindPos(*V.GV) < FindPos(*ER.V.GV); + } case MachineOperand::MO_BlockAddress: { const BasicBlock *ThisB = V.BA->getBasicBlock(); const BasicBlock *OtherB = ER.V.BA->getBasicBlock(); -- cgit v1.2.3