<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=big5">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:Wingdings;
        panose-1:5 0 0 0 0 0 0 0 0 0;}
@font-face
        {font-family:"MS Gothic";
        panose-1:2 11 6 9 7 2 5 8 2 4;}
@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:"Segoe UI Emoji";
        panose-1:2 11 5 2 4 2 4 2 2 3;}
@font-face
        {font-family:"\@MS Gothic";
        panose-1:2 11 6 9 7 2 5 8 2 4;}
@font-face
        {font-family:"Segoe UI";
        panose-1:2 11 5 2 4 2 4 2 2 3;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;
        mso-fareast-language:EN-US;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:#0563C1;
        text-decoration:underline;}
pre
        {mso-style-priority:99;
        mso-style-link:"\0421\0442\0430\043D\0434\0430\0440\0442\043D\044B\0439 HTML \0417\043D\0430\043A";
        margin:0cm;
        font-size:10.0pt;
        font-family:"Courier New";}
p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph
        {mso-style-priority:34;
        margin-top:0cm;
        margin-right:0cm;
        margin-bottom:0cm;
        margin-left:36.0pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;
        mso-fareast-language:EN-US;}
span.EmailStyle17
        {mso-style-type:personal-compose;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
span.HTML
        {mso-style-name:"\0421\0442\0430\043D\0434\0430\0440\0442\043D\044B\0439 HTML \0417\043D\0430\043A";
        mso-style-priority:99;
        mso-style-link:"\0421\0442\0430\043D\0434\0430\0440\0442\043D\044B\0439 HTML";
        font-family:"Courier New";
        mso-fareast-language:RU;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri",sans-serif;
        mso-fareast-language:EN-US;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:2.0cm 42.5pt 2.0cm 3.0cm;}
div.WordSection1
        {page:WordSection1;}
/* List Definitions */
@list l0
        {mso-list-id:146241253;
        mso-list-type:hybrid;
        mso-list-template-ids:230738098 68747265 68747267 68747269 68747265 68747267 68747269 68747265 68747267 68747269;}
@list l0:level1
        {mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Symbol;}
@list l0:level2
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Courier New";}
@list l0:level3
        {mso-level-number-format:bullet;
        mso-level-text:\F0A7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Wingdings;}
@list l0:level4
        {mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Symbol;}
@list l0:level5
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Courier New";}
@list l0:level6
        {mso-level-number-format:bullet;
        mso-level-text:\F0A7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Wingdings;}
@list l0:level7
        {mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Symbol;}
@list l0:level8
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Courier New";}
@list l0:level9
        {mso-level-number-format:bullet;
        mso-level-text:\F0A7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Wingdings;}
@list l1
        {mso-list-id:380598078;
        mso-list-type:hybrid;
        mso-list-template-ids:-1516054728 68747265 68747267 68747269 68747265 68747267 68747269 68747265 68747267 68747269;}
@list l1:level1
        {mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Symbol;}
@list l1:level2
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Courier New";}
@list l1:level3
        {mso-level-number-format:bullet;
        mso-level-text:\F0A7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Wingdings;}
@list l1:level4
        {mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Symbol;}
@list l1:level5
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Courier New";}
@list l1:level6
        {mso-level-number-format:bullet;
        mso-level-text:\F0A7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Wingdings;}
@list l1:level7
        {mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Symbol;}
@list l1:level8
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Courier New";}
@list l1:level9
        {mso-level-number-format:bullet;
        mso-level-text:\F0A7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Wingdings;}
@list l2
        {mso-list-id:533077077;
        mso-list-type:hybrid;
        mso-list-template-ids:964166928 68747265 68747267 68747269 68747265 68747267 68747269 68747265 68747267 68747269;}
@list l2:level1
        {mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Symbol;}
@list l2:level2
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Courier New";}
@list l2:level3
        {mso-level-number-format:bullet;
        mso-level-text:\F0A7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Wingdings;}
@list l2:level4
        {mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Symbol;}
@list l2:level5
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Courier New";}
@list l2:level6
        {mso-level-number-format:bullet;
        mso-level-text:\F0A7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Wingdings;}
@list l2:level7
        {mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Symbol;}
@list l2:level8
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Courier New";}
@list l2:level9
        {mso-level-number-format:bullet;
        mso-level-text:\F0A7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Wingdings;}
@list l3
        {mso-list-id:836772578;
        mso-list-type:hybrid;
        mso-list-template-ids:44495050 68747265 68747267 68747269 68747265 68747267 68747269 68747265 68747267 68747269;}
@list l3:level1
        {mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Symbol;}
@list l3:level2
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Courier New";}
@list l3:level3
        {mso-level-number-format:bullet;
        mso-level-text:\F0A7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Wingdings;}
@list l3:level4
        {mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Symbol;}
@list l3:level5
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Courier New";}
@list l3:level6
        {mso-level-number-format:bullet;
        mso-level-text:\F0A7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Wingdings;}
@list l3:level7
        {mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Symbol;}
@list l3:level8
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Courier New";}
@list l3:level9
        {mso-level-number-format:bullet;
        mso-level-text:\F0A7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Wingdings;}
ol
        {margin-bottom:0cm;}
ul
        {margin-bottom:0cm;}
--></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="RU" link="#0563C1" vlink="#954F72" style="word-wrap:break-word">
<div class="WordSection1">
<p class="MsoNormal"><span lang="EN-US">Hello everyone,<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">I wanted to discuss the loop alignment choice in X86 codegen. Currently, LLVM unconditionally aligns all loops by 16 bits. And in some cases it does not interact well with some processor mechanisms, in particular with
 DSB. The effect I¡¦m observing now has been discussed before, at least it is mentioned in this slides:
<a href="https://llvm.org/devmtg/2016-11/Slides/Ansari-Code-Alignment.pdf">https://llvm.org/devmtg/2016-11/Slides/Ansari-Code-Alignment.pdf</a>, but it doesn¡¦t seem that any decision has been taken on it ever since.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><b><span lang="EN-US">Motivation:<o:p></o:p></span></b></p>
<p class="MsoNormal"><span lang="EN-US">The motivating code piece that demonstrated significant score swings is as in the following example:<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:"Courier New"">define i32 @test(i32* %p, i64 %len, i32 %x) {<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:"Courier New"">entry:<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:"Courier New"">  br label %loop<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:"Courier New""><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:"Courier New"">loop:                                             ; preds = %backedge, %entry<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:"Courier New"">  %iv = phi i64 [ %iv.next, %backedge ], [ %len, %entry ]<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:"Courier New"">  %iv.next = add nsw i64 %iv, -1<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:"Courier New"">  %cond_1 = icmp eq i64 %iv, 0<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:"Courier New"">  br i1 %cond_1, label %exit, label %backedge<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:"Courier New""><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:"Courier New"">backedge:                                         ; preds = %loop<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:"Courier New"">  %addr = getelementptr inbounds i32, i32* %p, i64 %iv.next<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:"Courier New"">  %loaded = load atomic i32, i32* %addr unordered, align 4<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:"Courier New"">  %cond_2 = icmp eq i32 %loaded, %x<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:"Courier New"">  br i1 %cond_2, label %failure, label %loop<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:"Courier New""><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:"Courier New"">exit:                                             ; preds = %loop<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:"Courier New"">  ret i32 -1<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:"Courier New""><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:"Courier New"">failure:                                          ; preds = %backedge<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:"Courier New"">  unreachable<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:"Courier New"">} <o:p>
</o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Basically this code is searching element x in array of values. Here is llc result for this loop in mtriple=x86_64-apple-macosx:<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:"Courier New"">  .p2align 4, 0x90<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:"Courier New"">LBB0_1: ## %loop<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:"Courier New"">  ## =>This Inner Loop Header: Depth=1<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:"Courier New"">  subq $1, %rax<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:"Courier New"">  jb LBB0_4<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:"Courier New"">## %bb.2: ## %backedge<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:"Courier New"">  ## in Loop: Header=BB0_1 Depth=1<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:"Courier New"">  cmpl %edx, -4(%rdi,%rsi,4)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:"Courier New"">  movq %rax, %rsi<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:"Courier New"">  jne LBB0_1<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">(Note: the last movq is redundant, inserted by LSR likely due to cost model bug, filed as
<a href="https://bugs.llvm.org/show_bug.cgi?id=48355">https://bugs.llvm.org/show_bug.cgi?id=48355</a>. Regardless of it, the situation remains the same).<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">And here is the assembly on x64 platform:<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal" style="background:#F4F5F7"><span lang="EN-US" style="font-size:9.0pt;font-family:"Courier New";color:#172B4D;mso-fareast-language:RU">97.34% 
</span><span lang="EN-US" style="font-size:9.0pt;font-family:"Segoe UI Emoji",sans-serif;color:#172B4D;mso-fareast-language:RU">¡ù</span><span lang="EN-US" style="font-size:9.0pt;font-family:"Courier New";color:#172B4D;mso-fareast-language:RU">  0x30026d50:
 83ea01                   subl    $1, %edx                      <o:p></o:p></span></p>
