<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:Wingdings;
        panose-1:5 0 0 0 0 0 0 0 0 0;}
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Tahoma;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:#0563C1;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:#954F72;
        text-decoration:underline;}
p.MsoAcetate, li.MsoAcetate, div.MsoAcetate
        {mso-style-priority:99;
        mso-style-link:"Balloon Text Char";
        margin:0in;
        margin-bottom:.0001pt;
        font-size:8.0pt;
        font-family:"Tahoma",sans-serif;}
p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph
        {mso-style-priority:34;
        margin-top:0in;
        margin-right:0in;
        margin-bottom:0in;
        margin-left:.5in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
p.msonormal0, li.msonormal0, div.msonormal0
        {mso-style-name:msonormal;
        mso-margin-top-alt:auto;
        margin-right:0in;
        mso-margin-bottom-alt:auto;
        margin-left:0in;
        font-size:12.0pt;
        font-family:"Times New Roman",serif;}
span.BalloonTextChar
        {mso-style-name:"Balloon Text Char";
        mso-style-priority:99;
        mso-style-link:"Balloon Text";
        font-family:"Tahoma",sans-serif;}
span.EmailStyle21
        {mso-style-type:personal;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
span.EmailStyle22
        {mso-style-type:personal;
        font-family:"Calibri",sans-serif;
        color:#1F497D;}
span.EmailStyle23
        {mso-style-type:personal;
        font-family:"Calibri",sans-serif;
        color:#1F497D;}
span.EmailStyle24
        {mso-style-type:personal;
        font-family:"Calibri",sans-serif;
        color:#1F497D;}
span.EmailStyle25
        {mso-style-type:personal;
        font-family:"Calibri",sans-serif;
        color:#1F497D;}
span.EmailStyle26
        {mso-style-type:personal;
        font-family:"Calibri",sans-serif;
        color:#1F497D;}
span.EmailStyle27
        {mso-style-type:personal;
        font-family:"Calibri",sans-serif;
        color:#1F497D;}
span.EmailStyle28
        {mso-style-type:personal;
        font-family:"Calibri",sans-serif;
        color:#1F497D;}
span.EmailStyle29
        {mso-style-type:personal;
        font-family:"Calibri",sans-serif;
        color:#1F497D;}
span.EmailStyle30
        {mso-style-type:personal-reply;
        font-family:"Calibri",sans-serif;
        color:#1F497D;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-US" link="#0563C1" vlink="#954F72">
<div class="WordSection1">
<p class="MsoNormal"><span style="color:#1F497D">I will create a patch for that. Thanks.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">Sam<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"><o:p> </o:p></span></p>
<div>
<div style="border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal"><b>From:</b> Anastasia Stulova [mailto:Anastasia.Stulova@arm.com]
<br>
<b>Sent:</b> Thursday, June 16, 2016 1:58 PM<br>
<b>To:</b> Sumner, Brian <Brian.Sumner@amd.com>; Liu, Yaxun (Sam) <Yaxun.Liu@amd.com>; cfe-dev (cfe-dev@lists.llvm.org) <cfe-dev@lists.llvm.org>; Bader, Alexey (alexey.bader@intel.com) <alexey.bader@intel.com>; Pan, Xiuli <xiuli.pan@intel.com><br>
<b>Cc:</b> Tom Stellard <tom@stellard.net>; Tye, Tony <Tony.Tye@amd.com>; nd <nd@arm.com><br>
<b>Subject:</b> RE: [RFC][OpenCL] New representation for sampler_t and its literal initializer<o:p></o:p></p>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><span lang="EN-GB" style="color:#1F497D">Hi Brian,</span><span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB" style="color:#1F497D"> </span><span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB" style="color:#1F497D">Perhaps  without specific examples it’s hard to judge, but as I said I don’t see big difference between these two representations.</span><span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB" style="color:#1F497D"> </span><span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB" style="color:#1F497D">May be we could setup the review and see if anyone has strong preference.</span><span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB" style="color:#1F497D"> </span><span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB" style="color:#1F497D">Thanks,</span><span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB" style="color:#1F497D">Anastasia</span><span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB" style="color:#1F497D"> </span><span lang="EN-GB"><o:p></o:p></span></p>
<div>
<div style="border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal"><b><span style="font-size:10.0pt;font-family:"Tahoma",sans-serif">From:</span></b><span style="font-size:10.0pt;font-family:"Tahoma",sans-serif"> Sumner, Brian [<a href="mailto:Brian.Sumner@amd.com">mailto:Brian.Sumner@amd.com</a>]
<br>
<b>Sent:</b> 16 June 2016 17:12<br>
<b>To:</b> Anastasia Stulova; Liu, Yaxun (Sam); cfe-dev (<a href="mailto:cfe-dev@lists.llvm.org">cfe-dev@lists.llvm.org</a>); Bader, Alexey (<a href="mailto:alexey.bader@intel.com">alexey.bader@intel.com</a>); Pan, Xiuli<br>
<b>Cc:</b> Tom Stellard; Tye, Tony; nd<br>
<b>Subject:</b> RE: [RFC][OpenCL] New representation for sampler_t and its literal initializer</span><span lang="EN-GB"><o:p></o:p></span></p>
</div>
</div>
<p class="MsoNormal"><span lang="EN-GB"> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">Hi Anastasia,</span><span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"> </span><span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">From my perspective we have more been working around the headaches caused by the integer representation rather than relying on it.  The change proposed here should make handling samplers much easier, or at least
 no more difficult, for all of us.  And for those whose target sampler really is an int, __translate_sampler_initializer is a simple as a cast.</span><span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"> </span><span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">Regards,</span><span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">Brian</span><span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"> </span><span lang="EN-GB"><o:p></o:p></span></p>
<div>
<div style="border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal"><b><span style="font-size:10.0pt;font-family:"Tahoma",sans-serif">From:</span></b><span style="font-size:10.0pt;font-family:"Tahoma",sans-serif"> Anastasia Stulova [<a href="mailto:Anastasia.Stulova@arm.com">mailto:Anastasia.Stulova@arm.com</a>]
<br>
<b>Sent:</b> Thursday, June 16, 2016 8:23 AM<br>
<b>To:</b> Sumner, Brian; Liu, Yaxun (Sam); cfe-dev (<a href="mailto:cfe-dev@lists.llvm.org">cfe-dev@lists.llvm.org</a>); Bader, Alexey (<a href="mailto:alexey.bader@intel.com">alexey.bader@intel.com</a>); Pan, Xiuli<br>
<b>Cc:</b> Tom Stellard; Tye, Tony; nd<br>
<b>Subject:</b> RE: [RFC][OpenCL] New representation for sampler_t and its literal initializer</span><span lang="EN-GB"><o:p></o:p></span></p>
</div>
</div>
<p class="MsoNormal"> <span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB" style="color:#1F497D">Hi Brian,</span><span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB" style="color:#1F497D"> </span><span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB" style="color:#1F497D">I think it should be alright to keep the definitions of those constants either way we take.</span><span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB" style="color:#1F497D"> </span><span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB" style="color:#1F497D">I wouldn’t argue that leaving integer representation rather than using struct is more generic as ideally we are missing a distinct LLVM type for this.</span><span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB" style="color:#1F497D">However, my general concern here is that going for a bigger change (i.e. using struct) has a risk of higher impact on implementations that has originally and since long time relied on integer representation
 of sampler type.</span><span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB" style="color:#1F497D"> </span><span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB" style="color:#1F497D">Cheers,</span><span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB" style="color:#1F497D">Anastasia </span><span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB" style="color:#1F497D"> </span><span lang="EN-GB"><o:p></o:p></span></p>
<div>
<div style="border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal"><b><span style="font-size:10.0pt;font-family:"Tahoma",sans-serif">From:</span></b><span style="font-size:10.0pt;font-family:"Tahoma",sans-serif"> Sumner, Brian [<a href="mailto:Brian.Sumner@amd.com">mailto:Brian.Sumner@amd.com</a>]
<br>
<b>Sent:</b> 15 June 2016 15:01<br>
<b>To:</b> Liu, Yaxun (Sam); Anastasia Stulova; cfe-dev (<a href="mailto:cfe-dev@lists.llvm.org">cfe-dev@lists.llvm.org</a>); Bader, Alexey (<a href="mailto:alexey.bader@intel.com">alexey.bader@intel.com</a>); Pan, Xiuli<br>
<b>Cc:</b> Tom Stellard; Tye, Tony; nd<br>
<b>Subject:</b> RE: [RFC][OpenCL] New representation for sampler_t and its literal initializer</span><span lang="EN-GB"><o:p></o:p></span></p>
</div>
</div>
<p class="MsoNormal"><span lang="EN-GB"> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">I’d like to request that, if we take this approach, we keep the current definitions of CLK_ADDRESS_*, CLK_NORMALIZED_COORDS_*, and CLK_FILTER_* that are currently in opencl-c.h. I believe these permit efficient
 translation to the target dependent sampler pointer.  We could actually add 3 more addressing modes without adjusting the normalized and filter values, and so these definitions should be sufficient for quite some time.</span><span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"> </span><span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">Brian</span><span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"> </span><span lang="EN-GB"><o:p></o:p></span></p>
<div>
<div style="border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal"><b><span style="font-size:10.0pt;font-family:"Tahoma",sans-serif">From:</span></b><span style="font-size:10.0pt;font-family:"Tahoma",sans-serif"> Liu, Yaxun (Sam)
<br>
<b>Sent:</b> Tuesday, June 14, 2016 1:27 PM<br>
<b>To:</b> Anastasia Stulova; cfe-dev (<a href="mailto:cfe-dev@lists.llvm.org">cfe-dev@lists.llvm.org</a>); Bader, Alexey (<a href="mailto:alexey.bader@intel.com">alexey.bader@intel.com</a>); Pan, Xiuli<br>
<b>Cc:</b> Tom Stellard; Sumner, Brian; Tye, Tony; nd<br>
<b>Subject:</b> RE: [RFC][OpenCL] New representation for sampler_t and its literal initializer</span><span lang="EN-GB"><o:p></o:p></span></p>
</div>
</div>
<p class="MsoNormal"> <span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">Hi Anastasia,</span><span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"> </span><span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">The sampler initializer struct has a one-to-one mapping to an OpenCL sampler literal, so it has the same expressiveness as the original representation.</span><span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"> </span><span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">As you said, it also keeps a unique copy of initializer for each OpenCL sampler literal.</span><span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"> </span><span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">Sam</span><span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"> </span><span lang="EN-GB"><o:p></o:p></span></p>
<div>
<div style="border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal"><b>From:</b> Anastasia Stulova [<a href="mailto:Anastasia.Stulova@arm.com">mailto:Anastasia.Stulova@arm.com</a>]
<br>
<b>Sent:</b> Monday, June 13, 2016 2:06 PM<br>
<b>To:</b> Liu, Yaxun (Sam) <<a href="mailto:Yaxun.Liu@amd.com">Yaxun.Liu@amd.com</a>>; cfe-dev (<a href="mailto:cfe-dev@lists.llvm.org">cfe-dev@lists.llvm.org</a>) <<a href="mailto:cfe-dev@lists.llvm.org">cfe-dev@lists.llvm.org</a>>; Bader, Alexey (<a href="mailto:alexey.bader@intel.com">alexey.bader@intel.com</a>)
 <<a href="mailto:alexey.bader@intel.com">alexey.bader@intel.com</a>>; Pan, Xiuli <<a href="mailto:xiuli.pan@intel.com">xiuli.pan@intel.com</a>><br>
<b>Cc:</b> Tom Stellard <<a href="mailto:tom@stellard.net">tom@stellard.net</a>>; Sumner, Brian <<a href="mailto:Brian.Sumner@amd.com">Brian.Sumner@amd.com</a>>; Tye, Tony <<a href="mailto:Tony.Tye@amd.com">Tony.Tye@amd.com</a>>; nd <<a href="mailto:nd@arm.com">nd@arm.com</a>><br>
<b>Subject:</b> RE: [RFC][OpenCL] New representation for sampler_t and its literal initializer<span lang="EN-GB"><o:p></o:p></span></p>
</div>
</div>
<p class="MsoNormal"> <span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB" style="color:#1F497D">Hi Sam,</span><span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB" style="color:#1F497D"> </span><span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB" style="color:#1F497D">I am just not sure whether having a struct solution is generic enough, certainly less generic than just having __initialize_sampler call.
</span><span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB" style="color:#1F497D"> </span><span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB" style="color:#1F497D">On the other hand,  having this struct offers more functionality (avoid splitting sampler fields later on).</span><span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB" style="color:#1F497D"> </span><span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB" style="color:#1F497D">Cheers,</span><span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB" style="color:#1F497D">Anastasia</span><span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB" style="color:#1F497D"> </span><span lang="EN-GB"><o:p></o:p></span></p>
<div>
<div style="border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal"><b><span style="font-size:10.0pt;font-family:"Tahoma",sans-serif">From:</span></b><span style="font-size:10.0pt;font-family:"Tahoma",sans-serif"> Liu, Yaxun (Sam) [<a href="mailto:Yaxun.Liu@amd.com">mailto:Yaxun.Liu@amd.com</a>]
<br>
<b>Sent:</b> 10 June 2016 16:14<br>
<b>To:</b> Anastasia Stulova; cfe-dev (<a href="mailto:cfe-dev@lists.llvm.org">cfe-dev@lists.llvm.org</a>); Bader, Alexey (<a href="mailto:alexey.bader@intel.com">alexey.bader@intel.com</a>); Pan, Xiuli<br>
<b>Cc:</b> Tom Stellard; Sumner, Brian; Tye, Tony; nd<br>
<b>Subject:</b> RE: [RFC][OpenCL] New representation for sampler_t and its literal initializer</span><span lang="EN-GB"><o:p></o:p></span></p>
</div>
</div>
<p class="MsoNormal"><span lang="EN-GB"> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">Anastasia,</span><span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"> </span><span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">Thanks for the feedback.</span><span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"> </span><span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">Right all the sampler variables will become local (function scope).</span><span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"> </span><span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">I have some updates to the proposal by Brian’s suggestions to accommodate OpenCL C++’s needs since they represent the sampler initializer by struct.</span><span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"> </span><span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">Basically,</span><span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoListParagraph" style="text-indent:-.25in"><span style="color:#1F497D">1.</span><span style="font-size:7.0pt;font-family:"Times New Roman",serif;color:#1F497D">      
</span><span style="color:#1F497D">Change the builtin function name from </span>__initialize_sampler to
<span style="color:#1F497D"> __translate_sampler_initializer.</span><span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoListParagraph" style="text-indent:-.25in"><span style="color:#1F497D">2.</span><span style="font-size:7.0pt;font-family:"Times New Roman",serif;color:#1F497D">      
</span><span style="color:#1F497D">Keep the concrete struct type for sampler initializer in Khronos Clang.</span><span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoListParagraph" style="text-indent:-.25in"><span style="color:#1F497D">3.</span><span style="font-size:7.0pt;font-family:"Times New Roman",serif;color:#1F497D">      
</span><span style="color:#1F497D">Change the argument of __translate_sampler_initializer from int to the sampler initializer struct. Clang will translate the OpenCL sampler literal to the sampler initializer struct first, then pass it to __translate_sampler_initializer.</span><span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"> </span><span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"> </span><span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">Here is the updated example:</span><span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"> </span><span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal">sampler_t s = ADDR | NORM | FILT;<span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal">void f() {<span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal">  g(s);<span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal">}<span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoListParagraph" style="text-indent:-.25in"><span style="font-family:Wingdings">ð</span><span style="font-size:7.0pt;font-family:"Times New Roman",serif"> 
</span>Llvm bitcode equivalent to (assuming __sampler is the opaque struct type to represent sampler_t):<span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal">// opaque struct type for sampler<span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal">struct __sampler;<span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal">// concrete sampler initializer struct type<span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal">struct __sampler_initializer {<span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal">  int addr;<span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal">  int normalization;<span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal">  int filter;<span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal">};<span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB"> <o:p></o:p></span></p>
<p class="MsoNormal">constant __sampler *__attribute__((always_inline)) __translate_sampler_initializer(struct __sampler_initializer); // a builtin function for translating sampler initializer<span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal">constant struct __sampler_initializer _SI = {ADDR, NORM, FILT};<span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal">void f() {<span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal">  constant __sampler *_s = __translate_sampler_initializer(_SI);<span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal">  g(_s);<span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal">}<span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">Thanks.</span><span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"> </span><span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">Sam</span><span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"> </span><span lang="EN-GB"><o:p></o:p></span></p>
<div>
<div style="border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal"><b>From:</b> Anastasia Stulova [<a href="mailto:Anastasia.Stulova@arm.com">mailto:Anastasia.Stulova@arm.com</a>]
<br>
<b>Sent:</b> Friday, June 10, 2016 10:16 AM<br>
<b>To:</b> Liu, Yaxun (Sam) <<a href="mailto:Yaxun.Liu@amd.com">Yaxun.Liu@amd.com</a>>; cfe-dev (<a href="mailto:cfe-dev@lists.llvm.org">cfe-dev@lists.llvm.org</a>) <<a href="mailto:cfe-dev@lists.llvm.org">cfe-dev@lists.llvm.org</a>>; Bader, Alexey (<a href="mailto:alexey.bader@intel.com">alexey.bader@intel.com</a>)
 <<a href="mailto:alexey.bader@intel.com">alexey.bader@intel.com</a>>; Pan, Xiuli <<a href="mailto:xiuli.pan@intel.com">xiuli.pan@intel.com</a>><br>
<b>Cc:</b> Tom Stellard <<a href="mailto:tom@stellard.net">tom@stellard.net</a>>; Sumner, Brian <<a href="mailto:Brian.Sumner@amd.com">Brian.Sumner@amd.com</a>>; Tye, Tony <<a href="mailto:Tony.Tye@amd.com">Tony.Tye@amd.com</a>>; nd <<a href="mailto:nd@arm.com">nd@arm.com</a>><br>
<b>Subject:</b> RE: [RFC][OpenCL] New representation for sampler_t and its literal initializer<span lang="EN-GB"><o:p></o:p></span></p>
</div>
</div>
<p class="MsoNormal"> <span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB" style="color:#1F497D">Hi Sam,</span><span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB" style="color:#1F497D"> </span><span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB" style="color:#1F497D">I agree the original implementation of sampler type in LLVM isn’t ideal.</span><span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB" style="color:#1F497D"> </span><span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB" style="color:#1F497D">Your approach seems sensible to me. Would this mean that all sampler variables will be transformed to local by Clang?</span><span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB" style="color:#1F497D"> </span><span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB" style="color:#1F497D">Thanks,</span><span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB" style="color:#1F497D">Anastasia </span><span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB" style="color:#1F497D"> </span><span lang="EN-GB"><o:p></o:p></span></p>
<div>
<div style="border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal"><b><span style="font-size:10.0pt;font-family:"Tahoma",sans-serif">From:</span></b><span style="font-size:10.0pt;font-family:"Tahoma",sans-serif"> Liu, Yaxun (Sam) [</span><a href="mailto:Yaxun.Liu@amd.com"><span style="font-size:10.0pt;font-family:"Tahoma",sans-serif">mailto:Yaxun.Liu@amd.com</span></a><span style="font-size:10.0pt;font-family:"Tahoma",sans-serif">]
<br>
<b>Sent:</b> 09 June 2016 21:18<br>
<b>To:</b> cfe-dev (</span><a href="mailto:cfe-dev@lists.llvm.org"><span style="font-size:10.0pt;font-family:"Tahoma",sans-serif">cfe-dev@lists.llvm.org</span></a><span style="font-size:10.0pt;font-family:"Tahoma",sans-serif">); Anastasia Stulova; Bader, Alexey
 (</span><a href="mailto:alexey.bader@intel.com"><span style="font-size:10.0pt;font-family:"Tahoma",sans-serif">alexey.bader@intel.com</span></a><span style="font-size:10.0pt;font-family:"Tahoma",sans-serif">); Pan, Xiuli<br>
<b>Cc:</b> Tom Stellard; Sumner, Brian; Tye, Tony<br>
<b>Subject:</b> [RFC][OpenCL] New representation for sampler_t and its literal initializer</span><span lang="EN-GB"><o:p></o:p></span></p>
</div>
</div>
<p class="MsoNormal"><span lang="EN-GB"> <o:p></o:p></span></p>
<p class="MsoNormal">Hi,<span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal">Currently Clang use int32 to represent sampler_t, which have been a source of issue for some backends, because in some backends sampler_t cannot be represented by int32. They have to depend on kernel argument metadata and use IPA to find
 the sampler arguments and global variables and transform them to target specific sampler type.<span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal">Khronos Clang spirv-1.0 branch (<a href="https://github.com/KhronosGroup/SPIR/tree/spirv-1.0">https://github.com/KhronosGroup/SPIR/tree/spirv-1.0</a> ) represents sampler_t as an opaque struct pointer. Also it represents sampler literal
 as a concrete struct type, and cast its pointer to a pointer to the opaque struct type for sampler_t. However there are two issues with the way how sampler literal is represented:<span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoListParagraph" style="text-indent:-.25in">1.<span style="font-size:7.0pt;font-family:"Times New Roman",serif">      
</span>Backends still need to translate the sampler initializer struct to target specific sampler initializer, and this transformation cannot be implemented by library functions. Instead, it needs to be done by passes.<span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoListParagraph" style="text-indent:-.25in">2.<span style="font-size:7.0pt;font-family:"Times New Roman",serif">      
</span>Optimizer may try to optimize the sampler global variable initialized with a sampler initializer struct. The optimizer will assume the sampler contains the bits of the initializer struct and may do memory optimizations on it, which will cause difficulty
 for backends to transform the samplers.<span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal">We think representing sampler as an opaque type is a good idea, which we suggest Clang trunk to adopt. And we propose a another way to represent sampler literal. Basically in Clang codegen we generate a function call for each reference
 of a sampler global variable initialized with a sampler literal, e.g.<span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal">sampler_t s = 0;<span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal">void f() {<span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal">  g(s);<span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal">}<span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoListParagraph" style="text-indent:-.25in"><span style="font-family:Wingdings">ð</span><span style="font-size:7.0pt;font-family:"Times New Roman",serif"> 
</span>Llvm bitcode equivalent to (assuming __sampler is the opaque struct type to represent sampler_t):<span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal">constant __sampler *__attribute__((always_inline)) __initialize_sampler(int); // a builtin function for initialize a sampler<span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal">void f() {<span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal">  constant __sampler *_s = __initialize_sampler(0);<span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal">  g(_s);<span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal">}<span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal">Each builtin library can implement its own __initialize_sampler(). Since the real sampler type tends to be architecture dependent, allowing it to be initialized by a library function simplifies backend design. A typical implementation of
 __initialize_sampler could be a table lookup of real sampler literal values. Since its argument is always a literal, the returned pointer is known at compile time and easily optimized to finally become some literal values directly put into image read instructions.<span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal">The advantage of this representation is:<span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoListParagraph" style="text-indent:-.25in">1.<span style="font-size:7.0pt;font-family:"Times New Roman",serif">      
</span>Robust - can be optimized without losing information<span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoListParagraph" style="text-indent:-.25in">2.<span style="font-size:7.0pt;font-family:"Times New Roman",serif">      
</span>Easy to implement – can be implemented by library instead of pass<span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal">Your feedbacks are welcome. Thanks.<span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal">Sam<span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"> <span lang="EN-GB"><o:p></o:p></span></p>
</div>
</body>
</html>