From 0a68c5ac904b9792b56dd51ba61d6dea124f24dd Mon Sep 17 00:00:00 2001 From: Singapuram Sanjay Srivallabh Date: Wed, 2 Aug 2017 15:20:07 +0000 Subject: [PATCH] Remove debug metadata from copied instruction to prevent GPUModule verification failure Summary: **Remove debug metadata from instruction to be copied to prevent the source file's debug metadata being copied into GPUModule and eventually failing Module verification and ASM string codegeneration.** When copying the instruction onto the Module meant for the GPU, debug metadata attached to an instruction causes all related metadata to be pulled into the Module, including the DICompileUnit, which is not listed in llvm.dbg.cu of the Module. This fails the verification of the Module and generation of the ASM string. The only debug metadata of the instruction, the DebugLoc, is unset by this patch. This patch reattempts https://reviews.llvm.org/D35630 by targeting only those instructions that are to end up in a Module meant for the GPU. Reviewers: grosser, bollu Reviewed By: grosser Subscribers: pollydev Tags: #polly Differential Revision: https://reviews.llvm.org/D36161 git-svn-id: https://llvm.org/svn/llvm-project/polly/trunk@309822 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/BlockGenerators.cpp | 10 ++++ test/GPGPU/debug-metadata-leak.ll | 104 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 114 insertions(+) create mode 100644 test/GPGPU/debug-metadata-leak.ll diff --git a/lib/CodeGen/BlockGenerators.cpp b/lib/CodeGen/BlockGenerators.cpp index 5b01f950..55e5ed09 100644 --- a/lib/CodeGen/BlockGenerators.cpp +++ b/lib/CodeGen/BlockGenerators.cpp @@ -234,9 +234,19 @@ void BlockGenerator::copyInstScalar(ScopStmt &Stmt, Instruction *Inst, NewInst->replaceUsesOfWith(OldOperand, NewOperand); } + Builder.Insert(NewInst); BBMap[Inst] = NewInst; + // When copying the instruction onto the Module meant for the GPU, + // debug metadata attached to an instruction causes all related + // metadata to be pulled into the Module. This includes the DICompileUnit, + // which will not be listed in llvm.dbg.cu of the Module since the Module + // doesn't contain one. This fails the verification of the Module and the + // subsequent generation of the ASM string. + if( NewInst->getModule() != Inst->getModule() ) + NewInst->setDebugLoc(llvm::DebugLoc()); + if (!NewInst->getType()->isVoidTy()) NewInst->setName("p_" + Inst->getName()); } diff --git a/test/GPGPU/debug-metadata-leak.ll b/test/GPGPU/debug-metadata-leak.ll new file mode 100644 index 00000000..e0ad4d44 --- /dev/null +++ b/test/GPGPU/debug-metadata-leak.ll @@ -0,0 +1,104 @@ +; RUN: opt %loadPolly %s -polly-process-unprofitable -polly-codegen-ppcg -polly-acc-dump-kernel-ir \ +; RUN: | FileCheck --check-prefix=KERNEL-IR %s + +; REQUIRES: pollyacc + +; KERNEL-IR: define ptx_kernel void @FUNC_vec_add_1_SCOP_0_KERNEL_0(i8 addrspace(1)* %MemRef_arr, i32 %N) #0 { + +; The instruction marked <<>> is copied into the GPUModule, +; with changes only to the parameters to access data on the device instead of +; the host, i.e., MemRef_arr becomes polly.access.cast.MemRef_arr. Since the +; instruction is annotated with a DILocation, copying the instruction also copies +; the metadata into the GPUModule. This stops codegenerating the ptx_kernel by +; failing the verification of the Module in GPUNodeBuilder::finalize, due to the +; copied DICompileUnit not being listed in a llvm.dbg.cu which was neither copied +; nor created. +; +; https://reviews.llvm.org/D35630 removes this debug metadata before the +; instruction is copied to the GPUModule. +; +; vec_add_1.c: +; void vec_add_1(int N, int arr[N]) { +; int i=0; +; for( i=0 ; i>> + store i32 %add, i32* %arrayidx, align 4, !dbg !26, !tbaa !27 + br label %for.inc, !dbg !25 + +for.inc: ; preds = %for.body + %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1, !dbg !31 + call void @llvm.dbg.value(metadata !2, i64 0, metadata !15, metadata !16), !dbg !19 + br label %for.cond, !dbg !32, !llvm.loop !33 + +for.end: ; preds = %for.cond + ret void, !dbg !35 +} + +declare void @llvm.dbg.declare(metadata, metadata, metadata) + +declare void @llvm.dbg.value(metadata, i64, metadata, metadata) + + +!llvm.dbg.cu = !{!0} +!llvm.module.flags = !{!3, !4, !5} +!llvm.ident = !{!6} + +!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang version 5.0.0 (http://llvm.org/git/clang.git 23e042ffe07a923db2dbebf4d2a3692c5a454fee) (http://llvm.org/git/llvm.git 39c5686a1f54884f12120927b1753a750fdb5e02)", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !2) +!1 = !DIFile(filename: "vec_add_1.c", directory: "/tmp") +!2 = !{} +!3 = !{i32 2, !"Dwarf Version", i32 4} +!4 = !{i32 2, !"Debug Info Version", i32 3} +!5 = !{i32 1, !"wchar_size", i32 4} +!6 = !{!"clang version 5.0.0 (http://llvm.org/git/clang.git 23e042ffe07a923db2dbebf4d2a3692c5a454fee) (http://llvm.org/git/llvm.git 39c5686a1f54884f12120927b1753a750fdb5e02)"} +!7 = distinct !DISubprogram(name: "vec_add_1", scope: !1, file: !1, line: 1, type: !8, isLocal: false, isDefinition: true, scopeLine: 1, flags: DIFlagPrototyped, isOptimized: true, unit: !0, variables: !12) +!8 = !DISubroutineType(types: !9) +!9 = !{null, !10, !11} +!10 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed) +!11 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !10, size: 64) +!12 = !{!13, !14, !15} +!13 = !DILocalVariable(name: "N", arg: 1, scope: !7, file: !1, line: 1, type: !10) +!14 = !DILocalVariable(name: "arr", arg: 2, scope: !7, file: !1, line: 1, type: !11) +!15 = !DILocalVariable(name: "i", scope: !7, file: !1, line: 2, type: !10) +!16 = !DIExpression() +!17 = !DILocation(line: 1, column: 20, scope: !7) +!18 = !DILocation(line: 1, column: 27, scope: !7) +!19 = !DILocation(line: 2, column: 7, scope: !7) +!20 = !DILocation(line: 3, column: 8, scope: !21) +!21 = distinct !DILexicalBlock(scope: !7, file: !1, line: 3, column: 3) +!22 = !DILocation(line: 3, column: 15, scope: !23) +!23 = distinct !DILexicalBlock(scope: !21, file: !1, line: 3, column: 3) +!24 = !DILocation(line: 3, column: 3, scope: !21) +!25 = !DILocation(line: 3, column: 25, scope: !23) +!26 = !DILocation(line: 3, column: 32, scope: !23) +!27 = !{!28, !28, i64 0} +!28 = !{!"int", !29, i64 0} +!29 = !{!"omnipotent char", !30, i64 0} +!30 = !{!"Simple C/C++ TBAA"} +!31 = !DILocation(line: 3, column: 21, scope: !23) +!32 = !DILocation(line: 3, column: 3, scope: !23) +!33 = distinct !{!33, !24, !34} +!34 = !DILocation(line: 3, column: 35, scope: !21) +!35 = !DILocation(line: 4, column: 1, scope: !7) -- 2.11.4.GIT