On Apr 11, 2014, at 2:47 AM, Kyrill Tkachov <kyrylo.tkac...@arm.com> wrote:
> On 10/04/14 02:50, Maxim Kuvyrkov wrote: >> On Apr 9, 2014, at 4:15 AM, Kyrill Tkachov <kyrylo.tkac...@arm.com> wrote: >> >>> Hi all, >>> >>> I'm looking at some curious pre-reload scheduling behaviour and I noticed >>> this: >>> >>> At the add_branch_dependences function sched-rgn.c there is a comment that >>> says "branches, calls, uses, clobbers, cc0 setters, and instructions that >>> can throw exceptions" should be scheduled at the end of the basic block. >>> >>> However right below it the code that detects this kind of insns seems to >>> only look for these insns that are directly adjacent to the end of the >>> block (implemented with a while loop that ends as soon as the current insn >>> is not one of the aforementioned). >>> >>> Shouldn't the code look through the whole basic block, gather all of the >>> branches, clobbers etc. and schedule them at the end? >>> >> Not really. The instruction sequences mentioned in the comment end basic >> block by definition -- if there is a jump or other "special" sequence, then >> basic block can't continue beyond that as control may be transffered to >> something other than the next instruction. > > Makes sense for things like branches, calls and potential exception-throwers, > but how can clobbers and uses change the control flow? It might be that uses and clobbers are leftovers from before-data-flow infrastructure. You can try removing them from add_branch_dependencies and see what happens. -- Maxim Kuvyrkov www.linaro.org