Much of the previous work on modulo scheduling has targeted
numeric programs, in which, often, the majority of the loops are
well-behaved loop-counter-based loops without early exits. In
control-intensive non-numeric programs, the loops frequently have
characteristics that make it more difficult to effectively apply
modulo scheduling. These characteristics include multiple control
flow paths, loops that are not based on a loop counter, and multiple
exits. In these loops, the presence of unimportant paths with high
resource usage or long dependence chains can penalize the important
paths. A path that contains a hazard such as another nested loop
can prohibit modulo scheduling of the loop. Control dependences
can severely restrict the overlap of the blocks within and across
iterations.
This paper describes a set of methods that allow effective
modulo scheduling of loops with multiple exits. The techniques
include removal of control dependences to enable speculation,
extensions to modulo variable expansion, and a new epilogue
generation scheme. These methods can be used with superblock and
hyperblock techniques to allow modulo scheduling of the selected
paths of loops with arbitrary control flow. A case study is
presented to show how these methods, combined with superblock
techniques, enable modulo scheduling to be effectively applied to
control-intensive non-numeric programs. Performance results for
several SPEC CINT92 benchmarks and Unix utility programs are
reported and demonstrate the applicability of modulo scheduling
to this class of programs.