# REQUIRES: system-linux # RUN: llvm-mc -filetype=obj -triple x86_64-unknown-unknown %s -o %t.o # RUN: link_fdata %s %t.o %t.fdata # RUN: llvm-strip --strip-unneeded %t.o # RUN: %clang %cflags %t.o -o %t.exe -Wl,-q -nostdlib # RUN: llvm-bolt %t.exe --data %t.fdata -o %t --lite=0 -v=2 \ # RUN: --cmov-conversion --cmov-conversion-misprediction-threshold=-1 \ # RUN: --cmov-conversion-bias-threshold=-1 --print-all | FileCheck %s # CHECK: BOLT-INFO: CMOVConversion: CmovInHotPath, converted static 1/1 # CHECK: BOLT-INFO: CMOVConversion: CmovNotInHotPath, converted static 1/1 # CHECK: BOLT-INFO: CMOVConversion: MaxIndex, converted static 1/1 # CHECK: BOLT-INFO: CMOVConversion: MaxIndex_unpredictable, converted static 1/1 # CHECK: BOLT-INFO: CMOVConversion: MaxValue, converted static 1/1 # CHECK: BOLT-INFO: CMOVConversion: BinarySearch, converted static 0/0 # CHECK: BOLT-INFO: CMOVConversion: Transform, converted static 0/0 # CHECK: BOLT-INFO: CMOVConversion: test_cmov_memoperand, converted static 0/0 # CHECK: BOLT-INFO: CMOVConversion: test_cmov_memoperand_unpredictable, converted static 0/0 # CHECK: BOLT-INFO: CMOVConversion: test_cmov_memoperand_in_group, converted static 0/0 # CHECK: BOLT-INFO: CMOVConversion: test_cmov_memoperand_in_group2, converted static 0/0 # CHECK: BOLT-INFO: CMOVConversion: test_cmov_memoperand_conflicting_dir, converted static 0/0 # CHECK: BOLT-INFO: CMOVConversion: test_cmov_memoperand_in_group_reuse_for_addr, converted static 0/0 # CHECK: BOLT-INFO: CMOVConversion: test_cmov_memoperand_in_group_reuse_for_addr2, converted static 0/0 # CHECK: BOLT-INFO: CMOVConversion: test_cmov_memoperand_in_group_reuse_for_addr3, converted static 0/0 # CHECK: BOLT-INFO: CMOVConversion: test_memoperand_loop, converted static 1/1 # CHECK: BOLT-INFO: CMOVConversion: CmovBackToBack, converted static 2/2 # CHECK: BOLT-INFO: CMOVConversion total: converted static 8/8 .globl _start _start: .globl CmovInHotPath # -- Begin function CmovInHotPath .p2align 4, 0x90 .type CmovInHotPath,@function CmovInHotPath: # @CmovInHotPath # CHECK-LABEL: Binary Function "CmovInHotPath" after CMOV conversion # FDATA: 0 [unknown] 0 1 CmovInHotPath 0 1 2 .cfi_startproc # %bb.0: # %entry testl %edi, %edi jle LBB0_5 # %bb.1: # %for.body.preheader movl %edi, %r8d xorl %edi, %edi # FDATA: 0 [unknown] 0 1 CmovInHotPath #LBB0_2# 1 2 LBB0_2: # %for.body movl (%rcx,%rdi,4), %eax leal 1(%rax), %r9d imull %esi, %eax movl $10, %r10d cmpl %edx, %eax # CHECK: cmpl %edx, %eax # CHECK-NEXT: cmovlel %r9d, %r10d LBB0_2_br: jg LBB0_4 # FDATA: 1 CmovInHotPath #LBB0_2_br# 1 CmovInHotPath #LBB0_3# 1 2 # FDATA: 1 CmovInHotPath #LBB0_2_br# 1 CmovInHotPath #LBB0_4# 1 2 # %bb.3: # %for.body LBB0_3: movl %r9d, %r10d LBB0_4: # %for.body imull %r9d, %r10d movl %r10d, (%rcx,%rdi,4) addq $1, %rdi cmpq %rdi, %r8 jne LBB0_2 LBB0_5: # %for.cond.cleanup retq Lfunc_end0: .size CmovInHotPath, Lfunc_end0-CmovInHotPath .cfi_endproc # -- End function .globl CmovNotInHotPath # -- Begin function CmovNotInHotPath .p2align 4, 0x90 .type CmovNotInHotPath,@function CmovNotInHotPath: # @CmovNotInHotPath # CHECK-LABEL: Binary Function "CmovNotInHotPath" after CMOV conversion # FDATA: 0 [unknown] 0 1 CmovNotInHotPath 0 1 2 .cfi_startproc # %bb.0: # %entry testl %edi, %edi jle LBB1_5 # %bb.1: # %for.body.preheader movl %edx, %r9d movl %edi, %r10d xorl %edi, %edi # FDATA: 0 [unknown] 0 1 CmovNotInHotPath #LBB1_2# 1 2 LBB1_2: # %for.body movl (%rcx,%rdi,4), %r11d movl %r11d, %eax imull %esi, %eax movl $10, %edx cmpl %r9d, %eax # CHECK: cmpl %r9d, %eax # CHECK-NEXT: cmovlel %r11d, %edx LBB1_4_br: jg LBB1_4 # FDATA: 1 CmovNotInHotPath #LBB1_4_br# 1 CmovNotInHotPath #LBB1_3# 1 2 # FDATA: 1 CmovNotInHotPath #LBB1_4_br# 1 CmovNotInHotPath #LBB1_4# 1 2 # %bb.3: # %for.body LBB1_3: movl %r11d, %edx LBB1_4: # %for.body movl %edx, (%rcx,%rdi,4) movl (%r8,%rdi,4), %eax cltd idivl %r9d movl %eax, (%r8,%rdi,4) addq $1, %rdi cmpq %rdi, %r10 jne LBB1_2 LBB1_5: # %for.cond.cleanup retq Lfunc_end1: .size CmovNotInHotPath, Lfunc_end1-CmovNotInHotPath .cfi_endproc # -- End function .globl MaxIndex # -- Begin function MaxIndex .p2align 4, 0x90 .type MaxIndex,@function MaxIndex: # @MaxIndex # CHECK-LABEL: Binary Function "MaxIndex" after CMOV conversion # FDATA: 0 [unknown] 0 1 MaxIndex 0 1 2 .cfi_startproc # %bb.0: # %entry xorl %eax, %eax cmpl $2, %edi jl LBB2_5 # %bb.1: # %for.body.preheader movl %edi, %r8d xorl %edi, %edi movl $1, %edx # FDATA: 0 [unknown] 0 1 MaxIndex #LBB2_2# 1 2 LBB2_2: # %for.body movl (%rsi,%rdx,4), %r9d movslq %edi, %rcx movl %edx, %eax cmpl (%rsi,%rcx,4), %r9d # CHECK: cmpl (%rsi,%rcx,4), %r9d # CHECK-NEXT: cmovlel %edi, %eax LBB2_2_br: jg LBB2_4 # FDATA: 1 MaxIndex #LBB2_2_br# 1 MaxIndex #LBB2_3# 1 2 # FDATA: 1 MaxIndex #LBB2_2_br# 1 MaxIndex #LBB2_4# 1 2 # %bb.3: # %for.body LBB2_3: movl %edi, %eax LBB2_4: # %for.body addq $1, %rdx movl %eax, %edi cmpq %rdx, %r8 jne LBB2_2 LBB2_5: # %for.cond.cleanup retq Lfunc_end2: .size MaxIndex, Lfunc_end2-MaxIndex .cfi_endproc # -- End function .globl MaxIndex_unpredictable # -- Begin function MaxIndex_unpredictable .p2align 4, 0x90 .type MaxIndex_unpredictable,@function MaxIndex_unpredictable: # @MaxIndex_unpredictable # CHECK-LABEL: Binary Function "MaxIndex_unpredictable" after CMOV conversion # FDATA: 0 [unknown] 0 1 MaxIndex_unpredictable 0 1 2 .cfi_startproc # %bb.0: # %entry xorl %eax, %eax cmpl $2, %edi jl LBB3_5 # %bb.1: # %for.body.preheader movl %edi, %r8d xorl %edi, %edi movl $1, %edx # FDATA: 0 [unknown] 0 1 MaxIndex_unpredictable #LBB3_2# 1 2 LBB3_2: # %for.body movl (%rsi,%rdx,4), %r9d movslq %edi, %rcx movl %edx, %eax cmpl (%rsi,%rcx,4), %r9d # CHECK: cmpl (%rsi,%rcx,4), %r9d # CHECK-NEXT: cmovlel %edi, %eax LBB3_2_br: jg LBB3_4 # FDATA: 1 MaxIndex_unpredictable #LBB3_2_br# 1 MaxIndex_unpredictable #LBB3_3# 1 2 # FDATA: 1 MaxIndex_unpredictable #LBB3_2_br# 1 MaxIndex_unpredictable #LBB3_4# 1 2 # %bb.3: # %for.body LBB3_3: movl %edi, %eax LBB3_4: # %for.body addq $1, %rdx movl %eax, %edi cmpq %rdx, %r8 jne LBB3_2 LBB3_5: # %for.cond.cleanup retq Lfunc_end3: .size MaxIndex_unpredictable, Lfunc_end3-MaxIndex_unpredictable .cfi_endproc # -- End function .globl MaxValue # -- Begin function MaxValue .p2align 4, 0x90 .type MaxValue,@function MaxValue: # @MaxValue # CHECK-LABEL: Binary Function "MaxValue" after CMOV conversion # FDATA: 0 [unknown] 0 1 MaxValue 0 1 2 .cfi_startproc # %bb.0: # %entry movl (%rsi), %ecx cmpl $2, %edi jge LBB4_3 # %bb.1: LBB4_1: movl %ecx, %eax LBB4_2: # %for.cond.cleanup retq LBB4_3: # %for.body.preheader movl %edi, %edi movl $1, %edx LBB4_4: # %for.body movl (%rsi,%rdx,4), %eax cmpl %ecx, %eax # CHECK: cmpl %ecx, %eax # CHECK-NEXT: cmovlel %ecx, %eax LBB4_4_br: jg LBB4_6 # FDATA: 1 MaxValue #LBB4_4_br# 1 MaxValue #LBB4_5# 1 2 # FDATA: 1 MaxValue #LBB4_4_br# 1 MaxValue #LBB4_6# 1 2 # %bb.5: # %for.body LBB4_5: movl %ecx, %eax LBB4_6: # %for.body addq $1, %rdx movl %eax, %ecx cmpq %rdx, %rdi je LBB4_2 jmp LBB4_4 Lfunc_end4: .size MaxValue, Lfunc_end4-MaxValue .cfi_endproc # -- End function .globl BinarySearch # -- Begin function BinarySearch .p2align 4, 0x90 .type BinarySearch,@function BinarySearch: # @BinarySearch # CHECK-LABEL: Binary Function "BinarySearch" after CMOV conversion # FDATA: 0 [unknown] 0 1 BinarySearch 0 1 2 .cfi_startproc # %bb.0: # %entry movl (%rsi), %eax jmp LBB5_2 LBB5_1: # %while.body movl %ecx, %eax xorl %ecx, %ecx btl %eax, %edi setae %cl movq 8(%rdx,%rcx,8), %rdx LBB5_2: # %while.body movl (%rdx), %ecx cmpl %ecx, %eax ja LBB5_1 # %bb.3: # %while.end retq Lfunc_end5: .size BinarySearch, Lfunc_end5-BinarySearch .cfi_endproc # -- End function .globl Transform # -- Begin function Transform .p2align 4, 0x90 .type Transform,@function Transform: # @Transform # CHECK-LABEL: Binary Function "Transform" after CMOV conversion # FDATA: 0 [unknown] 0 1 Transform 0 1 2 .cfi_startproc # %bb.0: # %entry movb $1, %al testb %al, %al jne LBB6_5 # %bb.1: # %while.body.preheader movl %edx, %r8d xorl %esi, %esi LBB6_2: # %while.body movslq %esi, %rsi movl (%rdi,%rsi,4), %eax xorl %edx, %edx divl %r8d movl %eax, %edx movl $11, %eax movl %r8d, %ecx cmpl %r8d, %edx ja LBB6_4 # %bb.3: # %while.body movl $22, %eax movl $22, %ecx LBB6_4: # %while.body xorl %edx, %edx divl %ecx movl %edx, (%rdi,%rsi,4) addl $1, %esi cmpl %r9d, %esi ja LBB6_2 LBB6_5: # %while.end retq Lfunc_end6: .size Transform, Lfunc_end6-Transform .cfi_endproc # -- End function .globl test_cmov_memoperand # -- Begin function test_cmov_memoperand .p2align 4, 0x90 .type test_cmov_memoperand,@function test_cmov_memoperand: # @test_cmov_memoperand # CHECK-LABEL: Binary Function "test_cmov_memoperand" after CMOV conversion # FDATA: 0 [unknown] 0 1 test_cmov_memoperand 0 1 2 .cfi_startproc # %bb.0: # %entry movl %edx, %eax cmpl %esi, %edi ja LBB7_2 # %bb.1: # %entry movl (%rcx), %eax LBB7_2: # %entry retq Lfunc_end7: .size test_cmov_memoperand, Lfunc_end7-test_cmov_memoperand .cfi_endproc # -- End function .globl test_cmov_memoperand_unpredictable # -- Begin function test_cmov_memoperand_unpredictable .p2align 4, 0x90 .type test_cmov_memoperand_unpredictable,@function test_cmov_memoperand_unpredictable: # @test_cmov_memoperand_unpredictable # CHECK-LABEL: Binary Function "test_cmov_memoperand_unpredictable" after CMOV conversion # FDATA: 0 [unknown] 0 1 test_cmov_memoperand_unpredictable 0 1 2 .cfi_startproc # %bb.0: # %entry movl %edx, %eax cmpl %esi, %edi ja LBB8_2 # %bb.1: # %entry movl (%rcx), %eax LBB8_2: # %entry retq Lfunc_end8: .size test_cmov_memoperand_unpredictable, Lfunc_end8-test_cmov_memoperand_unpredictable .cfi_endproc # -- End function .globl test_cmov_memoperand_in_group # -- Begin function test_cmov_memoperand_in_group .p2align 4, 0x90 .type test_cmov_memoperand_in_group,@function test_cmov_memoperand_in_group: # @test_cmov_memoperand_in_group # CHECK-LABEL: Binary Function "test_cmov_memoperand_in_group" after CMOV conversion # FDATA: 0 [unknown] 0 1 test_cmov_memoperand_in_group 0 1 2 .cfi_startproc # %bb.0: # %entry movl %edx, %eax movl %edx, %r8d cmpl %esi, %edi ja LBB9_2 # %bb.1: # %entry movl (%rcx), %r8d movl %edi, %eax movl %esi, %edx LBB9_2: # %entry addl %r8d, %eax addl %edx, %eax retq Lfunc_end9: .size test_cmov_memoperand_in_group, Lfunc_end9-test_cmov_memoperand_in_group .cfi_endproc # -- End function .globl test_cmov_memoperand_in_group2 # -- Begin function test_cmov_memoperand_in_group2 .p2align 4, 0x90 .type test_cmov_memoperand_in_group2,@function test_cmov_memoperand_in_group2: # @test_cmov_memoperand_in_group2 # CHECK-LABEL: Binary Function "test_cmov_memoperand_in_group2" after CMOV conversion # FDATA: 0 [unknown] 0 1 test_cmov_memoperand_in_group2 0 1 2 .cfi_startproc # %bb.0: # %entry movl %edx, %eax movl %edx, %r8d cmpl %esi, %edi jbe LBB10_2 # %bb.1: # %entry movl (%rcx), %r8d movl %edi, %eax movl %esi, %edx LBB10_2: # %entry addl %r8d, %eax addl %edx, %eax retq Lfunc_end10: .size test_cmov_memoperand_in_group2, Lfunc_end10-test_cmov_memoperand_in_group2 .cfi_endproc # -- End function .globl test_cmov_memoperand_conflicting_dir # -- Begin function test_cmov_memoperand_conflicting_dir .p2align 4, 0x90 .type test_cmov_memoperand_conflicting_dir,@function test_cmov_memoperand_conflicting_dir: # @test_cmov_memoperand_conflicting_dir # CHECK-LABEL: Binary Function "test_cmov_memoperand_conflicting_dir" after CMOV conversion # FDATA: 0 [unknown] 0 1 test_cmov_memoperand_conflicting_dir 0 1 2 .cfi_startproc # %bb.0: # %entry cmpl %esi, %edi movl (%rcx), %eax cmoval %edx, %eax cmoval (%r8), %edx addl %edx, %eax retq Lfunc_end11: .size test_cmov_memoperand_conflicting_dir, Lfunc_end11-test_cmov_memoperand_conflicting_dir .cfi_endproc # -- End function .globl test_cmov_memoperand_in_group_reuse_for_addr # -- Begin function test_cmov_memoperand_in_group_reuse_for_addr .p2align 4, 0x90 .type test_cmov_memoperand_in_group_reuse_for_addr,@function test_cmov_memoperand_in_group_reuse_for_addr: # @test_cmov_memoperand_in_group_reuse_for_addr # CHECK-LABEL: Binary Function "test_cmov_memoperand_in_group_reuse_for_addr" after CMOV conversion # FDATA: 0 [unknown] 0 1 test_cmov_memoperand_in_group_reuse_for_addr 0 1 2 .cfi_startproc # %bb.0: # %entry movl %edi, %eax cmpl %esi, %edi ja LBB12_2 # %bb.1: # %entry movl (%rcx), %eax LBB12_2: # %entry retq Lfunc_end12: .size test_cmov_memoperand_in_group_reuse_for_addr, Lfunc_end12-test_cmov_memoperand_in_group_reuse_for_addr .cfi_endproc # -- End function .globl test_cmov_memoperand_in_group_reuse_for_addr2 # -- Begin function test_cmov_memoperand_in_group_reuse_for_addr2 .p2align 4, 0x90 .type test_cmov_memoperand_in_group_reuse_for_addr2,@function test_cmov_memoperand_in_group_reuse_for_addr2: # @test_cmov_memoperand_in_group_reuse_for_addr2 # CHECK-LABEL: Binary Function "test_cmov_memoperand_in_group_reuse_for_addr2" after CMOV conversion # FDATA: 0 [unknown] 0 1 test_cmov_memoperand_in_group_reuse_for_addr2 0 1 2 .cfi_startproc # %bb.0: # %entry movl %edi, %eax cmpl %esi, %edi ja LBB13_2 # %bb.1: # %entry movq (%rcx), %rax movl (%rax), %eax LBB13_2: # %entry retq Lfunc_end13: .size test_cmov_memoperand_in_group_reuse_for_addr2, Lfunc_end13-test_cmov_memoperand_in_group_reuse_for_addr2 .cfi_endproc # -- End function .globl test_cmov_memoperand_in_group_reuse_for_addr3 # -- Begin function test_cmov_memoperand_in_group_reuse_for_addr3 .p2align 4, 0x90 .type test_cmov_memoperand_in_group_reuse_for_addr3,@function test_cmov_memoperand_in_group_reuse_for_addr3: # @test_cmov_memoperand_in_group_reuse_for_addr3 # CHECK-LABEL: Binary Function "test_cmov_memoperand_in_group_reuse_for_addr3" after CMOV conversion # FDATA: 0 [unknown] 0 1 test_cmov_memoperand_in_group_reuse_for_addr3 0 1 2 .cfi_startproc # %bb.0: # %entry movl %edi, %eax cmpl %esi, %edi ja LBB14_2 # %bb.1: # %entry movl (%rcx), %eax LBB14_2: # %entry retq Lfunc_end14: .size test_cmov_memoperand_in_group_reuse_for_addr3, Lfunc_end14-test_cmov_memoperand_in_group_reuse_for_addr3 .cfi_endproc # -- End function .globl test_memoperand_loop # -- Begin function test_memoperand_loop .p2align 4, 0x90 .type test_memoperand_loop,@function test_memoperand_loop: # @test_memoperand_loop # CHECK-LABEL: Binary Function "test_memoperand_loop" after CMOV conversion # FDATA: 0 [unknown] 0 1 test_memoperand_loop 0 1 2 .cfi_startproc # %bb.0: # %entry movq begin@GOTPCREL(%rip), %r8 movq (%r8), %rax movq end@GOTPCREL(%rip), %rcx movq (%rcx), %rdx xorl %esi, %esi movq %rax, %rcx LBB15_1: # %loop.body addq $8, %rcx cmpq %rdx, %rcx ja LBB15_3 # %bb.2: # %loop.body movq (%r8), %rcx LBB15_3: # %loop.body movl %edi, (%rcx) addq $8, %rcx cmpq %rdx, %rcx # CHECK: movl %edi, (%rcx) # CHECK-NEXT: addq $0x8, %rcx # CHECK-NEXT: cmpq %rdx, %rcx # CHECK-NEXT: cmovbeq %rax, %rcx LBB15_3_br: ja LBB15_5 # FDATA: 1 test_memoperand_loop #LBB15_3_br# 1 test_memoperand_loop #LBB15_4# 1 2 # FDATA: 1 test_memoperand_loop #LBB15_3_br# 1 test_memoperand_loop #LBB15_5# 1 2 # %bb.4: # %loop.body LBB15_4: movq %rax, %rcx LBB15_5: # %loop.body movl %edi, (%rcx) addl $1, %esi cmpl $1024, %esi # imm = 0x400 jl LBB15_1 # %bb.6: # %exit retq Lfunc_end15: .size test_memoperand_loop, Lfunc_end15-test_memoperand_loop .cfi_endproc # -- End function .globl CmovBackToBack # -- Begin function CmovBackToBack .p2align 4, 0x90 .type CmovBackToBack,@function CmovBackToBack: # @CmovBackToBack # CHECK-LABEL: Binary Function "CmovBackToBack" after CMOV conversion # FDATA: 0 [unknown] 0 1 CmovBackToBack 0 1 2 .cfi_startproc testl %edi, %edi jle LBB16_5 movl %edi, %r8d xorl %edi, %edi # FDATA: 0 [unknown] 0 1 CmovBackToBack #LBB16_2# 1 2 LBB16_2: # %for.body movl (%rcx,%rdi,4), %eax leal 1(%rax), %r9d imull %esi, %eax movl $10, %r10d cmpl %edx, %eax # CHECK: cmpl %edx, %eax # CHECK-NEXT: cmovlel %r9d, %r10d LBB16_2_br: jg LBB16_4 # FDATA: 1 CmovBackToBack #LBB16_2_br# 1 CmovBackToBack #LBB16_3# 1 2 # FDATA: 1 CmovBackToBack #LBB16_2_br# 1 CmovBackToBack #LBB16_4# 1 2 LBB16_3: movl %r9d, %r10d LBB16_4: # %for.body # CHECK-NEXT: cmovlel %r9d, %r10d LBB16_6_br: jg LBB16_8 # FDATA: 1 CmovBackToBack #LBB16_6_br# 1 CmovBackToBack #LBB16_7# 1 2 # FDATA: 1 CmovBackToBack #LBB16_6_br# 1 CmovBackToBack #LBB16_8# 1 2 LBB16_7: movl %r9d, %r10d LBB16_8: # %for.body imull %r9d, %r10d movl %r10d, (%rcx,%rdi,4) addq $1, %rdi cmpq %rdi, %r8 jne LBB16_2 LBB16_5: # %for.cond.cleanup retq Lfunc_end16: .size CmovBackToBack, Lfunc_end16-CmovBackToBack .cfi_endproc # -- End function .data .globl begin begin: .quad 0xdeadbeef .globl end end: .quad 0xfaceb00c