llvm.org GIT mirror llvm / 08f7943
Merging r344589: ------------------------------------------------------------------------ r344589 | dstenb | 2018-10-16 01:06:48 -0700 (Tue, 16 Oct 2018) | 41 lines [DebugInfo][LCSSA] Rewrite pre-existing debug values outside loop Summary: Extend LCSSA so that debug values outside loops are rewritten to use the PHI nodes that the pass creates. This fixes PR39019. In that case, we ran LCSSA on a loop that was later on vectorized, which left us with something like this: for.cond.cleanup: %add.lcssa = phi i32 [ %add, %for.body ], [ %34, %middle.block ] call void @llvm.dbg.value(metadata i32 %add, ret i32 %add.lcssa for.body: %add = [...] br i1 %exitcond, label %for.cond.cleanup, label %for.body which later resulted in the debug.value becoming undef when removing the scalar loop (and the location would have probably been wrong for the vectorized case otherwise). As we now may need to query the AvailableVals cache more than once for a basic block, FindAvailableVals() in SSAUpdaterImpl is changed so that it updates the cache for blocks that we do not create a PHI node for, regardless of the block's number of predecessors. The debug value in the attached IR reproducer would not be properly rewritten without this. Debug values residing in blocks where we have not inserted any PHI nodes are currently left as-is by this patch. I'm not sure what should be done with those uses. Reviewers: mattd, aprantl, vsk, probinson Reviewed By: mattd, aprantl Subscribers: jmorse, gbedwell, JDevlieghere, llvm-commits Differential Revision: https://reviews.llvm.org/D53130 ------------------------------------------------------------------------ git-svn-id: https://llvm.org/svn/llvm-project/llvm/branches/release_70@348011 91177308-0d34-0410-b5e6-96231b3b80d8 Tom Stellard 1 year, 10 months ago
5 changed file(s) with 97 addition(s) and 4 deletion(s). Raw diff Collapse all Expand all
7474 /// Return true if the SSAUpdater already has a value for the specified
7575 /// block.
7676 bool HasValueForBlock(BasicBlock *BB) const;
77
78 /// Return the value for the specified block if the SSAUpdater has one,
79 /// otherwise return nullptr.
80 Value *FindValueForBlock(BasicBlock *BB) const;
7781
7882 /// Construct SSA form, materializing a value that is live at the end
7983 /// of the specified block.
356356 BBInfo *Info = *I;
357357
358358 if (Info->DefBB != Info) {
359 // Record the available value at join nodes to speed up subsequent
360 // uses of this SSAUpdater for the same value.
361 if (Info->NumPreds > 1)
362 (*AvailableVals)[Info->BB] = Info->DefBB->AvailableVal;
359 // Record the available value to speed up subsequent uses of this
360 // SSAUpdater for the same value.
361 (*AvailableVals)[Info->BB] = Info->DefBB->AvailableVal;
363362 continue;
364363 }
365364
4040 #include "llvm/IR/Dominators.h"
4141 #include "llvm/IR/Function.h"
4242 #include "llvm/IR/Instructions.h"
43 #include "llvm/IR/IntrinsicInst.h"
4344 #include "llvm/IR/PredIteratorCache.h"
4445 #include "llvm/Pass.h"
4546 #include "llvm/Transforms/Utils.h"
198199
199200 // Otherwise, do full PHI insertion.
200201 SSAUpdate.RewriteUse(*UseToRewrite);
202 }
203
204 SmallVector DbgValues;
205 llvm::findDbgValues(DbgValues, I);
206
207 // Update pre-existing debug value uses that reside outside the loop.
208 auto &Ctx = I->getContext();
209 for (auto DVI : DbgValues) {
210 BasicBlock *UserBB = DVI->getParent();
211 if (InstBB == UserBB || L->contains(UserBB))
212 continue;
213 // We currently only handle debug values residing in blocks where we have
214 // inserted a PHI instruction.
215 if (Value *V = SSAUpdate.FindValueForBlock(UserBB))
216 DVI->setOperand(0, MetadataAsValue::get(Ctx, ValueAsMetadata::get(V)));
201217 }
202218
203219 // SSAUpdater might have inserted phi-nodes inside other loops. We'll need
6363 return getAvailableVals(AV).count(BB);
6464 }
6565
66 Value *SSAUpdater::FindValueForBlock(BasicBlock *BB) const {
67 AvailableValsTy::iterator AVI = getAvailableVals(AV).find(BB);
68 return (AVI != getAvailableVals(AV).end()) ? AVI->second : nullptr;
69 }
70
6671 void SSAUpdater::AddAvailableValue(BasicBlock *BB, Value *V) {
6772 assert(ProtoType && "Need to initialize SSAUpdater");
6873 assert(ProtoType == V->getType() &&
0 ; RUN: opt -S -lcssa < %s | FileCheck %s
1
2 target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
3 target triple = "x86_64-unknown-linux-gnu"
4
5 ; Reproducer for PR39019.
6 ;
7 ; Verify that the llvm.dbg.value in the %for.cond.cleanup2 block is rewritten
8 ; to use the PHI node for %add that is created by LCSSA.
9
10 ; CHECK-LABEL: for.cond.cleanup2:
11 ; CHECK-NEXT: [[PN:%[^ ]*]] = phi i32 [ %add.lcssa, %for.cond.cleanup1 ]
12 ; CHECK-NEXT: call void @llvm.dbg.value(metadata i32 [[PN]], metadata [[VAR:![0-9]+]], metadata !DIExpression())
13 ; CHECK-NEXT: call void @bar(i32 [[PN]])
14
15 ; CHECK-LABEL: for.body:
16 ; CHECK: %add = add nsw i32 0, 2
17 ; CHECK: call void @llvm.dbg.value(metadata i32 %add, metadata [[VAR]], metadata !DIExpression())
18
19 ; CHECK: [[VAR]] = !DILocalVariable(name: "sum",
20
21 ; Function Attrs: nounwind
22 define void @foo() #0 !dbg !6 {
23 entry:
24 br label %for.cond.preheader, !dbg !12
25
26 for.cond.preheader: ; preds = %for.cond.cleanup1, %entry
27 br label %for.body, !dbg !12
28
29 for.cond.cleanup2: ; preds = %for.cond.cleanup1
30 call void @llvm.dbg.value(metadata i32 %add, metadata !9, metadata !DIExpression()), !dbg !12
31 tail call void @bar(i32 %add) #0, !dbg !12
32 ret void, !dbg !12
33
34 for.cond.cleanup1: ; preds = %for.body
35 br i1 false, label %for.cond.preheader, label %for.cond.cleanup2, !dbg !12
36
37 for.body: ; preds = %for.body, %for.cond.preheader
38 %add = add nsw i32 0, 2, !dbg !12
39 call void @llvm.dbg.value(metadata i32 %add, metadata !9, metadata !DIExpression()), !dbg !12
40 br i1 false, label %for.body, label %for.cond.cleanup1, !dbg !12
41 }
42
43 ; Function Attrs: nounwind
44 declare void @bar(i32) #0
45
46 ; Function Attrs: nounwind readnone speculatable
47 declare void @llvm.dbg.value(metadata, metadata, metadata) #1
48
49 attributes #0 = { nounwind }
50 attributes #1 = { nounwind readnone speculatable }
51
52 !llvm.dbg.cu = !{!0}
53 !llvm.module.flags = !{!3, !4}
54 !llvm.ident = !{!5}
55
56 !0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang version 8.0.0", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !2, globals: !2)
57 !1 = !DIFile(filename: "foo.c", directory: "/")
58 !2 = !{}
59 !3 = !{i32 2, !"Dwarf Version", i32 4}
60 !4 = !{i32 2, !"Debug Info Version", i32 3}
61 !5 = !{!"clang version 8.0.0"}
62 !6 = distinct !DISubprogram(name: "foo", scope: !1, file: !1, line: 10, type: !7, isLocal: false, isDefinition: true, scopeLine: 10, isOptimized: true, unit: !0, retainedNodes: !8)
63 !7 = !DISubroutineType(types: !2)
64 !8 = !{!9}
65 !9 = !DILocalVariable(name: "sum", scope: !10, file: !1, line: 11, type: !11)
66 !10 = !DILexicalBlockFile(scope: !6, file: !1, discriminator: 0)
67 !11 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
68 !12 = !DILocation(line: 0, scope: !10)