[PATCH] D76738: [llvm][IR][CastInst] Update `castIsValid` for scalable vectors.
Francesco Petrogalli via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Thu Mar 26 14:42:13 PDT 2020
fpetrogalli marked 3 inline comments as done.
fpetrogalli added inline comments.
================
Comment at: llvm/lib/IR/Instructions.cpp:3241
// Get the size of the types in bits, we'll need this later
- unsigned SrcBitSize = SrcTy->getScalarSizeInBits();
- unsigned DstBitSize = DstTy->getScalarSizeInBits();
+ TypeSize SrcBitSize = SrcTy->getScalarType()->getPrimitiveSizeInBits();
+ TypeSize DstBitSize = DstTy->getScalarType()->getPrimitiveSizeInBits();
----------------
Nit: While doing some of the modification you have asked me, I got confused by the fact that the variables `[Src|Dst]BitSize` are referring to the size of the scalars, not of the whole `[Src|Dst]Ty`. Is it OK if I rename them to `[Src|Dst]ScalarBitSize`?
================
Comment at: llvm/lib/IR/Instructions.cpp:3242
+ TypeSize SrcBitSize = SrcTy->getScalarType()->getPrimitiveSizeInBits();
+ TypeSize DstBitSize = DstTy->getScalarType()->getPrimitiveSizeInBits();
----------------
efriedma wrote:
> What's wrong with getScalarSizeInBits()?
`getScalarSizeInBits` implicitly casts the `TypeSize` of `getScalarType()->getPrimitiveSizeInBits()` into an integer, an operation that we have agreed to mark as deprecated. I probably should have mentioned this in the commit message.
`getScalarSizeInBits` is implemented as follows:
```
unsigned Type::getScalarSizeInBits() const {
return getScalarType()->getPrimitiveSizeInBits();
}
```
Given that we don't expect "scalar" values to be scalable, I can revert this change to use `unsigned` values, and maybe submit a separate patch that adds an assertion inside `getScalarSizeInBits` that makes sure to check that the TypeSize retrieved by `getPrimitiveSizeInBits` is not a scalable `TypeSize`.
The method will look like this after the change (disclaimer, I didn't compile it!):
```
unsigned Type::getScalarSizeInBits() const {
TypeSize TS = getScalarType()->getPrimitiveSizeInBits();
assert(!TS.isScalable() && "Invalid type.")
return TS.getKnownMinSize();
}
```
Please let me know which of the following you want me to do:
1. mention and justify the change in the commit message
2. revert the change to use unsigned, and create a separate patch that add the assertion "is not scalable" to `getScalarSizeInBits`.
3. third option you might have that I have missed! :)
================
Comment at: llvm/lib/IR/Instructions.cpp:3284
if (VectorType *VT = dyn_cast<VectorType>(SrcTy))
- if (VT->getNumElements() != cast<VectorType>(DstTy)->getNumElements())
+ if (VT->getElementCount() != cast<VectorType>(DstTy)->getElementCount())
return false;
----------------
efriedma wrote:
> Can we simplify some of the getElementCount() calls by using SrcLength/DstLength instead?
> Can we simplify some of the getElementCount() calls by using SrcLength/DstLength instead?
Yes, on it.
How about also creating two boolean vars that hold the `isa<VectorType>([Src|Dst]Ty)` and use them instead of the `isa<VectorType>([Src|Dst]Ty)` or `dyn_cast<VectorType>([Src|Dst]Ty).`?
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D76738/new/
https://reviews.llvm.org/D76738
More information about the llvm-commits
mailing list