From 2c12b35c9597cc72aac00facd8a9f14262e26eb4 Mon Sep 17 00:00:00 2001 From: Adrian Prantl Date: Thu, 20 Aug 2015 18:24:02 +0000 Subject: [PATCH] Fix a bug that caused SimplifyCFG to drop DebugLocs. Instruction::dropUnknownMetadata(KnownSet) is supposed to preserve all metadata in KnownSet, but the condition for DebugLocs was inverted. Most users of dropUnknownMetadata() actually worked around this by not adding LLVMContext::MD_dbg to their list of KnowIDs. This is now made explicit. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@245589 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/IR/Metadata.cpp | 2 +- .../InstCombine/InstCombineLoadStoreAlloca.cpp | 1 + lib/Transforms/Scalar/GVN.cpp | 1 + lib/Transforms/Scalar/MemCpyOptimizer.cpp | 1 + lib/Transforms/Scalar/MergedLoadStoreMotion.cpp | 4 ++-- lib/Transforms/Utils/SimplifyCFG.cpp | 1 + lib/Transforms/Vectorize/BBVectorize.cpp | 1 + test/Transforms/SimplifyCFG/basictest.ll | 14 ++++++++++++-- 8 files changed, 20 insertions(+), 5 deletions(-) diff --git a/lib/IR/Metadata.cpp b/lib/IR/Metadata.cpp index 6ec4a25f51b..08fa7ce3b05 100644 --- a/lib/IR/Metadata.cpp +++ b/lib/IR/Metadata.cpp @@ -1062,7 +1062,7 @@ void Instruction::dropUnknownMetadata(ArrayRef KnownIDs) { KnownSet.insert(KnownIDs.begin(), KnownIDs.end()); // Drop debug if needed - if (KnownSet.erase(LLVMContext::MD_dbg)) + if (!KnownSet.erase(LLVMContext::MD_dbg)) DbgLoc = DebugLoc(); if (!hasMetadataHashEntry()) diff --git a/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp b/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp index e3179dbeece..3614868e194 100644 --- a/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp +++ b/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp @@ -754,6 +754,7 @@ Instruction *InstCombiner::visitLoadInst(LoadInst &LI) { 6, AA, &AATags)) { if (LoadInst *NLI = dyn_cast(AvailableVal)) { unsigned KnownIDs[] = { + LLVMContext::MD_dbg, LLVMContext::MD_tbaa, LLVMContext::MD_alias_scope, LLVMContext::MD_noalias, diff --git a/lib/Transforms/Scalar/GVN.cpp b/lib/Transforms/Scalar/GVN.cpp index d898b1796b6..cbb9c1bc00b 100644 --- a/lib/Transforms/Scalar/GVN.cpp +++ b/lib/Transforms/Scalar/GVN.cpp @@ -1780,6 +1780,7 @@ static void patchReplacementInstruction(Instruction *I, Value *Repl) { // regions, and so we need a conservative combination of the noalias // scopes. static const unsigned KnownIDs[] = { + LLVMContext::MD_dbg, LLVMContext::MD_tbaa, LLVMContext::MD_alias_scope, LLVMContext::MD_noalias, diff --git a/lib/Transforms/Scalar/MemCpyOptimizer.cpp b/lib/Transforms/Scalar/MemCpyOptimizer.cpp index 3c2a498669e..85335a21a4b 100644 --- a/lib/Transforms/Scalar/MemCpyOptimizer.cpp +++ b/lib/Transforms/Scalar/MemCpyOptimizer.cpp @@ -743,6 +743,7 @@ bool MemCpyOpt::performCallSlotOptzn(Instruction *cpy, // FIXME: MD_tbaa_struct and MD_mem_parallel_loop_access should also be // handled here, but combineMetadata doesn't support them yet unsigned KnownIDs[] = { + LLVMContext::MD_dbg, LLVMContext::MD_tbaa, LLVMContext::MD_alias_scope, LLVMContext::MD_noalias, diff --git a/lib/Transforms/Scalar/MergedLoadStoreMotion.cpp b/lib/Transforms/Scalar/MergedLoadStoreMotion.cpp index 6a094b2a7a1..7feb0cd1df6 100644 --- a/lib/Transforms/Scalar/MergedLoadStoreMotion.cpp +++ b/lib/Transforms/Scalar/MergedLoadStoreMotion.cpp @@ -293,7 +293,7 @@ void MergedLoadStoreMotion::hoistInstruction(BasicBlock *BB, // Intersect optional metadata. HoistCand->intersectOptionalDataWith(ElseInst); - HoistCand->dropUnknownMetadata(); + HoistCand->dropUnknownMetadata(LLVMContext::MD_dbg); // Prepend point for instruction insert Instruction *HoistPt = BB->getTerminator(); @@ -472,7 +472,7 @@ bool MergedLoadStoreMotion::sinkStore(BasicBlock *BB, StoreInst *S0, BasicBlock::iterator InsertPt = BB->getFirstInsertionPt(); // Intersect optional metadata. S0->intersectOptionalDataWith(S1); - S0->dropUnknownMetadata(); + S0->dropUnknownMetadata(LLVMContext::MD_dbg); // Create the new store to be inserted at the join point. StoreInst *SNew = (StoreInst *)(S0->clone()); diff --git a/lib/Transforms/Utils/SimplifyCFG.cpp b/lib/Transforms/Utils/SimplifyCFG.cpp index 71455813b50..02e17d38821 100644 --- a/lib/Transforms/Utils/SimplifyCFG.cpp +++ b/lib/Transforms/Utils/SimplifyCFG.cpp @@ -1093,6 +1093,7 @@ static bool HoistThenElseCodeToIf(BranchInst *BI, I2->replaceAllUsesWith(I1); I1->intersectOptionalDataWith(I2); unsigned KnownIDs[] = { + LLVMContext::MD_dbg, LLVMContext::MD_tbaa, LLVMContext::MD_range, LLVMContext::MD_fpmath, diff --git a/lib/Transforms/Vectorize/BBVectorize.cpp b/lib/Transforms/Vectorize/BBVectorize.cpp index 7ddf2b9505a..1eed84fa90f 100644 --- a/lib/Transforms/Vectorize/BBVectorize.cpp +++ b/lib/Transforms/Vectorize/BBVectorize.cpp @@ -3118,6 +3118,7 @@ namespace { K->mutateType(getVecTypeForPair(L->getType(), H->getType())); unsigned KnownIDs[] = { + LLVMContext::MD_dbg, LLVMContext::MD_tbaa, LLVMContext::MD_alias_scope, LLVMContext::MD_noalias, diff --git a/test/Transforms/SimplifyCFG/basictest.ll b/test/Transforms/SimplifyCFG/basictest.ll index d228499b2ec..c9047577c71 100644 --- a/test/Transforms/SimplifyCFG/basictest.ll +++ b/test/Transforms/SimplifyCFG/basictest.ll @@ -50,7 +50,7 @@ define i8 @test6f() { ; CHECK: alloca i8, align 1 ; CHECK-NEXT: call i8 @test6g ; CHECK-NEXT: icmp eq i8 %tmp, 0 -; CHECK-NEXT: load i8, i8* %r, align 1{{$}} +; CHECK-NEXT: load i8, i8* %r, align 1, !dbg !{{[0-9]+$}} bb0: %r = alloca i8, align 1 @@ -58,7 +58,7 @@ bb0: %tmp1 = icmp eq i8 %tmp, 0 br i1 %tmp1, label %bb2, label %bb1 bb1: - %tmp3 = load i8, i8* %r, align 1, !range !2, !tbaa !1 + %tmp3 = load i8, i8* %r, align 1, !range !2, !tbaa !1, !dbg !5 %tmp4 = icmp eq i8 %tmp3, 1 br i1 %tmp4, label %bb2, label %bb3 bb2: @@ -69,6 +69,16 @@ bb3: } declare i8 @test6g(i8*) +!llvm.dbg.cu = !{!3} +!llvm.module.flags = !{!8, !9} + !0 = !{!1, !1, i64 0} !1 = !{!"foo"} !2 = !{i8 0, i8 2} +!3 = distinct !DICompileUnit(language: DW_LANG_C99, file: !7, producer: "clang", isOptimized: false, runtimeVersion: 0, emissionKind: 1, enums: !4, subprograms: !4, globals: !4) +!4 = !{} +!5 = !DILocation(line: 23, scope: !6) +!6 = !DISubprogram(name: "foo", scope: !3, file: !7, line: 1, type: !DISubroutineType(types: !4), isLocal: false, isDefinition: true, scopeLine: 1, flags: DIFlagPrototyped, isOptimized: false, variables: !4) +!7 = !DIFile(filename: "foo.c", directory: "/") +!8 = !{i32 2, !"Dwarf Version", i32 2} +!9 = !{i32 2, !"Debug Info Version", i32 3} -- 2.34.1