Skip to content

Commit 2884d04

Browse files
committed
[SROA] Add additional tests for splitting up ops with !tbaa.struct.
1 parent 0d72f0b commit 2884d04

File tree

1 file changed

+107
-0
lines changed

1 file changed

+107
-0
lines changed
Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
2+
; RUN: opt -p sroa -S %s | FileCheck %s
3+
4+
define void @load_store_transfer_split_struct_tbaa_2_float(ptr dereferenceable(24) %res, float %a, float %b) {
5+
; CHECK-LABEL: define void @load_store_transfer_split_struct_tbaa_2_float(
6+
; CHECK-SAME: ptr dereferenceable(24) [[RES:%.*]], float [[A:%.*]], float [[B:%.*]]) {
7+
; CHECK-NEXT: entry:
8+
; CHECK-NEXT: [[TMP0:%.*]] = bitcast float [[A]] to i32
9+
; CHECK-NEXT: [[TMP1:%.*]] = bitcast float [[B]] to i32
10+
; CHECK-NEXT: store i32 [[TMP0]], ptr [[RES]], align 4
11+
; CHECK-NEXT: [[RES_SROA_IDX:%.*]] = getelementptr inbounds i8, ptr [[RES]], i64 4
12+
; CHECK-NEXT: store i32 [[TMP1]], ptr [[RES_SROA_IDX]], align 4
13+
; CHECK-NEXT: [[P:%.*]] = load ptr, ptr [[RES]], align 8
14+
; CHECK-NEXT: ret void
15+
;
16+
entry:
17+
%tmp = alloca { float, float }, align 4
18+
store float %a, ptr %tmp, align 4
19+
%tmp.4 = getelementptr inbounds i8, ptr %tmp, i64 4
20+
store float %b, ptr %tmp.4, align 4
21+
%l1 = load i64, ptr %tmp, !tbaa.struct !0
22+
store i64 %l1, ptr %res, !tbaa.struct !0
23+
%p = load ptr, ptr %res, align 8
24+
ret void
25+
}
26+
27+
define void @memcpy_transfer(ptr dereferenceable(24) %res, float %a, float %b) {
28+
; CHECK-LABEL: define void @memcpy_transfer(
29+
; CHECK-SAME: ptr dereferenceable(24) [[RES:%.*]], float [[A:%.*]], float [[B:%.*]]) {
30+
; CHECK-NEXT: entry:
31+
; CHECK-NEXT: [[L_PTR:%.*]] = load ptr, ptr [[RES]], align 8
32+
; CHECK-NEXT: store float [[A]], ptr [[L_PTR]], align 1, !tbaa.struct [[TBAA_STRUCT0:![0-9]+]]
33+
; CHECK-NEXT: [[TMP_SROA_2_0_L_PTR_SROA_IDX:%.*]] = getelementptr inbounds i8, ptr [[L_PTR]], i64 4
34+
; CHECK-NEXT: store float [[B]], ptr [[TMP_SROA_2_0_L_PTR_SROA_IDX]], align 1, !tbaa.struct [[TBAA_STRUCT5:![0-9]+]]
35+
; CHECK-NEXT: ret void
36+
;
37+
entry:
38+
%tmp = alloca { float, float }, align 4
39+
store float %a, ptr %tmp, align 4
40+
%__im_.i.i = getelementptr inbounds i8, ptr %tmp, i64 4
41+
store float %b, ptr %__im_.i.i, align 4
42+
%l.ptr = load ptr, ptr %res, align 8
43+
call void @llvm.memcpy.p0.p0.i64(ptr %l.ptr, ptr %tmp, i64 8, i1 false), !tbaa.struct !0
44+
ret void
45+
}
46+
47+
define void @memcpy_transfer_tbaa_field_and_size_do_not_align(ptr dereferenceable(24) %res, float %a, float %b) {
48+
; CHECK-LABEL: define void @memcpy_transfer_tbaa_field_and_size_do_not_align(
49+
; CHECK-SAME: ptr dereferenceable(24) [[RES:%.*]], float [[A:%.*]], float [[B:%.*]]) {
50+
; CHECK-NEXT: entry:
51+
; CHECK-NEXT: [[L_PTR:%.*]] = load ptr, ptr [[RES]], align 8
52+
; CHECK-NEXT: store float [[A]], ptr [[L_PTR]], align 1, !tbaa.struct [[TBAA_STRUCT0]]
53+
; CHECK-NEXT: [[TMP_SROA_2_0_L_PTR_SROA_IDX:%.*]] = getelementptr inbounds i8, ptr [[L_PTR]], i64 4
54+
; CHECK-NEXT: [[TMP0:%.*]] = bitcast float [[B]] to i32
55+
; CHECK-NEXT: [[TMP_SROA_2_0_EXTRACT_TRUNC:%.*]] = trunc i32 [[TMP0]] to i16
56+
; CHECK-NEXT: store i16 [[TMP_SROA_2_0_EXTRACT_TRUNC]], ptr [[TMP_SROA_2_0_L_PTR_SROA_IDX]], align 1, !tbaa.struct [[TBAA_STRUCT5]]
57+
; CHECK-NEXT: ret void
58+
;
59+
entry:
60+
%tmp = alloca { float, float }, align 4
61+
store float %a, ptr %tmp, align 4
62+
%__im_.i.i = getelementptr inbounds i8, ptr %tmp, i64 4
63+
store float %b, ptr %__im_.i.i, align 4
64+
%l.ptr = load ptr, ptr %res, align 8
65+
call void @llvm.memcpy.p0.p0.i64(ptr %l.ptr, ptr %tmp, i64 6, i1 false), !tbaa.struct !0
66+
ret void
67+
}
68+
69+
define void @load_store_transfer_split_struct_tbaa_2_i31(ptr dereferenceable(24) %res, i31 %a, i31 %b) {
70+
; CHECK-LABEL: define void @load_store_transfer_split_struct_tbaa_2_i31(
71+
; CHECK-SAME: ptr dereferenceable(24) [[RES:%.*]], i31 [[A:%.*]], i31 [[B:%.*]]) {
72+
; CHECK-NEXT: entry:
73+
; CHECK-NEXT: [[TMP:%.*]] = alloca { i31, i31 }, align 4
74+
; CHECK-NEXT: store i31 [[A]], ptr [[TMP]], align 4
75+
; CHECK-NEXT: [[TMP_4_TMP_4_SROA_IDX:%.*]] = getelementptr inbounds i8, ptr [[TMP]], i64 4
76+
; CHECK-NEXT: store i31 [[B]], ptr [[TMP_4_TMP_4_SROA_IDX]], align 4
77+
; CHECK-NEXT: [[TMP_0_L1:%.*]] = load i62, ptr [[TMP]], align 4, !tbaa.struct [[TBAA_STRUCT0]]
78+
; CHECK-NEXT: store i62 [[TMP_0_L1]], ptr [[RES]], align 4, !tbaa.struct [[TBAA_STRUCT0]]
79+
; CHECK-NEXT: ret void
80+
;
81+
entry:
82+
%tmp = alloca { i31 , i31 }, align 4
83+
store i31 %a, ptr %tmp, align 4
84+
%tmp.4 = getelementptr inbounds i8, ptr %tmp, i64 4
85+
store i31 %b, ptr %tmp.4, align 4
86+
%l1 = load i62, ptr %tmp, !tbaa.struct !0
87+
store i62 %l1, ptr %res, !tbaa.struct !0
88+
ret void
89+
}
90+
91+
92+
; Function Attrs: mustprogress nocallback nofree nounwind willreturn memory(argmem: readwrite)
93+
declare void @llvm.memcpy.p0.p0.i64(ptr noalias nocapture writeonly, ptr noalias nocapture readonly, i64, i1 immarg) #2
94+
95+
!0 = !{i64 0, i64 4, !1, i64 4, i64 4, !1}
96+
!1 = !{!2, !2, i64 0}
97+
!2 = !{!"float", !3, i64 0}
98+
!3 = !{!"omnipotent char", !4, i64 0}
99+
!4 = !{!"Simple C++ TBAA"}
100+
;.
101+
; CHECK: [[TBAA_STRUCT0]] = !{i64 0, i64 4, [[META1:![0-9]+]], i64 4, i64 4, [[META1]]}
102+
; CHECK: [[META1]] = !{[[META2:![0-9]+]], [[META2]], i64 0}
103+
; CHECK: [[META2]] = !{!"float", [[META3:![0-9]+]], i64 0}
104+
; CHECK: [[META3]] = !{!"omnipotent char", [[META4:![0-9]+]], i64 0}
105+
; CHECK: [[META4]] = !{!"Simple C++ TBAA"}
106+
; CHECK: [[TBAA_STRUCT5]] = !{i64 0, i64 4, [[META1]]}
107+
;.

0 commit comments

Comments
 (0)