<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=us-ascii">
<meta name="Generator" content="Microsoft Word 14 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 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:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
p.MsoPlainText, li.MsoPlainText, div.MsoPlainText
        {mso-style-priority:99;
        mso-style-link:"Plain Text Char";
        margin:0in;
        margin-bottom:.0001pt;
        font-size:10.0pt;
        font-family:"Courier New";}
span.PlainTextChar
        {mso-style-name:"Plain Text Char";
        mso-style-priority:99;
        mso-style-link:"Plain Text";
        font-family:"Courier New";}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri","sans-serif";}
@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="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoPlainText"><span style="font-size:12.0pt;font-family:"Times New Roman","serif"">I'm working on some small improvements to SLPVectorizer.cpp so that it can deal with some tuple operations arising from Julia code.  Being fairly new to LLVM, I could
 use some advice, particular from those familiar with the internals of SLPVectorizer.<o:p></o:p></span></p>
<p class="MsoPlainText"><span style="font-size:12.0pt;font-family:"Times New Roman","serif""><o:p> </o:p></span></p>
<p class="MsoPlainText"><span style="font-size:12.0pt;font-family:"Times New Roman","serif"">The motivation can be found in the Julia discussion https://github.com/JuliaLang/julia/issues/5857 .  Here is an example of the kind of LLVM code I wish to vectorize. 
  <o:p></o:p></span></p>
<p class="MsoPlainText">-------------------------------------------------------------<o:p></o:p></p>
<p class="MsoPlainText">define <4 x float> @julia_foo111(<4 x float>, <4 x float>) {<o:p></o:p></p>
<p class="MsoPlainText">top:<o:p></o:p></p>
<p class="MsoPlainText">  %2 = extractelement <4 x float> %0, i32 0<o:p></o:p></p>
<p class="MsoPlainText">  %3 = extractelement <4 x float> %1, i32 0<o:p></o:p></p>
<p class="MsoPlainText">  %4 = fadd float %2, %3<o:p></o:p></p>
<p class="MsoPlainText">  %5 = insertelement <4 x float> undef, float %4, i32 0<o:p></o:p></p>
<p class="MsoPlainText">  %6 = extractelement <4 x float> %0, i32 1<o:p></o:p></p>
<p class="MsoPlainText">  %7 = extractelement <4 x float> %1, i32 1<o:p></o:p></p>
<p class="MsoPlainText">  %8 = fadd float %6, %7<o:p></o:p></p>
<p class="MsoPlainText">  %9 = insertelement <4 x float> %5, float %8, i32 1<o:p></o:p></p>
<p class="MsoPlainText">  %10 = extractelement <4 x float> %0, i32 2<o:p></o:p></p>
<p class="MsoPlainText">  %11 = extractelement <4 x float> %1, i32 2<o:p></o:p></p>
<p class="MsoPlainText">  %12 = fadd float %10, %11<o:p></o:p></p>
<p class="MsoPlainText">  %13 = insertelement <4 x float> %9, float %12, i32 2<o:p></o:p></p>
<p class="MsoPlainText">  %14 = extractelement <4 x float> %0, i32 3<o:p></o:p></p>
<p class="MsoPlainText">  %15 = extractelement <4 x float> %1, i32 3<o:p></o:p></p>
<p class="MsoPlainText">  %16 = fadd float %14, %15<o:p></o:p></p>
<p class="MsoPlainText">  %17 = insertelement <4 x float> %13, float %16, i32 3<o:p></o:p></p>
<p class="MsoPlainText">  ret <4 x float> %17<o:p></o:p></p>
<p class="MsoPlainText">}<o:p></o:p></p>
<p class="MsoPlainText">-------------------------------------------------------------<o:p></o:p></p>
<p class="MsoPlainText"><span style="font-size:12.0pt;font-family:"Times New Roman","serif"">I want the fadd instructions to be vectorized.  I've been able to implement most of what I need (see attached patch), but with a fatal flaw: the uses of the vectorized
 result are  not moved as necessary.  Here is the current (and quite illegal) result:<o:p></o:p></span></p>
