[PATCH] D110613: [Taildup] Don't tail-duplicate loop header with multiple successors as its latches

JunMa via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Sep 28 20:37:40 PDT 2021


junparser added a comment.

In D110613#3027076 <https://reviews.llvm.org/D110613#3027076>, @lkail wrote:

> IIUC, switching this pattern off might lose some optimization commonly seen in interpreter, e.g., https://eli.thegreenplace.net/2012/07/12/computed-goto-for-efficient-dispatch-tables. Do you have any benchmark numbers?

Hi, thanks for the reminder! 
I tested the change with spec cpu2017, and there was no performance change.  I also tested the case in  https://eli.thegreenplace.net/2012/07/12/computed-goto-for-efficient-dispatch-tables, and I add it int tesetcase as well.  This patch has no effect on most of the interpreter switch loop.

However, i test the case offered by @alexfh based on D106056 <https://reviews.llvm.org/D106056> and w/o this change, it show 1x performance gains without the change.  The reduced case is large_loop_switch in testcase.

The root reason is that llvm optimizer usually does not change unused default case into unreachable before D106056 <https://reviews.llvm.org/D106056>. The interpreter switch loop also keeps this branch when transform to jumptable, The loop form become to :

  //                  
  //              / <---------/ / /
  //          0-> 1->  2  -> 3  / /            
  //              \      \  -> 4 /              
  //                \      \ -> 5             
  //                  \---> default          

the default bb can not tail duplicate into loop header. With D106056 <https://reviews.llvm.org/D106056>, the unreachable default bb is removed, then taildup can help to transform switch loop into dispatch table.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D110613/new/

https://reviews.llvm.org/D110613



More information about the llvm-commits mailing list