[X86] Fix SLM uops/resources counts for CMPXCHG instructions
authorSimon Pilgrim <llvm-dev@redking.me.uk>
Mon, 19 Dec 2022 18:27:50 +0000 (18:27 +0000)
committerSimon Pilgrim <llvm-dev@redking.me.uk>
Tue, 20 Dec 2022 13:07:03 +0000 (13:07 +0000)
LOCK + CMPXCHG8/CMPXCHG16 variants still need overriding as they are not completely correct - already much better though

Based off llvm-exegesis captures, confirmed with Agner + uops.info

llvm/lib/Target/X86/X86ScheduleSLM.td
llvm/test/tools/llvm-mca/X86/SLM/resources-cmpxchg.s
llvm/test/tools/llvm-mca/X86/SLM/resources-x86_64.s

index ea6f74e..c59853b 100644 (file)
@@ -117,8 +117,8 @@ defm : X86WriteResPairUnsupported<WriteMULX64>;
 
 defm : X86WriteRes<WriteBSWAP32, [SLM_IEC_RSV01], 1, [1], 1>;
 defm : X86WriteRes<WriteBSWAP64, [SLM_IEC_RSV01], 1, [1], 1>;
-defm : X86WriteRes<WriteCMPXCHG, [SLM_IEC_RSV01], 1, [1], 1>;
-defm : X86WriteRes<WriteCMPXCHGRMW, [SLM_IEC_RSV01, SLM_MEC_RSV], 4, [1, 2], 2>;
+defm : X86WriteRes<WriteCMPXCHG, [SLM_IEC_RSV01], 6, [6], 5>;
+defm : X86WriteRes<WriteCMPXCHGRMW, [SLM_IEC_RSV01, SLM_MEC_RSV], 10, [6, 2], 8>;
 defm : X86WriteRes<WriteXCHG,      [SLM_IEC_RSV01], 1, [1], 1>;
 
 defm : SLMWriteResPair<WriteShift,    [SLM_IEC_RSV0],  1>;
index f6636d3..86143c5 100644 (file)
@@ -15,10 +15,10 @@ lock cmpxchg16b (%rax)
 # CHECK-NEXT: [6]: HasSideEffects (U)
 
 # CHECK:      [1]    [2]    [3]    [4]    [5]    [6]    Instructions:
-# CHECK-NEXT:  2      4     2.00    *      *            cmpxchg8b      (%rax)
-# CHECK-NEXT:  2      4     2.00    *      *            cmpxchg16b     (%rax)
-# CHECK-NEXT:  2      4     2.00    *      *            lock           cmpxchg8b       (%rax)
-# CHECK-NEXT:  2      4     2.00    *      *            lock           cmpxchg16b      (%rax)
+# CHECK-NEXT:  8      10    3.00    *      *            cmpxchg8b      (%rax)
+# CHECK-NEXT:  8      10    3.00    *      *            cmpxchg16b     (%rax)
+# CHECK-NEXT:  8      10    3.00    *      *            lock           cmpxchg8b       (%rax)
+# CHECK-NEXT:  8      10    3.00    *      *            lock           cmpxchg16b      (%rax)
 
 # CHECK:      Resources:
 # CHECK-NEXT: [0]   - SLMDivider
@@ -32,11 +32,11 @@ lock cmpxchg16b (%rax)
 
 # CHECK:      Resource pressure per iteration:
 # CHECK-NEXT: [0]    [1]    [2]    [3]    [4]    [5]    [6]    [7]
-# CHECK-NEXT:  -      -      -      -      -     2.00   2.00   8.00
+# CHECK-NEXT:  -      -      -      -      -     12.00  12.00  8.00
 
 # CHECK:      Resource pressure by instruction:
 # CHECK-NEXT: [0]    [1]    [2]    [3]    [4]    [5]    [6]    [7]    Instructions:
