Teach the latency scheduler some new tricks. In particular, to break ties,
authorChris Lattner <sabre@nondot.org>
Fri, 10 Mar 2006 05:51:05 +0000 (05:51 +0000)
committerChris Lattner <sabre@nondot.org>
Fri, 10 Mar 2006 05:51:05 +0000 (05:51 +0000)
commitda4ff69153c7562a71a1990929adc0faa8d0996d
treee688edfd1e2550008cf805a71138880aa2f5c09a
parenta72047cc0a9376598e7ccf07a73860785f8e3525
Teach the latency scheduler some new tricks.  In particular, to break ties,
keep track of a sense of "mobility", i.e. how many other nodes scheduling one
node will free up.  For something like this:

float testadd(float *X, float *Y, float *Z, float *W, float *V) {
  return (*X+*Y)*(*Z+*W)+*V;
}

For example, this makes us schedule *X then *Y, not *X then *Z.  The former
allows us to issue the add, the later only lets us issue other loads.

This turns the above code from this:

_testadd:
        lfs f0, 0(r3)
        lfs f1, 0(r6)
        lfs f2, 0(r4)
        lfs f3, 0(r5)
        fadds f0, f0, f2
        fadds f1, f3, f1
        lfs f2, 0(r7)
        fmadds f1, f0, f1, f2
        blr

into this:

_testadd:
        lfs f0, 0(r6)
        lfs f1, 0(r5)
        fadds f0, f1, f0
        lfs f1, 0(r4)
        lfs f2, 0(r3)
        fadds f1, f2, f1
        lfs f2, 0(r7)
        fmadds f1, f1, f0, f2
        blr

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@26680 91177308-0d34-0410-b5e6-96231b3b80d8
lib/CodeGen/SelectionDAG/ScheduleDAGList.cpp