Hi all, In order to identify loops I'm using the DILexicalScope metadata attached to the loop latch, but with some combinations of optimisations that metadata seems to disappear. For example, when -simplifycfg removes a block because it only contains a branch, and -loop-simplify recreates that block because it turned out to be a back-edge of some loop, the metadata gets removed. Specifically, using the following testcase: while (while_test()) { if (if_test()) { foo(); } else { bar(); } } ... Clang emits* the following IR: *after slightly modifying the code generator so that it also emits metadata for unconditional branches while.cond: %call = call zeroext i1 (...)* @while_test(), !dbg !8 br i1 %call, label %while.body, label %while.end, !dbg !8 while.body: %call1 = call zeroext i1 (...)* @if_test(), !dbg !9 br i1 %call1, label %if.then, label %if.else, !dbg !9 if.then: call void (...)* @foo(), !dbg !11 br label %if.end, !dbg !13 if.else: call void (...)* @bar(), !dbg !14 br label %if.end, !dbg !16 if.end: br label %while.cond, !dbg !17 while.end: ret i32 0, !dbg !18 If I run -simplifycfg, the if.then, if.else and if.end blocks get transformed as follows: if.then: call void (...)* @foo(), !dbg !11 br label %while.cond, !dbg !13 if.else: call void (...)* @bar(), !dbg !14 br label %while.cond, !dbg !16 Removal of the back-edge (and its metadata) is problematic for other loop passes, which is why -loop-simplify creates an artificial back-edge like this: if.then: call void (...)* @foo(), !dbg !11 br label %while.cond.backedge, !dbg !13 if.else: call void (...)* @bar(), !dbg !14 br label %while.cond.backedge, !dbg !16 while.cond.backedge: br label %while.cond Ultimately I end up with a back-edge with no metadata whatsoever, breaking my loop identification. What is the best way to work around this? Modify -simplifycfg so that it does not simplify loop back-edges? Or somehow add the metadata to the new back-edges? Sincerely, -- Tim Besard Computer Systems Lab Department of Electronics & Information Systems Ghent University
In order to identify loops I'm using the DILexicalScope metadata> attached to the loop latch, but with some combinations of optimisations > that metadata seems to disappear. > >Looks like line number information yes?> For example, when -simplifycfg removes a block because it only contains > a branch, and -loop-simplify recreates that block because it turned out > to be a back-edge of some loop, the metadata gets removed. > > Specifically, using the following testcase: > while (while_test()) { > if (if_test()) { > foo(); > } else { > bar(); > } > } > > ... Clang emits* the following IR: > *after slightly modifying the code generator so that it also emits > metadata for unconditional branches > while.cond: > %call = call zeroext i1 (...)* @while_test(), !dbg !8 > br i1 %call, label %while.body, label %while.end, !dbg !8 > while.body: > %call1 = call zeroext i1 (...)* @if_test(), !dbg !9 > br i1 %call1, label %if.then, label %if.else, !dbg !9 > if.then: > call void (...)* @foo(), !dbg !11 > br label %if.end, !dbg !13 > if.else: > call void (...)* @bar(), !dbg !14 > br label %if.end, !dbg !16 > if.end: > br label %while.cond, !dbg !17 > while.end: > ret i32 0, !dbg !18 > > If I run -simplifycfg, the if.then, if.else and if.end blocks get > transformed as follows: > if.then: > call void (...)* @foo(), !dbg !11 > br label %while.cond, !dbg !13 > if.else: > call void (...)* @bar(), !dbg !14 > br label %while.cond, !dbg !16 > > Removal of the back-edge (and its metadata) is problematic for other > loop passes, which is why -loop-simplify creates an artificial back-edge > like this: > if.then: > call void (...)* @foo(), !dbg !11 > br label %while.cond.backedge, !dbg !13 > if.else: > call void (...)* @bar(), !dbg !14 > br label %while.cond.backedge, !dbg !16 > while.cond.backedge: > br label %while.cond > > Ultimately I end up with a back-edge with no metadata whatsoever, > breaking my loop identification. What is the best way to work around > this? Modify -simplifycfg so that it does not simplify loop back-edges? > Or somehow add the metadata to the new back-edges? > >You're identifying loops in IR based on line number information? That said, we could probably figure out a way to add line information to the back edge if we're getting something wrong in our optimized line tables - not a high priority though. -eric -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20130326/03bc5a3d/attachment.html>
Reasonably Related Threads
- [SCEV] Why is backedge-taken count <nsw> instead of <nuw>?
- [SCEV] Why is backedge-taken count <nsw> instead of <nuw>?
- Question on induction variable simplification pass
- [SCEV] Why is backedge-taken count <nsw> instead of <nuw>?
- missing simplification in ScalarEvolution?