diff options
author | Craig Topper <craig.topper@sifive.com> | 2023-08-21 10:36:17 -0700 |
---|---|---|
committer | Craig Topper <craig.topper@sifive.com> | 2023-08-21 10:36:17 -0700 |
commit | e620eac75e470f94928a17d215a3be947712028b (patch) | |
tree | dfccbff88f6693e382363dde4092519bc25afbc9 /llvm/lib/CodeGen/Analysis.cpp | |
parent | e223e4567722661f1b32aa052cd13d9f47b896d9 (diff) | |
download | llvm-e620eac75e470f94928a17d215a3be947712028b.zip llvm-e620eac75e470f94928a17d215a3be947712028b.tar.gz llvm-e620eac75e470f94928a17d215a3be947712028b.tar.bz2 |
[SelectionDAG][RISCV][SVE] Harden fixed offset version of ComputeValueVTs against scalable offsets.
Use getFixedValue instead of getKnownMinValue to convert TypeSize
to uint64_t. I believe this would have caught the bug fixed by
D157872.
To prevent false failures, I had to treat a scalable 0 as if it
is fixed value.
Reviewed By: paulwalker-arm
Differential Revision: https://reviews.llvm.org/D158115
Diffstat (limited to 'llvm/lib/CodeGen/Analysis.cpp')
-rw-r--r-- | llvm/lib/CodeGen/Analysis.cpp | 26 |
1 files changed, 12 insertions, 14 deletions
diff --git a/llvm/lib/CodeGen/Analysis.cpp b/llvm/lib/CodeGen/Analysis.cpp index 2065bfb..1994e6a 100644 --- a/llvm/lib/CodeGen/Analysis.cpp +++ b/llvm/lib/CodeGen/Analysis.cpp @@ -140,15 +140,14 @@ void llvm::ComputeValueVTs(const TargetLowering &TLI, const DataLayout &DL, SmallVectorImpl<uint64_t> *FixedOffsets, uint64_t StartingOffset) { TypeSize Offset = TypeSize::get(StartingOffset, Ty->isScalableTy()); - SmallVector<TypeSize, 4> Offsets; - if (FixedOffsets) + if (FixedOffsets) { + SmallVector<TypeSize, 4> Offsets; ComputeValueVTs(TLI, DL, Ty, ValueVTs, &Offsets, Offset); - else - ComputeValueVTs(TLI, DL, Ty, ValueVTs, nullptr, Offset); - - if (FixedOffsets) for (TypeSize Offset : Offsets) - FixedOffsets->push_back(Offset.getKnownMinValue()); + FixedOffsets->push_back(Offset.getFixedValue()); + } else { + ComputeValueVTs(TLI, DL, Ty, ValueVTs, nullptr, Offset); + } } void llvm::ComputeValueVTs(const TargetLowering &TLI, const DataLayout &DL, @@ -166,15 +165,14 @@ void llvm::ComputeValueVTs(const TargetLowering &TLI, const DataLayout &DL, SmallVectorImpl<uint64_t> *FixedOffsets, uint64_t StartingOffset) { TypeSize Offset = TypeSize::get(StartingOffset, Ty->isScalableTy()); - SmallVector<TypeSize, 4> Offsets; - if (FixedOffsets) + if (FixedOffsets) { + SmallVector<TypeSize, 4> Offsets; ComputeValueVTs(TLI, DL, Ty, ValueVTs, MemVTs, &Offsets, Offset); - else - ComputeValueVTs(TLI, DL, Ty, ValueVTs, MemVTs, nullptr, Offset); - - if (FixedOffsets) for (TypeSize Offset : Offsets) - FixedOffsets->push_back(Offset.getKnownMinValue()); + FixedOffsets->push_back(Offset.getFixedValue()); + } else { + ComputeValueVTs(TLI, DL, Ty, ValueVTs, MemVTs, nullptr, Offset); + } } void llvm::computeValueLLTs(const DataLayout &DL, Type &Ty, |