https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70479

            Bug ID: 70479
           Summary: FMA is not reassociated causing x2 slowdown vs. ICC
           Product: gcc
           Version: 6.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: kyukhin at gcc dot gnu.org
  Target Milestone: ---

Created attachment 38146
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=38146&action=edit
Reproducer

Attached example demonstrates the issue.
GCC is recent trunk. ICC is v16.

Compile:
  GCC: g++ -march=haswell -Ofast -flto -fopenmp-simd -fpermissive m.cpp -o
m.gcc
  ICC: icpc -O3 -ipo -fpermissive -xAVX2 -qopenmp m.cpp -o m.icc

Run
  GCC: time ./m.icc 20000 20000
  ICC: time ./m.gcc 20000 20000

Hot spot generated by GCC (annotated w/ perf hit counts):
157 │8d0:┌─→vbroad 0x4(%r13),%zmm0
193 │    │  lea    0x1(%rdx),%edx
173 │    │  vmulps (%r14,%rax,1),%zmm0,%zmm0
2943│    │  vbroad 0x60(%r13),%zmm1
166 │    │  vbroad 0x5c(%r13),%zmm2
151 │    │  vbroad 0x58(%r13),%zmm3
144 │    │  vbroad 0x54(%r13),%zmm4
164 │    │  vbroad 0x50(%r13),%zmm5
170 │    │  vbroad 0x4c(%r13),%zmm6
162 │    │  vbroad 0x48(%r13),%zmm7
162 │    │  vbroad 0x44(%r13),%zmm8
154 │    │  vbroad 0x40(%r13),%zmm9
172 │    │  vbroad 0x3c(%r13),%zmm10
167 │    │  vbroad 0x38(%r13),%zmm11
172 │    │  vbroad 0x34(%r13),%zmm12
171 │    │  vbroad 0x30(%r13),%zmm13
161 │    │  vbroad 0x2c(%r13),%zmm14
176 │    │  vbroad 0x28(%r13),%zmm15
139 │    │  vbroad 0x24(%r13),%zmm16
180 │    │  vbroad 0x20(%r13),%zmm17
158 │    │  vbroad 0x1c(%r13),%zmm18
165 │    │  vbroad 0x18(%r13),%zmm19
140 │    │  vbroad 0x10(%r13),%zmm21
179 │    │  vbroad 0xc(%r13),%zmm22
146 │    │  vbroad 0x8(%r13),%zmm23
170 │    │  vbroad 0x0(%r13),%zmm24
170 │    │  vbroad 0x14(%r13),%zmm20
168 │    │  vfmadd (%r15,%rax,1),%zmm24,%zmm0
2732│    │  mov    0xb8(%rsp),%rcx
172 │    │  vfmadd (%r11,%rax,1),%zmm23,%zmm0
1649│    │  vfmadd (%rsi,%rax,1),%zmm22,%zmm0                                  
                                      3413│    │  vfmadd
(%rcx,%rax,1),%zmm21,%zmm0                                                     
                   3653│    │  mov    0xc0(%rsp),%rcx                          
                                                         182 │    │  vfmadd
