[llvm] [InstCombine] Copy metadata in select-to-masked.load fold (PR #211965)

via llvm-commits llvm-commits at lists.llvm.org
Sat Jul 25 16:58:53 PDT 2026


https://github.com/muhammadshayanasim1-web updated https://github.com/llvm/llvm-project/pull/211965

>From fb677d475aa9c8832c487d2d63078d0f38cb0ff8 Mon Sep 17 00:00:00 2001
From: radish <shayanasim2005 at gmail.com>
Date: Sat, 25 Jul 2026 02:35:58 +0500
Subject: [PATCH 1/4] [InstCombine] Select-to-masked.load metadata pre-commit
 test

---
 .../InstCombine/select-masked_load.ll         | 20 +++++++++++++++++++
 1 file changed, 20 insertions(+)

diff --git a/llvm/test/Transforms/InstCombine/select-masked_load.ll b/llvm/test/Transforms/InstCombine/select-masked_load.ll
index f7584c41ce641..2d4314d5284e4 100644
--- a/llvm/test/Transforms/InstCombine/select-masked_load.ll
+++ b/llvm/test/Transforms/InstCombine/select-masked_load.ll
@@ -149,6 +149,26 @@ define <vscale x 4 x float> @fold_sel_into_masked_load_scalable_one_use_check(pt
   ret <vscale x 4 x float> %sel
 }
 
+define <4 x i32> @fold_sel_into_masked_load_metadata(ptr %ptr, <4 x i1> %mask) {
+; CHECK-LABEL: @fold_sel_into_masked_load_metadata(
+; CHECK-NEXT:    [[SEL:%.*]] = call <4 x i32> @llvm.masked.load.v4i32.p0(ptr align 4 [[PTR:%.*]], <4 x i1> [[MASK:%.*]], <4 x i32> splat (i32 111))
+; CHECK-NEXT:    ret <4 x i32> [[SEL]]
+;
+  %load = call <4 x i32> @llvm.masked.load.v4i32.p0(ptr %ptr, i32 4, <4 x i1> %mask, <4 x i32> poison), !tbaa !0, !alias.scope !3, !noalias !6
+  %sel = select <4 x i1> %mask, <4 x i32> %load, <4 x i32> splat (i32 111)
+  ret <4 x i32> %sel
+}
+
+!0 = !{!1, !1, i64 0}
+!1 = !{!"int", !2, i64 0}
+!2 = !{!"omnipotent char", !8, i64 0}
+!3 = !{!4}
+!4 = distinct !{!4, !5, !"scope"}
+!5 = distinct !{!5, !"domain"}
+!6 = !{!7}
+!7 = distinct !{!7, !5, !"noscope"}
+!8 = !{!"Simple C/C++ TBAA"}
+
 declare <8 x float> @llvm.masked.load.v8f32.p0(ptr, i32 immarg, <8 x i1>, <8 x float>)
 declare <4 x i32> @llvm.masked.load.v4i32.p0(ptr, i32 immarg, <4 x i1>, <4 x i32>)
 declare <4 x float> @llvm.masked.load.v4f32.p0(ptr, i32 immarg, <4 x i1>, <4 x float>)

>From 835c5fb1510f750cd0b99f86273b1c18fa86a242 Mon Sep 17 00:00:00 2001
From: radish <shayanasim2005 at gmail.com>
Date: Sat, 25 Jul 2026 02:37:29 +0500
Subject: [PATCH 2/4] [InstCombine] Select-to-masked.load metadata fix

---
 .../Transforms/InstCombine/InstCombineSelect.cpp    | 13 ++++++++-----
 .../Transforms/InstCombine/select-masked_load.ll    |  2 +-
 2 files changed, 9 insertions(+), 6 deletions(-)

diff --git a/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp b/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp
index f107c15304d9f..0981c07254917 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp
@@ -5306,12 +5306,15 @@ Instruction *InstCombinerImpl::visitSelectInst(SelectInst &SI) {
 
   Value *MaskedLoadPtr;
   if (match(TrueVal, m_OneUse(m_MaskedLoad(m_Value(MaskedLoadPtr),
-                                           m_Specific(CondVal), m_Value()))))
-    return replaceInstUsesWith(
-        SI, Builder.CreateMaskedLoad(
+                                           m_Specific(CondVal), m_Value())))){
+
+    llvm::IntrinsicInst *OldLoad = cast<IntrinsicInst>(TrueVal);
+    Instruction* In = Builder.CreateMaskedLoad(
                 TrueVal->getType(), MaskedLoadPtr,
-                cast<IntrinsicInst>(TrueVal)->getParamAlign(0).valueOrOne(),
-                CondVal, FalseVal));
+                OldLoad->getParamAlign(0).valueOrOne(),
+                CondVal, FalseVal);
+    In->copyMetadata(*OldLoad);
+    return replaceInstUsesWith(SI, In);}
 
   // Canonicalize sign function ashr pattern: select (icmp slt X, 1), ashr X,
   // bitwidth-1, 1 -> scmp(X, 0)
