<div dir="ltr"><div dir="ltr">I finally managed to reproduce the issue:<div><br></div><div><div>define void @bad(i32* %A, i32 %x) {<br></div><div>entry:</div><div>  %do = icmp slt i32 0, %x</div><div>  br i1 %do, label %loop.prehead, label %exit</div><div><br></div><div>loop.prehead:                                     ; preds = %entry</div><div>  br label %loop.body</div><div><br></div><div>loop.body:                                        ; preds = %loop.body, %loop.prehead</div><div>  %i = phi i32 [ 0, %loop.prehead ], [ %i.next, %loop.body ]</div><div>  %i.next = add nsw i32 %i, 1</div><div>  %i.96 = add nsw i32 %i, 96</div><div><b>  %store.addr = getelementptr i32, i32* %A, i32 %i.next</b></div><div>  store i32 %i, i32* %store.addr, align 4</div><div>  %cmp = icmp slt i32 %i.next, %x</div><div>  br i1 %cmp, label %loop.body, label %loop.exit</div><div><br></div><div>loop.exit:                                        ; preds = %loop.body</div><div>  br label %exit</div><div><br></div><div>exit:                                             ; preds = %loop.exit, %entry</div><div>  ret void</div><div>}</div><div><br></div><div>; Printing analysis 'Scalar Evolution Analysis' for function 'bad':</div><div>; Classifying expressions for: @bad</div><div>;   %i = phi i32 [ 0, %loop.prehead ], [ %i.next, %loop.body ]</div><div>;   -->  {0,+,1}<nuw><nsw><%loop.body> U: [0,2147483647) S: [0,2147483647)<span style="white-space:pre">         </span>Exits: (-1 + %x)<span style="white-space:pre">             </span>LoopDispositions: { %loop.body: Computable }</div><div>;   %i.next = add nsw i32 %i, 1</div><div>;   -->  {1,+,1}<nuw><nsw><%loop.body> U: [1,-2147483648) S: [1,-2147483648)<span style="white-space:pre">              </span>Exits: %x<span style="white-space:pre">            </span>LoopDispositions: { %loop.body: Computable }</div><div>;   %i.96 = add nsw i32 %i, 96</div><div>;   -->  {96,+,1}<nuw><%loop.body> U: [96,-2147483553) S: [96,-2147483553)<span style="white-space:pre">               </span>Exits: (95 + %x)<span style="white-space:pre">             </span>LoopDispositions: { %loop.body: Computable }</div><div>;   %store.addr = getelementptr i32, i32* %A, i32 %i.next</div><div>;   -->  {(8 + %A),+,8}<%loop.body> U: full-set S: full-set<span style="white-space:pre">         </span>Exits: (8 + (8 * (zext i32 (-1 + %x) to i64)) + %A)<span style="white-space:pre">          </span>LoopDispositions: { %loop.body: Computable }</div><div>; Determining loop execution counts for: @bad</div><div>; Loop %loop.body: backedge-taken count is (-1 + %x)</div><div>; Loop %loop.body: max backedge-taken count is 2147483646</div><div>; Loop %loop.body: Predicated backedge-taken count is (-1 + %x)</div><div>;  Predicates:</div><div>; </div><div>; Loop %loop.body: Trip multiple is 1</div><div><br></div><div>define void @good(i32* %A, i32 %x) {</div><div>entry:</div><div>  %do = icmp slt i32 0, %x</div><div>  br i1 %do, label %loop.prehead, label %exit</div><div><br></div><div>loop.prehead:                                     ; preds = %entry</div><div>  br label %loop.body</div><div><br></div><div>loop.body:                                        ; preds = %loop.body, %loop.prehead</div><div>  %i = phi i32 [ 0, %loop.prehead ], [ %i.next, %loop.body ]</div><div>  %i.next = add nsw i32 %i, 1</div><div>  %i.96 = add nsw i32 %i, 96</div><div><b>  %store.addr = getelementptr i32, i32* %A, i32 %i.96</b></div><div>  store i32 %i, i32* %store.addr, align 4</div><div>  %cmp = icmp slt i32 %i.next, %x</div><div>  br i1 %cmp, label %loop.body, label %loop.exit</div><div><br></div><div>loop.exit:                                        ; preds = %loop.body</div><div>  br label %exit</div><div><br></div><div>exit:                                             ; preds = %loop.exit, %entry</div><div>  ret void</div><div>}</div><div><br></div><div>; Printing analysis 'Scalar Evolution Analysis' for function 'good':</div><div>; Classifying expressions for: @good</div><div>;   %i = phi i32 [ 0, %loop.prehead ], [ %i.next, %loop.body ]</div><div>;   -->  {0,+,1}<nuw><nsw><%loop.body> U: [0,2147483647) S: [0,2147483647)<span style="white-space:pre">              </span>Exits: (-1 + %x)<span style="white-space:pre">             </span>LoopDispositions: { %loop.body: Computable }</div><div>;   %i.next = add nsw i32 %i, 1</div><div>;   -->  {1,+,1}<nuw><nsw><%loop.body> U: [1,-2147483648) S: [1,-2147483648)<span style="white-space:pre">              </span>Exits: %x<span style="white-space:pre">            </span>LoopDispositions: { %loop.body: Computable }</div><div>;   %i.96 = add nsw i32 %i, 96</div><div>;   -->  {96,+,1}<nuw><nsw><%loop.body> U: [96,-2147483648) S: [96,-2147483648)<span style="white-space:pre">            </span>Exits: (95 + %x)<span style="white-space:pre">             </span>LoopDispositions: { %loop.body: Computable }</div><div>;   %store.addr = getelementptr i32, i32* %A, i32 %i.96</div><div>;   -->  {(768 + %A),+,8}<%loop.body> U: full-set S: full-set<span style="white-space:pre">         </span>Exits: (768 + (8 * (zext i32 (-1 + %x) to i64)) + %A)<span style="white-space:pre">                </span>LoopDispositions: { %loop.body: Computable }</div><div>; Determining loop execution counts for: @good</div><div>; Loop %loop.body: backedge-taken count is (-1 + %x)</div><div>; Loop %loop.body: max backedge-taken count is 2147483646</div><div>; Loop %loop.body: Predicated backedge-taken count is (-1 + %x)</div><div>;  Predicates:</div><div>; </div><div>; Loop %loop.body: Trip multiple is 1</div></div><div><br></div><div>Notice the only difference is on the gep (in bold). Can somebody shed some light?</div><div><br></div><div>I attached the test file.</div></div></div><br><div class="gmail_quote"><div dir="ltr">On Fri, Oct 26, 2018 at 10:41 AM Alexandre Isoard <<a href="mailto:alexandre.isoard@gmail.com">alexandre.isoard@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div dir="ltr"><div dir="ltr">Hello,<div><br></div><div>I'm running into an issue where SCEV misses explicit nsw flags on the following expressions:</div><div><br></div><div><div>  %mm.07 = phi i32 [ 0, %<a href="http://for.body.lr.ph" target="_blank">for.body.lr.ph</a> ], [ %add, %for.inc30 ]</div><div>  -->  {0,+,1}<nuw><nsw><%for.body> U: [0,2147483647) S: [0,2147483647)<span style="white-space:pre-wrap">            </span>Exits: (-1 + %m)<span style="white-space:pre-wrap">                </span>LoopDispositions: { %for.body: Computable, %for.body5: Invariant, %for.inc: Invariant }</div><div>  %add = add nsw i32 %mm.07, 1</div><div>  -->  {1,+,1}<nuw><nsw><%for.body> U: [1,-2147483648) S: [1,-2147483648)<span style="white-space:pre-wrap">            </span>Exits: %m<span style="white-space:pre-wrap">               </span>LoopDispositions: { %for.body: Computable, %for.body5: Invariant, %for.inc: Invariant }</div><div>  %add2 = add nsw i32 %mm.07, 96</div><div>  -->  {96,+,1}<nuw><%for.body> U: [96,-2147483553) S: [96,-2147483553)<span style="white-space:pre-wrap">          </span>Exits: (95 + %m)<span style="white-space:pre-wrap">                </span>LoopDispositions: { %for.body: Computable, %for.body5: Invariant, %for.inc: Invariant }</div></div><div><br></div><div>My problem is with the later one, where the <nsw> is missing (which cause me problems down the line with gep computation on 64 bit address space).</div><div><br></div><div>Any clue as to what could be the source of that disappearance? I tried to reproduce the issue on simple cases but to no avail. I get the following expected result:</div><div><br></div><div><div>  %i = phi i32 [ 0, %loop.prehead ], [ %i.next, %loop.body ]</div><div>  -->  {0,+,1}<nuw><nsw><%loop.body> U: [0,2147483647) S: [0,2147483647)<span style="white-space:pre-wrap">            </span>Exits: (-1 + %x)<span style="white-space:pre-wrap">                </span>LoopDispositions: { %loop.body: Computable }</div><div>  %i.next = add nsw i32 %i, 1</div><div>  -->  {1,+,1}<nuw><nsw><%loop.body> U: [1,-2147483648) S: [1,-2147483648)<span style="white-space:pre-wrap">               </span>Exits: %x<span style="white-space:pre-wrap">               </span>LoopDispositions: { %loop.body: Computable }</div><div>  %i.96 = add nsw i32 %i, 96</div><div>  -->  {96,+,1}<nuw><nsw><%loop.body> U: [96,-2147483648) S: [96,-2147483648)<span style="white-space:pre-wrap">             </span>Exits: (95 + %x)<span style="white-space:pre-wrap">                </span>LoopDispositions: { %loop.body: Computable }</div></div><div><br></div><div>Help?</div><div><div><br></div>-- <br><div dir="ltr" class="m_-5444284807688690167gmail_signature"><div dir="ltr"><b>Alexandre Isoard</b><br></div></div></div></div></div></div>
</blockquote></div><br clear="all"><div><br></div>-- <br><div dir="ltr" class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr"><b>Alexandre Isoard</b><br></div></div>