[llvm] [LSROA] Add logical SROA pass (PR #192058)
Nikita Popov via llvm-commits
llvm-commits at lists.llvm.org
Wed Jul 15 02:07:21 PDT 2026
Nathan =?utf-8?q?Gauër?= <brioche at google.com>,
Nathan =?utf-8?q?Gauër?= <brioche at google.com>,
Nathan =?utf-8?q?Gauër?= <brioche at google.com>,
Nathan =?utf-8?q?Gauër?= <brioche at google.com>,
Nathan =?utf-8?q?Gauër?= <brioche at google.com>,
Nathan =?utf-8?q?Gauër?= <brioche at google.com>,
Nathan =?utf-8?q?Gauër?= <brioche at google.com>,
Nathan =?utf-8?q?Gauër?= <brioche at google.com>,
Nathan =?utf-8?q?Gauër?= <brioche at google.com>,
Nathan =?utf-8?q?Gauër?= <brioche at google.com>,
Nathan =?utf-8?q?Gauër?= <brioche at google.com>,
Nathan =?utf-8?q?Gauër?= <brioche at google.com>,
Nathan =?utf-8?q?Gauër?= <brioche at google.com>,
Nathan =?utf-8?q?Gauër?= <brioche at google.com>,
Nathan =?utf-8?q?Gauër?= <brioche at google.com>,
Nathan =?utf-8?q?Gauër?= <brioche at google.com>,
Nathan =?utf-8?q?Gauër?= <brioche at google.com>,
Nathan =?utf-8?q?Gauër?= <brioche at google.com>,
Nathan =?utf-8?q?Gauër?= <brioche at google.com>,
Nathan =?utf-8?q?Gauër?= <brioche at google.com>,
Nathan =?utf-8?q?Gauër?= <brioche at google.com>,
Nathan =?utf-8?q?Gauër?= <brioche at google.com>,
Nathan =?utf-8?q?Gauër?= <brioche at google.com>
Message-ID:
In-Reply-To: <llvm.org/llvm/llvm-project/pull/192058 at github.com>
================
@@ -0,0 +1,152 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6
+; RUN: opt < %s -passes='logical-sroa' -S | FileCheck %s --check-prefixes=CHECK
+
+declare void @llvm.lifetime.start.p0(ptr nocapture)
+declare void @llvm.lifetime.end.p0(ptr nocapture)
+declare ptr @llvm.structured.alloca.p0()
+declare ptr @llvm.structured.gep.p0(ptr, ...)
+
+define i32 @test_simple_scalar() {
+; CHECK-LABEL: define i32 @test_simple_scalar() {
+; CHECK-NEXT: [[ENTRY:.*:]]
+; CHECK-NEXT: [[TMP:%.*]] = call elementtype(i32) ptr @llvm.structured.alloca.p0()
+; CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr [[TMP]])
+; CHECK-NEXT: store i32 0, ptr [[TMP]], align 4
+; CHECK-NEXT: [[RES:%.*]] = load i32, ptr [[TMP]], align 4
+; CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr [[TMP]])
+; CHECK-NEXT: ret i32 [[RES]]
+;
+entry:
+ %tmp = call elementtype(i32) ptr @llvm.structured.alloca.p0()
+ call void @llvm.lifetime.start.p0(ptr %tmp)
+ store i32 0, ptr %tmp
+ %res = load i32, ptr %tmp
+ call void @llvm.lifetime.end.p0(ptr %tmp)
+ ret i32 %res
+}
+
+define i32 @test_simple_struct_entire_write_read() {
+; CHECK-LABEL: define i32 @test_simple_struct_entire_write_read() {
+; CHECK-NEXT: [[ENTRY:.*:]]
+; CHECK-NEXT: [[TMP0:%.*]] = call elementtype(i32) ptr @llvm.structured.alloca.p0()
+; CHECK-NEXT: [[TMP1:%.*]] = call elementtype(i32) ptr @llvm.structured.alloca.p0()
+; CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr [[TMP0]])
+; CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr [[TMP1]])
+; CHECK-NEXT: store i32 0, ptr [[TMP0]], align 4
+; CHECK-NEXT: store i32 1, ptr [[TMP1]], align 4
+; CHECK-NEXT: [[A:%.*]] = load i32, ptr [[TMP0]], align 4
+; CHECK-NEXT: [[B:%.*]] = load i32, ptr [[TMP1]], align 4
+; CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr [[TMP0]])
+; CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr [[TMP1]])
+; CHECK-NEXT: [[RES:%.*]] = add i32 [[A]], [[B]]
+; CHECK-NEXT: ret i32 [[RES]]
+;
+entry:
+ %tmp = call elementtype({ i32, i32 }) ptr @llvm.structured.alloca.p0()
+ %ptr0 = call ptr (ptr, ...) @llvm.structured.gep.p0(ptr elementtype({ i32, i32 }) %tmp, i32 0)
+ %ptr1 = call ptr (ptr, ...) @llvm.structured.gep.p0(ptr elementtype({ i32, i32 }) %tmp, i32 1)
+
+ call void @llvm.lifetime.start.p0(ptr %tmp)
+ store i32 0, ptr %ptr0
+ store i32 1, ptr %ptr1
+ %a = load i32, ptr %ptr0
+ %b = load i32, ptr %ptr1
+ call void @llvm.lifetime.end.p0(ptr %tmp)
+
+ %res = add i32 %a, %b
+ ret i32 %res
+
+
----------------
nikic wrote:
nit: Unnecessary spaces.
https://github.com/llvm/llvm-project/pull/192058
More information about the llvm-commits
mailing list