Moreover, the value numbers of the original tuples have been preserved and new ones assigned to the new tuples. In general, one cannot move a computation backwards past the computation of any of its operands forwards past any computation using its value onto a path along which it would not have been computed by the original program. If a computation that could lead to an error is moved onto a path along which it would not have been computed by the original program, the optimized program can fail when the unoptimized one does not It is not necessary to preserve the failure position, so we can move computations that may fail Optimizations might delete a computation that fails, creating an optimized program that runs where the unoptimized one fails. Thus the lumped computation could be carried out in any of the three starred blocks. A critical edge is an edge in the flow graph leading from a node with multiple successors to a node with multiple predecessors.
Critical edges can cause problems for code motion.
Both V 21 and V 22 are constant within the loop, yet neither can be moved to block 1 because that would move them onto a path along which they would not have been computed by the original program.