[llvm] [llvm][sroa] Fixed failing assertion caused by no handling for `{launder, strip}.invariant.group` in `AggLoadStoreRewriter` (PR #151574)
Tommy Má¶œMichen via llvm-commits
llvm-commits at lists.llvm.org
Thu Jul 31 11:31:31 PDT 2025
https://github.com/tommymcm created https://github.com/llvm/llvm-project/pull/151574
Added test for `launder.invariant.group` intrinsic inside of a loop, which causes a failing assertion on debug build:
```
void (anonymous namespace)::AllocaSlices::SliceBuilder::visitStoreInst(StoreInst &):
Assertion `(!SI.isSimple() || ValOp->getType()->isSingleValueType()) &&
"All simple FCA stores should have been pre-split"' failed.
```
This is fixed by adding handling to the `AggLoadStoreRewriter` for `{launder,strip}.invariant.group` intrinsic.
>From 059b1bbc06422d4941e67fee59a0f7a86a2aa7e0 Mon Sep 17 00:00:00 2001
From: Tommy McMichen <tommymcmichen at fb.com>
Date: Thu, 31 Jul 2025 11:08:14 -0700
Subject: [PATCH 1/2] [llvm][sroa] Added test for `launder.invariant.group`
inside of loop
---
llvm/test/Transforms/SROA/invariant-group.ll | 38 ++++++++++++++++++++
1 file changed, 38 insertions(+)
diff --git a/llvm/test/Transforms/SROA/invariant-group.ll b/llvm/test/Transforms/SROA/invariant-group.ll
index 1be6f6e2fc32b..4eac8fc1b48d6 100644
--- a/llvm/test/Transforms/SROA/invariant-group.ll
+++ b/llvm/test/Transforms/SROA/invariant-group.ll
@@ -155,6 +155,44 @@ define void @partial_promotion_of_alloca() {
ret void
}
+define void @launder_in_loop() {
+; CHECK-LABEL: @launder_in_loop(
+; CHECK-NEXT: br label %[[HEADER:.*]]
+;
+ %struct_ptr = alloca %t, i64 1, align 4
+ br label %header
+
+; CHECK: [[HEADER]]:
+; CHECK-NEXT: br i1 true, label %[[BODY:.*]], label %[[EXIT:.*]]
+;
+header:
+ br i1 true, label %body, label %exit
+
+; CHECK: [[BODY]]:
+; CHECK-NEXT: [[STRUCT:%.*]] = call %t @make_t()
+; CHECK-NEXT: [[FIRST:%.*]] = extractvalue %t [[STRUCT]], 0
+; CHECK-NEXT: [[SECOND:%.*]] = extractvalue %t [[STRUCT]], 1
+; CHECK-NEXT: br label %[[HEADER]]
+;
+body: ; preds = %6
+ %struct_ptr_fresh = call ptr @llvm.launder.invariant.group.p0(ptr %struct_ptr)
+ %struct = call %t @make_t()
+ store %t %struct, ptr %struct_ptr_fresh, align 4, !invariant.group !0
+ %first_ptr = getelementptr %t, ptr %struct_ptr_fresh, i32 0, i32 0
+ %first = load i32, ptr %first_ptr, align 4
+ %second_ptr = getelementptr %t, ptr %struct_ptr_fresh, i32 0, i32 1
+ %second = load i32, ptr %second_ptr, align 4
+ br label %header
+
+; CHECK: [[EXIT]]:
+; CHECK-NEXT: ret void
+;
+exit:
+ ret void
+}
+
+declare %t @make_t()
+
declare void @use(ptr)
!0 = !{}
>From 1c2e217e8e08f77712638d44696ce606b9540915 Mon Sep 17 00:00:00 2001
From: Tommy McMichen <tommymcmichen at fb.com>
Date: Thu, 31 Jul 2025 11:11:34 -0700
Subject: [PATCH 2/2] [llvm][sroa] Added pass-through handling for
launder/strip invariant group intrinsic in `AggLoadStoreRewriter`
---
llvm/lib/Transforms/Scalar/SROA.cpp | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/llvm/lib/Transforms/Scalar/SROA.cpp b/llvm/lib/Transforms/Scalar/SROA.cpp
index 23256cf2acbd2..821b41f0583f3 100644
--- a/llvm/lib/Transforms/Scalar/SROA.cpp
+++ b/llvm/lib/Transforms/Scalar/SROA.cpp
@@ -4261,6 +4261,12 @@ class AggLoadStoreRewriter : public InstVisitor<AggLoadStoreRewriter, bool> {
enqueueUsers(SI);
return false;
}
+
+ bool visitIntrinsicInst(IntrinsicInst &II) {
+ if (II.isLaunderOrStripInvariantGroup())
+ enqueueUsers(II);
+ return false;
+ }
};
} // end anonymous namespace
More information about the llvm-commits
mailing list