optionally perform hybrid tiling
The hybrid tiling is based on Grosser et al.,
"Hybrid Hexagonal/Classical Tiling for GPUs" with a few minor corrections.
This commit only implements the basic hybrid tiling and not
some of the other optimizations in the same paper.
Hybrid tiling is turned on with the --hybrid option.
If this option is set, and if some subtree of the scheduled
schedule tree contains a pattern that is suitable for hybrid tiling,
the relative dependence distances are computed.
If these are appropriately bounded, hybrid tiling is applied.
Within each phase of the tiling a GPU kernel is created.
The bounds on the dependence distances are computed by projecting
the dependence distances on a two-dimensional space and computing
the convex hull. An alternative would be to use wrapping.
Signed-off-by: Sven Verdoolaege <skimo@kotnet.org>