mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 03:02:36 +01:00
[InstCombine] Merge DebugLoc when speculatively hoisting store instruction
Summary: Along with https://reviews.llvm.org/D27804, debug locations need to be merged when hoisting store instructions as well. Not sure if just dropping debug locations would make more sense for this case, but as the branch instruction will have at least different discriminator with the hoisted store instruction, I think there will be no difference in practice. Reviewers: aprantl, andreadb, danielcdh Reviewed By: aprantl Subscribers: llvm-commits Differential Revision: https://reviews.llvm.org/D29062 llvm-svn: 293372
This commit is contained in:
parent
fd1d0471ca
commit
782a81fa14
@ -2078,6 +2078,9 @@ static bool SpeculativelyExecuteBB(BranchInst *BI, BasicBlock *ThenBB,
|
|||||||
Value *S = Builder.CreateSelect(
|
Value *S = Builder.CreateSelect(
|
||||||
BrCond, TrueV, FalseV, TrueV->getName() + "." + FalseV->getName(), BI);
|
BrCond, TrueV, FalseV, TrueV->getName() + "." + FalseV->getName(), BI);
|
||||||
SpeculatedStore->setOperand(0, S);
|
SpeculatedStore->setOperand(0, S);
|
||||||
|
SpeculatedStore->setDebugLoc(
|
||||||
|
DILocation::getMergedLocation(
|
||||||
|
BI->getDebugLoc(), SpeculatedStore->getDebugLoc()));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Metadata can be dependent on the condition we are hoisting above.
|
// Metadata can be dependent on the condition we are hoisting above.
|
||||||
|
68
test/Transforms/SimplifyCFG/remove-debug-2.ll
Normal file
68
test/Transforms/SimplifyCFG/remove-debug-2.ll
Normal file
@ -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)
|
Loading…
Reference in New Issue
Block a user