<div dir="ltr">Hi JinGu,<div><br></div><div>I don't think it should be a problem for OpenCL. 3-component vector is aligned as 4-component vector (see section 6.1.5 "Alignment of Type" of OpenCL C kernel language specification v2.0).</div><div>AFAIK, almost all existing OpenCL compilers are based on clang and there seems to be no problems with handling load/store operations this way.<br></div><div>Could you elaborate on the case where this approach doesn't work?</div><div><br></div><div>Thanks,</div><div>Alexey</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Mar 6, 2017 at 6:47 PM, <a href="mailto:jingu@codeplay.com">jingu@codeplay.com</a> via cfe-dev <span dir="ltr"><<a href="mailto:cfe-dev@lists.llvm.org" target="_blank">cfe-dev@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi All,<br>
<br>
<br>
I have a question about "CodeGenFunction::EmitLoadOfSc<wbr>alar". 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::EmitLoadOfSc<wbr>alar" as follows:<br>
<br>
1312   // For better performance, handle vector loads differently.<br>
1313   if (Ty->isVectorType()) {<br>
1314     const llvm::Type *EltTy = Addr.getElementType();<br>
1315<br>
1316     const auto *VTy = cast<llvm::VectorType>(EltTy);<br>
1317<br>
1318     // Handle vectors of size 3 like size 4 for better performance.<br>
1319     if (VTy->getNumElements() == 3) {<br>
1320<br>
1321       // Bitcast to vec4 type.<br>
1322       llvm::VectorType *vec4Ty = llvm::VectorType::get(VTy->get<wbr>ElementType(),<br>
1323                                                          4);<br>
1324       Address Cast = Builder.CreateElementBitCast(A<wbr>ddr, vec4Ty, "castToVec4");<br>
1325       // Now load value.<br>
1326       llvm::Value *V = Builder.CreateLoad(Cast, Volatile, "loadVec4");<br>
<br>
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::EmitLoadOfSc<wbr>alar" like this "if (!getLangOpts().OpenCL)" or with target specific property on TargetCodeGenInfo?<br>
<br>
If I missed something, please let me know.<br>
<br>
Thanks,<br>
JinGu Kang<br>
<br>
______________________________<wbr>_________________<br>
cfe-dev mailing list<br>
<a href="mailto:cfe-dev@lists.llvm.org" target="_blank">cfe-dev@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/cfe-dev</a><br>
</blockquote></div><br></div>