[llvm] [memcpyopt] handle memcpy from memset in more cases (PR #140954)
via llvm-commits
llvm-commits at lists.llvm.org
Mon Jun 2 01:27:50 PDT 2025
================
@@ -187,6 +187,54 @@ define void @test_write_before_memset_in_both_regions(ptr %result) {
ret void
}
+define void @test_offset_memset(ptr %result) {
+; CHECK-LABEL: @test_offset_memset(
+; CHECK-NEXT: [[A1:%.*]] = alloca [4 x i32], align 8
+; CHECK-NEXT: [[A:%.*]] = getelementptr i32, ptr [[A1]], i32 1
+; CHECK-NEXT: call void @llvm.memset.p0.i64(ptr align 8 [[A]], i8 0, i64 12, i1 false)
+; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i8, ptr [[RESULT:%.*]], i64 4
+; CHECK-NEXT: call void @llvm.memset.p0.i64(ptr [[TMP1]], i8 0, i64 8, i1 false)
+; CHECK-NEXT: ret void
+;
+ %a = alloca [ 4 x i32 ], align 8
+ %b = getelementptr i32, ptr %a, i32 1
+ call void @llvm.memset.p0.i64(ptr align 8 %b, i8 0, i64 12, i1 false)
+ call void @llvm.memcpy.p0.p0.i64(ptr %result, ptr align 8 %a, i64 12, i1 false)
+ ret void
+}
+
+define void @test_offset_memsetcpy(ptr %result) {
+; CHECK-LABEL: @test_offset_memsetcpy(
+; CHECK-NEXT: [[A1:%.*]] = alloca [4 x i32], align 8
+; CHECK-NEXT: [[A:%.*]] = getelementptr i32, ptr [[A1]], i32 1
+; CHECK-NEXT: call void @llvm.memset.p0.i64(ptr align 8 [[A1]], i8 0, i64 12, i1 false)
+; CHECK-NEXT: call void @llvm.memset.p0.i64(ptr [[RESULT:%.*]], i8 0, i64 8, i1 false)
+; CHECK-NEXT: ret void
+;
+ %a = alloca [ 4 x i32 ], align 8
+ %b = getelementptr i32, ptr %a, i32 1
----------------
dianqk wrote:
```suggestion
%a = alloca [16 x i8], align 8
%b = getelementptr i8, ptr %a, i32 4
```
https://github.com/llvm/llvm-project/pull/140954
More information about the llvm-commits
mailing list