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
...
|