From: Duncan P. N. Exon Smith Date: Thu, 31 Jul 2014 00:13:28 +0000 (+0000) Subject: UseListOrder: Don't give constant IDs to GlobalValues X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=e5ae09b08fdcbfd2440d527e64d805c915f4ee41;p=oota-llvm.git UseListOrder: Don't give constant IDs to GlobalValues Since initializers of GlobalValues are being assigned IDs before GlobalValues themselves, explicitly exclude GlobalValues from the constant pool. Added targeted test in `test/Bitcode/use-list-order.ll` and added two more RUN lines in `test/Assembly`. This is part of PR5680. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@214368 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Bitcode/Writer/ValueEnumerator.cpp b/lib/Bitcode/Writer/ValueEnumerator.cpp index fa1c8b3c57d..2ac53fea8a9 100644 --- a/lib/Bitcode/Writer/ValueEnumerator.cpp +++ b/lib/Bitcode/Writer/ValueEnumerator.cpp @@ -80,12 +80,15 @@ static OrderMap orderModule(const Module *M) { // implicitly. for (const GlobalVariable &G : M->globals()) if (G.hasInitializer()) - orderValue(G.getInitializer(), OM); + if (!isa(G.getInitializer())) + orderValue(G.getInitializer(), OM); for (const GlobalAlias &A : M->aliases()) - orderValue(A.getAliasee(), OM); + if (!isa(A.getAliasee())) + orderValue(A.getAliasee(), OM); for (const Function &F : *M) if (F.hasPrefixData()) - orderValue(F.getPrefixData(), OM); + if (!isa(F.getPrefixData())) + orderValue(F.getPrefixData(), OM); OM.LastGlobalConstantID = OM.size(); // Initializers of GlobalValues are processed in diff --git a/test/Assembler/ConstantExprFold.ll b/test/Assembler/ConstantExprFold.ll index fc18ce708ed..f3da4e089b4 100644 --- a/test/Assembler/ConstantExprFold.ll +++ b/test/Assembler/ConstantExprFold.ll @@ -2,6 +2,7 @@ ; situations ; RUN: llvm-as < %s | llvm-dis | not grep "(" +; RUN: verify-uselistorder %s -preserve-bc-use-list-order -num-shuffles=5 @A = global i64 0 diff --git a/test/Assembler/ConstantExprFoldCast.ll b/test/Assembler/ConstantExprFoldCast.ll index 161a4ca3575..825ca573d94 100644 --- a/test/Assembler/ConstantExprFoldCast.ll +++ b/test/Assembler/ConstantExprFoldCast.ll @@ -1,6 +1,7 @@ ; This test checks to make sure that constant exprs fold in some simple situations ; RUN: llvm-as < %s | llvm-dis | not grep cast +; RUN: verify-uselistorder %s -preserve-bc-use-list-order -num-shuffles=5 @A = global i32* bitcast (i8* null to i32*) ; Cast null -> fold @B = global i32** bitcast (i32** @A to i32**) ; Cast to same type -> fold diff --git a/test/Bitcode/use-list-order.ll b/test/Bitcode/use-list-order.ll index fb18b462da5..3d3a06ca9de 100644 --- a/test/Bitcode/use-list-order.ll +++ b/test/Bitcode/use-list-order.ll @@ -22,6 +22,19 @@ @globalAndFunction = global i4 4 @globalAndFunctionGlobalUser = global i4* @globalAndFunction +; Check use-list order for constants used by globals that are themselves used +; as aliases. This confirms that this globals are recognized as GlobalValues +; (not general constants). +@const.global = global i63 0 +@const.global.ptr = global i63* @const.global +@const.global.2 = global i63 0 + +; Same as above, but for aliases. +@const.target = global i62 1 +@const.alias = alias i62* @const.target +@const.alias.ptr = alias i62* @const.alias +@const.alias.2 = alias i62* @const.target + define i64 @f(i64 %f) { entry: %sum = add i64 %f, 0