private SIRSplitJoin getVerticalObj(int x1, int x2, int y1, int y2, SIRStream str) {
private SIRSplitJoin getVerticalObj(int x1, int x2, int y1, int y2, int tilesAvail, SIRStream str) {
    private SIRSplitJoin getVerticalObj(int x1, int x2, int y1, int y2, SIRStream str) {	// see if we can do a vertical cut -- first, that there	// are two streams to cut between	boolean tryVertical = x1<x2 && sameWidth[y1][y2];		// get the object we're doing vertical cuts on, and try to	// remove any synchronization	SIRSplitJoin verticalObj = null;	if (tryVertical) {	    if (str instanceof SIRPipeline) {		// make a copy of our pipeline, since we're about		// to split across it.  Don't worry about parent		// field of children, since they seem to be		// switched around a lot during partitioning (and		// restored after)		SIRPipeline copy = new SIRPipeline(str.getParent(), str.getIdent()+"_copy");		for (int i=0; i<((SIRPipeline)str).size(); i++) { copy.add(((SIRPipeline)str).get(i)); }		// now remove synchronization in <copy>.		RefactorSplitJoin.removeMatchingSyncPoints(copy);		// now if we only have one splitjoin left as the child, we can do a cut		if (copy.size()==1) {		    verticalObj = (SIRSplitJoin)copy.get(0);		} else {		    // otherwise can't do a cut		    tryVertical = false;		}	    } else if (str instanceof SIRSplitJoin) {		verticalObj = (SIRSplitJoin)str;	    } else {		Utils.fail("Didn't expect " + str.getClass() + " as object of vertical cut.");	    }    	}	Utils.assert(!(tryVertical && verticalObj==null));		// return obj if it's possible to do vert cut	if (tryVertical) {	    return verticalObj;	} else {