diff --git a/llvm/lib/Transforms/Utils/Local.cpp b/llvm/lib/Transforms/Utils/Local.cpp index b32ed2a8c657f..c0d95694eb06e 100644 --- a/llvm/lib/Transforms/Utils/Local.cpp +++ b/llvm/lib/Transforms/Utils/Local.cpp @@ -2682,8 +2682,10 @@ void llvm::combineMetadata(Instruction *K, const Instruction *J, K->setMetadata(Kind, MDNode::getMostGenericFPMath(JMD, KMD)); break; case LLVMContext::MD_invariant_load: - // Only set the !invariant.load if it is present in both instructions. - K->setMetadata(Kind, JMD); + // If K moves, only set the !invariant.load if it is present in both + // instructions. + if (DoesKMove) + K->setMetadata(Kind, JMD); break; case LLVMContext::MD_nonnull: if (DoesKMove || !K->hasMetadata(LLVMContext::MD_noundef)) diff --git a/llvm/test/Transforms/GVN/PRE/invariant-load.ll b/llvm/test/Transforms/GVN/PRE/invariant-load.ll index 3d0102629e621..79cf95155c70c 100644 --- a/llvm/test/Transforms/GVN/PRE/invariant-load.ll +++ b/llvm/test/Transforms/GVN/PRE/invariant-load.ll @@ -187,7 +187,7 @@ define i32 @metadata_preservation(ptr nocapture %p, ptr nocapture %q) { ; CHECK-LABEL: define i32 @metadata_preservation ; CHECK-SAME: (ptr nocapture [[P:%.*]], ptr nocapture [[Q:%.*]]) { ; CHECK-NEXT: entry: -; CHECK-NEXT: [[X:%.*]] = load i32, ptr [[P]], align 4 +; CHECK-NEXT: [[X:%.*]] = load i32, ptr [[P]], align 4, !invariant.load !0 ; CHECK-NEXT: [[ADD:%.*]] = add i32 [[X]], [[X]] ; CHECK-NEXT: ret i32 [[ADD]] ;