<p class="MsoPlainText">-------------------------------------------------------------<o:p></o:p></p>
<p class="MsoPlainText">top:<o:p></o:p></p>
<p class="MsoPlainText">  %2 = extractelement <4 x float> %8, i32 0<o:p></o:p></p>
<p class="MsoPlainText">  %3 = insertelement <4 x float> undef, float %2, i32 0<o:p></o:p></p>
<p class="MsoPlainText">  %4 = extractelement <4 x float> %8, i32 1<o:p></o:p></p>
<p class="MsoPlainText">  %5 = insertelement <4 x float> %3, float %4, i32 1<o:p></o:p></p>
<p class="MsoPlainText">  %6 = extractelement <4 x float> %8, i32 2<o:p></o:p></p>
<p class="MsoPlainText">  %7 = insertelement <4 x float> %5, float %6, i32 2<o:p></o:p></p>
<p class="MsoPlainText">  %8 = fadd <4 x float> %0, %1<o:p></o:p></p>
<p class="MsoPlainText">  %9 = extractelement <4 x float> %8, i32 3<o:p></o:p></p>
<p class="MsoPlainText">  %10 = insertelement <4 x float> %7, float %9, i32 3<o:p></o:p></p>
<p class="MsoPlainText">  ret <4 x float> %10<o:p></o:p></p>
<p class="MsoPlainText">-------------------------------------------------------------<o:p></o:p></p>
<p class="MsoPlainText"><span style="font-size:12.0pt;font-family:"Times New Roman","serif"">Instructions %3, %A5 and %7 need to be moved to after Instructions %8.  I’m wondering what is a good way to do this.  The relevant place in SLPVectorizer.cpp is around
 here:<o:p></o:p></span></p>
<p class="MsoPlainText">-------------------------------------------------------------<o:p></o:p></p>
<p class="MsoPlainText"><span style="font-size:12.0pt;font-family:"Times New Roman","serif"">    if (Cost < -SLPCostThreshold) {<o:p></o:p></span></p>
<p class="MsoPlainText"><span style="font-size:12.0pt;font-family:"Times New Roman","serif"">      DEBUG(dbgs() << "SLP: Vectorizing list at cost:" << Cost << ".\n");<o:p></o:p></span></p>
<p class="MsoPlainText"><span style="font-size:12.0pt;font-family:"Times New Roman","serif"">      R.vectorizeTree();<o:p></o:p></span></p>
<p class="MsoPlainText"><span style="font-size:12.0pt;font-family:"Times New Roman","serif""><o:p> </o:p></span></p>
<p class="MsoPlainText"><span style="font-size:12.0pt;font-family:"Times New Roman","serif"">      // Move to the next bundle.<o:p></o:p></span></p>
<p class="MsoPlainText"><span style="font-size:12.0pt;font-family:"Times New Roman","serif"">      i += VF - 1;<o:p></o:p></span></p>
<p class="MsoPlainText"><span style="font-size:12.0pt;font-family:"Times New Roman","serif"">      Changed = true;<o:p></o:p></span></p>
<p class="MsoPlainText"><span style="font-size:12.0pt;font-family:"Times New Roman","serif"">    }<o:p></o:p></span></p>
<p class="MsoPlainText"><span style="font-size:12.0pt;font-family:"Times New Roman","serif""></span>-------------------------------------------------------------<o:p></o:p></p>
<p class="MsoPlainText"><span style="font-size:12.0pt;font-family:"Times New Roman","serif"">Should I try to move the instructions before or after the call to R.vectorizeTree()?  Or maybe do it even later after all bundles have been vectorized?  Are there LLVM
 utilities for doing this kind of fixup within a basic block?<o:p></o:p></span></p>
<p class="MsoPlainText"><span style="font-size:12.0pt;font-family:"Times New Roman","serif""><o:p> </o:p></span></p>
<p class="MsoPlainText"><span style="font-size:12.0pt;font-family:"Times New Roman","serif"">Any pointers/advice appreciated.<o:p></o:p></span></p>
<p class="MsoPlainText"><span style="font-size:12.0pt;font-family:"Times New Roman","serif""><o:p> </o:p></span></p>
<p class="MsoPlainText"><span style="font-size:12.0pt;font-family:"Times New Roman","serif"">- Arch</span>
<span style="font-size:12.0pt;font-family:"Times New Roman","serif""><o:p></o:p></span></p>
</div>
</body>
</html>