branchfolding-debug-invariant.mir 3.62 KB
# 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
...