-# CHECK-NEXT:  -      -      -      -      -     0.50   0.50   2.00   cmpxchg8b        (%rax)
-# CHECK-NEXT:  -      -      -      -      -     0.50   0.50   2.00   cmpxchg16b       (%rax)
-# CHECK-NEXT:  -      -      -      -      -     0.50   0.50   2.00   lock             cmpxchg8b       (%rax)
-# CHECK-NEXT:  -      -      -      -      -     0.50   0.50   2.00   lock             cmpxchg16b      (%rax)
+# CHECK-NEXT:  -      -      -      -      -     3.00   3.00   2.00   cmpxchg8b        (%rax)
+# CHECK-NEXT:  -      -      -      -      -     3.00   3.00   2.00   cmpxchg16b       (%rax)
+# CHECK-NEXT:  -      -      -      -      -     3.00   3.00   2.00   lock             cmpxchg8b       (%rax)
+# CHECK-NEXT:  -      -      -      -      -     3.00   3.00   2.00   lock             cmpxchg16b      (%rax)
index 7b27f1b..15441af 100644 (file)
@@ -1296,18 +1296,18 @@ xorq (%rax), %rdi
 # CHECK-NEXT:  1      100   1.00                  U     cmpsw  %es:(%rdi), (%rsi)
 # CHECK-NEXT:  1      100   1.00                  U     cmpsl  %es:(%rdi), (%rsi)
 # CHECK-NEXT:  1      100   1.00                  U     cmpsq  %es:(%rdi), (%rsi)
-# CHECK-NEXT:  1      1     0.50                        cmpxchgb       %cl, %bl
-# CHECK-NEXT:  2      4     2.00    *      *            cmpxchgb       %cl, (%rbx)
-# CHECK-NEXT:  2      4     2.00    *      *            lock           cmpxchgb        %cl, (%rbx)
-# CHECK-NEXT:  1      1     0.50                        cmpxchgw       %cx, %bx
-# CHECK-NEXT:  2      4     2.00    *      *            cmpxchgw       %cx, (%rbx)
-# CHECK-NEXT:  2      4     2.00    *      *            lock           cmpxchgw        %cx, (%rbx)
-# CHECK-NEXT:  1      1     0.50                        cmpxchgl       %ecx, %ebx
-# CHECK-NEXT:  2      4     2.00    *      *            cmpxchgl       %ecx, (%rbx)
-# CHECK-NEXT:  2      4     2.00    *      *            lock           cmpxchgl        %ecx, (%rbx)
-# CHECK-NEXT:  1      1     0.50                        cmpxchgq       %rcx, %rbx
-# CHECK-NEXT:  2      4     2.00    *      *            cmpxchgq       %rcx, (%rbx)
-# CHECK-NEXT:  2      4     2.00    *      *            lock           cmpxchgq        %rcx, (%rbx)
+# CHECK-NEXT:  5      6     3.00                        cmpxchgb       %cl, %bl
+# CHECK-NEXT:  8      10    3.00    *      *            cmpxchgb       %cl, (%rbx)
+# CHECK-NEXT:  8      10    3.00    *      *            lock           cmpxchgb        %cl, (%rbx)
+# CHECK-NEXT:  5      6     3.00                        cmpxchgw       %cx, %bx
+# CHECK-NEXT:  8      10    3.00    *      *            cmpxchgw       %cx, (%rbx)
+# CHECK-NEXT:  8      10    3.00    *      *            lock           cmpxchgw        %cx, (%rbx)
+# CHECK-NEXT:  5      6     3.00                        cmpxchgl       %ecx, %ebx
+# CHECK-NEXT:  8      10    3.00    *      *            cmpxchgl       %ecx, (%rbx)
+# CHECK-NEXT:  8      10    3.00    *      *            lock           cmpxchgl        %ecx, (%rbx)
+# CHECK-NEXT:  5      6     3.00                        cmpxchgq       %rcx, %rbx
+# CHECK-NEXT:  8      10    3.00    *      *            cmpxchgq       %rcx, (%rbx)
+# CHECK-NEXT:  8      10    3.00    *      *            lock           cmpxchgq        %rcx, (%rbx)
 # CHECK-NEXT:  1      100   1.00                  U     cpuid
 # CHECK-NEXT:  1      1     0.50                        decb   %dil
 # CHECK-NEXT:  1      5     2.00    *      *            decb   (%rax)
@@ -1960,7 +1960,7 @@ xorq (%rax), %rdi
 
 # CHECK:      Resource pressure per iteration:
 # CHECK-NEXT: [0]    [1]    [2]    [3]    [4]    [5]    [6]    [7]
