[Hexagon] Use getTypeAllocSize to compute difference between objects

The code was using getTypeStoreSize to calculate the difference
between consecutive objects. The calculation was incorrect due
to padding that is added between consecutive objects. The
getTypeAllocSize includes the padding amount. For example,
if the type is [19 x i8], the difference between consecutive
objects is 32 bytes, not 19 bytes.

A second case for getTypeAllocSize is needed when computing
the pointer values for the vector accesses. The calculation needs
to account for the padding as well.

Differential Revision: https://reviews.llvm.org/D109403
This commit is contained in:
Brendon Cahoon 2021-09-13 19:04:00 -05:00 committed by Krzysztof Parzyszek
parent a72763af67
commit 42dace9c5b
2 changed files with 56 additions and 3 deletions

View File

@ -82,6 +82,7 @@ public:
int getSizeOf(const Value *Val) const;
int getSizeOf(const Type *Ty) const;
int getAllocSizeOf(const Type *Ty) const;
int getTypeAlignment(Type *Ty) const;
VectorType *getByteVectorTy(int ScLen) const;
@ -443,8 +444,8 @@ auto AlignVectors::createAdjustedPointer(IRBuilder<> &Builder, Value *Ptr,
auto *PtrTy = cast<PointerType>(Ptr->getType());
if (!PtrTy->isOpaque()) {
Type *ElemTy = PtrTy->getElementType();
int ElemSize = HVC.getSizeOf(ElemTy);
if (Adjust % ElemSize == 0) {
int ElemSize = HVC.getAllocSizeOf(ElemTy);
if (Adjust % ElemSize == 0 && Adjust != 0) {
Value *Tmp0 =
Builder.CreateGEP(ElemTy, Ptr, HVC.getConstInt(Adjust / ElemSize));
return Builder.CreatePointerCast(Tmp0, ValTy->getPointerTo());
@ -979,6 +980,10 @@ auto HexagonVectorCombine::getSizeOf(const Type *Ty) const -> int {
return DL.getTypeStoreSize(const_cast<Type *>(Ty)).getFixedValue();
}
auto HexagonVectorCombine::getAllocSizeOf(const Type *Ty) const -> int {
return DL.getTypeAllocSize(const_cast<Type *>(Ty)).getFixedValue();
}
auto HexagonVectorCombine::getTypeAlignment(Type *Ty) const -> int {
// The actual type may be shorter than the HVX vector, so determine
// the alignment based on subtarget info.
@ -1326,7 +1331,7 @@ auto HexagonVectorCombine::calculatePointerDifference(Value *Ptr0,
return None;
Builder B(Gep0->getParent());
int Scale = DL.getTypeStoreSize(Gep0->getSourceElementType());
int Scale = getAllocSizeOf(Gep0->getSourceElementType());
// FIXME: for now only check GEPs with a single index.
if (Gep0->getNumOperands() != 2 || Gep1->getNumOperands() != 2)

View File

@ -0,0 +1,48 @@
; RUN: llc -march=hexagon -hexagon-hvx-widen=32 < %s | FileCheck %s
; Test that the Hexagon Vector Combine pass computes the address
; correctly when the loading objects that contain extra padding
; between successive objects.
; CHECK: [[REG:r[0-9]+]] = add(r{{[0-9]+}},#2432)
; CHECK: = vmem([[REG]]+#0)
define dllexport void @test(i8* %a0) local_unnamed_addr #0 {
b0:
%v0 = add nuw nsw i32 0, 3040
%v1 = load i8, i8* undef, align 1
%v2 = insertelement <19 x i8> undef, i8 %v1, i32 0
%v3 = shufflevector <19 x i8> %v2, <19 x i8> undef, <19 x i32> zeroinitializer
%v4 = getelementptr inbounds i8, i8* %a0, i32 %v0
%v5 = bitcast i8* %v4 to <19 x i8>*
%v6 = load <19 x i8>, <19 x i8>* %v5, align 1
%v7 = mul <19 x i8> %v3, %v6
%v8 = add <19 x i8> %v7, zeroinitializer
%v9 = add <19 x i8> zeroinitializer, %v8
%v10 = add <19 x i8> zeroinitializer, %v9
%v11 = add <19 x i8> zeroinitializer, %v10
%v12 = add <19 x i8> zeroinitializer, %v11
%v13 = add <19 x i8> zeroinitializer, %v12
%v14 = add <19 x i8> zeroinitializer, %v13
%v15 = add <19 x i8> zeroinitializer, %v14
%v16 = add <19 x i8> zeroinitializer, %v15
%v17 = add <19 x i8> zeroinitializer, %v16
%v18 = add <19 x i8> zeroinitializer, %v17
%v19 = load i8, i8* undef, align 1
%v20 = insertelement <19 x i8> undef, i8 %v19, i32 0
%v21 = shufflevector <19 x i8> %v20, <19 x i8> undef, <19 x i32> zeroinitializer
%v22 = add nuw nsw i32 0, 5472
%v23 = getelementptr inbounds i8, i8* %a0, i32 %v22
%v24 = bitcast i8* %v23 to <19 x i8>*
%v25 = load <19 x i8>, <19 x i8>* %v24, align 1
%v26 = mul <19 x i8> %v21, %v25
%v27 = add <19 x i8> %v26, %v18
%v28 = add <19 x i8> zeroinitializer, %v27
%v29 = add <19 x i8> zeroinitializer, %v28
%v30 = add <19 x i8> zeroinitializer, %v29
%v31 = bitcast i8* %a0 to <19 x i8>*
store <19 x i8> %v30, <19 x i8>* %v31, align 1
ret void
}
attributes #0 = { "target-features"="+hvxv66,+hvx-length128b" }