Exploiting Task-Order Information: in Compilers for Shared-Memory Parallel Programs