
Summary: The fix in BranchFolder related to non debug invariant problems done in commit ec32dff0b075055 actually introduced some new problems with debug invariance. Before that patch ComputeCommonTailLength would move iterators back, past debug instructions, in order to make ProfitableToMerge make consistent answers "when one block differs from the other only by whether debugging pseudos are present at the beginning". But the changes in ec32dff0b075055 undid that by moving the iterators forward again. This patch refactors ComputeCommonTailLength. The function was really complex, considering that the SkipTopCFIAndReturn part always moved the iterators forward to the first "real" instruction in the found tail after ec32dff0b075055. The patch also restores the logic to "back past possible debugging pseudos at beginning of block" to make sure ProfitableToMerge gives consistent answers independent of DBG_VALUE instructions before the tail. That is now done by ProfitableToMerge instead of being hidden as a side-effect in ComputeCommonTailLength. Reviewers: probinson, yechunliang, jmorse Reviewed By: jmorse Subscribers: Orlando, mehdi_amini, dexonsmith, aprantl, hiraditya, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D70091
136 lines
3.6 KiB
YAML
136 lines
3.6 KiB
YAML
# RUN: llc -mtriple=x86_64-- -run-pass branch-folder -O3 -o - %s | FileCheck %s
|
|
|
|
---
|
|
name: test1a
|
|
body: |
|
|
; CHECK-LABEL: name: test1a
|
|
; CHECK: bb.0:
|
|
; CHECK: TEST8rr killed renamable $al, renamable $al, implicit-def $eflags
|
|
; CHECK: JCC_1 %bb.2, 5, implicit $eflags
|
|
; CHECK: bb.1:
|
|
; CHECK: successors: %bb.2(0x80000000)
|
|
; CHECK: MOV8mi $r12, 1, $noreg, 0, $noreg, 0
|
|
; CHECK-NOT: RET
|
|
; CHECK: bb.2:
|
|
; CHECK: MOV8mi $r13, 1, $noreg, 0, $noreg, 0
|
|
; CHECK: RET 0
|
|
bb.0:
|
|
TEST8rr killed renamable $al, renamable $al, implicit-def $eflags
|
|
JCC_1 %bb.2, 5, implicit killed $eflags
|
|
|
|
bb.1:
|
|
MOV8mi $r12, 1, $noreg, 0, $noreg, 0
|
|
MOV8mi $r13, 1, $noreg, 0, $noreg, 0
|
|
RET 0
|
|
|
|
bb.2:
|
|
MOV8mi $r13, 1, $noreg, 0, $noreg, 0
|
|
RET 0
|
|
...
|
|
|
|
---
|
|
name: test1b
|
|
body: |
|
|
|
|
; Verify that we get the same rewrites as in test1a when adding some
|
|
; DBG_VALUE instructions in the mix.
|
|
;
|
|
; CHECK-LABEL: name: test1b
|
|
; CHECK: bb.0:
|
|
; CHECK: TEST8rr killed renamable $al, renamable $al, implicit-def $eflags
|
|
; CHECK: JCC_1 %bb.2, 5, implicit $eflags
|
|
; CHECK: bb.1:
|
|
; CHECK: successors: %bb.2(0x80000000)
|
|
; CHECK: MOV8mi $r12, 1, $noreg, 0, $noreg, 0
|
|
; CHECK-NOT: RET
|
|
; CHECK: bb.2:
|
|
; CHECK: DBG_VALUE
|
|
; CHECK: DBG_VALUE
|
|
; CHECK: MOV8mi $r13, 1, $noreg, 0, $noreg, 0
|
|
; CHECK: RET 0
|
|
bb.0:
|
|
TEST8rr killed renamable $al, renamable $al, implicit-def $eflags
|
|
JCC_1 %bb.2, 5, implicit killed $eflags
|
|
|
|
bb.1:
|
|
MOV8mi $r12, 1, $noreg, 0, $noreg, 0
|
|
MOV8mi $r13, 1, $noreg, 0, $noreg, 0
|
|
RET 0
|
|
|
|
bb.2:
|
|
DBG_VALUE
|
|
DBG_VALUE
|
|
MOV8mi $r13, 1, $noreg, 0, $noreg, 0
|
|
RET 0
|
|
...
|
|
|
|
---
|
|
name: test2a
|
|
body: |
|
|
; CFI instruction currently prevents the rewrite here (although technically
|
|
; I suppose that branch folding could let bb.1 fallthrough into bb.2 here).
|
|
;
|
|
; CHECK-LABEL: name: test2a
|
|
; CHECK: bb.0:
|
|
; CHECK: TEST8rr killed renamable $al, renamable $al, implicit-def $eflags
|
|
; CHECK: JCC_1 %bb.2, 5, implicit killed $eflags
|
|
; CHECK: bb.1:
|
|
; CHECK: MOV8mi $r12, 1, $noreg, 0, $noreg, 0
|
|
; CHECK: MOV8mi $r13, 1, $noreg, 0, $noreg, 0
|
|
; CHECK: RET 0
|
|
; CHECK: bb.2:
|
|
; CHECK: CFI_INSTRUCTION def_cfa_offset 8
|
|
; CHECK: MOV8mi $r13, 1, $noreg, 0, $noreg, 0
|
|
; CHECK: RET 0
|
|
bb.0:
|
|
TEST8rr killed renamable $al, renamable $al, implicit-def $eflags
|
|
JCC_1 %bb.2, 5, implicit killed $eflags
|
|
|
|
bb.1:
|
|
MOV8mi $r12, 1, $noreg, 0, $noreg, 0
|
|
MOV8mi $r13, 1, $noreg, 0, $noreg, 0
|
|
RET 0
|
|
|
|
bb.2:
|
|
CFI_INSTRUCTION def_cfa_offset 8
|
|
MOV8mi $r13, 1, $noreg, 0, $noreg, 0
|
|
RET 0
|
|
...
|
|
|
|
---
|
|
name: test2b
|
|
body: |
|
|
; Verify that we get the same rewrites as in test1a when adding some
|
|
; DBG_VALUE instructions in the mix.
|
|
;
|
|
; CHECK-LABEL: name: test2b
|
|
; CHECK: bb.0:
|
|
; CHECK: TEST8rr killed renamable $al, renamable $al, implicit-def $eflags
|
|
; CHECK: JCC_1 %bb.2, 5, implicit killed $eflags
|
|
; CHECK: bb.1:
|
|
; CHECK: MOV8mi $r12, 1, $noreg, 0, $noreg, 0
|
|
; CHECK: MOV8mi $r13, 1, $noreg, 0, $noreg, 0
|
|
; CHECK: RET 0
|
|
; CHECK: bb.2:
|
|
; CHECK: DBG_VALUE
|
|
; CHECK: CFI_INSTRUCTION def_cfa_offset 8
|
|
; CHECK: DBG_VALUE
|
|
; CHECK: MOV8mi $r13, 1, $noreg, 0, $noreg, 0
|
|
; CHECK: RET 0
|
|
bb.0:
|
|
TEST8rr killed renamable $al, renamable $al, implicit-def $eflags
|
|
JCC_1 %bb.2, 5, implicit killed $eflags
|
|
|
|
bb.1:
|
|
MOV8mi $r12, 1, $noreg, 0, $noreg, 0
|
|
MOV8mi $r13, 1, $noreg, 0, $noreg, 0
|
|
RET 0
|
|
|
|
bb.2:
|
|
DBG_VALUE
|
|
CFI_INSTRUCTION def_cfa_offset 8
|
|
DBG_VALUE
|
|
MOV8mi $r13, 1, $noreg, 0, $noreg, 0
|
|
RET 0
|
|
...
|