diff --git a/llvm/lib/Transforms/Scalar/GVN.cpp b/llvm/lib/Transforms/Scalar/GVN.cpp --- a/llvm/lib/Transforms/Scalar/GVN.cpp +++ b/llvm/lib/Transforms/Scalar/GVN.cpp @@ -1406,6 +1406,10 @@ NewLoad->setMetadata(LLVMContext::MD_invariant_group, InvGroupMD); if (auto *RangeMD = LI->getMetadata(LLVMContext::MD_range)) NewLoad->setMetadata(LLVMContext::MD_range, RangeMD); + if (auto *AccessMD = LI->getMetadata(LLVMContext::MD_access_group)) + if (this->LI && this->LI->getLoopFor(LI->getParent()) == + this->LI->getLoopFor(UnavailablePred)) + NewLoad->setMetadata(LLVMContext::MD_access_group, AccessMD); // We do not propagate the old load's debug location, because the new // load now lives in a different BB, and we want to avoid a jumpy line diff --git a/llvm/test/Transforms/GVN/PRE/load-pre-metadata-accsess-group.ll b/llvm/test/Transforms/GVN/PRE/load-pre-metadata-accsess-group.ll --- a/llvm/test/Transforms/GVN/PRE/load-pre-metadata-accsess-group.ll +++ b/llvm/test/Transforms/GVN/PRE/load-pre-metadata-accsess-group.ll @@ -20,7 +20,7 @@ ; CHECK-NEXT: [[EXITCOND:%.*]] = icmp ne i64 [[INDVARS_IV_NEXT]], 100 ; CHECK-NEXT: br i1 [[EXITCOND]], label [[FOR_BODY_FOR_BODY_CRIT_EDGE]], label [[FOR_END:%.*]] ; CHECK: for.body.for.body_crit_edge: -; CHECK-NEXT: [[DOTPRE]] = load i32, i32* [[IDX]], align 4 +; CHECK-NEXT: [[DOTPRE]] = load i32, i32* [[IDX]], align 4, !llvm.access.group !0 ; CHECK-NEXT: br label [[FOR_BODY]] ; CHECK: for.end: ; CHECK-NEXT: ret void @@ -68,7 +68,7 @@ ; CHECK-NEXT: store i32 [[MUL]], i32* [[AA]], align 4, !llvm.access.group !1 ; CHECK-NEXT: br i1 true, label [[FOR_BODY2_FOR_BODY2_CRIT_EDGE]], label [[FOR_END:%.*]] ; CHECK: for.body2.for.body2_crit_edge: -; CHECK-NEXT: [[DOTPRE1]] = load i32, i32* [[IDX]], align 4 +; CHECK-NEXT: [[DOTPRE1]] = load i32, i32* [[IDX]], align 4, !llvm.access.group !1 ; CHECK-NEXT: br label [[FOR_BODY2]] ; CHECK: for.end: ; CHECK-NEXT: br i1 false, label [[FOR_END_FOR_BODY_CRIT_EDGE:%.*]], label [[END:%.*]]