OSDN Git Service

Salvage debug info from instructions about to be deleted
authorAdrian Prantl <aprantl@apple.com>
Thu, 16 Mar 2017 21:14:09 +0000 (21:14 +0000)
committerAdrian Prantl <aprantl@apple.com>
Thu, 16 Mar 2017 21:14:09 +0000 (21:14 +0000)
commitb70598b6c68514ad181960cfccc90ce4db583264
tree92693014d452b9f115ceb9b7aba857571ad84512
parent2360eb02ec6d6f4d4f7b994687b105067850c2b0
Salvage debug info from instructions about to be deleted

[Reapplies r297971 and punting on finding a better API for findDbgValues()]

This patch improves debug info quality in InstCombine by looking at
values that are about to be deleted, checking whether there are any
dbg.value instrinsics referring to them, and potentially encoding the
semantics of the deleted instruction into the dbg.value's
DIExpression.

In the example in the testcase (which was extracted from XNU) there is a sequence of

 %4 = load %struct.entry*, %struct.entry** %next2, align 8, !dbg !41
 %5 = bitcast %struct.entry* %4 to i8*, !dbg !42
 %add.ptr4 = getelementptr inbounds i8, i8* %5, i64 -8, !dbg !43
 %6 = bitcast i8* %add.ptr4 to %struct.entry*, !dbg !44
 call void @llvm.dbg.value(metadata %struct.entry* %6, i64 0, metadata !20, metadata !21), !dbg 34

When these instructions are eliminated by instcombine one after
another, we can still salvage the otherwise dead debug info:

- Bitcasts have no effect, so have the dbg.value point to operand(0)
- Loads can be expressed via a DW_OP_deref
- Constant gep instructions can be replaced by DWARF expression arithmetic

The API introduced by this patch is not specific to instcombine and
can be useful in other places, too.

rdar://problem/30725338

Differential Revision: https://reviews.llvm.org/D30919

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@297994 91177308-0d34-0410-b5e6-96231b3b80d8
include/llvm/Transforms/Utils/Local.h
lib/Transforms/InstCombine/InstCombineInternal.h
lib/Transforms/Utils/Local.cpp
test/Transforms/InstCombine/debuginfo-dce.ll [new file with mode: 0644]