diff --git a/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp b/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp --- a/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp +++ b/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp @@ -2137,8 +2137,14 @@ if (PropagateShadow) { std::tie(ShadowPtr, OriginPtr) = getShadowOriginPtr(Addr, IRB, ShadowTy, Alignment, /*isStore*/ false); - setShadow(&I, - IRB.CreateAlignedLoad(ShadowTy, ShadowPtr, Alignment, "_msld")); + if (I.getMetadata(LLVMContext::MD_noundef)) { + insertShadowCheck( + IRB.CreateAlignedLoad(ShadowTy, ShadowPtr, Alignment, "_msld"), &I); + setShadow(&I, getCleanShadow(&I)); + } else { + setShadow( + &I, IRB.CreateAlignedLoad(ShadowTy, ShadowPtr, Alignment, "_msld")); + } } else { setShadow(&I, getCleanShadow(&I)); }