[SelectionDAG] Check CALLSEQ_BEGIN nodes in DelayForLiveRegs
authorSam Parker <sam.parker@arm.com>
Tue, 11 Apr 2017 08:43:32 +0000 (08:43 +0000)
committerSam Parker <sam.parker@arm.com>
Tue, 11 Apr 2017 08:43:32 +0000 (08:43 +0000)
commit4fc5f3c02e57136c7c4055bd2f83a56bb79d37e5
treec8e5ace0cb2018a7222d88e0765a47727461e020
parent5fd75fb72e0eb04bf590765fc70f27a444993e74
[SelectionDAG] Check CALLSEQ_BEGIN nodes in DelayForLiveRegs

A fix for the bug reported in PR30911.

The issue arises when multiple CALLSEQ_BEGIN nodes are unscheduled as
the last node to be unscheduled will gain access to the CallResource
register. But when a node is being picked, only CALLSEQ_END nodes are
checked against the CallResource and have their chains evaluated.
This then means that other CALLSEQ_BEGIN nodes can be scheduled
before the existing call sequence has been finalised. This patch adds
a check against the FrameSetup nodes in DelayForLiveRegs to prevent
this from happening.

Differential Revision: https://reviews.llvm.org/D31536

llvm-svn: 299926
llvm/lib/CodeGen/SelectionDAG/ScheduleDAGRRList.cpp
llvm/test/CodeGen/ARM/unschedule-first-call.ll [new file with mode: 0644]