From e16b4f5b16a3d6b3753ce1a45d40113c8cb6bc23 Mon Sep 17 00:00:00 2001 From: Simon Pilgrim Date: Mon, 19 Dec 2022 18:27:50 +0000 Subject: [PATCH] [X86] Fix SLM uops/resources counts for CMPXCHG instructions 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 | 4 +- .../tools/llvm-mca/X86/SLM/resources-cmpxchg.s | 18 ++++---- .../test/tools/llvm-mca/X86/SLM/resources-x86_64.s | 50 +++++++++++----------- 3 files changed, 36 insertions(+), 36 deletions(-) diff --git a/llvm/lib/Target/X86/X86ScheduleSLM.td b/llvm/lib/Target/X86/X86ScheduleSLM.td index ea6f74e..c59853b 100644 --- a/llvm/lib/Target/X86/X86ScheduleSLM.td +++ b/llvm/lib/Target/X86/X86ScheduleSLM.td @@ -117,8 +117,8 @@ defm : X86WriteResPairUnsupported; defm : X86WriteRes; defm : X86WriteRes; -defm : X86WriteRes; -defm : X86WriteRes; +defm : X86WriteRes; +defm : X86WriteRes; defm : X86WriteRes; defm : SLMWriteResPair; diff --git a/llvm/test/tools/llvm-mca/X86/SLM/resources-cmpxchg.s b/llvm/test/tools/llvm-mca/X86/SLM/resources-cmpxchg.s index f6636d3..86143c5 100644 --- a/llvm/test/tools/llvm-mca/X86/SLM/resources-cmpxchg.s +++ b/llvm/test/tools/llvm-mca/X86/SLM/resources-cmpxchg.s @@ -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) diff --git a/llvm/test/tools/llvm-mca/X86/SLM/resources-x86_64.s b/llvm/test/tools/llvm-mca/X86/SLM/resources-x86_64.s index 7b27f1b..15441af 100644 --- a/llvm/test/tools/llvm-mca/X86/SLM/resources-x86_64.s +++ b/llvm/test/tools/llvm-mca/X86/SLM/resources-x86_64.s @@ -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) -- 2.7.4