<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;
        text-align:justify;
        font-size:10.5pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:#0563C1;
        text-decoration:underline;}
span.EmailStyle21
        {mso-style-type:personal-reply;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
.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" style="text-justify-trim:punctuation">
<div class="WordSection1">
<p class="MsoNormal" align="left" style="text-align:left"><span style="font-size:11.0pt">The issue is specifically the case where the condition of a select constant expression is itself a select or shuffle constant expression?  The simplest solution is probably
 to just call getConstantFwdRef() early, to “set” the type of each expression. We know the result type of the constant expression when we first see it; the ambiguity is only the type of the condition operand.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">-Eli<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt"><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" align="left" style="margin-left:.5in;text-align:left"><b><span style="font-size:11.0pt">From:</span></b><span style="font-size:11.0pt"> chenmindong <chenmindong1@huawei.com>
<br>
<b>Sent:</b> Sunday, July 19, 2020 10:27 PM<br>
<b>To:</b> Eli Friedman <efriedma@quicinc.com>; llvm-dev@lists.llvm.org<br>
<b>Subject:</b> [EXT] RE: [llvm-dev] BitcodeReader.cpp bug under LTO<o:p></o:p></span></p>
</div>
</div>
<p class="MsoNormal" align="left" style="margin-left:.5in;text-align:left"><o:p> </o:p></p>
<p class="MsoNormal" style="margin-left:.5in"><span style="color:#1F497D;mso-fareast-language:ZH-CN">Hi Eli,<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:.5in"><span style="color:#1F497D;mso-fareast-language:ZH-CN"><o:p> </o:p></span></p>
<p class="MsoNormal" style="margin-left:.5in"><span style="color:#1F497D;mso-fareast-language:ZH-CN">Thanks for the advice! By delaying processing the “select” until we have resolved other records(like “aggregate ” in this case) as you did for “shuffle”, the
 test case passes now. But I wonder if it’s an ultimate solution: what if the selector of a “select” is the output of another forward-reference “select” that hasn’t been resolved yet? We still cannot determine its type then. Is it possible?<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:.5in"><span style="color:#1F497D;mso-fareast-language:ZH-CN"><o:p> </o:p></span></p>
<p class="MsoNormal" style="margin-left:.5in"><span style="color:#1F497D;mso-fareast-language:ZH-CN">Regards,<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:.5in"><span style="color:#1F497D;mso-fareast-language:ZH-CN">Mindong<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:.5in"><span style="color:#1F497D;mso-fareast-language:ZH-CN"><o:p> </o:p></span></p>
<div style="border:none;border-left:solid blue 1.5pt;padding:0in 0in 0in 4.0pt">
<div>
<div style="border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal" align="left" style="margin-left:.5in;text-align:left"><b><span style="font-size:11.0pt;mso-fareast-language:ZH-CN">From:</span></b><span style="font-size:11.0pt;mso-fareast-language:ZH-CN"> Eli Friedman [<a href="mailto:efriedma@quicinc.com">mailto:efriedma@quicinc.com</a>]
<br>
<b>Sent:</b> Friday, July 17, 2020 3:06 AM<br>
<b>To:</b> chenmindong <<a href="mailto:chenmindong1@huawei.com">chenmindong1@huawei.com</a>>; llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org">llvm-dev@lists.llvm.org</a>><br>
<b>Subject:</b> RE: [llvm-dev] BitcodeReader.cpp bug under LTO<o:p></o:p></span></p>
</div>
</div>
<p class="MsoNormal" align="left" style="margin-left:.5in;text-align:left"><span style="mso-fareast-language:ZH-CN"><o:p> </o:p></span></p>
<p class="MsoNormal" style="margin-left:.5in"><span style="font-size:11.0pt;mso-fareast-language:ZH-CN">The DelayedShuffles code in BitcodeReader::parseConstants is solving a sort of similar issue; you might be able to borrow the same approach.<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:.5in"><span style="font-size:11.0pt;mso-fareast-language:ZH-CN"><o:p> </o:p></span></p>
<p class="MsoNormal" style="margin-left:.5in"><span style="font-size:11.0pt;mso-fareast-language:ZH-CN">-Eli<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:.5in"><span style="font-size:11.0pt;mso-fareast-language:ZH-CN"><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" align="left" style="margin-left:1.0in;text-align:left"><b><span style="font-size:11.0pt;mso-fareast-language:ZH-CN">From:</span></b><span style="font-size:11.0pt;mso-fareast-language:ZH-CN"> llvm-dev <<a href="mailto:llvm-dev-bounces@lists.llvm.org">llvm-dev-bounces@lists.llvm.org</a>>
<b>On Behalf Of </b>chenmindong via llvm-dev<br>
<b>Sent:</b> Thursday, July 16, 2020 7:54 AM<br>
<b>To:</b> <a href="mailto:llvm-dev@lists.llvm.org">llvm-dev@lists.llvm.org</a><br>
<b>Subject:</b> [EXT] [llvm-dev] BitcodeReader.cpp bug under LTO<o:p></o:p></span></p>
</div>
</div>
<p class="MsoNormal" align="left" style="margin-left:1.0in;text-align:left"><span style="mso-fareast-language:ZH-CN"><o:p> </o:p></span></p>
<p class="MsoNormal" style="margin-left:1.0in"><span style="mso-fareast-language:ZH-CN">Hi guys,<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:1.0in"><span style="mso-fareast-language:ZH-CN"><o:p> </o:p></span></p>
<p class="MsoNormal" style="margin-left:1.0in"><span style="mso-fareast-language:ZH-CN">We have found a bug of BitcodeReader.cpp in processing an LTO bitcode file. As LLVM doesn’t emit use-list for LTO bitcode files, many forward references will happen when
 BitcodeReader processes the bitcode file, and LLVM uses placeholders for those forward references and resolve them later.
<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:1.0in"><span style="mso-fareast-language:ZH-CN"><o:p> </o:p></span></p>
<p class="MsoNormal" style="margin-left:1.0in"><span style="mso-fareast-language:ZH-CN">When parseConstants() reads in a CST_CODE_CE_SELECT record, e.g.<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:1.0in"><span style="mso-fareast-language:ZH-CN"><o:p> </o:p></span></p>
<p class="MsoNormal" style="margin-left:1.0in"><span style="mso-fareast-language:ZH-CN">select <selty><cond>, <ty><val1>, <ty><val2><o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:1.0in"><span style="mso-fareast-language:ZH-CN"><o:p> </o:p></span></p>
<p class="MsoNormal" style="margin-left:1.0in"><span style="mso-fareast-language:ZH-CN">If “ty” here is a vector type and “cond” is a forward reference, LLVM uses i1 as the placeholder type of “cond” if it cannot find “cond” in ValueList, as the code follows:<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:1.0in"><span style="mso-fareast-language:ZH-CN"><o:p> </o:p></span></p>
<p class="MsoNormal" style="margin-left:1.0in"><span style="mso-fareast-language:ZH-CN">      Type *SelectorTy = Type::getInt1Ty(Context);<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:1.0in"><span style="mso-fareast-language:ZH-CN"><o:p> </o:p></span></p>
<p class="MsoNormal" style="margin-left:1.0in"><span style="mso-fareast-language:ZH-CN">      // The selector might be an i1 or an <n x i1><o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:1.0in"><span style="mso-fareast-language:ZH-CN">      // Get the type from the ValueList before getting a forward ref.<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:1.0in"><span style="mso-fareast-language:ZH-CN">      if (VectorType *VTy = dyn_cast<VectorType>(CurTy))<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:1.0in"><span style="mso-fareast-language:ZH-CN">        if (Value *V = ValueList[Record[0]])<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:1.0in"><span style="mso-fareast-language:ZH-CN">          if (SelectorTy != V->getType())<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:1.0in"><span style="mso-fareast-language:ZH-CN">            SelectorTy = VectorType::get(SelectorTy, VTy->getNumElements());
<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:1.0in"><span style="mso-fareast-language:ZH-CN"><o:p> </o:p></span></p>
<p class="MsoNormal" style="margin-left:1.0in"><span style="mso-fareast-language:ZH-CN"><o:p> </o:p></span></p>
<p class="MsoNormal" style="margin-left:1.0in"><span style="mso-fareast-language:ZH-CN">However, the program aborts in RAUW() if we find “selty” is a vector type later, because LLVM are trying to replace an i1 placeholder with an <n x i1> value.<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:1.0in"><span style="mso-fareast-language:ZH-CN"><o:p> </o:p></span></p>
<p class="MsoNormal" style="margin-left:1.0in"><span style="mso-fareast-language:ZH-CN">A rough idea is to create a BitcodeReader-specific RAUW which doesn’t check type legitimacy and any other suggestion is welcome.<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:1.0in"><span style="mso-fareast-language:ZH-CN"><o:p> </o:p></span></p>
<p class="MsoNormal" style="margin-left:1.0in"><span style="mso-fareast-language:ZH-CN">Bugzilla link:
<a href="https://bugs.llvm.org/show_bug.cgi?id=46750">https://bugs.llvm.org/show_bug.cgi?id=46750</a><o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:1.0in"><span style="mso-fareast-language:ZH-CN"><o:p> </o:p></span></p>
<p class="MsoNormal" style="margin-left:1.0in"><span style="mso-fareast-language:ZH-CN">Regards,<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:1.0in"><span style="mso-fareast-language:ZH-CN">Mindong<o:p></o:p></span></p>
</div>
</div>
</body>
</html>