| The modulo scheduling pass impliment modulo scheduling for llvm instruction. It includes two passes |
| |
| |
| 1. building graph |
| The pass will build an instance of class ModuloSchedGraph for each loop-including basicblock in a function. The steps to build a graph: |
| a)build one node for each instruction in the basicblock |
| ---ModuloScheduGraph::buildNodesforBB() |
| b)add def-use edges |
| ---ModuloScheduGraph::addDefUseEdges() |
| c)add cd edges |
| ---ModuloScheduGraph::addCDEdges() |
| d)add mem dependency edges |
| ---ModuloScheduGraph::addMemEdges() |
| e)compute resource restriction II and recurrenct II |
| ---ModuloScheduGraph::computeResII() |
| ---ModuloScheduGraph::computeRecII() |
| f)compute each node's property, including ASAP,ALAP, Mov, Depth and Height. |
| ---ModuloScheduGraph::computeNodeProperty |
| g)sort all nodes |
| ---ModuloScheduGraph::orderNodes() |
| |
| |
| 2. compute schedule |
| The second step is to compute a schule and replace the orginal basic block with three basicblocks: prelogue, kernelblock and epilog. |
| |
| a)compute the schedule according the algorithm described in the paper |
| ---ModuloScheduling::computeSchedule() |
| |
| b)replace the original basicblock.(to be done) |
| ---ModuloScheduling::constructPrologue(); |
| ---ModuloScheduling::constructKernel(); |
| ---ModuloScheduling::constructEpilogue(); |
| These three functions are not working yet. |