reference, declarationdefinition
definition → references, declarations, derived classes, virtual overrides
reference to multiple definitions → definitions
unreferenced
    1
    2
    3
    4
    5
    6
    7
    8
    9
   10
   11
   12
   13
   14
   15
   16
   17
   18
   19
   20
   21
   22
   23
   24
   25
   26
   27
   28
   29
   30
   31
   32
   33
   34
   35
   36
   37
   38
   39
   40
   41
   42
   43
   44
   45
   46
   47
   48
   49
   50
   51
   52
   53
   54
   55
   56
   57
   58
   59
   60
   61
   62
   63
   64
   65
   66
   67
   68
   69
   70
   71
   72
   73
   74
# Using a trick to run simple-register-coalescing twice, that way
# liveintervals should be preserved while running the machine verifier.
#
# RUN: not llc -o - %s -march=hexagon -hexagon-subreg-liveness=false -run-pass simple-register-coalescing -verify-machineinstrs -run-pass simple-register-coalescing 2>&1 | FileCheck -check-prefix=CHECK-NOSUB %s
# RUN: not llc -o - %s -march=hexagon -hexagon-subreg-liveness=true -run-pass simple-register-coalescing -verify-machineinstrs -run-pass simple-register-coalescing 2>&1 | FileCheck -check-prefix=CHECK-SUB %s

---
name: test_pass
tracksRegLiveness: true
body: |
  bb.0:
    A2_nop implicit-def %0:doubleregs
    A2_nop implicit-def dead %0.isub_lo, implicit-def %0.isub_hi, implicit %0
    A2_nop implicit %0.isub_hi
...

---
name: test_fail
tracksRegLiveness: true
body: |
  bb.0:
    A2_nop implicit-def %0:doubleregs
    A2_nop implicit-def dead %0.isub_lo, implicit-def %0.isub_hi, implicit %0
    A2_nop implicit %0.isub_lo

    A2_nop implicit-def %1:doubleregs
    A2_nop implicit-def dead %1.isub_lo, implicit-def dead %1.isub_hi, implicit %1
    A2_nop implicit %1

    A2_nop implicit-def dead %2:doubleregs
    A2_nop implicit %2

...

###############################################################################
# We are expecting four "Bad machine code" when subregister liveness is used.
#
# CHECK-SUB-NOT: Bad machine code
#
# CHECK-SUB: Bad machine code: Live range continues after dead def flag
# CHECK_SUB-NEXT: function:    test_fail
# CHECK-SUB:      v. register: %0
# CHECK-SUB:      lanemask:    00000002
#
# CHECK-SUB-NOT: Bad machine code
#
# CHECK-SUB: Bad machine code: Live range continues after dead def flag
# CHECK-SUB-NEXT: function:    test_fail
# CHECK-SUB:      v. register: %1
# CHECK-SUB:      lanemask:    00000002
#
# CHECK-SUB-NOT: Bad machine code
#
# CHECK-SUB: Bad machine code: Live range continues after dead def flag
# CHECK-SUB-NEXT: function:    test_fail
# CHECK-SUB:      v. register: %1
# CHECK-SUB:      lanemask:    00000001
#
# CHECK-SUB: Bad machine code: Live range continues after dead def flag
# CHECK-SUB-NEXT: function:    test_fail
# CHECK:          v. register: %2
#
# CHECK-SUB-NOT: Bad machine code

###############################################################################
# Without subregister liveness we only detect one of the failing scenarios.
#
# CHECK-NOSUB-NOT: Bad machine code
#
# CHECK-NOSUB: Bad machine code: Live range continues after dead def flag
# CHECK-NOSUB-NEXT: function:    test_fail
# CHECK:            v. register: %2
#
# CHECK-NOSUB-NOT: Bad machine code