[libre-riscv-dev] building structured CFG

Jacob Lifshay programmerjake at gmail.com
Mon Dec 31 09:54:35 GMT 2018

I finally realized that I was way over-complicating the structured
representation that I need to use for converting from SIMT-style code to
vectorized code. I'm hoping to have the structured CFG parser/builder
portion done by tomorrow.

All I really needed was to build a DAG of trees with inner nodes being
loops and leaves being basic blocks with the children sorted in a
topological order over the original CFG. This structure is the sequence in
which I need to execute basic blocks in order to properly cover all the
basic blocks without executing them multiple times by accident for each
time around the surrounding loop(s).

Since I already have the underlying CFG already, I can just put it in a
structure like:

pub enum CFGStructureNode {
    Loop { children: Vec<CFGStructureNode> },
    Node { node_index: CFGNodeIndex },

type CFGStructure = Vec<CFGStructureNode>;

CFGNodeIndex is the index of a basic block in the underlying CFG.
All of the Vecs are stored topologically-sorted over the underlying CFG.

Note that this means the parser won't work on OpenCL SPIR-V without
modifications since only Vulkan requires OpLoopMerge which I am using to
determine the loop tree.


More information about the libre-riscv-dev mailing list