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%