[llvm-commits] add nounwind flag to BasicBlock

Duncan Sands baldrick at free.fr
Wed Mar 12 01:29:03 PDT 2008


Hi Nick,

> Like the nounwind flag on call and functions, this flag can be computed 
> by looking at the instructions inside the block,

this seems wrong.  The nounwind flag on a call can reflect front-end semantics:
in C++ a call may not be allowed to unwind, for example a call that occurs
as part of running a destructor during unwinding of an exception.  Such a
call is marked nounwind but this does not mean that the called function is
a nounwind function, and in fact the callee may unwind.  What it means is:
(1) the optimizers may assume that the callee does not in fact unwind;
(2) the runtime is informed (via entries in the dwarf eh tables) that the
call is nounwind: if the runtime unwinder unwinds to such a call then it
takes language specific action, which in the C++ case means calling terminate.
Point (2) means that the nounwind flag needs to be carefully preserved (for
example, propagated during inlining).

On the other hand, presumably instructions will themselves get a
"nounwind" flag in which case the block flag can indeed be a summary
of the instructions' flags.

The patch itself looks ok to me.

+  /// setDoesNotThrow - Set whether unwinding is permissible in this
+  /// BasicBlock. Setting it to true will also clear the unwind dest.

It sounds like this changes the cfg - is that the case (if so it seems
unwise)?

CIao,

Duncan.



More information about the llvm-commits mailing list