On Tue, Dec 10, 2013 at 9:44 PM, Maxim Kuvyrkov <ma...@kugelworks.com> wrote: > On 11/12/2013, at 5:17 am, Ramana Radhakrishnan <ramana....@googlemail.com> > wrote: > >> On Mon, Jul 1, 2013 at 5:31 PM, Paulo Matos <pma...@broadcom.com> wrote: >>> Hi, >>> >>> Near the start of schedule_block, find_modifiable_mems is called if >>> DONT_BREAK_DEPENDENCIES is not enabled for this scheduling pass. It seems >>> on c6x backend currently uses this. >>> However, it's quite strange that this is not a requirement for all backends >>> since find_modifiable_mems, moves all my dependencies in SD_LIST_HARD_BACK >>> to SD_LIST_SPEC_BACK even though I don't have DO_SPECULATION enabled. >>> >>> Since dependencies are accessed later on from try_ready (for example), I >>> would have thought that it would be always good not to call >>> find_modifiable_mems, given that it seems to 'literally' break >>> dependencies. >>> >>> Is the behaviour of find_modifiable_mems a bug or somehow expected? > > "Breaking" a dependency in scheduler involves modification of instructions > that would allow scheduler to move one instruction past the other. The most > common case of breaking a dependency is "r2 = r1 + 4; r3 = [r2];" which can > be transformed into "r3 = [r1 + 4]; r2 = r1 + 4;". Breaking a dependency is > not ignoring it, speculatively or otherwise; it is an equivalent code > transformation to allow scheduler more freedom to fill up CPU cycles.
Yes, but there are times when it does this a bit too aggressively and this looks like the cause for a performance regression that I'm investigating on ARM. I was looking for a way of preventing this transformation and there doesn't seem to be an easy one other than the obvious hack. Additionally there appears to be no way to control "flags" in a backend hook for sched-rgn for DONT_BREAK_DEPENDENCIES . Again if the DONT_BREAK_DEPENDENCIES is meant to be disabled with these flags, then it looks like we should allow for these to also be handled or describe TARGET_SCHED_SET_SCHED_FLAGS as only a hook valid with the selective scheduler. > >> >> >> It's funny how I've been trying to track down a glitch and ended up >> asking the same question today. Additionally if I use >> TARGET_SCHED_SET_SCHED_FLAGS on a port that doesn't use the selective >> scheduler, this does nothing. Does anyone know why is this the default >> for ports where we don't turn on selective scheduling and might need a >> hook to turn this off ? > > SCHED_FLAGS is used to enable or disable various parts of GCC scheduler. On > an architecture that supports speculative >scheduling with recovery (IA64) it > can turn this feature on or off. The documentation for various features of > sched-rgn, sched-ebb and sel-sched is not the best and one will likely get > weird artefacts by trying out non-default settings. Well, it appears as though TARGET_SCHED_SET_SCHED_FLAGS is only valid with the selective scheduler on as above and is a no-op as far as sched-rgn goes. This whole area could do with some improved documentation - I'll follow up with some patches to see if I can improve the situation. Thanks for your reply though. regards Ramana > > -- > Maxim Kuvyrkov > www.kugelworks.com > >