[llvm-commits] Speeding up instruction selection

Roman Levenstein romix.llvm at googlemail.com
Mon Apr 21 08:48:54 PDT 2008


Hi,

2008/4/19, Roman Levenstein <romix.llvm at googlemail.com>:
> Hi Dan, Hi Evan,
>
>  2008/4/19, Dan Gohman <gohman at apple.com>:
>
> >
>  >  On Apr 16, 2008, at 9:19 AM, Roman Levenstein wrote:
>  >  >
>  >
>  > > BTW, Dan, have you had any time to look at the patch introducing
>  >  > queues instead of heaps in the target specific instruction selectors?
>  >
>  >
>  > Is this the ScheduleDAGRRList patch that changes std::priority_queue
>  >  to std::set? I know you checked in part of those changes already;
>  >  could you send me an updated patch with just the outstanding changes?
>
>
> No. I don't mean the ScheduleDAGRRList.pacth. For this one, I proposed
>  the remaining patch just with the outstanding patches yesterday (see
>  http://lists.cs.uiuc.edu/pipermail/llvm-commits/Week-of-Mon-20080414/061236.html).
>  And it is also about using the std::set :-)
>
>  The patch for instruction selectors was proposed by me here:
>  http://lists.cs.uiuc.edu/pipermail/llvm-commits/Week-of-Mon-20080303/059215.html
>  It is related to the Select() and SelectRoot implementations inside
>  the target-specific code selectors generated by tablegen.
>
>  Regarding my questions about std::set vs std;;multiset in the mentioned patch:
>  Having looked into it again, I have the impression that std::set could
>  be used and there is no need for std::multiset. Basically, the this
>  code:
>   void AddToISelQueue(SDOperand N) DISABLE_INLINE {
>    int Id = N.Val->getNodeId();
>    if (Id != -1 && !isQueued(Id)) {
>    ...
>  }
>  ensures that only one node with a given NodeId can be inserted into
>  the ISelQueue.
>
>  One possible further improvement, I'm thinking about is the following:
>  Why do we use a sorted data structure (e.g. sorted vector, set) for
>  the ISelQueue at all?
>
>  1) If we look into the SelectRoot logic, it basically takes the node
>  with the SMALLEST NodeId from the pending selection queue.
>  2) More over, it seems to me (please, confirm if it is true!) that the
>  next node taken for selection in the loop inside the SelectRoot, at
>  any point in time, has a NodeId that is GREATER than the NodeId of the
>  last selected node.
>  3) Even if the selection of the node puts new nodes into the selection
>  queue, they ALWAYS have NodeIds GREATER than that of this node.
>  Therefore the property (2) is preserved.
>
>  I checked (2) and (3) by adding some debug output to the SelectRoot.
>  Only one test of all llvm/test test-cases does not fulfill this
>  assumptions and even there it is not quite obvious if it is a
>  contradiction to (2) and (3) or a bug.
>
>  So, assuming that properties (2) and (3) do hold, the following can be
>  probably done:
>  - We iterate over the NodeId numbers from 0 till the DAGSize.
>  - We check if a Node with a given NodeId (by looking into the
>  TopOrder???), if isQueued(NodeId) is true, i.e. this is in the queue
>  - We then check if isSelected(NodeId) is true or false and call
>  Select() for this node, if it is not selected yet.
>  - If a new node needs to be inserted into the queue, only
>  setQueued(NodeId) is called
>
>  With these changes, no online sorting would be required at all, which
>  is a great improvement over the current approach.
>
>  What do you think about it?  Is it a correct analysis?

I created a working implementation based on these I ideas. Now all
llvm/test test-cases pass it. Please find it in  the attached patch.
The patch is rather ugly and uses a lot of #ifdefs, but I think it is
OK for a proof of concept.

Short explanation for the macros:
OLD - enables old-style selector queue, using heaps. Can be used to
have a step-by-step comparison with std::set based approach.
USE_QUEUE - enables std::set based approach
NO_QUEUE - enables the implementation that does not use any special
sorted queue at all, as outlined in the previous mail.
(Note: USE_QUEUE should not be used at the same time as NO_QUEUE)

Both USE_QUEUE and NO_QUEUE modes speed-up the instruction selection
significantly (on my test compilation time goes down from 12 to 9
seconds).

I'm very interested in your comments about this approach.

-Roman



More information about the llvm-commits mailing list