Index: lib/Transforms/Utils/SimplifyCFG.cpp =================================================================== --- lib/Transforms/Utils/SimplifyCFG.cpp +++ lib/Transforms/Utils/SimplifyCFG.cpp @@ -1485,8 +1485,14 @@ // 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 @@ 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 @@ 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; Index: test/Transforms/SimplifyCFG/sink-common-code.ll =================================================================== --- test/Transforms/SimplifyCFG/sink-common-code.ll +++ test/Transforms/SimplifyCFG/sink-common-code.ll @@ -340,7 +340,7 @@ ; 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 @@ %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 @@ 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 @@ ; 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"}