-# CHECK-NEXT: 400.00  -      -     49.00   -     654.50 595.50 835.00
+# CHECK-NEXT: 400.00  -      -     49.00   -     684.50 625.50 835.00
 
 # CHECK:      Resource pressure by instruction:
 # CHECK-NEXT: [0]    [1]    [2]    [3]    [4]    [5]    [6]    [7]    Instructions:
@@ -2226,18 +2226,18 @@ xorq (%rax), %rdi
 # CHECK-NEXT:  -      -      -     1.00    -      -      -      -     cmpsw    %es:(%rdi), (%rsi)
 # CHECK-NEXT:  -      -      -     1.00    -      -      -      -     cmpsl    %es:(%rdi), (%rsi)
 # CHECK-NEXT:  -      -      -     1.00    -      -      -      -     cmpsq    %es:(%rdi), (%rsi)
-# CHECK-NEXT:  -      -      -      -      -     0.50   0.50    -     cmpxchgb %cl, %bl
-# CHECK-NEXT:  -      -      -      -      -     0.50   0.50   2.00   cmpxchgb %cl, (%rbx)
-# CHECK-NEXT:  -      -      -      -      -     0.50   0.50   2.00   lock             cmpxchgb        %cl, (%rbx)
-# CHECK-NEXT:  -      -      -      -      -     0.50   0.50    -     cmpxchgw %cx, %bx
-# CHECK-NEXT:  -      -      -      -      -     0.50   0.50   2.00   cmpxchgw %cx, (%rbx)
-# CHECK-NEXT:  -      -      -      -      -     0.50   0.50   2.00   lock             cmpxchgw        %cx, (%rbx)
-# CHECK-NEXT:  -      -      -      -      -     0.50   0.50    -     cmpxchgl %ecx, %ebx
-# CHECK-NEXT:  -      -      -      -      -     0.50   0.50   2.00   cmpxchgl %ecx, (%rbx)
-# CHECK-NEXT:  -      -      -      -      -     0.50   0.50   2.00   lock             cmpxchgl        %ecx, (%rbx)
-# CHECK-NEXT:  -      -      -      -      -     0.50   0.50    -     cmpxchgq %rcx, %rbx
-# CHECK-NEXT:  -      -      -      -      -     0.50   0.50   2.00   cmpxchgq %rcx, (%rbx)
-# CHECK-NEXT:  -      -      -      -      -     0.50   0.50   2.00   lock             cmpxchgq        %rcx, (%rbx)
+# CHECK-NEXT:  -      -      -      -      -     3.00   3.00    -     cmpxchgb %cl, %bl
+# CHECK-NEXT:  -      -      -      -      -     3.00   3.00   2.00   cmpxchgb %cl, (%rbx)
+# CHECK-NEXT:  -      -      -      -      -     3.00   3.00   2.00   lock             cmpxchgb        %cl, (%rbx)
+# CHECK-NEXT:  -      -      -      -      -     3.00   3.00    -     cmpxchgw %cx, %bx
+# CHECK-NEXT:  -      -      -      -      -     3.00   3.00   2.00   cmpxchgw %cx, (%rbx)
+# CHECK-NEXT:  -      -      -      -      -     3.00   3.00   2.00   lock             cmpxchgw        %cx, (%rbx)
+# CHECK-NEXT:  -      -      -      -      -     3.00   3.00    -     cmpxchgl %ecx, %ebx
+# CHECK-NEXT:  -      -      -      -      -     3.00   3.00   2.00   cmpxchgl %ecx, (%rbx)
+# CHECK-NEXT:  -      -      -      -      -     3.00   3.00   2.00   lock             cmpxchgl        %ecx, (%rbx)
+# CHECK-NEXT:  -      -      -      -      -     3.00   3.00    -     cmpxchgq %rcx, %rbx
+# CHECK-NEXT:  -      -      -      -      -     3.00   3.00   2.00   cmpxchgq %rcx, (%rbx)
+# CHECK-NEXT:  -      -      -      -      -     3.00   3.00   2.00   lock             cmpxchgq        %rcx, (%rbx)
 # CHECK-NEXT:  -      -      -     1.00    -      -      -      -     cpuid
 # CHECK-NEXT:  -      -      -      -      -     0.50   0.50    -     decb     %dil
 # CHECK-NEXT:  -      -      -      -      -     0.50   0.50   2.00   decb     (%rax)