<p class="MsoNormal" style="background:#F4F5F7"><span lang="EN-US" style="font-size:9.0pt;font-family:"Courier New";color:#172B4D;mso-fareast-language:RU">         ¢x  0x30026d53: 0f820b060000             jb    1547                            ; 0x30027364<o:p></o:p></span></p>
<p class="MsoNormal" style="background:#F4F5F7"><span lang="EN-US" style="font-size:9.0pt;font-family:"Courier New";color:#172B4D;mso-fareast-language:RU">  0.04%  ¢x  0x30026d59: 89d3                     movl    %edx, %ebx                   
<o:p></o:p></span></p>
<p class="MsoNormal" style="background:#F4F5F7"><span lang="EN-US" style="font-size:9.0pt;font-family:"Courier New";color:#172B4D;mso-fareast-language:RU">         ¢x  0x30026d5b: 394c9810                 cmpl    %ecx, 16(%rax,%rbx,4)        
<o:p></o:p></span></p>
<p class="MsoNormal" style="background:#F4F5F7"><span lang="EN-US" style="font-size:9.0pt;font-family:"Courier New";color:#172B4D;mso-fareast-language:RU">         </span><span style="font-size:9.0pt;font-family:"MS Gothic";color:#172B4D;mso-fareast-language:RU">¢¢</span><span lang="EN-US" style="font-size:9.0pt;font-family:"Courier New";color:#172B4D;mso-fareast-language:RU"> 
 0x30026d5f: 75ef                     jne    -17                            ; 0x30026d50<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Important notes here:<o:p></o:p></span></p>
