Index: lib/Transforms/InstCombine/InstCombineCasts.cpp =================================================================== --- lib/Transforms/InstCombine/InstCombineCasts.cpp +++ lib/Transforms/InstCombine/InstCombineCasts.cpp @@ -282,8 +282,10 @@ // condition may inhibit other folds and lead to worse codegen. auto *Cmp = dyn_cast(Sel->getCondition()); if (!Cmp || Cmp->getOperand(0)->getType() != Sel->getType()) - if (Instruction *NV = FoldOpIntoSelect(CI, Sel)) + if (Instruction *NV = FoldOpIntoSelect(CI, Sel)) { + replaceAllDbgUsesWith(*Sel, *NV, CI, DT); return NV; + } } // If we are casting a PHI, then fold the cast into the PHI. Index: test/Transforms/InstCombine/debuginfo-variables.ll =================================================================== --- test/Transforms/InstCombine/debuginfo-variables.ll +++ test/Transforms/InstCombine/debuginfo-variables.ll @@ -26,6 +26,17 @@ ret i64 %c2 } +define i32 @test_cast_select(i1 %cond) { +; CHECK-LABEL: @test_cast_select( +; CHECK-NEXT: [[sel:%.*]] = select i1 %cond, i32 3, i32 5 +; CHECK-NEXT: call void @llvm.dbg.value(metadata i32 [[sel]], {{.*}}, metadata !DIExpression()) +; CHECK-NEXT: call void @llvm.dbg.value(metadata i32 [[sel]], {{.*}}, metadata !DIExpression()) +; CHECK-NEXT: ret i32 [[sel]] + %sel = select i1 %cond, i16 3, i16 5 + %cast = zext i16 %sel to i32 + ret i32 %cast +} + define void @test_or(i64 %A) { ; CHECK-LABEL: @test_or( ; CHECK-NEXT: call void @llvm.dbg.value(metadata i64 %A, {{.*}}, metadata !DIExpression(DW_OP_constu, 256, DW_OP_or, DW_OP_stack_value))