InstCombine debugging reference

Instruction Combine is a crucial pass occurring in the middle of the pipeline. It consolidates redundant instructions and while doing that it doesn't always get the Debug Info right.

Code structure

The pass is split into many different files. The class definition along with the definition of the instruction work-list is in llvm/include/llvm/Transforms/InstCombine while the implementation lies in llvm/lib/Transforms/InstCombine. The main cpp file is /home/gramanas/code/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp

The pass runs on a function level.


In order to see what the pass is doing step by step use this:

opt -debug-only=instcombine -instcombine sample.ll


The following llvm-ir snippet:

define <2 x i64> @test3(<2 x i64> %A) {
  %trunc = trunc <2 x i64> %A to <2 x i32>
  %and = and <2 x i32> %trunc, <i32 23, i32 42>
  %zext = zext <2 x i32> %and to <2 x i64>
  ret <2 x i64> %zext

gets reduced to this:

define <2 x i64> @test3(<2 x i64> %A) {                                                                                                                                              
  %and = and <2 x i64> %A, <i64 23, i64 42>                                                                                                                                          
  ret <2 x i64> %and                                                                                                                                                                 

after running instcombine on it.

We are left with two dbg.value intrinsics missing.