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.
I'd give this a name & use it for the function parameter. Maybe - I can sort of see how the implementation's more legible as a boolean than an enum... *shrug*