<ul style="margin-top:0cm" type="disc">
<li class="MsoListParagraph" style="margin-left:0cm;mso-list:l3 level1 lfo1"><span lang="EN-US">Loop is aligned by 16 bytes;<o:p></o:p></span></li><li class="MsoListParagraph" style="margin-left:0cm;mso-list:l3 level1 lfo1"><span lang="EN-US">Loop size is 17 bytes;<o:p></o:p></span></li></ul>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Depending on a particular machine, this loop is also aligned by 32 bytes. The score difference for this example is dramatic: 32 ops/ms when loop is aligned by 16 (and not by 32), against 51 ops/ms (when loop is aligned
 by 32). It means that the workload is bound to decoding, and the rest of execution works fine (insns/cycpes grows from 2.5 to 3.7 when aligned).<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Alignment of this particular loop depends on how code for previous IR is generated, and in our case it varies:<o:p></o:p></span></p>
<ul style="margin-top:0cm" type="disc">
<li class="MsoListParagraph" style="margin-left:0cm;mso-list:l1 level1 lfo2"><span lang="EN-US">Host to host;<o:p></o:p></span></li><li class="MsoListParagraph" style="margin-left:0cm;mso-list:l1 level1 lfo2"><span lang="EN-US">Build to build;<o:p></o:p></span></li><li class="MsoListParagraph" style="margin-left:0cm;mso-list:l1 level1 lfo2"><span lang="EN-US">Run to run (observed at least once, might be a JIT effect?).<o:p></o:p></span></li></ul>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Here are some performance counters collected on this test:<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p style="mso-margin-top-alt:7.5pt;margin-right:0cm;margin-bottom:0cm;margin-left:0cm;background:white">
<span lang="EN-US" style="font-size:10.5pt;font-family:"Segoe UI",sans-serif;color:#172B4D">Align 16:<o:p></o:p></span></p>
<pre style="background:#F4F5F7;max-height: 30em;overflow-wrap: normal;overflow:auto"><span lang="EN-US" style="color:#172B4D">    17,502,234,018      cycles                                                        (81.80%)<o:p></o:p></span></pre>
<pre style="background:#F4F5F7"><span lang="EN-US" style="color:#172B4D">        26,147,856      idq.all_dsb_cycles_4_uops                                     (81.80%)<o:p></o:p></span></pre>
<pre style="background:#F4F5F7"><span lang="EN-US" style="color:#172B4D">    17,304,494,357      idq.all_dsb_cycles_any_uops                                     (81.80%)<o:p></o:p></span></pre>
<pre style="background:#F4F5F7"><span lang="EN-US" style="color:#172B4D">    17,302,169,702      idq.dsb_cycles                                                (81.80%)<o:p></o:p></span></pre>
<pre style="background:#F4F5F7"><span lang="EN-US" style="color:#172B4D">    34,681,358,154      idq.dsb_uops                                                  (81.80%)<o:p></o:p></span></pre>
<pre style="background:#F4F5F7"><span lang="EN-US" style="color:#172B4D">        23,714,772      idq.all_mite_cycles_4_uops                                     (81.82%)<o:p></o:p></span></pre>
<pre style="background:#F4F5F7"><span lang="EN-US" style="color:#172B4D">        87,658,024      idq.all_mite_cycles_any_uops                                     (81.83%)<o:p></o:p></span></pre>
<pre style="background:#F4F5F7"><span lang="EN-US" style="color:#172B4D">        66,740,027      idq.mite_cycles                                               (81.84%)<o:p></o:p></span></pre>
<pre style="background:#F4F5F7"><span lang="EN-US" style="color:#172B4D">       163,425,243      idq.mite_uops                                                 (81.84%)<o:p></o:p></span></pre>
<pre style="background:#F4F5F7"><span lang="EN-US" style="color:#172B4D">         2,674,281      dsb2mite_switches.penalty_cycles                                     (72.74%)<o:p></o:p></span></pre>
<pre style="background:#F4F5F7"><span lang="EN-US" style="color:#172B4D">         5,537,882      idq.ms_switches                                               (72.72%)<o:p></o:p></span></pre>
<pre style="background:#F4F5F7"><span lang="EN-US" style="color:#172B4D"><o:p> </o:p></span></pre>
<pre style="background:#F4F5F7"><span lang="EN-US" style="color:#172B4D">       5.001125917 seconds time elapsed<o:p></o:p></span></pre>
<p style="mso-margin-top-alt:7.5pt;margin-right:0cm;margin-bottom:0cm;margin-left:0cm;background:white;font-variant-ligatures: normal;font-variant-caps: normal;orphans: 2;text-align:start;widows: 2;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;word-spacing:0px">
<span lang="EN-US" style="font-size:10.5pt;font-family:"Segoe UI",sans-serif;color:#172B4D">Align 32:<o:p></o:p></span></p>
<pre style="background:#F4F5F7;max-height: 30em;overflow-wrap: normal;overflow:auto"><span lang="EN-US" style="color:#172B4D">    17,686,896,278      cycles                                                        (81.79%)<o:p></o:p></span></pre>
<pre style="background:#F4F5F7"><span lang="EN-US" style="color:#172B4D">    13,101,510,457      idq.all_dsb_cycles_4_uops                                     (81.81%)<o:p></o:p></span></pre>
<pre style="background:#F4F5F7"><span lang="EN-US" style="color:#172B4D">    13,113,604,250      idq.all_dsb_cycles_any_uops                                     (81.83%)<o:p></o:p></span></pre>
<pre style="background:#F4F5F7"><span lang="EN-US" style="color:#172B4D">    13,112,858,568      idq.dsb_cycles                                                (81.83%)<o:p></o:p></span></pre>
<pre style="background:#F4F5F7"><span lang="EN-US" style="color:#172B4D">    52,468,480,758      idq.dsb_uops                                                  (81.83%)<o:p></o:p></span></pre>
<pre style="background:#F4F5F7"><span lang="EN-US" style="color:#172B4D">        23,659,985      idq.all_mite_cycles_4_uops                                     (81.83%)<o:p></o:p></span></pre>
<pre style="background:#F4F5F7"><span lang="EN-US" style="color:#172B4D">        64,453,229      idq.all_mite_cycles_any_uops                                     (81.83%)<o:p></o:p></span></pre>
<pre style="background:#F4F5F7"><span lang="EN-US" style="color:#172B4D">        44,043,473      idq.mite_cycles                                               (81.83%)<o:p></o:p></span></pre>
<pre style="background:#F4F5F7"><span lang="EN-US" style="color:#172B4D">       123,098,484      idq.mite_uops                                                 (81.83%)<o:p></o:p></span></pre>
<pre style="background:#F4F5F7"><span lang="EN-US" style="color:#172B4D">         2,485,361      dsb2mite_switches.penalty_cycles                                     (72.71%)<o:p></o:p></span></pre>
<pre style="background:#F4F5F7"><span lang="EN-US" style="color:#172B4D">         5,676,762      idq.ms_switches                                               (72.70%)<o:p></o:p></span></pre>
<pre style="background:#F4F5F7"><span lang="EN-US" style="color:#172B4D"><o:p> </o:p></span></pre>
<pre style="background:#F4F5F7"><span lang="EN-US" style="color:#172B4D">       </span><span style="color:#172B4D">5.051353273 seconds time elapsed<o:p></o:p></span></pre>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">There is a dramatic difference in counter ¡§<span style="color:#172B4D">idq.all_dsb_cycles_4_uops</span>¡¨. The apparent reason of it is that DSB works with 32-byte aligned instruction window. If the loop crosses the border
 of this window, it cannot work with max possible efficiency.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">We are only observing this in one workload (out of Java benchmark set we run regularly), but provided how simple this example is, I see no reason why it¡¦s not a generic widespread issue. Obviously, we want such loops
 aligned by 32 to benefit from DSB.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><b><span lang="EN-US">Proposal:<o:p></o:p></span></b></p>
