Index: lib/CodeGen/CodeGenPrepare.cpp =================================================================== --- lib/CodeGen/CodeGenPrepare.cpp +++ lib/CodeGen/CodeGenPrepare.cpp @@ -6559,6 +6559,7 @@ /// The GEP operand must be a pointer, so must its result -> BitCast Instruction *NC = new BitCastInst(GEPI->getOperand(0), GEPI->getType(), GEPI->getName(), GEPI); + NC->setDebugLoc(GEPI->getDebugLoc()); GEPI->replaceAllUsesWith(NC); GEPI->eraseFromParent(); ++NumGEPsElim; Index: test/DebugInfo/X86/bitcast-di.ll =================================================================== --- test/DebugInfo/X86/bitcast-di.ll +++ test/DebugInfo/X86/bitcast-di.ll @@ -3,6 +3,8 @@ target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128" target triple = "x86_64-unknown-linux-gnu" +@x = external global [1 x [2 x <4 x float>]] + declare void @foo(i32) declare void @slowpath(i32, i32*) @@ -33,4 +35,14 @@ br label %fallthrough } +; Is DI maitained when a GEP with all zero indices gets converted to bitcast? +define void @test2() { +; CHECK-LABEL: @test2 +load.i145: +; CHECK: bitcast [1 x [2 x <4 x float>]]* @x to [2 x <4 x float>]*, !dbg ![[castLoc2:[0-9]+]] + %x_offset = getelementptr [1 x [2 x <4 x float>]], [1 x [2 x <4 x float>]]* @x, i32 0, i64 0 + ret void +} + ; CHECK: ![[castLoc]] = !DILocation(line: 2 +; CHECK: ![[castLoc2]] = !DILocation(line: 11 \ No newline at end of file