(%rcx,%rax,1),%zmm20,%zmm0
2806│    │  mov    0xc8(%rsp),%rcx
176 │    │  vfmadd (%rcx,%rax,1),%zmm19,%zmm0
2439│    │  mov    0xd0(%rsp),%rcx
179 │    │  vfmadd (%rcx,%rax,1),%zmm18,%zmm0
2562│    │  mov    0xd8(%rsp),%rcx
197 │    │  vfmadd (%rcx,%rax,1),%zmm17,%zmm0
2867│    │  mov    0xe0(%rsp),%rcx
141 │    │  vfmadd (%rcx,%rax,1),%zmm16,%zmm0
3200│    │  mov    0xe8(%rsp),%rcx
156 │    │  vfmadd (%rcx,%rax,1),%zmm15,%zmm0
3557│    │  mov    0xf0(%rsp),%rcx
158 │    │  vfmadd (%rcx,%rax,1),%zmm14,%zmm0
3333│    │  mov    0xf8(%rsp),%rcx
143 │    │  vfmadd (%rcx,%rax,1),%zmm13,%zmm0
3004│    │  mov    0x100(%rsp),%rcx
177 │    │  vfmadd (%rcx,%rax,1),%zmm12,%zmm0
2876│    │  mov    0x108(%rsp),%rcx
144 │    │  vfmadd (%rcx,%rax,1),%zmm11,%zmm0
2838│    │  mov    0x110(%rsp),%rcx
168 │    │  vfmadd (%rcx,%rax,1),%zmm10,%zmm0
2503│    │  mov    0x118(%rsp),%rcx
203 │    │  vfmadd (%rcx,%rax,1),%zmm9,%zmm0
2471│    │  mov    0x120(%rsp),%rcx
185 │    │  vfmadd (%rcx,%rax,1),%zmm8,%zmm0
2153│    │  mov    0x128(%rsp),%rcx
152 │    │  vfmadd (%r12,%rax,1),%zmm7,%zmm0
2091│    │  vfmadd (%rbx,%rax,1),%zmm6,%zmm0
3049│    │  vfmadd (%r10,%rax,1),%zmm5,%zmm0
3737│    │  vfmadd (%r9,%rax,1),%zmm4,%zmm0
3665│    │  vfmadd (%r8,%rax,1),%zmm3,%zmm0
3627│    │  vfmadd (%rdi,%rax,1),%zmm2,%zmm0
3804│    │  vfmadd (%rcx,%rax,1),%zmm1,%zmm0
4052│    │  mov    0x130(%rsp),%rcx
160 │    │  cmp    0x138(%rsp),%edx
534 │    │  vmovup %zmm0,(%rcx,%rax,1)
3235│    │  lea    0x40(%rax),%rax
161 │    └──jb     8d0