<p class="MsoNormal"><span lang="EN-US">We could have an heuristic trying to align such loops by 32 bytes. It may be more or less complex. The simplest solution would be ¡§let¡¦s align all innermost loops by 32¡¨ (we already have an experimental option for that).
 The more accurate solution would be:<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Align loops by 32 if:<o:p></o:p></span></p>
<ul style="margin-top:0cm" type="disc">
<li class="MsoListParagraph" style="margin-left:0cm;mso-list:l2 level1 lfo3"><span lang="EN-US">They are innermost;<o:p></o:p></span></li><li class="MsoListParagraph" style="margin-left:0cm;mso-list:l2 level1 lfo3"><span lang="EN-US">Size of loop mod 32 is between 16 and 31 (only in this case alignment by 32 will strictly reduce the number of 32 window crossings by 1);<o:p></o:p></span></li><li class="MsoListParagraph" style="margin-left:0cm;mso-list:l2 level1 lfo3"><span lang="EN-US">(Optional) The loop is small, e.g. less than 32 bytes;<o:p></o:p></span></li><li class="MsoListParagraph" style="margin-left:0cm;mso-list:l2 level1 lfo3"><span lang="EN-US">(Optional) We could make even sharper checks trying to ensure that all other conditions of DSB max utilization are met (may be very complex!)<o:p></o:p></span></li></ul>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><b><span lang="EN-US">Possible cons we¡¦re aware about:<o:p></o:p></span></b></p>
<ul style="margin-top:0cm" type="disc">
<li class="MsoListParagraph" style="margin-left:0cm;mso-list:l0 level1 lfo4"><span lang="EN-US">Code size. Insertion of NOPs for alignment potentially increases code size.<o:p></o:p></span>
<ul style="margin-top:0cm" type="circle">
<li class="MsoListParagraph" style="margin-left:0cm;mso-list:l0 level2 lfo4"><span lang="EN-US">Despite there is clearly a growth, I think it¡¦s negligible: we¡¦ve measured this on a huge Java code corps, and the impact is far less than 1% and not distinguishable
 from noise in JIT runs.<o:p></o:p></span></li></ul>
