Ignore back edges in backwardFlowUse
Ignore back edges in backwardFlowUse

Back edges make the last use of a variable occur before it is defined.

Since the USED_LATER set is currently only used to figure out where to extinguish locals
in iterators, we can get away with ignoring back edges.  We assume that any place that a
local is used, it is in straight-line code, so last use is equivalent to the end of the
scope.

The lowering of an iterator should make this true, although I am not sure that it handles
all cases.  If there are exceptions, we'll have to add more detailed logic here to deal
with it.

Basically, just like the zippered iterator implementation, we assume that the actions in a
loop can be summarized as:
  zip1();
  while (more) {
    zip2();
    yield value;
    zip3();
  }
  zip4();
What we are counting on is that all variables that cross a boundary between one zip?()
function an another have been captured in the iterator class (IC) structure.  The only
variables that remain are temporaries whose scopes are limited by the enclosing zip?()
function.

As long as these blocks of code contain only straight-line code, inserting the
auto-destroy after the last use will work correctly.  If there are back-edges (still
entirely contained within one of the zip?() regions), then we may end up deleting the
temporary too early.  The solution in that case will be to create pseudo-scopes (using the
same algorithm as is used to scrape the original iterator function for variables that are
added to the IC) corresponding to each of the zip?() regions in its entirety.

We note that the end of a zip?() region should coincide with the end of a basic block --
which should simplify the implementation somewhat.

    179 regressions
     22 run-time

hildeth/chapel,hildeth/chapel,hildeth/chapel,hildeth/chapel,hildeth/chapel,hildeth/chapel,hildeth/chapel