[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