[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