diff --git a/llvm/include/llvm/CodeGen/Analysis.h b/llvm/include/llvm/CodeGen/Analysis.h index 2f1364d199710..debbaa80bd2d2 100644 --- a/llvm/include/llvm/CodeGen/Analysis.h +++ b/llvm/include/llvm/CodeGen/Analysis.h @@ -88,9 +88,13 @@ void ComputeValueVTs(const TargetLowering &TLI, const DataLayout &DL, Type *Ty, /// with the in-memory offsets of each of the individual values. /// void computeValueLLTs(const DataLayout &DL, Type &Ty, - SmallVectorImpl &ValueTys, - SmallVectorImpl *Offsets = nullptr, - uint64_t StartingOffset = 0); + SmallVectorImpl &ValueLLTs, + SmallVectorImpl *Offsets = nullptr, + TypeSize StartingOffset = TypeSize::getZero()); +void computeValueLLTs(const DataLayout &DL, Type &Ty, + SmallVectorImpl &ValueLLTs, + SmallVectorImpl *FixedOffsets, + uint64_t FixedStartingOffset = 0); /// ExtractTypeInfo - Returns the type info, possibly bitcast, encoded in V. GlobalValue *ExtractTypeInfo(Value *V); diff --git a/llvm/lib/CodeGen/Analysis.cpp b/llvm/lib/CodeGen/Analysis.cpp index f5fbfb7e5e21d..51c2933286d02 100644 --- a/llvm/lib/CodeGen/Analysis.cpp +++ b/llvm/lib/CodeGen/Analysis.cpp @@ -147,38 +147,28 @@ void llvm::ComputeValueVTs(const TargetLowering &TLI, const DataLayout &DL, } void llvm::computeValueLLTs(const DataLayout &DL, Type &Ty, - SmallVectorImpl &ValueTys, - SmallVectorImpl *Offsets, - uint64_t StartingOffset) { - // Given a struct type, recursively traverse the elements. - if (StructType *STy = dyn_cast(&Ty)) { - // If the Offsets aren't needed, don't query the struct layout. This allows - // us to support structs with scalable vectors for operations that don't - // need offsets. - const StructLayout *SL = Offsets ? DL.getStructLayout(STy) : nullptr; - for (unsigned I = 0, E = STy->getNumElements(); I != E; ++I) { - uint64_t EltOffset = SL ? SL->getElementOffset(I) : 0; - computeValueLLTs(DL, *STy->getElementType(I), ValueTys, Offsets, - StartingOffset + EltOffset); - } - return; - } - // Given an array type, recursively traverse the elements. - if (ArrayType *ATy = dyn_cast(&Ty)) { - Type *EltTy = ATy->getElementType(); - uint64_t EltSize = DL.getTypeAllocSize(EltTy).getFixedValue(); - for (unsigned i = 0, e = ATy->getNumElements(); i != e; ++i) - computeValueLLTs(DL, *EltTy, ValueTys, Offsets, - StartingOffset + i * EltSize); - return; + SmallVectorImpl &ValueLLTs, + SmallVectorImpl *Offsets, + TypeSize StartingOffset) { + SmallVector ValTys; + ComputeValueTypes(DL, &Ty, ValTys, Offsets, StartingOffset); + for (Type *ValTy : ValTys) + ValueLLTs.push_back(getLLTForType(*ValTy, DL)); +} + +void llvm::computeValueLLTs(const DataLayout &DL, Type &Ty, + SmallVectorImpl &ValueLLTs, + SmallVectorImpl *FixedOffsets, + uint64_t FixedStartingOffset) { + TypeSize StartingOffset = TypeSize::getFixed(FixedStartingOffset); + if (FixedOffsets) { + SmallVector Offsets; + computeValueLLTs(DL, Ty, ValueLLTs, &Offsets, StartingOffset); + for (TypeSize Offset : Offsets) + FixedOffsets->push_back(Offset.getFixedValue()); + } else { + computeValueLLTs(DL, Ty, ValueLLTs, nullptr, StartingOffset); } - // Interpret void as zero return values. - if (Ty.isVoidTy()) - return; - // Base case: we can get an LLT for this LLVM IR type. - ValueTys.push_back(getLLTForType(Ty, DL)); - if (Offsets) - Offsets->push_back(StartingOffset); } /// ExtractTypeInfo - Returns the type info, possibly bitcast, encoded in V.