diff options
| author | Andrew Trick <atrick@apple.com> | 2015-03-27 03:44:13 +0000 |
|---|---|---|
| committer | Andrew Trick <atrick@apple.com> | 2015-03-27 03:44:13 +0000 |
| commit | e97ff5a2ad4896324705347ca5514a24122ab17c (patch) | |
| tree | 72ff42a0631e9968008cc28cf5c82e4fe452261f /llvm/lib/CodeGen | |
| parent | ffb0864b44c49fa4ade8e666c64da65d9a49c8c8 (diff) | |
| download | bcm5719-llvm-e97ff5a2ad4896324705347ca5514a24122ab17c.tar.gz bcm5719-llvm-e97ff5a2ad4896324705347ca5514a24122ab17c.zip | |
Fix a bug in SelectionDAG scheduling backtracking code: PR22304.
It can happen (by line CurSU->isPending = true; // This SU is not in
AvailableQueue right now.) that a SUnit is mark as available but is
not in the AvailableQueue. For SUnit being selected for scheduling
both conditions must be met.
This patch mainly defensively protects from invalid removing a node
from a queue. Sometimes nodes are marked isAvailable but are not in
the queue because they have been defered due to some hazard.
Patch by Pawel Bylica!
llvm-svn: 233351
Diffstat (limited to 'llvm/lib/CodeGen')
| -rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/ScheduleDAGRRList.cpp | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/ScheduleDAGRRList.cpp b/llvm/lib/CodeGen/SelectionDAG/ScheduleDAGRRList.cpp index 8b54e6568b9..5222de1063b 100644 --- a/llvm/lib/CodeGen/SelectionDAG/ScheduleDAGRRList.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/ScheduleDAGRRList.cpp @@ -1423,9 +1423,10 @@ SUnit *ScheduleDAGRRList::PickNodeToScheduleBottomUp() { // If one or more successors has been unscheduled, then the current // node is no longer available. - if (!TrySU->isAvailable) + if (!TrySU->isAvailable || !TrySU->NodeQueueId) CurSU = AvailableQueue->pop(); else { + // Available and in AvailableQueue AvailableQueue->remove(TrySU); CurSU = TrySU; } |

