<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><br class=""><div><blockquote type="cite" class=""><div class="">On Oct 7, 2014, at 5:39 AM, hadi sadeghi <<a href="mailto:hasadegh@elis.ugent.be" class="">hasadegh@elis.ugent.be</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><br class=""><blockquote type="cite" class=""><blockquote type="cite" class=""><blockquote type="cite" class=""><blockquote type="cite" class="">I think fixing this may be an easy change to LoopInfo get/setLoopID.<br class="">The rule would be simple, if the loop back branch is unconditional, <br class="">and it has a single predecessor, the metadata is expected on the <br class="">predecessaor's conditional branch:<br class=""><br class="">loop.body:<br class="">   ...<br class="">   br i1 %c, label %loop.tail, label %exit, !llvm.loop<br class=""><br class="">loop.tail:<br class="">   ...<br class="">   br label %loop.body<br class=""><br class="">exit:<br class="">   ret<br class=""><br class="">If the loop tail does not have a single predecessor (complex control <br class="">flow occurs after the loop test), then the metadata can still be <br class="">placed on the unconditional branch. Either way, we don't need to <br class="">worry about edge splitting. Only a signficant loop restructuring will <br class="">invalidate the metadata.<br class=""><br class="">I don't think any change is necessary when clang emits a loop with an <br class="">unconditional backedge, but someone will want to verify with some <br class="">test cases. If a change is needed it should also be easy.<br class=""><br class=""></blockquote></blockquote></blockquote></blockquote><br class="">I have couple of questions regarding this proposal, does not it change<br class="">llvm's standard Loop structure ? I guess some optimizations working around <br class="">standard loop structure. another issue could be that simplify-cfg might<br class="">optimize out such an unconditional branch (I am not sure about it). <br class="">I was working around preserving loop metadata for while, our proposal was to<br class="">attach loop metadata to both, back-edge and loop's phi nodes (phi nodes at<br class="">the start of loop Header), since in SSA from, a loop can be identified by<br class="">its phi nodes. this solution worked for us, but our benchmarks were limited<br class="">to MPEG and H264. do you think this could be considered as a general solution ?<br class=""></div></blockquote></div><br class=""><div class="">The proposal is that passes can convert a loop between these two canonical forms:</div><div class=""><br class=""></div><div class="">(1)</div><div class=""><blockquote type="cite" class=""><blockquote type="cite" class=""><blockquote type="cite" class=""><blockquote type="cite" class=""><blockquote type="cite" class=""></blockquote></blockquote></blockquote></blockquote></blockquote>loop.body:<br class=""><blockquote type="cite" class=""><blockquote type="cite" class=""><blockquote type="cite" class=""><blockquote type="cite" class=""><blockquote type="cite" class=""></blockquote></blockquote></blockquote></blockquote></blockquote>  ...<br class=""><blockquote type="cite" class=""><blockquote type="cite" class=""><blockquote type="cite" class=""><blockquote type="cite" class=""><blockquote type="cite" class=""></blockquote></blockquote></blockquote></blockquote></blockquote>  br i1 %c, label %loop.tail, label %exit, !llvm.loop<br class=""><blockquote type="cite" class=""><blockquote type="cite" class=""><blockquote type="cite" class=""><blockquote type="cite" class=""><blockquote type="cite" class=""></blockquote></blockquote></blockquote></blockquote></blockquote><font color="#12c00e" class=""><br class=""></font><blockquote type="cite" class=""><blockquote type="cite" class=""><blockquote type="cite" class=""><blockquote type="cite" class=""><blockquote type="cite" class=""></blockquote></blockquote></blockquote></blockquote></blockquote>exit:<br class="">  ret<br class=""></div><div class=""><br class=""></div><div class="">(2)</div><div class="">loop.body:<br class=""><blockquote type="cite" class=""><blockquote type="cite" class=""><blockquote type="cite" class=""><blockquote type="cite" class=""><blockquote type="cite" class=""></blockquote></blockquote></blockquote></blockquote></blockquote>  ...<br class=""><blockquote type="cite" class=""><blockquote type="cite" class=""><blockquote type="cite" class=""><blockquote type="cite" class=""><blockquote type="cite" class=""></blockquote></blockquote></blockquote></blockquote></blockquote>  br i1 %c, label %loop.tail, label %exit, !llvm.loop<br class=""><blockquote type="cite" class=""><blockquote type="cite" class=""><blockquote type="cite" class=""><blockquote type="cite" class=""><blockquote type="cite" class=""></blockquote></blockquote></blockquote></blockquote></blockquote><font color="#12c00e" class=""><br class=""></font><blockquote type="cite" class=""><blockquote type="cite" class=""><blockquote type="cite" class=""><blockquote type="cite" class=""><blockquote type="cite" class=""></blockquote></blockquote></blockquote></blockquote></blockquote>loop.tail:</div><div class="">  ; split critical edge<br class=""><blockquote type="cite" class=""><blockquote type="cite" class=""><blockquote type="cite" class=""><blockquote type="cite" class=""><blockquote type="cite" class=""></blockquote></blockquote></blockquote></blockquote></blockquote>  br label %loop.body<br class=""><blockquote type="cite" class=""><blockquote type="cite" class=""><blockquote type="cite" class=""><blockquote type="cite" class=""><blockquote type="cite" class=""></blockquote></blockquote></blockquote></blockquote></blockquote><font color="#12c00e" class=""><br class=""></font><blockquote type="cite" class=""><blockquote type="cite" class=""><blockquote type="cite" class=""><blockquote type="cite" class=""><blockquote type="cite" class=""></blockquote></blockquote></blockquote></blockquote></blockquote>exit:<br class="">  ret</div><div class=""><br class=""></div><div class="">without affecting loop metadata.</div><div class=""><br class=""></div><div class="">SplitCriticalEdges transforms from 1->2. SimplifyCFG transforms from 2->1.</div><div class=""><br class=""></div><div class="">It doesn’t change the form of the loop that any pass sees, just changes where a the pass needs to look for the metadata if the loop is already in form 2.</div><div class=""><br class=""></div><div class="">-Andy</div></body></html>