From 018a3afa99573586646e36d6e3e20e59975466bb Mon Sep 17 00:00:00 2001 From: Dehao Chen Date: Mon, 17 Oct 2016 19:28:44 +0000 Subject: [PATCH] Ignore debug info when making optimization decisions in SimplifyCFG. Summary: Debug info should *not* affect code generation. This patch properly handles debug info to make sure the generated code are the same with or without debug info. Reviewers: davidxl, mzolotukhin, jmolloy Subscribers: aprantl, llvm-commits Differential Revision: https://reviews.llvm.org/D25286 llvm-svn: 284415 --- llvm/lib/Transforms/Utils/SimplifyCFG.cpp | 29 ++++++++++++++-------- .../Transforms/SimplifyCFG/sink-common-code.ll | 21 +++++++++++++--- 2 files changed, 35 insertions(+), 15 deletions(-) diff --git a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp index c7c66fd..ec5db1e 100644 --- a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp +++ b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp @@ -1485,8 +1485,14 @@ static bool sinkLastInstruction(ArrayRef Blocks) { // canSinkLastInstruction returning true guarantees that every block has at // least one non-terminator instruction. SmallVector Insts; - for (auto *BB : Blocks) - Insts.push_back(BB->getTerminator()->getPrevNode()); + for (auto *BB : Blocks) { + Instruction *I = BB->getTerminator(); + do { + I = I->getPrevNode(); + } while (isa(I) && I != &BB->front()); + if (!isa(I)) + Insts.push_back(I); + } // The only checking we need to do now is that all users of all instructions // are the same PHI node. canSinkLastInstruction should have checked this but @@ -1584,15 +1590,15 @@ namespace { Fail = false; Insts.clear(); for (auto *BB : Blocks) { - if (Instruction *Terminator = BB->getTerminator()) { - if (Instruction *LastNonTerminator = Terminator->getPrevNode()) { - Insts.push_back(LastNonTerminator); - continue; - } + Instruction *Inst = BB->getTerminator(); + for (Inst = Inst->getPrevNode(); Inst && isa(Inst);) + Inst = Inst->getPrevNode(); + if (!Inst) { + // Block wasn't big enough. + Fail = true; + return; } - // Block wasn't big enough. - Fail = true; - return; + Insts.push_back(Inst); } } @@ -1604,7 +1610,8 @@ namespace { if (Fail) return; for (auto *&Inst : Insts) { - Inst = Inst->getPrevNode(); + for (Inst = Inst->getPrevNode(); Inst && isa(Inst);) + Inst = Inst->getPrevNode(); // Already at beginning of block. if (!Inst) { Fail = true; diff --git a/llvm/test/Transforms/SimplifyCFG/sink-common-code.ll b/llvm/test/Transforms/SimplifyCFG/sink-common-code.ll index a2639d8..953d96e 100644 --- a/llvm/test/Transforms/SimplifyCFG/sink-common-code.ll +++ b/llvm/test/Transforms/SimplifyCFG/sink-common-code.ll @@ -340,7 +340,7 @@ if.end: ; CHECK-LABEL: test13 ; CHECK-DAG: select ; CHECK-DAG: load volatile -; CHECK: store volatile {{.*}}, !tbaa !0 +; CHECK: store volatile {{.*}}, !tbaa ![[TBAA:[0-9]]] ; CHECK-NOT: load ; CHECK-NOT: store @@ -384,6 +384,7 @@ if.else: %gepb = getelementptr inbounds %struct.anon, %struct.anon* %s, i32 0, i32 1 %sv2 = load i32, i32* %gepb %cmp2 = icmp eq i32 %sv2, 57 + call void @llvm.dbg.value(metadata i32 0, i64 0, metadata !9, metadata !DIExpression()), !dbg !11 br label %if.end if.end: @@ -391,6 +392,18 @@ if.end: ret i32 1 } +declare void @llvm.dbg.value(metadata, i64, metadata, metadata) +!llvm.module.flags = !{!5, !6} +!llvm.dbg.cu = !{!7} + +!5 = !{i32 2, !"Dwarf Version", i32 4} +!6 = !{i32 2, !"Debug Info Version", i32 3} +!7 = distinct !DICompileUnit(language: DW_LANG_C99, file: !10) +!8 = distinct !DISubprogram(name: "foo", unit: !7) +!9 = !DILocalVariable(name: "b", line: 1, arg: 2, scope: !8) +!10 = !DIFile(filename: "a.c", directory: "a/b") +!11 = !DILocation(line: 1, column: 14, scope: !8) + ; CHECK-LABEL: test14 ; CHECK: getelementptr ; CHECK: load @@ -781,6 +794,6 @@ merge: ; CHECK: right: ; CHECK-NEXT: %val1 = call i32 @call_target() [ "deopt"(i32 20) ] -; CHECK: !0 = !{!1, !1, i64 0} -; CHECK: !1 = !{!"float", !2} -; CHECK: !2 = !{!"an example type tree"} +; CHECK: ![[TBAA]] = !{![[TYPE:[0-9]]], ![[TYPE]], i64 0} +; CHECK: ![[TYPE]] = !{!"float", ![[TEXT:[0-9]]]} +; CHECK: ![[TEXT]] = !{!"an example type tree"} -- 2.7.4