[llvm] [llvm][sroa] Fixed failing assertion caused by no handling for `{launder, strip}.invariant.group` in `AggLoadStoreRewriter` (PR #151574)
via llvm-commits
llvm-commits at lists.llvm.org
Thu Jul 31 11:32:19 PDT 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-llvm-transforms
Author: Tommy Má¶œMichen (tommymcm)
<details>
<summary>Changes</summary>
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.
---
Full diff: https://github.com/llvm/llvm-project/pull/151574.diff
2 Files Affected:
- (modified) llvm/lib/Transforms/Scalar/SROA.cpp (+6)
- (modified) llvm/test/Transforms/SROA/invariant-group.ll (+38)
``````````diff
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
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 = !{}
``````````
</details>
https://github.com/llvm/llvm-project/pull/151574
More information about the llvm-commits
mailing list