AbstractBidirectional data flow analysis has become the standard technique for solving bit-vector-based code motion problems in the presence of critical edges. Unfortunately, bidirectional analyses are conceptually and computationally harder than their unidirectional counterparts. In this paper we show that code motion in the presence of critical edges can be achieved without bidirectional data flow analyses. This is demonstrated by means of an adaption of our algorithm for lazy code motion (Knoop et al., Proc. ACM SIGPLAN Conf. on Programming Language Design and Implementation (PLDI)’92, ACM SIGPLAN Notices, vol. 27, 7, San Francisco, CA, June 1992, pp. 224–234), which is developed from a fresh, specification-oriented view. As the key elem...