Index: llvm/trunk/lib/Transforms/Utils/Local.cpp =================================================================== --- llvm/trunk/lib/Transforms/Utils/Local.cpp +++ llvm/trunk/lib/Transforms/Utils/Local.cpp @@ -1666,11 +1666,10 @@ }; if (auto *CI = dyn_cast(&I)) { - if (!CI->isNoopCast(DL)) - return nullptr; - - // No-op casts are irrelevant for debug info. - return SrcDIExpr; + // No-op casts and zexts are irrelevant for debug info. + if (CI->isNoopCast(DL) || isa(&I)) + return SrcDIExpr; + return nullptr; } else if (auto *GEP = dyn_cast(&I)) { unsigned BitWidth = M.getDataLayout().getIndexSizeInBits(GEP->getPointerAddressSpace()); Index: llvm/trunk/test/Transforms/InstCombine/cast-mul-select.ll =================================================================== --- llvm/trunk/test/Transforms/InstCombine/cast-mul-select.ll +++ llvm/trunk/test/Transforms/InstCombine/cast-mul-select.ll @@ -170,3 +170,12 @@ unreachable } +; Check that we don't drop debug info when a zext is removed. +define i1 @foo(i1 zeroext %b) { +; DBGINFO-LABEL: @foo( +; DBGINFO-NEXT: call void @llvm.dbg.value(metadata i1 %b +; DBGINFO-NEXT: ret i1 %b + + %frombool = zext i1 %b to i8 + ret i1 %b +}