[WinEH] Optimize WinEH state stores
authorDavid Majnemer <david.majnemer@gmail.com>
Wed, 17 Feb 2016 18:37:11 +0000 (18:37 +0000)
committerDavid Majnemer <david.majnemer@gmail.com>
Wed, 17 Feb 2016 18:37:11 +0000 (18:37 +0000)
commit7e5937b775410a81b5a57c45fb087ef99e971308
tree2117ecf2317c374e0837094cf3fd7ccde45b2eb6
parentcef252ea4c6cd44ac5a1253ffc1836b400cef3ec
[WinEH] Optimize WinEH state stores

32-bit x86 Windows targets use a linked-list of nodes allocated on the
stack, referenced to via thread-local storage.  The personality routine
interprets one of the fields in the node as a 'state number' which
indicates where the personality routine should transfer control.

State transitions are possible only before call-sites which may throw
exceptions.  Our previous scheme had us update the state number before
all call-sites which may throw.

Instead, we can try to minimize the number of times we need to store by
reasoning about the nearest store which dominates the current call-site.
If the last store agrees with the current call-site, then we know that
the state-update is redundant and can be elided.

This is largely straightforward: an RPO walk of the blocks allows us to
correctly forward propagate the information when the function is a DAG.
Currently, loops are not handled optimally and may trigger superfluous
state stores.

Differential Revision: http://reviews.llvm.org/D16763

llvm-svn: 261122
llvm/lib/Target/X86/X86WinEHState.cpp
llvm/test/CodeGen/WinEH/wineh-statenumbering.ll
llvm/test/CodeGen/X86/cleanuppad-inalloca.ll