Skip to content
This repository was archived by the owner on Mar 28, 2020. It is now read-only.

Cherry-pick r293372. #48

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 11 additions & 8 deletions lib/Transforms/Utils/SimplifyCFG.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1280,7 +1280,7 @@ static bool HoistThenElseCodeToIf(BranchInst *BI,
if (!isa<CallInst>(I1))
I1->setDebugLoc(
DILocation::getMergedLocation(I1->getDebugLoc(), I2->getDebugLoc()));

I2->eraseFromParent();
Changed = true;

Expand Down Expand Up @@ -1546,7 +1546,7 @@ static bool sinkLastInstruction(ArrayRef<BasicBlock*> Blocks) {
}))
return false;
}

// We don't need to do any more checking here; canSinkLastInstruction should
// have done it all for us.
SmallVector<Value*, 4> NewOperands;
Expand Down Expand Up @@ -1653,7 +1653,7 @@ namespace {
bool isValid() const {
return !Fail;
}

void operator -- () {
if (Fail)
return;
Expand Down Expand Up @@ -1737,7 +1737,7 @@ static bool SinkThenElseCodeToEnd(BranchInst *BI1) {
}
if (UnconditionalPreds.size() < 2)
return false;

bool Changed = false;
// We take a two-step approach to tail sinking. First we scan from the end of
// each block upwards in lockstep. If the n'th instruction from the end of each
Expand Down Expand Up @@ -1767,7 +1767,7 @@ static bool SinkThenElseCodeToEnd(BranchInst *BI1) {
unsigned NumPHIInsts = NumPHIdValues / UnconditionalPreds.size();
if ((NumPHIdValues % UnconditionalPreds.size()) != 0)
NumPHIInsts++;

return NumPHIInsts <= 1;
};

Expand All @@ -1790,7 +1790,7 @@ static bool SinkThenElseCodeToEnd(BranchInst *BI1) {
}
if (!Profitable)
return false;

DEBUG(dbgs() << "SINK: Splitting edge\n");
// We have a conditional edge and we're going to sink some instructions.
// Insert a new block postdominating all blocks we're going to sink from.
Expand All @@ -1800,7 +1800,7 @@ static bool SinkThenElseCodeToEnd(BranchInst *BI1) {
return false;
Changed = true;
}

// Now that we've analyzed all potential sinking candidates, perform the
// actual sink. We iteratively sink the last non-terminator of the source
// blocks into their common successor unless doing so would require too
Expand All @@ -1826,7 +1826,7 @@ static bool SinkThenElseCodeToEnd(BranchInst *BI1) {
DEBUG(dbgs() << "SINK: stopping here, too many PHIs would be created!\n");
break;
}

if (!sinkLastInstruction(UnconditionalPreds))
return Changed;
NumSinkCommons++;
Expand Down Expand Up @@ -2078,6 +2078,9 @@ static bool SpeculativelyExecuteBB(BranchInst *BI, BasicBlock *ThenBB,
Value *S = Builder.CreateSelect(
BrCond, TrueV, FalseV, TrueV->getName() + "." + FalseV->getName(), BI);
SpeculatedStore->setOperand(0, S);
SpeculatedStore->setDebugLoc(
DILocation::getMergedLocation(
BI->getDebugLoc(), SpeculatedStore->getDebugLoc()));
}

// Metadata can be dependent on the condition we are hoisting above.
Expand Down
68 changes: 68 additions & 0 deletions test/Transforms/SimplifyCFG/remove-debug-2.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
; RUN: opt < %s -simplifycfg -S | FileCheck %s

; Check if the debug info for hoisted store for "ret = 0" is removed
;
; int foo(int x) {
; int ret = 1;
; if (x)
; ret = 0;
; return ret;
; }
;
; CHECK: store i32 1,{{.+}}!dbg ![[DLOC1:[0-9]+]]
; CHECK: icmp ne {{.+}}!dbg ![[DLOC2:[0-9]+]]
; CHECK: [[VREG:%[^ ]+]] = select
; CHECK: store i32 [[VREG]]
; CHECK-NOT: !dbg
; CHECK-SAME: {{$}}
; CHECK: ret {{.+}}!dbg ![[DLOC3:[0-9]+]]
; CHECK: ![[DLOC1]] = !DILocation(line: 2
; CHECK: ![[DLOC2]] = !DILocation(line: 3
; CHECK: ![[DLOC3]] = !DILocation(line: 5

target triple = "x86_64-unknown-linux-gnu"

; Function Attrs: noinline nounwind uwtable
define i32 @foo(i32) !dbg !6 {
%2 = alloca i32, align 4
%3 = alloca i32, align 4
store i32 %0, i32* %2, align 4
store i32 1, i32* %3, align 4, !dbg !14
%4 = load i32, i32* %2, align 4, !dbg !15
%5 = icmp ne i32 %4, 0, !dbg !15
br i1 %5, label %6, label %7, !dbg !17

; <label>:6: ; preds = %1
store i32 0, i32* %3, align 4, !dbg !18
br label %7, !dbg !19

; <label>:7: ; preds = %6, %1
%8 = load i32, i32* %3, align 4, !dbg !20
ret i32 %8, !dbg !21
}

!llvm.dbg.cu = !{!0}
!llvm.module.flags = !{!3, !4}

!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1)
!1 = !DIFile(filename: "foo.c", directory: "b/")
!2 = !{}
!3 = !{i32 2, !"Dwarf Version", i32 4}
!4 = !{i32 2, !"Debug Info Version", i32 3}
!5 = !{}
!6 = distinct !DISubprogram(name: "foo", scope: !1, file: !1, line: 1, type: !7, isLocal: false, isDefinition: true, scopeLine: 1, flags: DIFlagPrototyped, isOptimized: false, unit: !0, variables: !2)
!7 = !DISubroutineType(types: !8)
!8 = !{!9, !9}
!9 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
!10 = !DILocalVariable(name: "x", arg: 1, scope: !6, file: !1, line: 1, type: !9)
!11 = !DIExpression()
!12 = !DILocation(line: 1, column: 13, scope: !6)
!13 = !DILocalVariable(name: "ret", scope: !6, file: !1, line: 2, type: !9)
!14 = !DILocation(line: 2, column: 7, scope: !6)
!15 = !DILocation(line: 3, column: 7, scope: !16)
!16 = distinct !DILexicalBlock(scope: !6, file: !1, line: 3, column: 7)
!17 = !DILocation(line: 3, column: 7, scope: !6)
!18 = !DILocation(line: 4, column: 9, scope: !16)
!19 = !DILocation(line: 4, column: 5, scope: !16)
!20 = !DILocation(line: 5, column: 10, scope: !6)
!21 = !DILocation(line: 5, column: 3, scope: !6)