[clang] [Clang] Remove 3-element vector load and store special handling (PR #104661)
Craig Topper via cfe-commits
cfe-commits at lists.llvm.org
Sun Dec 15 17:39:22 PST 2024
================
@@ -2003,20 +2003,19 @@ llvm::Value *CodeGenFunction::EmitLoadOfScalar(Address Addr, bool Volatile,
return EmitFromMemory(V, Ty);
}
- // Handle vectors of size 3 like size 4 for better performance.
- const llvm::Type *EltTy = Addr.getElementType();
- const auto *VTy = cast<llvm::FixedVectorType>(EltTy);
-
- if (!CGM.getCodeGenOpts().PreserveVec3Type && VTy->getNumElements() == 3) {
-
- llvm::VectorType *vec4Ty =
- llvm::FixedVectorType::get(VTy->getElementType(), 4);
- Address Cast = Addr.withElementType(vec4Ty);
- // Now load value.
- llvm::Value *V = Builder.CreateLoad(Cast, Volatile, "loadVec4");
-
- // Shuffle vector to get vec3.
- V = Builder.CreateShuffleVector(V, ArrayRef<int>{0, 1, 2}, "extractVec");
+ // Handles vectors of sizes that are likely to be expanded to a larger size
+ // to optimize performance.
+ auto *VTy = cast<llvm::FixedVectorType>(Addr.getElementType());
+ auto *NewVecTy = getTarget().getOptimalVectorType(VTy, getLangOpts());
+
+ if (VTy != NewVecTy) {
+ Address Cast = Addr.withElementType(NewVecTy);
+ llvm::Value *V = Builder.CreateLoad(Cast, Volatile, "loadVecN");
+ unsigned OldNumElements = VTy->getNumElements();
+ SmallVector<int, 4> Mask(OldNumElements);
+ for (unsigned I = 0; I < OldNumElements; ++I)
+ Mask[I] = I;
----------------
topperc wrote:
Can we use std::iota to fill the vector?
https://github.com/llvm/llvm-project/pull/104661
More information about the cfe-commits
mailing list