</li><li class="MsoListParagraph" style="margin-left:0cm;mso-list:l0 level1 lfo4"><span lang="EN-US">Code size growth may affect performance of containing loops (e.g. they will stop fitting into some code window/cache line/icache).<o:p></o:p></span>
<ul style="margin-top:0cm" type="circle">
<li class="MsoListParagraph" style="margin-left:0cm;mso-list:l0 level2 lfo4"><span lang="EN-US">This, though theoretically possible, is very unlikely to be a real problem. Outer loops only matter if inner loops are small w.r.t. to them. It means that inner
 loops will likely be unrolled and fully eliminated, and the parents will become inner loops themselves.<o:p></o:p></span></li><li class="MsoListParagraph" style="margin-left:0cm;mso-list:l0 level2 lfo4"><span lang="EN-US">If it¡¦s a real problem, we can restrain the 32-byte alignment from applying to loops with parents.<o:p></o:p></span></li></ul>
</li><li class="MsoListParagraph" style="margin-left:0cm;mso-list:l0 level1 lfo4"><span lang="EN-US">This maybe interacts with some other processor mechanisms in a negative way. My knowledge here is not strong enough to say which and how.<o:p></o:p></span>
<ul style="margin-top:0cm" type="circle">
<li class="MsoListParagraph" style="margin-left:0cm;mso-list:l0 level2 lfo4"><span lang="EN-US">We did not see negative performance impact on our benchmarks. It does not mean there is none, but we may hope they¡¦re uncommon.<o:p></o:p></span></li></ul>
</li></ul>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">I suggest to think of this and chose how restrictively we want to align loops by 32, provided this data.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Regards,<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Max<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
</div>
</body>
</html>