Index: lib/Transforms/Utils/Local.cpp =================================================================== --- lib/Transforms/Utils/Local.cpp +++ lib/Transforms/Utils/Local.cpp @@ -2020,7 +2020,14 @@ // Also, if the condition is undefined, then we make the choice most // beneficial to the optimizer, and choose that to also be unreachable. if (auto *II = dyn_cast(&I)) { - if (II->getIntrinsicID() == Intrinsic::assume) { + auto IntrinsicID = II->getIntrinsicID(); + // Skip debug info intrinsics. + if (IntrinsicID == Intrinsic::dbg_addr || + IntrinsicID == Intrinsic::dbg_value || + IntrinsicID == Intrinsic::dbg_declare || + IntrinsicID == Intrinsic::dbg_label) + continue; + if (IntrinsicID == Intrinsic::assume) { if (match(II->getArgOperand(0), m_CombineOr(m_Zero(), m_Undef()))) { // Don't insert a call to llvm.trap right before the unreachable. changeToUnreachable(II, false, false, DDT); @@ -2029,7 +2036,7 @@ } } - if (II->getIntrinsicID() == Intrinsic::experimental_guard) { + if (IntrinsicID == Intrinsic::experimental_guard) { // A call to the guard intrinsic bails out of the current compilation // unit if the predicate passed to it is false. If the predicate is a // constant false, then we know the guard will bail out of the current @@ -2068,12 +2075,11 @@ } break; } - } + } else if (auto *SI = dyn_cast(&I)) { + // Store to undef and store to null are undefined and used to signal + // that they should be changed to unreachable by passes that can't + // modify the CFG. - // Store to undef and store to null are undefined and used to signal that - // they should be changed to unreachable by passes that can't modify the - // CFG. - if (auto *SI = dyn_cast(&I)) { // Don't touch volatile stores. if (SI->isVolatile()) continue;