Parallelizing compilers have traditionally focussed mainly on parallelizing
loops. This paper presents a new framework for automatically parallelizing
recursive procedures that typically appear in divide-and-conquer algorithm
s. We present compile-time analysis, using powerful, symbolic array section
analysis, to detect the independence of multiple recursive calls in a proc
edure. This allows exploitation of a scalable form of nested parallelism, w
here each parallel task can further spawn off parallel work in subsequent r
ecursive calls. We describe a runtime system which efficiently supports thi
s kind of nested parallelism without unnecessarily blocking tasks. We have
implemented this framework in a parallelizing compiler, which is able to au
tomatically parallelize programs like quicksort and mergesort, written in C
. For cases where even the advanced compile-time analysis we describe is no
t able to prove the independence of procedure calls, we propose novel techn
iques for speculative runtime parallelization, which are more efficient and
powerful in this context than analogous techniques proposed previously for
speculatively parallelizing loops. Our experimental results on an IBM G30
SMP machine show good speedups obtained by following our approach.