HomePhabricator

[ScheduleDAG] Make sure to process all def operands before any use operands

Description

[ScheduleDAG] Make sure to process all def operands before any use operands

An example from Hexagon where things went wrong:

%R0<def> = L2_loadrigp <ga:@fp04>      ; load function address
J2_callr %R0<kill>, ..., %R0<imp-def>  ; call *R0, return value in R0

ScheduleDAGInstrs::buildSchedGraph would visit all instructions going
backwards, and in each instruction it would visit all operands in their
order on the operand list. In the case of this call, it visited the use
of R0 first, then removed it from the set Uses after it visited the def.
This caused the DAG to be missing the data dependence edge on R0 between
the load and the call.

Differential Revision: http://reviews.llvm.org/D20102