[cfe-dev] Question about "CodeGenFunction::EmitLoadOfScalar" with vector type of 3 elements
jingu@codeplay.com via cfe-dev
cfe-dev at lists.llvm.org
Mon Mar 6 07:47:51 PST 2017
Hi All,
I have a question about "CodeGenFunction::EmitLoadOfScalar". I am
compiling code with vector type of 3 elements like int3 or float3. Clang
converts the vector load to different vector load with 4 element vector
type because there is code on "CodeGenFunction::EmitLoadOfScalar" as
follows:
1312 // For better performance, handle vector loads differently.
1313 if (Ty->isVectorType()) {
1314 const llvm::Type *EltTy = Addr.getElementType();
1315
1316 const auto *VTy = cast<llvm::VectorType>(EltTy);
1317
1318 // Handle vectors of size 3 like size 4 for better performance.
1319 if (VTy->getNumElements() == 3) {
1320
1321 // Bitcast to vec4 type.
1322 llvm::VectorType *vec4Ty =
llvm::VectorType::get(VTy->getElementType(),
1323 4);
1324 Address Cast = Builder.CreateElementBitCast(Addr, vec4Ty,
"castToVec4");
1325 // Now load value.
1326 llvm::Value *V = Builder.CreateLoad(Cast, Volatile, "loadVec4");
4 element vector load could generate aligned vector load in the end and
it would be better in usual. But it is not good for other target or
language like OpenCL which supports 3 element vector type natively. Can
we consider this situation on "CodeGenFunction::EmitLoadOfScalar" like
this "if (!getLangOpts().OpenCL)" or with target specific property on
TargetCodeGenInfo?
If I missed something, please let me know.
Thanks,
JinGu Kang
More information about the cfe-dev
mailing list