Index: lib/Transforms/Utils/SimplifyCFG.cpp =================================================================== --- lib/Transforms/Utils/SimplifyCFG.cpp +++ lib/Transforms/Utils/SimplifyCFG.cpp @@ -1242,6 +1242,14 @@ LLVMContext::MD_dereferenceable_or_null, LLVMContext::MD_mem_parallel_loop_access}; combineMetadata(I1, I2, KnownIDs); + + // If the debug loc for I1 and I2 are different, as we are combining them + // into one instruction, we do not want to select debug loc randomly from + // I1 or I2. Instead, we set the 0-line DebugLoc to note that we do not + // know the debug loc of the hoisted instruction. + if (!isa(I1) && I1->getDebugLoc() != I2->getDebugLoc()) + I1->setDebugLoc(DebugLoc()); + I2->eraseFromParent(); Changed = true; Index: test/Transforms/SimplifyCFG/remove-debug.ll =================================================================== --- /dev/null +++ test/Transforms/SimplifyCFG/remove-debug.ll @@ -0,0 +1,83 @@ +; RUN: opt < %s -simplifycfg -S | FileCheck %s + +; TODO: Track the acutal DebugLoc of the hoisted instruction when no-line +; DebugLoc is supported (https://reviews.llvm.org/D24180) +; CHECK: line: 6 +; CHECK-NOT: line: 7 +; CHECK: line: 8 +; CHECK: line: 9 +; CHECK-NOT: line: 10 +; CHECK: line: 11 + +; Checks if the debug info for hoisted "x = i" is removed +; int x; +; void bar(); +; void baz(); +; +; void foo(int i) { +; if (i == 0) { +; x = i; +; bar(); +; } else { +; x = i; +; baz(); +; } +; } + +target triple = "x86_64-unknown-linux-gnu" + +@x = global i32 0, align 4 + +; Function Attrs: uwtable +define void @_Z3fooi(i32) #0 !dbg !6 { + %2 = alloca i32, align 4 + store i32 %0, i32* %2, align 4, !tbaa !8 + %3 = load i32, i32* %2, align 4, !dbg !12, !tbaa !8 + %4 = icmp eq i32 %3, 0, !dbg !13 + br i1 %4, label %5, label %7, !dbg !12 + +;