Skip to content

Commit dc85719

Browse files
authored
[TBAA] Use !tbaa for first accessed field if it is an exact match in offset and size. (#81313)
Motivation for this and follow-on patches is to improve codegen for libc++, where using memcpy limits optimizations, like vectorization for code iteration over std::vector<std::complex<float>>: https://godbolt.org/z/f3vqYos3c Depends on #81289. PR: #81313
1 parent 831ba95 commit dc85719

File tree

3 files changed

+53
-61
lines changed

3 files changed

+53
-61
lines changed

llvm/lib/Analysis/TypeBasedAliasAnalysis.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -821,7 +821,7 @@ MDNode *AAMDNodes::extendToTBAA(MDNode *MD, ssize_t Len) {
821821
AAMDNodes AAMDNodes::adjustForAccess(unsigned AccessSize) {
822822
AAMDNodes New = *this;
823823
MDNode *M = New.TBAAStruct;
824-
if (M && M->getNumOperands() == 3 && M->getOperand(0) &&
824+
if (M && M->getNumOperands() >= 3 && M->getOperand(0) &&
825825
mdconst::hasa<ConstantInt>(M->getOperand(0)) &&
826826
mdconst::extract<ConstantInt>(M->getOperand(0))->isZero() &&
827827
M->getOperand(1) && mdconst::hasa<ConstantInt>(M->getOperand(1)) &&

llvm/test/Transforms/SROA/tbaa-struct2.ll

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,11 @@ declare double @subcall(double %g, i32 %m)
1111
define double @bar(ptr %wishart) {
1212
; CHECK-LABEL: @bar(
1313
; CHECK-NEXT: [[TMP_SROA_3:%.*]] = alloca [4 x i8], align 4
14-
; CHECK-NEXT: [[TMP_SROA_0_0_COPYLOAD:%.*]] = load double, ptr [[WISHART:%.*]], align 8, !tbaa.struct [[TBAA_STRUCT0:![0-9]+]]
14+
; CHECK-NEXT: [[TMP_SROA_0_0_COPYLOAD:%.*]] = load double, ptr [[WISHART:%.*]], align 8, !tbaa [[TBAA0:![0-9]+]]
1515
; CHECK-NEXT: [[TMP_SROA_2_0_WISHART_SROA_IDX:%.*]] = getelementptr inbounds i8, ptr [[WISHART]], i64 8
16-
; CHECK-NEXT: [[TMP_SROA_2_0_COPYLOAD:%.*]] = load i32, ptr [[TMP_SROA_2_0_WISHART_SROA_IDX]], align 8, !tbaa [[TBAA5:![0-9]+]]
16+
; CHECK-NEXT: [[TMP_SROA_2_0_COPYLOAD:%.*]] = load i32, ptr [[TMP_SROA_2_0_WISHART_SROA_IDX]], align 8, !tbaa [[TBAA4:![0-9]+]]
1717
; CHECK-NEXT: [[TMP_SROA_3_0_WISHART_SROA_IDX:%.*]] = getelementptr inbounds i8, ptr [[WISHART]], i64 12
18-
; CHECK-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[TMP_SROA_3]], ptr align 4 [[TMP_SROA_3_0_WISHART_SROA_IDX]], i64 4, i1 false), !tbaa.struct [[TBAA_STRUCT7:![0-9]+]]
18+
; CHECK-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[TMP_SROA_3]], ptr align 4 [[TMP_SROA_3_0_WISHART_SROA_IDX]], i64 4, i1 false), !tbaa.struct [[TBAA_STRUCT6:![0-9]+]]
1919
; CHECK-NEXT: [[CALL:%.*]] = call double @subcall(double [[TMP_SROA_0_0_COPYLOAD]], i32 [[TMP_SROA_2_0_COPYLOAD]])
2020
; CHECK-NEXT: ret double [[CALL]]
2121
;
@@ -38,14 +38,13 @@ define double @bar(ptr %wishart) {
3838
;.
3939
; CHECK: attributes #[[ATTR0:[0-9]+]] = { nocallback nofree nounwind willreturn memory(argmem: readwrite) }
4040
;.
41-
; CHECK: [[TBAA_STRUCT0]] = !{i64 0, i64 8, [[META1:![0-9]+]], i64 8, i64 4, [[TBAA5]]}
42-
; CHECK: [[META1]] = !{[[META2:![0-9]+]], [[META2]], i64 0}
43-
; CHECK: [[META2]] = !{!"double", [[META3:![0-9]+]], i64 0}
44-
; CHECK: [[META3]] = !{!"omnipotent char", [[META4:![0-9]+]], i64 0}
45-
; CHECK: [[META4]] = !{!"Simple C++ TBAA"}
46-
; CHECK: [[TBAA5]] = !{[[META6:![0-9]+]], [[META6]], i64 0}
47-
; CHECK: [[META6]] = !{!"int", [[META3]], i64 0}
48-
; CHECK: [[TBAA_STRUCT7]] = !{}
41+
; CHECK: [[TBAA0]] = !{[[META1:![0-9]+]], [[META1]], i64 0}
42+
; CHECK: [[META1]] = !{!"double", [[META2:![0-9]+]], i64 0}
43+
; CHECK: [[META2]] = !{!"omnipotent char", [[META3:![0-9]+]], i64 0}
44+
; CHECK: [[META3]] = !{!"Simple C++ TBAA"}
45+
; CHECK: [[TBAA4]] = !{[[META5:![0-9]+]], [[META5]], i64 0}
46+
; CHECK: [[META5]] = !{!"int", [[META2]], i64 0}
47+
; CHECK: [[TBAA_STRUCT6]] = !{}
4948
;.
5049
;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
5150
; CHECK-MODIFY-CFG: {{.*}}

0 commit comments

Comments
 (0)