Hot spot generated by ICC (annotated w/ perf hit counts):
   344 │47a:┌─→vmulps 0x204c(%r11,%r14,4),%zmm27,%zmm2
   821 │    │  vmulps 0x2050(%r11,%r14,4),%zmm4,%zmm1
   318 │    │  vmulps 0x2040(%r11,%r14,4),%zmm6,%zmm29
   818 │    │  vmulps 0x1840(%r11,%r14,4),%zmm7,%zmm31
   275 │    │  vfmadd 0x1838(%r11,%r14,4),%zmm9,%zmm31
  1234 │    │  vfmadd 0x183c(%r11,%r14,4),%zmm8,%zmm29
   442 │    │  vfmadd 0x2044(%r11,%r14,4),%zmm5,%zmm2
  1110 │    │  vfmadd 0x2048(%r11,%r14,4),%zmm28,%zmm1
   337 │    │  vaddps %zmm29,%zmm31,%zmm0
  1047 │    │  vaddps %zmm1,%zmm2,%zmm3
   655 │    │  vmulps 0x1830(%r11,%r14,4),%zmm11,%zmm30
   956 │    │  vmulps 0x1834(%r11,%r14,4),%zmm10,%zmm2
   296 │    │  vmulps 0x1024(%r11,%r14,4),%zmm15,%zmm1
  1050 │    │  vmulps 0x1028(%r11,%r14,4),%zmm14,%zmm31
   294 │    │  vaddps %zmm0,%zmm3,%zmm3
  1057 │    │  vfmadd 0x102c(%r11,%r14,4),%zmm13,%zmm30
   344 │    │  vfmadd 0x1030(%r11,%r14,4),%zmm12,%zmm2
   911 │    │  vfmadd 0x1020(%r11,%r14,4),%zmm16,%zmm31
   332 │    │  vfmadd 0x820(%r11,%r14,4),%zmm17,%zmm1
   885 │    │  vaddps %zmm2,%zmm30,%zmm29
   486 │    │  vmulps 0x818(%r11,%r14,4),%zmm19,%zmm2
   837 │    │  vaddps %zmm31,%zmm1,%zmm30
   487 │    │  vmulps 0x81c(%r11,%r14,4),%zmm18,%zmm1
   851 │    │  vfmadd 0x810(%r11,%r14,4),%zmm21,%zmm2
   424 │    │  vfmadd 0x814(%r11,%r14,4),%zmm20,%zmm1
  1123 │    │  vaddps %zmm30,%zmm29,%zmm29
   389 │    │  vaddps %zmm1,%zmm2,%zmm31
  1372 │    │  vmulps 0xc(%r11,%r14,4),%zmm23,%zmm2
   311 │    │  vmulps 0x10(%r11,%r14,4),%zmm22,%zmm1
   916 │    │  vaddps %zmm29,%zmm3,%zmm3
   297 │    │  vfmadd (%r11,%r14,4),%zmm26,%zmm2
   795 │    │  vfmadd 0x8(%r11,%r14,4),%zmm24,%zmm1
   426 │    │  vaddps %zmm1,%zmm2,%zmm0
  1275 │    │  vmulps 0x208c(%r11,%r14,4),%zmm27,%zmm1
   364 │    │  vmulps 0x2080(%r11,%r14,4),%zmm6,%zmm30
  1061 │    │  vfmadd 0x4(%r11,%r14,4),%zmm25,%zmm0
   473 │    │  vfmadd 0x2084(%r11,%r14,4),%zmm5,%zmm1
  1106 │    │  vaddps %zmm31,%zmm0,%zmm2
   327 │    │  vmulps 0x2090(%r11,%r14,4),%zmm4,%zmm0
  1410 │    │  vmulps 0x1880(%r11,%r14,4),%zmm7,%zmm29
   274 │    │  vfmadd 0x2088(%r11,%r14,4),%zmm28,%zmm0
  1317 │    │  vaddps %zmm2,%zmm3,%zmm2
   364 │    │  vmulps 0x1874(%r11,%r14,4),%zmm10,%zmm3
  1196 │    │  vaddps %zmm0,%zmm1,%zmm31
   408 │    │  nop
     9 │    │  vmulps 0x1870(%r11,%r14,4),%zmm11,%zmm0
   374 │    │  vfmadd 0x1878(%r11,%r14,4),%zmm9,%zmm29
  1515 │    │  vfmadd 0x187c(%r11,%r14,4),%zmm8,%zmm30
   333 │    │  vfmadd 0x106c(%r11,%r14,4),%zmm13,%zmm0
  1728 │    │  vfmadd 0x1070(%r11,%r14,4),%zmm12,%zmm3
   306 │    │  vaddps %zmm30,%zmm29,%zmm1
  1778 │    │  vmulps 0x1064(%r11,%r14,4),%zmm15,%zmm29
   321 │    │  vaddps %zmm3,%zmm0,%zmm0
  1826 │    │  vmulps 0x1068(%r11,%r14,4),%zmm14,%zmm3
   347 │    │  vfmadd 0x860(%r11,%r14,4),%zmm17,%zmm29
  1562 │    │  vaddps %zmm1,%zmm31,%zmm1
   239 │    │  vfmadd 0x1060(%r11,%r14,4),%zmm16,%zmm3
  1600 │    │  vmulps 0x85c(%r11,%r14,4),%zmm18,%zmm30
   311 │    │  vaddps %zmm3,%zmm29,%zmm3
  1776 │    │  vmulps 0x858(%r11,%r14,4),%zmm19,%zmm29
   338 │    │  vfmadd 0x854(%r11,%r14,4),%zmm20,%zmm30
  1588 │    │  vfmadd 0x850(%r11,%r14,4),%zmm21,%zmm29
   292 │    │  vaddps %zmm3,%zmm0,%zmm0
  1331 │    │  vaddps %zmm30,%zmm29,%zmm31
   460 │    │  vmulps 0x4c(%r11,%r14,4),%zmm23,%zmm29
  1365 │    │  vmulps 0x50(%r11,%r14,4),%zmm22,%zmm30
   347 │    │  vaddps %zmm0,%zmm1,%zmm1
  1461 │    │  vfmadd 0x40(%r11,%r14,4),%zmm26,%zmm29
   489 │    │  vfmadd 0x48(%r11,%r14,4),%zmm24,%zmm30
  1583 │    │  vaddps %zmm30,%zmm29,%zmm30
   875 │    │  vfmadd 0x44(%r11,%r14,4),%zmm25,%zmm30
  1912 │    │  vmovup %zmm2,0x1028(%r13,%r14,4)
  1536 │    │  vaddps %zmm31,%zmm30,%zmm31
  1472 │    │  vaddps %zmm31,%zmm1,%zmm0
  1088 │    │  vmovup %zmm0,0x1068(%r13,%r14,4)
  1644 │    │  add    $0x20,%r14
   182 │    │  cmp    $0x200,%r14
    10 │    └──jb     47a


The issue is that we not doing rebalancing of FMA calculations.
This issue might be reproduced on Haswell as well, although because
of shorter vector perf difference is about 30%

Reply via email to