Skip to content

Commit 780d723

Browse files
committed
[SROA] Pre-commit test cases involving aggregates with non-byte sized types
The bugfix in commit 54067c5, related to llvm#64081 limited the ability of SROA to handle non byte-sized types when used in aggregates that are memcpy'd. Adding some test cases involving tbaa.struct annotations that might allow us to eliminate more memcpy/alloca.
1 parent b8dca4f commit 780d723

File tree

1 file changed

+80
-0
lines changed

1 file changed

+80
-0
lines changed

llvm/test/Transforms/SROA/pr64081.ll

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,3 +30,83 @@ bb:
3030
declare void @use(ptr)
3131

3232
declare void @llvm.memcpy.p0.p0.i64(ptr noalias nocapture writeonly, ptr noalias nocapture readonly, i64, i1 immarg)
33+
34+
35+
; No unions or overlaps in the tbaa.struct. So we can rely on the types
36+
define void @test2(i3 %x) {
37+
; CHECK-LABEL: define void @test2(
38+
; CHECK-SAME: i3 [[X:%.*]]) {
39+
; CHECK-NEXT: bb:
40+
; CHECK-NEXT: [[RES:%.*]] = alloca [[B:%.*]], align 8
41+
; CHECK-NEXT: [[TMP_SROA_0:%.*]] = alloca i1, align 8
42+
; CHECK-NEXT: [[TMP_SROA_2:%.*]] = alloca i3, align 1
43+
; CHECK-NEXT: store i1 true, ptr [[TMP_SROA_0]], align 8
44+
; CHECK-NEXT: store i3 [[X]], ptr [[TMP_SROA_2]], align 1
45+
; CHECK-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 1 [[RES]], ptr align 8 [[TMP_SROA_0]], i64 1, i1 false), !tbaa.struct [[TBAA_STRUCT0:![0-9]+]]
46+
; CHECK-NEXT: [[TMP_SROA_2_0_RES_SROA_IDX:%.*]] = getelementptr inbounds i8, ptr [[RES]], i64 1
47+
; CHECK-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 1 [[TMP_SROA_2_0_RES_SROA_IDX]], ptr align 1 [[TMP_SROA_2]], i64 1, i1 false), !tbaa.struct [[TBAA_STRUCT7:![0-9]+]]
48+
; CHECK-NEXT: [[TMP0:%.*]] = call i8 @use(ptr [[RES]])
49+
; CHECK-NEXT: ret void
50+
;
51+
bb:
52+
%res = alloca %B
53+
%tmp = alloca %B
54+
%tmp.1 = getelementptr i8, ptr %tmp, i64 1
55+
store i1 1, ptr %tmp
56+
store i3 %x, ptr %tmp.1
57+
call void @llvm.memcpy.p0.p0.i64(ptr %res, ptr %tmp, i64 2, i1 false), !tbaa.struct !6
58+
call i8 @use(ptr %res)
59+
ret void
60+
}
61+
62+
; Union preventing SROA from removing the memcpy for the first byte.
63+
define void @test3(i3 %x) {
64+
; CHECK-LABEL: define void @test3(
65+
; CHECK-SAME: i3 [[X:%.*]]) {
66+
; CHECK-NEXT: bb:
67+
; CHECK-NEXT: [[RES:%.*]] = alloca [[B:%.*]], align 8
68+
; CHECK-NEXT: [[TMP_SROA_0:%.*]] = alloca i1, align 8
69+
; CHECK-NEXT: [[TMP_SROA_2:%.*]] = alloca i3, align 1
70+
; CHECK-NEXT: store i1 true, ptr [[TMP_SROA_0]], align 8
71+
; CHECK-NEXT: store i3 [[X]], ptr [[TMP_SROA_2]], align 1
72+
; CHECK-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 1 [[RES]], ptr align 8 [[TMP_SROA_0]], i64 1, i1 false), !tbaa.struct [[TBAA_STRUCT8:![0-9]+]]
73+
; CHECK-NEXT: [[TMP_SROA_2_0_RES_SROA_IDX:%.*]] = getelementptr inbounds i8, ptr [[RES]], i64 1
74+
; CHECK-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 1 [[TMP_SROA_2_0_RES_SROA_IDX]], ptr align 1 [[TMP_SROA_2]], i64 1, i1 false), !tbaa.struct [[TBAA_STRUCT7]]
75+
; CHECK-NEXT: [[TMP0:%.*]] = call i8 @use(ptr [[RES]])
76+
; CHECK-NEXT: ret void
77+
;
78+
bb:
79+
%res = alloca %B
80+
%tmp = alloca %B
81+
%tmp.1 = getelementptr i8, ptr %tmp, i64 1
82+
store i1 1, ptr %tmp
83+
store i3 %x, ptr %tmp.1
84+
call void @llvm.memcpy.p0.p0.i64(ptr %res, ptr %tmp, i64 2, i1 false), !tbaa.struct !9
85+
call i8 @use(ptr %res)
86+
ret void
87+
}
88+
89+
!1 = !{!"_BitInt(7)", !4, i64 0}
90+
!2 = !{!"_BitInt(1)", !4, i64 0}
91+
!3 = !{!"_BitInt(3)", !4, i64 0}
92+
!4 = !{!"omnipotent char", !5, i64 0}
93+
!5 = !{!"Simple C++ TBAA"}
94+
!6 = !{i64 0, i64 1, !7, i64 1, i64 1, !8}
95+
!7 = !{!2, !2, i64 0}
96+
!8 = !{!3, !3, i64 0}
97+
!9 = !{i64 0, i64 1, !10, i64 0, i64 1, !7, i64 1, i64 1, !8}
98+
!10 = !{!1, !1, i64 0}
99+
100+
;.
101+
; CHECK: [[TBAA_STRUCT0]] = !{i64 0, i64 1, [[META1:![0-9]+]], i64 1, i64 1, [[META5:![0-9]+]]}
102+
; CHECK: [[META1]] = !{[[META2:![0-9]+]], [[META2]], i64 0}
103+
; CHECK: [[META2]] = !{!"_BitInt(1)", [[META3:![0-9]+]], i64 0}
104+
; CHECK: [[META3]] = !{!"omnipotent char", [[META4:![0-9]+]], i64 0}
105+
; CHECK: [[META4]] = !{!"Simple C++ TBAA"}
106+
; CHECK: [[META5]] = !{[[META6:![0-9]+]], [[META6]], i64 0}
107+
; CHECK: [[META6]] = !{!"_BitInt(3)", [[META3]], i64 0}
108+
; CHECK: [[TBAA_STRUCT7]] = !{i64 0, i64 1, [[META5]]}
109+
; CHECK: [[TBAA_STRUCT8]] = !{i64 0, i64 1, [[META9:![0-9]+]], i64 0, i64 1, [[META1]], i64 1, i64 1, [[META5]]}
110+
; CHECK: [[META9]] = !{[[META10:![0-9]+]], [[META10]], i64 0}
111+
; CHECK: [[META10]] = !{!"_BitInt(7)", [[META3]], i64 0}
112+
;.

0 commit comments

Comments
 (0)