translation.backendopt.merge_if_blocks

  • name: merge_if_blocks
  • description: Merge if … elif chains
  • command-line: –if-block-merge
  • command-line for negation: –no-if-block-merge
  • option type: boolean option
  • default: True

This optimization converts parts of flow graphs that result from chains of ifs and elifs like this into merged blocks.

By default flow graphing this kind of code:

if x == 0:
    f()
elif x == 1:
    g()
elif x == 4:
    h()
else:
    j()

will result in a chain of blocks with two exits, somewhat like this:

../_images/unmergedblocks.png

(reflecting how Python would interpret this code). Running this optimization will transform the block structure to contain a single “choice block” with four exits:

../_images/mergedblocks.png

This can then be turned into a switch by the C backend, allowing the C compiler to produce more efficient code.