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
   75
   76
   77
   78
   79
   80
   81
   82
   83
   84
   85
   86
   87
   88
   89
   90
   91
   92
   93
   94
   95
   96
   97
   98
   99
  100
  101
  102
  103
  104
  105
  106
  107
  108
  109
  110
  111
  112
  113
  114
  115
  116
  117
  118
  119
  120
  121
  122
  123
  124
  125
  126
  127
  128
  129
  130
  131
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
# RUN: llc -run-pass simple-register-coalescing %s -systemz-subreg-liveness -O3 -mtriple s390x-ibm-linux -mcpu z13 -o - | FileCheck %s
#
# When the coalescing tries to coalesce `%20 = COPY %18`,
# %18 has been coalesced all the way up to %15 = ROSBG.
# ROSBG has tied operands and can be commuted, thus it
# maybe possible to swap the arguments of ROSBG to coalesce
# this copy. That's what the coalescer attempts.
#
# This used to produce an assertion failure in the coalescer,
# because this particular coalescing trick is used only on
# full copy. Therefore we were asserting that all the subranges
# at the point of the copy had a value number.
# This is actually not true in that example, because %18 is
# only partial defined before being fully copied.
#
# PR40215.
---
name:            main
alignment:       16
tracksRegLiveness: true
machineFunctionInfo: {}
body:             |
  ; CHECK-LABEL: name: main
  ; CHECK: bb.0:
  ; CHECK:   successors: %bb.1(0x80000000)
  ; CHECK:   [[LGHI:%[0-9]+]]:addr64bit = LGHI -30
  ; CHECK:   [[LHIMux:%[0-9]+]]:grx32bit = LHIMux 1
  ; CHECK:   [[LHIMux1:%[0-9]+]]:grx32bit = LHIMux 0
  ; CHECK:   undef %20.subreg_l32:gr64bit = IMPLICIT_DEF
  ; CHECK: bb.1:
  ; CHECK:   successors: %bb.3(0x00000001), %bb.4(0x7fffffff)
  ; CHECK:   CHIMux [[LHIMux]], 0, implicit-def $cc
  ; CHECK:   BRC 14, 6, %bb.3, implicit killed $cc
  ; CHECK:   J %bb.4
  ; CHECK: bb.2:
  ; CHECK:   successors:
  ; CHECK:   STMux %20.subreg_l32, undef %8:addr64bit, 0, $noreg :: (store 4 into `i32* undef`)
  ; CHECK: bb.3:
  ; CHECK:   successors:
  ; CHECK: bb.4:
  ; CHECK:   successors: %bb.5(0x30000000), %bb.6(0x50000000)
  ; CHECK:   [[LAY:%[0-9]+]]:gr64bit = LAY [[LGHI]], 19838, $noreg
  ; CHECK:   [[LAY1:%[0-9]+]]:gr64bit = LAY [[LGHI]], 19840, $noreg
  ; CHECK:   [[LAY2:%[0-9]+]]:gr64bit = LAY [[LGHI]], 19844, $noreg
  ; CHECK:   [[OGR:%[0-9]+]]:gr64bit = OGR [[OGR]], [[LAY]], implicit-def dead $cc
  ; CHECK:   undef %19.subreg_l32:gr64bit = AHIMuxK [[LGHI]].subreg_l32, 19843, implicit-def dead $cc
  ; CHECK:   [[ROSBG:%[0-9]+]]:gr64bit = ROSBG [[ROSBG]], [[OGR]], 32, 63, 0, implicit-def dead $cc
  ; The coalescer should have been able to swap the operands of
  ; the OR, hence eliminating the copy of %20 and %18.
  ; This is also visible here because the ROSBG operand was LHS
  ; before the coalescer, now it is RHS.
  ; CHECK:   %20.subreg_l32:gr64bit = OR %20.subreg_l32, [[ROSBG]].subreg_l32, implicit-def dead $cc
  ; CHECK:   [[ROSBG1:%[0-9]+]]:gr64bit = ROSBG [[ROSBG1]], [[LAY1]], 32, 63, 0, implicit-def dead $cc
  ; CHECK:   CHIMux [[LHIMux1]], 0, implicit-def $cc
  ; CHECK:   BRC 14, 6, %bb.6, implicit killed $cc
  ; CHECK:   J %bb.5
  ; CHECK: bb.5:
  ; CHECK:   successors: %bb.6(0x80000000)
  ; CHECK: bb.6:
  ; CHECK:   successors: %bb.2(0x00000001), %bb.7(0x7fffffff)
  ; CHECK:   [[LGHI]]:addr64bit = nuw nsw LA [[LGHI]], 6, $noreg
  ; CHECK:   CGHI [[LGHI]], 0, implicit-def $cc
  ; CHECK:   BRC 14, 8, %bb.2, implicit killed $cc
  ; CHECK: bb.7:
  ; CHECK:   successors: %bb.1(0x80000000)
  ; CHECK:   J %bb.1
  bb.0:
    %6:gr64bit = LGHI -30
    %8:grx32bit = LHIMux 1
    %21:grx32bit = LHIMux 0
    %23:addr64bit = COPY killed %6
    %24:gr32bit = IMPLICIT_DEF

  bb.1:
    successors: %bb.3(0x00000001), %bb.4(0x7fffffff)

    %1:gr32bit = COPY killed %24
    %0:addr64bit = COPY killed %23
    CHIMux %8, 0, implicit-def $cc
    BRC 14, 6, %bb.3, implicit killed $cc
    J %bb.4

  bb.2:
    successors:

    STMux killed %4, undef %22:addr64bit, 0, $noreg :: (store 4 into `i32* undef`)

  bb.3:
    successors:


  bb.4:
    successors: %bb.5(0x30000000), %bb.6(0x50000000)

    %2:gr64bit = LAY %0, 19838, $noreg
    %3:gr64bit = LAY %0, 19840, $noreg
    %9:gr64bit = LAY %0, 19844, $noreg
    %10:gr64bit = COPY killed %9
    %10:gr64bit = OGR %10, killed %2, implicit-def dead $cc
    %11:gr32bit = COPY %0.subreg_l32
    %12:gr32bit = AHIMuxK killed %11, 19843, implicit-def dead $cc
    undef %13.subreg_l32:gr64bit = COPY killed %12
    %15:gr64bit = COPY killed %13
    %15:gr64bit = ROSBG %15, killed %10, 32, 63, 0, implicit-def dead $cc
    %16:gr32bit = COPY killed %15.subreg_l32
    %17:gr32bit = COPY killed %16
    %17:gr32bit = OR %17, killed %1, implicit-def dead $cc
    undef %18.subreg_l32:gr64bit = COPY killed %17
    %20:gr64bit = COPY killed %18
    %20:gr64bit = ROSBG %20, killed %3, 32, 63, 0, implicit-def dead $cc
    CHIMux %21, 0, implicit-def $cc
    BRC 14, 6, %bb.6, implicit killed $cc
    J %bb.5

  bb.5:

  bb.6:
    successors: %bb.2(0x00000001), %bb.7(0x7fffffff)

    %4:grx32bit = COPY killed %20.subreg_l32
    %5:gr64bit = nuw nsw LA killed %0, 6, $noreg
    CGHI %5, 0, implicit-def $cc
    BRC 14, 8, %bb.2, implicit killed $cc

  bb.7:
    %23:addr64bit = COPY killed %5
    %24:gr32bit = COPY killed %4
    J %bb.1

...