[llvm] [JumpThreading] Copy metadata when inserting preload into preds (PR #134403)

Yingwei Zheng via llvm-commits llvm-commits at lists.llvm.org
Thu Apr 17 02:49:40 PDT 2025


https://github.com/dtcxzyw updated https://github.com/llvm/llvm-project/pull/134403

>From 447ccd294b097e23a044de543de77d627e5363fa Mon Sep 17 00:00:00 2001
From: Yingwei Zheng <dtcxzyw2333 at gmail.com>
Date: Fri, 4 Apr 2025 23:51:46 +0800
Subject: [PATCH 1/2] [JumpThreading] Copy metadata when inserting preload into
 preds

---
 llvm/lib/Transforms/Scalar/JumpThreading.cpp | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/llvm/lib/Transforms/Scalar/JumpThreading.cpp b/llvm/lib/Transforms/Scalar/JumpThreading.cpp
index ba598d8415b18..a681036ea78ee 100644
--- a/llvm/lib/Transforms/Scalar/JumpThreading.cpp
+++ b/llvm/lib/Transforms/Scalar/JumpThreading.cpp
@@ -1410,6 +1410,13 @@ bool JumpThreadingPass::simplifyPartiallyRedundantLoad(LoadInst *LoadI) {
     if (AATags)
       NewVal->setAAMetadata(AATags);
 
+    if (auto *MD = LoadI->getMetadata(LLVMContext::MD_invariant_load))
+      NewVal->setMetadata(LLVMContext::MD_invariant_load, MD);
+    if (auto *InvGroupMD = LoadI->getMetadata(LLVMContext::MD_invariant_group))
+      NewVal->setMetadata(LLVMContext::MD_invariant_group, InvGroupMD);
+    if (auto *RangeMD = LoadI->getMetadata(LLVMContext::MD_range))
+      NewVal->setMetadata(LLVMContext::MD_range, RangeMD);
+
     AvailablePreds.emplace_back(UnavailablePred, NewVal);
   }
 

>From 763c5847882246ee281e8206517c811eeb15f285 Mon Sep 17 00:00:00 2001
From: Yingwei Zheng <dtcxzyw2333 at gmail.com>
Date: Thu, 17 Apr 2025 17:48:59 +0800
Subject: [PATCH 2/2] [JumpThreading][GVN] Use `copyMetadataForLoad`

---
 llvm/lib/Transforms/Scalar/GVN.cpp           | 21 +-------------------
 llvm/lib/Transforms/Scalar/JumpThreading.cpp | 10 +---------
 llvm/lib/Transforms/Utils/Local.cpp          |  1 +
 3 files changed, 3 insertions(+), 29 deletions(-)

diff --git a/llvm/lib/Transforms/Scalar/GVN.cpp b/llvm/lib/Transforms/Scalar/GVN.cpp
index 6233e8e2ee681..31bdbc95fc277 100644
--- a/llvm/lib/Transforms/Scalar/GVN.cpp
+++ b/llvm/lib/Transforms/Scalar/GVN.cpp
@@ -1516,26 +1516,7 @@ void GVNPass::eliminatePartiallyRedundantLoad(
         MSSAU->insertUse(cast<MemoryUse>(NewAccess), /*RenameUses=*/true);
     }
 
-    // Transfer the old load's AA tags to the new load.
-    AAMDNodes Tags = Load->getAAMetadata();
-    if (Tags)
-      NewLoad->setAAMetadata(Tags);
-
-    if (auto *MD = Load->getMetadata(LLVMContext::MD_invariant_load))
-      NewLoad->setMetadata(LLVMContext::MD_invariant_load, MD);
-    if (auto *InvGroupMD = Load->getMetadata(LLVMContext::MD_invariant_group))
-      NewLoad->setMetadata(LLVMContext::MD_invariant_group, InvGroupMD);
-    if (auto *RangeMD = Load->getMetadata(LLVMContext::MD_range))
-      NewLoad->setMetadata(LLVMContext::MD_range, RangeMD);
-    if (auto *AccessMD = Load->getMetadata(LLVMContext::MD_access_group))
-      if (LI->getLoopFor(Load->getParent()) == LI->getLoopFor(UnavailableBlock))
-        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
-    // table.
-    // FIXME: How do we retain source locations without causing poor debugging
-    // behavior?
+    copyMetadataForLoad(*NewLoad, *Load);
 
     // Add the newly created load.
     ValuesPerBlock.push_back(
diff --git a/llvm/lib/Transforms/Scalar/JumpThreading.cpp b/llvm/lib/Transforms/Scalar/JumpThreading.cpp
index a681036ea78ee..8d790648c2ef9 100644
--- a/llvm/lib/Transforms/Scalar/JumpThreading.cpp
+++ b/llvm/lib/Transforms/Scalar/JumpThreading.cpp
@@ -1407,15 +1407,7 @@ bool JumpThreadingPass::simplifyPartiallyRedundantLoad(LoadInst *LoadI) {
         LoadI->getOrdering(), LoadI->getSyncScopeID(),
         UnavailablePred->getTerminator()->getIterator());
     NewVal->setDebugLoc(LoadI->getDebugLoc());
-    if (AATags)
-      NewVal->setAAMetadata(AATags);
-
-    if (auto *MD = LoadI->getMetadata(LLVMContext::MD_invariant_load))
-      NewVal->setMetadata(LLVMContext::MD_invariant_load, MD);
-    if (auto *InvGroupMD = LoadI->getMetadata(LLVMContext::MD_invariant_group))
-      NewVal->setMetadata(LLVMContext::MD_invariant_group, InvGroupMD);
-    if (auto *RangeMD = LoadI->getMetadata(LLVMContext::MD_range))
-      NewVal->setMetadata(LLVMContext::MD_range, RangeMD);
+    copyMetadataForLoad(*NewVal, *LoadI);
 
     AvailablePreds.emplace_back(UnavailablePred, NewVal);
   }
diff --git a/llvm/lib/Transforms/Utils/Local.cpp b/llvm/lib/Transforms/Utils/Local.cpp
index 2f3ea2266e07f..fab45b1dfb088 100644
--- a/llvm/lib/Transforms/Utils/Local.cpp
+++ b/llvm/lib/Transforms/Utils/Local.cpp
@@ -3468,6 +3468,7 @@ void llvm::copyMetadataForLoad(LoadInst &Dest, const LoadInst &Source) {
     case LLVMContext::MD_fpmath:
     case LLVMContext::MD_tbaa_struct:
     case LLVMContext::MD_invariant_load:
+    case LLVMContext::MD_invariant_group:
     case LLVMContext::MD_alias_scope:
     case LLVMContext::MD_noalias:
     case LLVMContext::MD_nontemporal:



More information about the llvm-commits mailing list