[llvm] [GVN] Load-store forwaring of scalable store to fixed load. (PR #124748)
Nikita Popov via llvm-commits
llvm-commits at lists.llvm.org
Tue Jan 28 07:37:40 PST 2025
================
@@ -13,32 +13,52 @@ static bool isFirstClassAggregateOrScalableType(Type *Ty) {
return Ty->isStructTy() || Ty->isArrayTy() || isa<ScalableVectorType>(Ty);
}
+static std::optional<unsigned> getKnownVScale(Function *F) {
+ const auto &Attrs = F->getAttributes().getFnAttrs();
+ unsigned MinVScale = Attrs.getVScaleRangeMin();
+ if (Attrs.getVScaleRangeMax() == MinVScale)
+ return MinVScale;
+ return std::nullopt;
+}
+
/// Return true if coerceAvailableValueToLoadType will succeed.
bool canCoerceMustAliasedValueToLoad(Value *StoredVal, Type *LoadTy,
- const DataLayout &DL) {
+ Function *F) {
Type *StoredTy = StoredVal->getType();
-
if (StoredTy == LoadTy)
return true;
+ const DataLayout &DL = F->getDataLayout();
+ TypeSize StoreSize = DL.getTypeSizeInBits(StoredTy);
+ TypeSize LoadSize = DL.getTypeSizeInBits(LoadTy);
if (isa<ScalableVectorType>(StoredTy) && isa<ScalableVectorType>(LoadTy) &&
- DL.getTypeSizeInBits(StoredTy) == DL.getTypeSizeInBits(LoadTy))
+ StoreSize == LoadSize)
return true;
- // If the loaded/stored value is a first class array/struct, or scalable type,
- // don't try to transform them. We need to be able to bitcast to integer.
- if (isFirstClassAggregateOrScalableType(LoadTy) ||
- isFirstClassAggregateOrScalableType(StoredTy))
+ // If the loaded/stored value is a first class array/struct, don't try to
+ // transform them. We need to be able to bitcast to integer. For scalable
+ // vectors forwarded to fixed-sized vectors @llvm.vector.extract is used.
+ if (isa<ScalableVectorType>(StoredTy) && isa<FixedVectorType>(LoadTy)) {
+ if (StoredTy->getScalarType() != LoadTy->getScalarType())
+ return false;
+
+ // If the VScale is known at compile-time, use that information to
+ // allow for wider loads.
+ std::optional<unsigned> VScale = getKnownVScale(F);
----------------
nikic wrote:
This could be generalized to only look at getVScaleRangeMin to determine the minimum store size (without knowing the exact store size), as we only need StoreSize >= LoadSize. (Don't know if we expect that pattern to occur.)
https://github.com/llvm/llvm-project/pull/124748
More information about the llvm-commits
mailing list