diff options
| author | Alexey Samsonov <vonosmas@gmail.com> | 2015-06-11 18:25:54 +0000 |
|---|---|---|
| committer | Alexey Samsonov <vonosmas@gmail.com> | 2015-06-11 18:25:54 +0000 |
| commit | 770f65ca6aa4d6a6a81b6129fcd48ef12d20f1f0 (patch) | |
| tree | becf1f3930a6a933e8d6ca1838169f8a2042f8b2 | |
| parent | ea20199b486b6a1a2e18ef305ead480b13e4c067 (diff) | |
| download | bcm5719-llvm-770f65ca6aa4d6a6a81b6129fcd48ef12d20f1f0.tar.gz bcm5719-llvm-770f65ca6aa4d6a6a81b6129fcd48ef12d20f1f0.zip | |
Set proper debug location for branch added in BasicBlock::splitBasicBlock().
This improves debug locations in passes that do a lot of basic block
transformations. Important case is LoopUnroll pass, the test for correct
debug locations accompanies this change.
Test Plan: regression test suite
Reviewers: dblaikie, sanjoy
Subscribers: llvm-commits
Differential Revision: http://reviews.llvm.org/D10367
llvm-svn: 239551
| -rw-r--r-- | llvm/lib/IR/BasicBlock.cpp | 5 | ||||
| -rw-r--r-- | llvm/test/Transforms/LoopUnroll/runtime-loop1.ll | 45 |
2 files changed, 37 insertions, 13 deletions
diff --git a/llvm/lib/IR/BasicBlock.cpp b/llvm/lib/IR/BasicBlock.cpp index 70ae3c39842..77cb10d5b6b 100644 --- a/llvm/lib/IR/BasicBlock.cpp +++ b/llvm/lib/IR/BasicBlock.cpp @@ -362,12 +362,15 @@ BasicBlock *BasicBlock::splitBasicBlock(iterator I, const Twine &BBName) { BasicBlock *New = BasicBlock::Create(getContext(), BBName, getParent(), InsertBefore); + // Save DebugLoc of split point before invalidating iterator. + DebugLoc Loc = I->getDebugLoc(); // Move all of the specified instructions from the original basic block into // the new basic block. New->getInstList().splice(New->end(), this->getInstList(), I, end()); // Add a branch instruction to the newly formed basic block. - BranchInst::Create(New, this); + BranchInst *BI = BranchInst::Create(New, this); + BI->setDebugLoc(Loc); // Now we must loop through all of the successors of the New block (which // _were_ the successors of the 'this' block), and update any PHI nodes in diff --git a/llvm/test/Transforms/LoopUnroll/runtime-loop1.ll b/llvm/test/Transforms/LoopUnroll/runtime-loop1.ll index 7684e394290..de61e847a5a 100644 --- a/llvm/test/Transforms/LoopUnroll/runtime-loop1.ll +++ b/llvm/test/Transforms/LoopUnroll/runtime-loop1.ll @@ -2,29 +2,50 @@ ; This tests that setting the unroll count works +; CHECK: for.body.preheader: +; CHECK: br {{.*}} label %for.body.prol, label %for.body.preheader.split, !dbg [[PH_LOC:![0-9]+]] ; CHECK: for.body.prol: -; CHECK: br label %for.body.preheader.split +; CHECK: br label %for.body.preheader.split, !dbg [[BODY_LOC:![0-9]+]] +; CHECK: for.body.preheader.split: +; CHECK: br {{.*}} label %for.end.loopexit, label %for.body.preheader.split.split, !dbg [[PH_LOC]] ; CHECK: for.body: -; CHECK: br i1 %exitcond.1, label %for.end.loopexit.unr-lcssa, label %for.body +; CHECK: br i1 %exitcond.1, label %for.end.loopexit.unr-lcssa, label %for.body, !dbg [[BODY_LOC]] ; CHECK-NOT: br i1 %exitcond.4, label %for.end.loopexit{{.*}}, label %for.body +; CHECK-DAG: [[PH_LOC]] = !DILocation(line: 101, column: 1, scope: !{{.*}}) +; CHECK-DAG: [[BODY_LOC]] = !DILocation(line: 102, column: 1, scope: !{{.*}}) + define i32 @test(i32* nocapture %a, i32 %n) nounwind uwtable readonly { entry: - %cmp1 = icmp eq i32 %n, 0 - br i1 %cmp1, label %for.end, label %for.body + %cmp1 = icmp eq i32 %n, 0, !dbg !7 + br i1 %cmp1, label %for.end, label %for.body, !dbg !7 for.body: ; preds = %for.body, %entry %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] %sum.02 = phi i32 [ %add, %for.body ], [ 0, %entry ] - %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv - %0 = load i32, i32* %arrayidx, align 4 - %add = add nsw i32 %0, %sum.02 - %indvars.iv.next = add i64 %indvars.iv, 1 - %lftr.wideiv = trunc i64 %indvars.iv.next to i32 - %exitcond = icmp eq i32 %lftr.wideiv, %n - br i1 %exitcond, label %for.end, label %for.body + %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv, !dbg !8 + %0 = load i32, i32* %arrayidx, align 4, !dbg !8 + %add = add nsw i32 %0, %sum.02, !dbg !8 + %indvars.iv.next = add i64 %indvars.iv, 1, !dbg !9 + %lftr.wideiv = trunc i64 %indvars.iv.next to i32, !dbg !9 + %exitcond = icmp eq i32 %lftr.wideiv, %n, !dbg !9 + br i1 %exitcond, label %for.end, label %for.body, !dbg !9 for.end: ; preds = %for.body, %entry %sum.0.lcssa = phi i32 [ 0, %entry ], [ %add, %for.body ] - ret i32 %sum.0.lcssa + ret i32 %sum.0.lcssa, !dbg !10 } + +!llvm.module.flags = !{!0, !1, !2} +!0 = !{i32 2, !"Dwarf Version", i32 4} +!1 = !{i32 2, !"Debug Info Version", i32 3} +!2 = !{i32 1, !"PIC Level", i32 2} + +!3 = !{} +!4 = !DISubroutineType(types: !3) +!5 = !DIFile(filename: "test.cpp", directory: "/tmp") +!6 = !DISubprogram(name: "test", scope: !5, file: !5, line: 99, type: !4, isLocal: false, isDefinition: true, scopeLine: 100, flags: DIFlagPrototyped, isOptimized: false, function: i32 (i32*, i32)* @test, variables: !3) +!7 = !DILocation(line: 100, column: 1, scope: !6) +!8 = !DILocation(line: 101, column: 1, scope: !6) +!9 = !DILocation(line: 102, column: 1, scope: !6) +!10 = !DILocation(line: 103, column: 1, scope: !6) |

