From 70fec687442b2cbd56baeec31fd504020723377d Mon Sep 17 00:00:00 2001 From: "Duncan P. N. Exon Smith" Date: Tue, 29 Jul 2014 23:31:11 +0000 Subject: [PATCH] Revert "UseListOrder: Order GlobalValue uses after initializers" This reverts commits r214242 and r214243 while I investigate buildbot failures [1][2][3]. I can't reproduce these failures locally, so if anyone can see what I've done wrong, I'd appreciate a note. [1]: http://lab.llvm.org:8011/builders/llvm-hexagon-elf/builds/9840 [2]: http://lab.llvm.org:8011/builders/clang-hexagon-elf/builds/14981 [3]: http://bb.pgr.jp/builders/cmake-llvm-x86_64-linux/builds/15191 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@214249 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Bitcode/Writer/ValueEnumerator.cpp | 69 +++++----------------- .../local-linkage-default-visibility.3.4.ll | 1 - test/Bitcode/old-aliases.ll | 1 - test/Bitcode/use-list-order.ll | 14 ----- 4 files changed, 14 insertions(+), 71 deletions(-) diff --git a/lib/Bitcode/Writer/ValueEnumerator.cpp b/lib/Bitcode/Writer/ValueEnumerator.cpp index 09b6c470802..5624e02a5c8 100644 --- a/lib/Bitcode/Writer/ValueEnumerator.cpp +++ b/lib/Bitcode/Writer/ValueEnumerator.cpp @@ -28,17 +28,6 @@ using namespace llvm; namespace { struct OrderMap { DenseMap> IDs; - unsigned LastGlobalConstantID; - unsigned LastGlobalValueID; - - OrderMap() : LastGlobalConstantID(0), LastGlobalValueID(0) {} - - bool isGlobalConstant(unsigned ID) const { - return ID <= LastGlobalConstantID; - } - bool isGlobalValue(unsigned ID) const { - return ID <= LastGlobalValueID && !isGlobalConstant(ID); - } unsigned size() const { return IDs.size(); } std::pair &operator[](const Value *V) { return IDs[V]; } @@ -55,7 +44,7 @@ static void orderValue(const Value *V, OrderMap &OM) { if (const Constant *C = dyn_cast(V)) if (C->getNumOperands() && !isa(C)) for (const Value *Op : C->operands()) - if (!isa(Op) && !isa(Op)) + if (!isa(Op)) orderValue(Op, OM); // Note: we cannot cache this lookup above, since inserting into the map @@ -68,11 +57,12 @@ static OrderMap orderModule(const Module *M) { // and ValueEnumerator::incorporateFunction(). OrderMap OM; - // In the reader, initializers of GlobalValues are set *after* all the - // globals have been read. Rather than awkwardly modeling this behaviour - // directly in predictValueUseListOrderImpl(), just assign IDs to - // initializers of GlobalValues before GlobalValues themselves to model this - // implicitly. + for (const GlobalVariable &G : M->globals()) + orderValue(&G, OM); + for (const Function &F : *M) + orderValue(&F, OM); + for (const GlobalAlias &A : M->aliases()) + orderValue(&A, OM); for (const GlobalVariable &G : M->globals()) if (G.hasInitializer()) orderValue(G.getInitializer(), OM); @@ -81,23 +71,6 @@ static OrderMap orderModule(const Module *M) { for (const Function &F : *M) if (F.hasPrefixData()) orderValue(F.getPrefixData(), OM); - OM.LastGlobalConstantID = OM.size(); - - // Initializers of GlobalValues are processed in - // BitcodeReader::ResolveGlobalAndAliasInits(). Match the order there rather - // than ValueEnumerator, and match the code in predictValueUseListOrderImpl() - // by giving IDs in reverse order. - // - // Since GlobalValues never reference each other directly (just through - // initializers), their relative IDs only matter for determining order of - // uses in their initializers. - for (const Function &F : *M) - orderValue(&F, OM); - for (const GlobalAlias &A : M->aliases()) - orderValue(&A, OM); - for (const GlobalVariable &G : M->globals()) - orderValue(&G, OM); - OM.LastGlobalValueID = OM.size(); for (const Function &F : *M) { if (F.isDeclaration()) @@ -137,8 +110,8 @@ static void predictValueUseListOrderImpl(const Value *V, const Function *F, // We may have lost some users. return; - bool IsGlobalValue = OM.isGlobalValue(ID); - std::sort(List.begin(), List.end(), [&](const Entry &L, const Entry &R) { + std::sort(List.begin(), List.end(), + [&OM, ID](const Entry &L, const Entry &R) { const Use *LU = L.first; const Use *RU = R.first; if (LU == RU) @@ -146,36 +119,22 @@ static void predictValueUseListOrderImpl(const Value *V, const Function *F, auto LID = OM.lookup(LU->getUser()).first; auto RID = OM.lookup(RU->getUser()).first; - - // Global values are processed in reverse order. - // - // Moreover, initializers of GlobalValues are set *after* all the globals - // have been read (despite having earlier IDs). Rather than awkwardly - // modeling this behaviour here, orderModule() has assigned IDs to - // initializers of GlobalValues before GlobalValues themselves. - if (OM.isGlobalValue(LID) && OM.isGlobalValue(RID)) - return LID < RID; - // If ID is 4, then expect: 7 6 5 1 2 3. if (LID < RID) { if (RID < ID) - if (!IsGlobalValue) // GlobalValue uses don't get reversed. - return true; + return true; return false; } if (RID < LID) { if (LID < ID) - if (!IsGlobalValue) // GlobalValue uses don't get reversed. - return false; + return false; return true; } - // LID and RID are equal, so we have different operands of the same user. // Assume operands are added in order for all instructions. - if (LID < ID) - if (!IsGlobalValue) // GlobalValue uses don't get reversed. - return LU->getOperandNo() < RU->getOperandNo(); - return LU->getOperandNo() > RU->getOperandNo(); + if (LU->getOperandNo() < RU->getOperandNo()) + return LID < ID; + return ID < LID; }); if (std::is_sorted( diff --git a/test/Bitcode/local-linkage-default-visibility.3.4.ll b/test/Bitcode/local-linkage-default-visibility.3.4.ll index c1a9fbefe69..45a7b1213a8 100644 --- a/test/Bitcode/local-linkage-default-visibility.3.4.ll +++ b/test/Bitcode/local-linkage-default-visibility.3.4.ll @@ -1,5 +1,4 @@ ; RUN: llvm-dis < %s.bc | FileCheck %s -; RUN: llvm-uselistorder < %s.bc -preserve-bc-use-list-order -num-shuffles=5 ; local-linkage-default-visibility.3.4.ll.bc was generated by passing this file ; to llvm-as-3.4. The test checks that LLVM upgrades visibility of symbols diff --git a/test/Bitcode/old-aliases.ll b/test/Bitcode/old-aliases.ll index 13b6d3efa23..7a0eea2f3f2 100644 --- a/test/Bitcode/old-aliases.ll +++ b/test/Bitcode/old-aliases.ll @@ -1,5 +1,4 @@ ; RUN: llvm-dis < %s.bc | FileCheck %s -; RUN: llvm-uselistorder < %s.bc -preserve-bc-use-list-order -num-shuffles=5 ; old-aliases.bc consist of this file assembled with an old llvm-as (3.5 trunk) ; from when aliases contained a ConstantExpr. diff --git a/test/Bitcode/use-list-order.ll b/test/Bitcode/use-list-order.ll index 33cc13edb05..ac7307b2711 100644 --- a/test/Bitcode/use-list-order.ll +++ b/test/Bitcode/use-list-order.ll @@ -3,20 +3,6 @@ @a = global [4 x i1] [i1 0, i1 1, i1 0, i1 1] @b = alias i1* getelementptr ([4 x i1]* @a, i64 0, i64 2) -; Check use-list order of constants used by globals. -@glob1 = global i5 7 -@glob2 = global i5 7 -@glob3 = global i5 7 - -; Check use-list order between variables and aliases. -@target = global i3 zeroinitializer -@alias1 = alias i3* @target -@alias2 = alias i3* @target -@alias3 = alias i3* @target -@var1 = global i3* @target -@var2 = global i3* @target -@var3 = global i3* @target - define i64 @f(i64 %f) { entry: %sum = add i64 %f, 0 -- 2.11.0