[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
Fri Aug 1 10:44:54 PDT 2025
https://github.com/tommymcm updated https://github.com/llvm/llvm-project/pull/151574
>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/3] [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/3] [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
>From a46f5fcac62ba6943122ab3b25834389b4cf133d Mon Sep 17 00:00:00 2001
From: Tommy McMichen <tommymcmichen at fb.com>
Date: Fri, 1 Aug 2025 10:07:15 -0700
Subject: [PATCH 3/3] [llvm][sroa] Re-generated checks with
update_test_check.py
---
llvm/test/Transforms/SROA/invariant-group.ll | 23 +++++++++-----------
1 file changed, 10 insertions(+), 13 deletions(-)
diff --git a/llvm/test/Transforms/SROA/invariant-group.ll b/llvm/test/Transforms/SROA/invariant-group.ll
index 4eac8fc1b48d6..9886217fb70d8 100644
--- a/llvm/test/Transforms/SROA/invariant-group.ll
+++ b/llvm/test/Transforms/SROA/invariant-group.ll
@@ -157,23 +157,23 @@ define void @partial_promotion_of_alloca() {
define void @launder_in_loop() {
; CHECK-LABEL: @launder_in_loop(
-; CHECK-NEXT: br label %[[HEADER:.*]]
+; CHECK-NEXT: br label [[HEADER:%.*]]
+; CHECK: header:
+; CHECK-NEXT: br i1 true, label [[BODY:%.*]], label [[EXIT:%.*]]
+; CHECK: body:
+; CHECK-NEXT: [[STRUCT:%.*]] = call [[T:%.*]] @[[MAKE_T:[a-zA-Z0-9_$\"\\.-]*[a-zA-Z_$\"\\.-][a-zA-Z0-9_$\"\\.-]*]]()
+; CHECK-NEXT: [[STRUCT_FCA_0_EXTRACT:%.*]] = extractvalue [[T]] [[STRUCT]], 0
+; CHECK-NEXT: [[STRUCT_FCA_1_EXTRACT:%.*]] = extractvalue [[T]] [[STRUCT]], 1
+; CHECK-NEXT: br label [[HEADER]]
+; CHECK: exit:
+; CHECK-NEXT: ret void
;
%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()
@@ -184,9 +184,6 @@ body: ; preds = %6
%second = load i32, ptr %second_ptr, align 4
br label %header
-; CHECK: [[EXIT]]:
-; CHECK-NEXT: ret void
-;
exit:
ret void
}
More information about the llvm-commits
mailing list