Build a KD-Tree using existing edges as the splitter planes and ignore regions that are completely outside of the polygon during recursion. The leaf nodes will then make up a rectangular decomposition.
Getting a good decomposition is simply a matter of which splitter to choose in each step of the recursion. You might wanna use a simple heuristic that halves the remaining area each step. If you want, you can also just try a few different splitters!
Here's some pseudo code:
function makeRects(Rect r, Polygon p)
if p is empty
if r is inside your original polygon
add r to results
else
choose good splitter s
makeRects(left part of r relative to s, left part of p relative to s)
makeRects(right part of r relative to s, right part of p relative to s)