``-lowerinvoke``: Lower Invokes to Calls, for Unwindless Code Generators
=====
Description
--------
``-lowerinvoke`` pass 指对不支持 stack unwind 的 code generator,将所有的 ``invoke`` instruction 都降级成 ``call`` instruction。
这样虽然会导致原来的 exception handler 都变成 dead instructions/blocks,但是这些 dead instruction/blocks 也可以被之后用 ``-dce`` 或者 ``-simplifycfg`` 给 remove 掉。
上面可能听起来有点绕,这里介绍几个关键概念(LLVM-specific 的概念,和 compiler 的 general knowledge 关系不大,不过还是了解一下):
1. Stack unwind 是 exception report 的一种技术,指如果程序 crash 了,从函数的 stack 中一层一层的 unwind,然后 find 并 report exception 的位置。详情可以看这个 `Link `_。
2. ``call`` instruction: 碰到很多了,其实就是调用别的 function,跳转 control-flow。不过这个 function 都是 normal execution。用法如下所示:
.. code-block:: llvm
%result = call ( )
3. ``invoke`` instruction:同样地也是调用别的 function,跳转 control-flow。但是这里会增加额外的 exception handler,如果 function 正常运行完了,那么就会运行到 ``normal_label`` (一个 basic block ID) 里,否则运行到 ``exception_label`` (另一个 basic block ID)。
.. code-block:: llvm
%normal = invoke ( )
to label unwind label
我们再给一个 ``invoke`` instruction 在实际编译中的例子。代码段来自于 `Parboil benchmark suite `_ 的 SGEMM.ll(LLVM 3.4 IR)
.. code-block:: llvm
;