[llvm-commits] [llvm] r168198 - in /llvm/trunk: lib/Target/NVPTX/NVPTXAsmPrinter.cpp test/CodeGen/NVPTX/global-ordering.ll
Justin Holewinski
justin.holewinski at gmail.com
Fri Nov 16 16:47:16 PST 2012
One more for 3.2. :)
On Fri, Nov 16, 2012 at 4:03 PM, Justin Holewinski
<jholewinski at nvidia.com>wrote:
> Author: jholewinski
> Date: Fri Nov 16 15:03:51 2012
> New Revision: 168198
>
> URL: http://llvm.org/viewvc/llvm-project?rev=168198&view=rev
> Log:
> [NVPTX] Order global variables in def-use order before emiting them in the
> final assembly
>
> Added:
> llvm/trunk/test/CodeGen/NVPTX/global-ordering.ll
> Modified:
> llvm/trunk/lib/Target/NVPTX/NVPTXAsmPrinter.cpp
>
> Modified: llvm/trunk/lib/Target/NVPTX/NVPTXAsmPrinter.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/NVPTX/NVPTXAsmPrinter.cpp?rev=168198&r1=168197&r2=168198&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/NVPTX/NVPTXAsmPrinter.cpp (original)
> +++ llvm/trunk/lib/Target/NVPTX/NVPTXAsmPrinter.cpp Fri Nov 16 15:03:51
> 2012
> @@ -68,7 +68,54 @@
>
> cl::location(llvm::InterleaveSrcInPtx));
>
>
> +namespace {
> +/// DiscoverDependentGlobals - Return a set of GlobalVariables on which
> \p V
> +/// depends.
> +void DiscoverDependentGlobals(Value *V,
> + DenseSet<GlobalVariable*> &Globals) {
> + if (GlobalVariable *GV = dyn_cast<GlobalVariable>(V))
> + Globals.insert(GV);
> + else {
> + if (User *U = dyn_cast<User>(V)) {
> + for (unsigned i = 0, e = U->getNumOperands(); i != e; ++i) {
> + DiscoverDependentGlobals(U->getOperand(i), Globals);
> + }
> + }
> + }
> +}
>
> +/// VisitGlobalVariableForEmission - Add \p GV to the list of
> GlobalVariable
> +/// instances to be emitted, but only after any dependents have been added
> +/// first.
> +void VisitGlobalVariableForEmission(GlobalVariable *GV,
> + SmallVectorImpl<GlobalVariable*>
> &Order,
> + DenseSet<GlobalVariable*> &Visited,
> + DenseSet<GlobalVariable*> &Visiting) {
> + // Have we already visited this one?
> + if (Visited.count(GV)) return;
> +
> + // Do we have a circular dependency?
> + if (Visiting.count(GV))
> + report_fatal_error("Circular dependency found in global variable
> set");
> +
> + // Start visiting this global
> + Visiting.insert(GV);
> +
> + // Make sure we visit all dependents first
> + DenseSet<GlobalVariable*> Others;
> + for (unsigned i = 0, e = GV->getNumOperands(); i != e; ++i)
> + DiscoverDependentGlobals(GV->getOperand(i), Others);
> +
> + for (DenseSet<GlobalVariable*>::iterator I = Others.begin(),
> + E = Others.end(); I != E; ++I)
> + VisitGlobalVariableForEmission(*I, Order, Visited, Visiting);
> +
> + // Now we can visit ourself
> + Order.push_back(GV);
> + Visited.insert(GV);
> + Visiting.erase(GV);
> +}
> +}
>
> // @TODO: This is a copy from AsmPrinter.cpp. The function is static, so
> we
> // cannot just link to the existing version.
> @@ -893,10 +940,27 @@
>
> emitDeclarations(M, OS2);
>
> - // Print out module-level global variables here.
> + // As ptxas does not support forward references of globals, we need to
> first
> + // sort the list of module-level globals in def-use order. We visit each
> + // global variable in order, and ensure that we emit it *after* its
> dependent
> + // globals. We use a little extra memory maintaining both a set and a
> list to
> + // have fast searches while maintaining a strict ordering.
> + SmallVector<GlobalVariable*,8> Globals;
> + DenseSet<GlobalVariable*> GVVisited;
> + DenseSet<GlobalVariable*> GVVisiting;
> +
> + // Visit each global variable, in order
> for (Module::global_iterator I = M.global_begin(), E = M.global_end();
> - I != E; ++I)
> - printModuleLevelGV(I, OS2);
> + I != E; ++I)
> + VisitGlobalVariableForEmission(I, Globals, GVVisited, GVVisiting);
> +
> + assert(GVVisited.size() == M.getGlobalList().size() &&
> + "Missed a global variable");
> + assert(GVVisiting.size() == 0 && "Did not fully process a global
> variable");
> +
> + // Print out module-level global variables in proper order
> + for (unsigned i = 0, e = Globals.size(); i != e; ++i)
> + printModuleLevelGV(Globals[i], OS2);
>
> OS2 << '\n';
>
>
> Added: llvm/trunk/test/CodeGen/NVPTX/global-ordering.ll
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/NVPTX/global-ordering.ll?rev=168198&view=auto
>
> ==============================================================================
> --- llvm/trunk/test/CodeGen/NVPTX/global-ordering.ll (added)
> +++ llvm/trunk/test/CodeGen/NVPTX/global-ordering.ll Fri Nov 16 15:03:51
> 2012
> @@ -0,0 +1,20 @@
> +; RUN: llc < %s -march=nvptx -mcpu=sm_20 | FileCheck %s
> --check-prefix=PTX32
> +; RUN: llc < %s -march=nvptx64 -mcpu=sm_20 | FileCheck %s
> --check-prefix=PTX64
> +
> +; Make sure we emit these globals in def-use order
> +
> +
> +; PTX32: .visible .global .align 1 .u8 a = 2;
> +; PTX32-NEXT: .visible .global .align 4 .u32 a2 = a;
> +; PTX64: .visible .global .align 1 .u8 a = 2;
> +; PTX64-NEXT: .visible .global .align 8 .u64 a2 = a;
> + at a2 = addrspace(1) global i8 addrspace(1)* @a
> + at a = addrspace(1) global i8 2
> +
> +
> +; PTX32: .visible .global .align 1 .u8 b = 1;
> +; PTX32-NEXT: .visible .global .align 4 .u32 b2[2] = {b, b};
> +; PTX64: .visible .global .align 1 .u8 b = 1;
> +; PTX64-NEXT: .visible .global .align 8 .u64 b2[2] = {b, b};
> + at b2 = addrspace(1) global [2 x i8 addrspace(1)*] [i8 addrspace(1)* @b, i8
> addrspace(1)* @b]
> + at b = addrspace(1) global i8 1
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
--
Thanks,
Justin Holewinski
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20121116/6f306258/attachment.html>
More information about the llvm-commits
mailing list