diff --git a/bolt/lib/Passes/TailDuplication.cpp b/bolt/lib/Passes/TailDuplication.cpp --- a/bolt/lib/Passes/TailDuplication.cpp +++ b/bolt/lib/Passes/TailDuplication.cpp @@ -44,7 +44,7 @@ static cl::opt TailDuplicationConstCopyPropagation( "tail-duplication-const-copy-propagation", cl::desc("enable const and copy propagation after tail duplication"), - cl::ReallyHidden, cl::init(false), cl::cat(BoltOptCategory)); + cl::ReallyHidden, cl::init(true), cl::cat(BoltOptCategory)); } // namespace opts diff --git a/bolt/test/X86/tail-dup-peephole.s b/bolt/test/X86/tail-dup-peephole.s new file mode 100644 --- /dev/null +++ b/bolt/test/X86/tail-dup-peephole.s @@ -0,0 +1,45 @@ +# This reproduces a bug in double-jumps peephole triggered by tail duplication. +# XFAIL: * +# 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 +# RUN: llvm-bolt %t.exe -o %t.out -data %t.fdata -relocs -lite=0 -funcs=main \ +# RUN: -reorder-blocks=cache -peepholes=double-jumps -tail-duplication=1 + + .globl main +main: + .cfi_startproc +a: + je b +# FDATA: 1 main #a# 1 main #b# 1 2 + movq 0, %r11 + testq %r11, %r11 +c: + jmp d +e: + je f +# FDATA: 1 main #e# 1 main #f# 1 4 +d: + cmpl %esi, %edi + leaq 0, %rsi + movq %r12, %rdx + movq 0, %rdi + leaq 0, %r15 + addq 8, %r15 + cmpq %r15, %rdi + je g + movq 8, %r13 +h: + jne g +# FDATA: 1 main #h# 1 main #i# 0 3 +i: + leaq 0, %rdi +f: + cmpw $0xae, 0x20(%rdi) +b: + jmp c +g: + jmp h + .cfi_endproc