<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:"MS Mincho";
        panose-1:2 2 6 9 4 2 5 8 3 4;}
@font-face
        {font-family:"MS Mincho";
        panose-1:2 2 6 9 4 2 5 8 3 4;}
@font-face
        {font-family:Cambria;
        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:"\@MS Mincho";
        panose-1:2 2 6 9 4 2 5 8 3 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.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:12.0pt;
        font-family:"Times New Roman","serif";}
span.EmailStyle18
        {mso-style-type:personal;
        font-family:"Calibri","sans-serif";
        color:windowtext;}
span.EmailStyle19
        {mso-style-type:personal;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
span.EmailStyle20
        {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;}
/* List Definitions */
@list l0
        {mso-list-id:873887640;
        mso-list-type:hybrid;
        mso-list-template-ids:1654663718 1134465488 67698713 67698715 67698703 67698713 67698715 67698703 67698713 67698715;}
@list l0:level1
        {mso-level-text:"\(%1\)";
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l0:level2
        {mso-level-number-format:alpha-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l0:level3
        {mso-level-number-format:roman-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:right;
        text-indent:-9.0pt;}
@list l0:level4
        {mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l0:level5
        {mso-level-number-format:alpha-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l0:level6
        {mso-level-number-format:roman-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:right;
        text-indent:-9.0pt;}
@list l0:level7
        {mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l0:level8
        {mso-level-number-format:alpha-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l0:level9
        {mso-level-number-format:roman-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:right;
        text-indent:-9.0pt;}
ol
        {margin-bottom:0in;}
ul
        {margin-bottom:0in;}
--></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="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif"">Hello,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif""><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif"">I encountered a problem triggered by Jump-Threading optimization.  This pass is creating an unreachable block with an instruction that is not well formed, which then causes the
 subsequent GVN pass to enter an infinite loop.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif""><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif"">Here are the details:<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif"">Consider the following small testcase. I reduced it from a huge project that was failing during LTO. Unfortunately,  I was not given any source files, only the bitcode.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif""><o:p> </o:p></span></p>
<p class="MsoNormal">-----------------------------------------------------------------------------<o:p></o:p></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif"">small.ll<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif"">----------------------------------------------------------------<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif"">%"class.ls_file::Path" = type { [1024 x i8], i8*, i8*, i8*}<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif""><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif"">; Function Attrs: nounwind sspstrong uwtable<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif"">define void @foo(%"class.ls_file::Path"* %this, i8* nocapture readonly %pPath) #0 {<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif"">  %1 = load i8* %pPath, align 1
<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif"">  switch i8 %1, label %.loopexit.i.i [<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif"">    i8 92, label %2<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif"">    i8 47, label %2<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif"">  ]
<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif""><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif"">; <label>:2                                       ; preds = %0, %0<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif"">  %3 = load i8* %pPath, align 1
<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif"">  %4 = icmp eq i8 %3, 46<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif"">  br i1 %4, label %.critedge.i.i, label %.outer.i.i
<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif""><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif"">.critedge.i.i:                                    ; preds = %.critedge.i.i, %.critedge.i.i, %2<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif"">  %.0.i.i = phi i8* [ %pPath, %2 ], [ %5, %.critedge.i.i ], [ %5, %.critedge.i.i ]<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif"">  %5 = getelementptr inbounds i8* %.0.i.i, i64 1
<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif"">  %6 = load i8* %5, align 1
<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif"">  switch i8 %6, label %.outer.i.i [<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif"">    i8 92, label %.critedge.i.i<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif"">    i8 47, label %.critedge.i.i<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif"">  ]
<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif""><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif"">.outer.i.i:                                       ; preds = %.critedge.i.i, %2<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif"">  %.2.ph2.i.i = phi i8* [ %5, %.critedge.i.i ], [ %pPath, %2 ]<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif"">  %7 = load i8* %.2.ph2.i.i, align 1
<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif"">  %8 = icmp eq i8 %7, 0
<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif"">  br label %.loopexit.i.i
<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif""><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif"">.loopexit.i.i:                                    ; preds = %7<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif"">  ret void
<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif"">}<o:p></o:p></span></p>
<div style="border:none;border-bottom:solid windowtext 1.0pt;padding:0in 0in 1.0pt 0in">
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif""><o:p> </o:p></span></p>
</div>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif""><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif"">If you run GVN after jump threading, opt will go into infinite recursion.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif""><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif"">opt  -jump-threading small.ll -o test2.o<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif"">opt -gvn test2.o -o test3.o<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif"">Segmentation fault (core dumped)<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif""><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif""><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif"">Here’s why it’s happening:<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif""><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif"">Jump threading transforms this block:<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif""><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif"">.critedge.i.i:                                    ; preds = %.critedge.i.i, %.critedge.i.i, %2<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif"">  %.0.i.i = phi i8* [ %pPath, %2 ], [ %5, %.critedge.i.i ], [ %5, %.critedge.i.i ]<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif"">  %5 = getelementptr inbounds i8* %.0.i.i, i64 1
<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif"">  %6 = load i8* %5, align 1
<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif"">  switch i8 %6, label %.outer.i.i [<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif"">    i8 92, label %.critedge.i.i<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif"">    i8 47, label %.critedge.i.i<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif"">  ]
<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif""><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif"">into the following block:<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif""><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif"">.critedge.i.i:                                    ; preds = %.critedge.i.i, %.critedge.i.i<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif"">  %2 = getelementptr inbounds i8* %2, i64 1<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif"">  %3 = load i8* %2, align 1<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif"">  switch i8 %3, label %.outer.i.i [<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif"">    i8 92, label %.critedge.i.i<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif"">    i8 47, label %.critedge.i.i<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif"">  ]<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif""><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif"">Note that the block .critedge.i.i is now unreachable and it contains the following instruction:<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif"">%2 = getelementptr inbounds i8* %2, i64 1                   <o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif""><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif"">This instruction doesn’t appear to be well formed. However, one could argue that it is – formally %2 def does dominate all %2 uses because both are located in an unreachable block,
 so every path to the use is passing through the def (because there are 0 paths like that).<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif"">That is likely the reason why –verify doesn’t complain about it.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif""><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif""><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif"">And this is where the problem actually happens:<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif"">When -gvn pass is invoked afterwards, it goes into an infinite recursion in function ‘<span style="background:white;mso-highlight:white">PHITranslateSubExpr</span>’ (located in
 PHITransAddr.cpp). When processing a GEP instruction (%2), this function calls itself recursively with its first operand (which is also %2).<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif""><o:p> </o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:14.0pt;font-family:"Cambria","serif";background:white;mso-highlight:white">// Handle getelementptr with at least one PHI translatable operand.<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:14.0pt;font-family:"Cambria","serif";background:white;mso-highlight:white">  if (GetElementPtrInst *GEP = dyn_cast<GetElementPtrInst>(Inst)) {<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:14.0pt;font-family:"Cambria","serif";background:white;mso-highlight:white">    SmallVector<Value*, 8> GEPOps;<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:14.0pt;font-family:"Cambria","serif";background:white;mso-highlight:white">    bool AnyChanged = false;<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:14.0pt;font-family:"Cambria","serif";background:white;mso-highlight:white">    for (unsigned i = 0, e = GEP->getNumOperands(); i != e; ++i) {<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:14.0pt;font-family:"Cambria","serif";background:white;mso-highlight:white">      Value *GEPOp = PHITranslateSubExpr(GEP->getOperand(i), CurBB, PredBB, DT);                     // <- it
 goes into infinite recursion here.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif";background:white;mso-highlight:white">      if (GEPOp == 0) return 0;</span><span style="font-size:14.0pt;font-family:"Cambria","serif""><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif""><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif"">There are several different ways to fix this problem.
<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif""><o:p> </o:p></span></p>
<p class="MsoListParagraph" style="text-indent:-.25in;mso-list:l0 level1 lfo2"><![if !supportLists]><span style="font-size:14.0pt;font-family:"Cambria","serif""><span style="mso-list:Ignore">(1)<span style="font:7.0pt "Times New Roman"">                       
</span></span></span><![endif]><span style="font-size:14.0pt;font-family:"Cambria","serif"">We have to remove the unreachable code immediately after or during Jump-Threading pass;<o:p></o:p></span></p>
<p class="MsoListParagraph" style="text-indent:-.25in;mso-list:l0 level1 lfo2"><![if !supportLists]><span style="font-size:14.0pt;font-family:"Cambria","serif""><span style="mso-list:Ignore">(2)<span style="font:7.0pt "Times New Roman"">                       
</span></span></span><![endif]><span style="font-size:14.0pt;font-family:"Cambria","serif"">GVN should skip unreachable code;<o:p></o:p></span></p>
<p class="MsoListParagraph" style="text-indent:-.25in;mso-list:l0 level1 lfo2"><![if !supportLists]><span style="font-size:14.0pt;font-family:"Cambria","serif""><span style="mso-list:Ignore">(3)<span style="font:7.0pt "Times New Roman"">                       
</span></span></span><![endif]><span style="font-size:14.0pt;font-family:"Cambria","serif"">GVN shouldn’t recursively invoke the same function with the same arguments. 
<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif""><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif""><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif"">Here is an extra check that implements the 3<sup>rd</sup> approach. Please review.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif""><o:p> </o:p></span></p>
<p class="MsoNormal">===================================================================<o:p></o:p></p>
<p class="MsoNormal">--- PHITransAddr.cpp    (revision 229821)<o:p></o:p></p>
<p class="MsoNormal">+++ PHITransAddr.cpp    (working copy)<o:p></o:p></p>
<p class="MsoNormal">@@ -217,10 +217,13 @@<o:p></o:p></p>
<p class="MsoNormal">     SmallVector<Value*, 8> GEPOps;<o:p></o:p></p>
<p class="MsoNormal">     bool AnyChanged = false;<o:p></o:p></p>
<p class="MsoNormal">     for (unsigned i = 0, e = GEP->getNumOperands(); i != e; ++i) {<o:p></o:p></p>
<p class="MsoNormal">-      Value *GEPOp = PHITranslateSubExpr(GEP->getOperand(i), CurBB, PredBB, DT);<o:p></o:p></p>
<p class="MsoNormal">+      Value *Operand= GEP->getOperand(i);<o:p></o:p></p>
<p class="MsoNormal">+      if (GEP==Operand)<o:p></o:p></p>
<p class="MsoNormal">+        continue;<o:p></o:p></p>
<p class="MsoNormal">+      Value *GEPOp = PHITranslateSubExpr(Operand, CurBB, PredBB, DT);<o:p></o:p></p>
<p class="MsoNormal">       if (!GEPOp) return nullptr;<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">-      AnyChanged |= GEPOp != GEP->getOperand(i);<o:p></o:p></p>
<p class="MsoNormal">+      AnyChanged |= GEPOp != Operand;<o:p></o:p></p>
<p class="MsoNormal">       GEPOps.push_back(GEPOp);<o:p></o:p></p>
<p class="MsoNormal">     }<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><span style="font-family:"Cambria","serif"">===================================================================</span><o:p></o:p></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif"">One thing to note here is – unreachable code, if not removed, could push invalid code through subsequent passes. This invalid code will not be caught by the verifier. If  these
 passes are not paranoid enough, the bad code may cause all sorts of issues. The case above is one example.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif""><o:p> </o:p></span></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif"">Katya.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif""><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif""><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif""><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:"Cambria","serif""> <o:p></o:p></span></p>
</div>
</body>
</html>