There is a misbehavior in the depgraph._serialize_tasks method, where PDEPEND can cause the runtime cycle code to merge a very large runtime cycle and its dependencies, even though it would be more optimal to merge the dependencies first. In the main "while mygraph:" loop, the problem occurs when the prefer_asap flag is True, and there's a node in the asap_nodes list. The smallest_cycle variable ends up with a large runtime cycle along with some dependencies that are not involved in the cycle (which should therefore be merged earlier than the rest).
Some existing relevant code is visible in these commits, but apparently it doesn't always work as intended:
I have a working patch in the following branch:
I'll submit it for review after I've added a test case.
Posted for review here:
This is in the master branch:
Fixed in portage-2.3.3.