================ @@ -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 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits