<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 15 (filtered medium)">
<style><!--
/* Font Definitions */
@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;}
/* 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;}
span.EmailStyle17
        {mso-style-type:personal-compose;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
.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="#0563C1" vlink="#954F72">
<div class="WordSection1">
<p class="MsoNormal">Hi,<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Consider the following test case:<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">int foo(float *A, float *B, float *C, int len, int VSMALL) {<o:p></o:p></p>
<p class="MsoNormal">  for (int i = 0; i < len; i++)<o:p></o:p></p>
<p class="MsoNormal">    if (C[i] > VSMALL)<o:p></o:p></p>
<p class="MsoNormal">      A[i] = B[i] / C[i];<o:p></o:p></p>
<p class="MsoNormal">}<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">In this test the div operation is conditional but llvm is generating unconditional div for this case:<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><span style="font-size:10.0pt">vector.body:                                      ; preds = %vector.body, %vector.ph<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt">  %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ]<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt">  %0 = getelementptr inbounds float, float* %C, i64 %index<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt">  %1 = bitcast float* %0 to <8 x float>*<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt">  %wide.load = load <8 x float>, <8 x float>* %1, align 4, !tbaa !2, !alias.scope !6<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt">  %2 = fcmp ogt <8 x float> %wide.load, %broadcast.splat30<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt">  %3 = getelementptr inbounds float, float* %B, i64 %index<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt">  %4 = bitcast float* %3 to <8 x float>*<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt">  %wide.masked.load = call <8 x float> @llvm.masked.load.v8f32.p0v8f32(<8 x float>* %4, i32 4, <8 x i1> %2, <8 x float> undef), !tbaa !2, !alias.scope !9<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt">  <span style="background:red;mso-highlight:red">
%5 = fdiv <8 x float> %wide.masked.load, %wide.load</span><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt">  %6 = getelementptr inbounds float, float* %A, i64 %index<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt">  %7 = bitcast float* %6 to <8 x float>*<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt">  call void @llvm.masked.store.v8f32.p0v8f32(<8 x float> %5, <8 x float>* %7, i32 4, <8 x i1> %2), !tbaa !2, !alias.scope !11, !noalias !13<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt">  %index.next = add i64 %index, 8<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt">  %8 = icmp eq i64 %index.next, %n.vec<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt">  br i1 %8, label %middle.block, label %vector.body, !llvm.loop !14<o:p></o:p></span></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">The generated IR seems unsafe because fdiv is not respecting the compare mask.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">As div is the unsafe operation, llvm should generates the predicated divs.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">If I change the data type of A, B & C to the integer type then it generates the right code, where div is predicated based on the mask, and scalar div gets generated for each lane.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">This seems like a problem in predicate instruction detection part of LV, currently it considers only UDiv, SDiv, URem, SRem.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><span style="font-size:10.0pt">bool LoopVectorizationCostModel::isScalarWithPredication(Instruction *I, unsigned VF) {<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt">  if (!Legal->blockNeedsPredication(I->getParent()))<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt">    return false;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt">  switch(I->getOpcode()) {<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt">  default:<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt">    break;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt">  case Instruction::UDiv:  <span style="background:silver;mso-highlight:silver">
<- Floating point operations not considered i.e FDiv & FRem</span><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt">  case Instruction::SDiv:<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt">  case Instruction::SRem:<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt">  case Instruction::URem:<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt">    return mayDivideByZero(*I);<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt">}<o:p></o:p></span></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">I don’t have any background of this function, but I feel this should consider FDiv & FRem instructions as well.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">If there is no objection to it, will do a patch.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Thanks,<o:p></o:p></p>
<p class="MsoNormal">Ashutosh<o:p></o:p></p>
</div>
</body>
</html>