diff --git a/llvm/test/Transforms/InstCombine/select-masked_load.ll b/llvm/test/Transforms/InstCombine/select-masked_load.ll
index 2d4314d5284e4..a577f26c6a01b 100644
--- a/llvm/test/Transforms/InstCombine/select-masked_load.ll
+++ b/llvm/test/Transforms/InstCombine/select-masked_load.ll
@@ -151,7 +151,7 @@ define <vscale x 4 x float> @fold_sel_into_masked_load_scalable_one_use_check(pt
 
 define <4 x i32> @fold_sel_into_masked_load_metadata(ptr %ptr, <4 x i1> %mask) {
 ; CHECK-LABEL: @fold_sel_into_masked_load_metadata(
-; CHECK-NEXT:    [[SEL:%.*]] = call <4 x i32> @llvm.masked.load.v4i32.p0(ptr align 4 [[PTR:%.*]], <4 x i1> [[MASK:%.*]], <4 x i32> splat (i32 111))
+; CHECK-NEXT:    [[SEL:%.*]] = call <4 x i32> @llvm.masked.load.v4i32.p0(ptr align 4 [[PTR:%.*]], <4 x i1> [[MASK:%.*]], <4 x i32> splat (i32 111)), !tbaa [[TBAA0:![0-9]+]], !alias.scope [[META4:![0-9]+]], !noalias [[META7:![0-9]+]]
 ; CHECK-NEXT:    ret <4 x i32> [[SEL]]
 ;
   %load = call <4 x i32> @llvm.masked.load.v4i32.p0(ptr %ptr, i32 4, <4 x i1> %mask, <4 x i32> poison), !tbaa !0, !alias.scope !3, !noalias !6

>From 01af0e80ca2ee25f8d3ab4aceafdfe580111d08f Mon Sep 17 00:00:00 2001
From: radish <shayanasim2005 at gmail.com>
Date: Sun, 26 Jul 2026 04:37:54 +0500
Subject: [PATCH 3/4] value based metadata drop test pre-commit

---
 .../Transforms/InstCombine/select-masked_load.ll     | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/llvm/test/Transforms/InstCombine/select-masked_load.ll b/llvm/test/Transforms/InstCombine/select-masked_load.ll
index a577f26c6a01b..a0fdb685eaf69 100644
--- a/llvm/test/Transforms/InstCombine/select-masked_load.ll
+++ b/llvm/test/Transforms/InstCombine/select-masked_load.ll
@@ -159,6 +159,16 @@ define <4 x i32> @fold_sel_into_masked_load_metadata(ptr %ptr, <4 x i1> %mask) {
   ret <4 x i32> %sel
 }
 
+define <vscale x 4 x i32> @fold_sel_into_masked_load_drop_metadata(ptr %loc, <vscale x 4 x i1> %mask, <vscale x 4 x i32> %passthrough) {
+; CHECK-LABEL: @fold_sel_into_masked_load_drop_metadata(
+; CHECK-NEXT:    [[SEL:%.*]] = call <vscale x 4 x i32> @llvm.masked.load.nxv4i32.p0(ptr align 1 [[LOC:%.*]], <vscale x 4 x i1> [[MASK:%.*]], <vscale x 4 x i32> [[PASSTHROUGH:%.*]]), !range [[RNG9:![0-9]+]]
+; CHECK-NEXT:    ret <vscale x 4 x i32> [[SEL]]
+;
+  %load = call <vscale x 4 x i32> @llvm.masked.load.v4i32.p0(ptr %loc, i32 1, <vscale x 4 x i1> %mask, <vscale x 4 x i32> zeroinitializer), !range !9
+  %sel = select <vscale x 4 x i1> %mask, <vscale x 4 x i32> %load, <vscale x 4 x i32> %passthrough
+  ret <vscale x 4 x i32> %sel
+}
+
 !0 = !{!1, !1, i64 0}
 !1 = !{!"int", !2, i64 0}
 !2 = !{!"omnipotent char", !8, i64 0}
@@ -168,6 +178,8 @@ define <4 x i32> @fold_sel_into_masked_load_metadata(ptr %ptr, <4 x i1> %mask) {
 !6 = !{!7}
 !7 = distinct !{!7, !5, !"noscope"}
 !8 = !{!"Simple C/C++ TBAA"}
+!9 = !{i32 0, i32 2}
+
 
 declare <8 x float> @llvm.masked.load.v8f32.p0(ptr, i32 immarg, <8 x i1>, <8 x float>)
 declare <4 x i32> @llvm.masked.load.v4i32.p0(ptr, i32 immarg, <4 x i1>, <4 x i32>)

>From ba79687aa1e4d381d98230e5f6e033c278af7e3a Mon Sep 17 00:00:00 2001
From: radish <shayanasim2005 at gmail.com>
Date: Sun, 26 Jul 2026 04:42:11 +0500
Subject: [PATCH 4/4] value based metadata drop fix

---
 .../Transforms/InstCombine/InstCombineSelect.cpp    | 13 ++++++++++++-
 .../Transforms/InstCombine/select-masked_load.ll    |  2 +-
 2 files changed, 13 insertions(+), 2 deletions(-)

diff --git a/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp b/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp
index 0981c07254917..308d39b6bea78 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp
@@ -5314,7 +5314,18 @@ Instruction *InstCombinerImpl::visitSelectInst(SelectInst &SI) {
                 OldLoad->getParamAlign(0).valueOrOne(),
                 CondVal, FalseVal);
     In->copyMetadata(*OldLoad);
-    return replaceInstUsesWith(SI, In);}
+    static const unsigned IDs[] = {LLVMContext::MD_range,
+                                   LLVMContext::MD_nonnull,
+                                   LLVMContext::MD_dereferenceable,
+                                   LLVMContext::MD_dereferenceable_or_null,
+                                   LLVMContext::MD_align,
+                                   LLVMContext::MD_noundef,
+                                   LLVMContext::MD_nofree,
+                                   LLVMContext::MD_nofpclass};
+    for (unsigned ID : IDs)
+      In->setMetadata(ID, nullptr);
+    return replaceInstUsesWith(SI, In);
+  }
 
   // Canonicalize sign function ashr pattern: select (icmp slt X, 1), ashr X,
   // bitwidth-1, 1 -> scmp(X, 0)
diff --git a/llvm/test/Transforms/InstCombine/select-masked_load.ll b/llvm/test/Transforms/InstCombine/select-masked_load.ll
index a0fdb685eaf69..cc6c48b29bf28 100644
--- a/llvm/test/Transforms/InstCombine/select-masked_load.ll
+++ b/llvm/test/Transforms/InstCombine/select-masked_load.ll
@@ -161,7 +161,7 @@ define <4 x i32> @fold_sel_into_masked_load_metadata(ptr %ptr, <4 x i1> %mask) {
 
 define <vscale x 4 x i32> @fold_sel_into_masked_load_drop_metadata(ptr %loc, <vscale x 4 x i1> %mask, <vscale x 4 x i32> %passthrough) {
 ; CHECK-LABEL: @fold_sel_into_masked_load_drop_metadata(
-; CHECK-NEXT:    [[SEL:%.*]] = call <vscale x 4 x i32> @llvm.masked.load.nxv4i32.p0(ptr align 1 [[LOC:%.*]], <vscale x 4 x i1> [[MASK:%.*]], <vscale x 4 x i32> [[PASSTHROUGH:%.*]]), !range [[RNG9:![0-9]+]]
+; CHECK-NEXT:    [[SEL:%.*]] = call <vscale x 4 x i32> @llvm.masked.load.nxv4i32.p0(ptr align 1 [[LOC:%.*]], <vscale x 4 x i1> [[MASK:%.*]], <vscale x 4 x i32> [[PASSTHROUGH:%.*]])
 ; CHECK-NEXT:    ret <vscale x 4 x i32> [[SEL]]
 ;
   %load = call <vscale x 4 x i32> @llvm.masked.load.v4i32.p0(ptr %loc, i32 1, <vscale x 4 x i1> %mask, <vscale x 4 x i32> zeroinitializer), !range !9



More information about the llvm-commits mailing list