<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Consolas;
        panose-1:2 11 6 9 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:#0563C1;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:#954F72;
        text-decoration:underline;}
p.msonormal0, li.msonormal0, div.msonormal0
        {mso-style-name:msonormal;
        mso-margin-top-alt:auto;
        margin-right:0in;
        mso-margin-bottom-alt:auto;
        margin-left:0in;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
span.EmailStyle18
        {mso-style-type:personal;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
span.EmailStyle19
        {mso-style-type:personal-reply;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-US" link="#0563C1" vlink="#954F72">
<div class="WordSection1">
<p class="MsoNormal">I didn’t see any response on this. Is there any way to turn off early tail duplication with a clang-7 option (other than completely turning off all optimizations)? The issue is reproducible with a very simple test case. Clang-7 with optimizations
 turned on takes hours compared to minutes with clang-5.0. Here is a simple cooked up test (the real-life example is of course different but this simple test exposes the same inefficiency):<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">// test.cpp<o:p></o:p></p>
<p class="MsoNormal"><span style="font-family:Consolas">#include <string><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:Consolas"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-family:Consolas">struct Foo {<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:Consolas">    std::string s1;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:Consolas">    std::string s2;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:Consolas">    std::string s3;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:Consolas">};<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:Consolas"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-family:Consolas">Foo Array[] = {<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:Consolas">    { “0”, “0”, “0” },<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:Consolas">    { “1”, “1”, “1” },<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:Consolas">     :<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:Consolas">     :<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:Consolas">     :<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:Consolas">    { “9999”, “9999”, “9999” }<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:Consolas">};<o:p></o:p></span></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Compile:<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><span style="font-family:Consolas">% clang++ -c -O3 test.cpp<o:p></o:p></span></p>
<p class="MsoNormal">…<o:p></o:p></p>
<p class="MsoNormal">Takes hours!<o:p></o:p></p>
<p class="MsoNormal">   <o:p></o:p></p>
<div>
<div style="border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal"><b>From:</b> Riyaz Puthiyapurayil <br>
<b>Sent:</b> Tuesday, January 29, 2019 11:27 AM<br>
<b>To:</b> 'llvm-dev' <llvm-dev@lists.llvm.org><br>
<b>Subject:</b> Early Tail Duplication Inefficiency<o:p></o:p></p>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><span style="font-size:14.0pt">I have a file for which clang-7 takes over 2 hours to compile with -O3. For the same file, clang-5 takes less than 2 minutes (which is also high IMHO). I will try to create a test case (but it is pretty simple,
 it only contains initializations of many arrays of structs where the structs are of the following form:<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:Consolas">struct Foo {<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:Consolas">    EnumType1 e1; // there are 700+ enum labels<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:Consolas">    std::string s1;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:Consolas">    EnumType2 e2; // 5 possible values for e2<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:Consolas">    std::string s2;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:Consolas">    std::string s3;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:Consolas">};<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:Consolas"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:Consolas">// A large array with 10K+ elements<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:Consolas">Foo array1[] = {<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:Consolas">  { EnumType1Label1, “some string”, EnumType2Label1, “another string”, “yet another string” },
<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:Consolas">:<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:Consolas">:<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:Consolas">};<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:Consolas"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:Consolas">// 11 more arrays like above but most of them have only a few hundred elements<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:Consolas">:<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:Consolas">:<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt">I would like to know if a similar problem had been reported before. A quick search didn’t find anything…<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt">Clang-5 -ftime-report shows:<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:Consolas">===-------------------------------------------------------------------------===<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:Consolas">                      ... Pass execution timing report ...<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:Consolas">===-------------------------------------------------------------------------===<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:Consolas">  Total Execution Time: 175.9183 seconds (176.1324 wall clock)<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:Consolas"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:Consolas">   ---User Time---   --System Time--   --User+System--   ---Wall Time---  --- Name ---<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:Consolas">  38.9181 ( 22.4%)   0.0070 (  0.4%)  38.9251 ( 22.1%)  38.9712 ( 22.1%)  Simple Register Coalescing<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:Consolas">  34.0788 ( 19.6%)   0.7859 ( 41.5%)  34.8647 ( 19.8%)  34.9069 ( 19.8%)  SROA<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:Consolas">  18.8351 ( 10.8%)   0.0070 (  0.4%)  18.8421 ( 10.7%)  18.8652 ( 10.7%)  Function Integration/Inlining<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:Consolas">  18.0393 ( 10.4%)   0.0010 (  0.1%)  18.0403 ( 10.3%)  18.0624 ( 10.3%)  Branch Probability Basic Block Placement<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:Consolas">  17.5163 ( 10.1%)   0.3060 ( 16.2%)  17.8223 ( 10.1%)  17.8458 ( 10.1%)  Merge disjoint stack slots<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:Consolas">  14.4318 (  8.3%)   0.0000 (  0.0%)  14.4318 (  8.2%)  14.4495 (  8.2%)  Control Flow Optimizer<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:Consolas">   6.5960 (  3.8%)   0.6219 ( 32.9%)   7.2179 (  4.1%)   7.2315 (  4.1%)  X86 DAG->DAG Instruction Selection<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:Consolas">   2.1577 (  1.2%)   0.0040 (  0.2%)   2.1617 (  1.2%)   2.1643 (  1.2%)  Greedy Register Allocator<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:Consolas">   0.9539 (  0.5%)   0.0000 (  0.0%)   0.9539 (  0.5%)   0.9543 (  0.5%)  Combine redundant instructions<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt">            :<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt">            :<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt">Clang-7 -ftime-report shows:<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:Consolas">===-------------------------------------------------------------------------===<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:Consolas">                      ... Pass execution timing report ...<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:Consolas">===-------------------------------------------------------------------------===<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:Consolas">  Total Execution Time: 7920.0840 seconds (8021.0405 wall clock)<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:Consolas"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:Consolas">   ---User Time---   --System Time--   --User+System--   ---Wall Time---  --- Name ---<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:Consolas">  6660.8174 ( 88.0%)  209.5201 ( 60.3%)  6870.3375 ( 86.7%)  6957.8224 ( 86.7%)  Early Tail Duplication<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:Consolas">  674.2655 (  8.9%)   0.0550 (  0.0%)  674.3205 (  8.5%)  675.1329 (  8.4%)  Jump Threading<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:Consolas">  89.1534 (  1.2%)   8.1488 (  2.3%)  97.3022 (  1.2%)  97.6368 (  1.2%)  Merge disjoint stack slots<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:Consolas">   2.4886 (  0.0%)  73.3249 ( 21.1%)  75.8135 (  1.0%)  79.9594 (  1.0%)  Eliminate PHI nodes for register allocation<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:Consolas">   9.2116 (  0.1%)  52.7120 ( 15.2%)  61.9236 (  0.8%)  62.1655 (  0.8%)  Slot index numbering<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:Consolas">  34.4118 (  0.5%)   2.5066 (  0.7%)  36.9184 (  0.5%)  44.2757 (  0.6%)  SROA<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:Consolas">  35.2266 (  0.5%)   0.0000 (  0.0%)  35.2266 (  0.4%)  35.2803 (  0.4%)  Simple Register Coalescing<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:Consolas">  18.0892 (  0.2%)   0.0020 (  0.0%)  18.0912 (  0.2%)  18.1253 (  0.2%)  Function Integration/Inlining<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:Consolas">   7.2959 (  0.1%)   0.5739 (  0.2%)   7.8698 (  0.1%)   7.9301 (  0.1%)  X86 DAG->DAG Instruction Selection<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:Consolas">   6.5990 (  0.1%)   0.0000 (  0.0%)   6.5990 (  0.1%)   6.6072 (  0.1%)  Branch Probability Basic Block Placement<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:Consolas">   2.8736 (  0.0%)   0.0060 (  0.0%)   2.8796 (  0.0%)   2.8831 (  0.0%)  Greedy Register Allocator<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:Consolas">   2.0147 (  0.0%)   0.1890 (  0.1%)   2.2037 (  0.0%)   2.2095 (  0.0%)  Global Value Numbering<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:Consolas">   2.1347 (  0.0%)   0.0010 (  0.0%)   2.1357 (  0.0%)   2.1456 (  0.0%)  Call-site splitting<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:Consolas">   1.5878 (  0.0%)   0.0010 (  0.0%)   1.5888 (  0.0%)   1.6079 (  0.0%)  Combine redundant instructions<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:Consolas">   1.4358 (  0.0%)   0.0020 (  0.0%)   1.4378 (  0.0%)   1.4569 (  0.0%)  Two-Address instruction pass<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:Consolas">   0.9689 (  0.0%)   0.0000 (  0.0%)   0.9689 (  0.0%)   0.9748 (  0.0%)  Live Interval Analysis<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:Consolas">     :<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:14.0pt;font-family:Consolas">     :<o:p></o:p></span></p>
</div>
</body>
</html>