1# RUN: llc -mtriple amdgcn -run-pass livevars -run-pass phi-node-elimination -o - %s | FileCheck %s
2
3################################################################################
4# This test used to hit an assert in PHIElimination:
5#  PHIElimination::LowerPHINode(llvm::MachineBasicBlock&, llvm::MachineBasicBlock::iterator): Assertion `KillInst->readsRegister(SrcReg) && "Cannot find kill instruction"'
6
7---
8name:            foo
9tracksRegLiveness: true
10body:             |
11  bb.0:
12    S_CBRANCH_SCC0 %bb.2, implicit undef $scc
13
14  bb.1:
15    %1:sreg_32_xm0 = S_MOV_B32 255
16    S_BRANCH %bb.3
17
18  bb.2:
19    %2:sreg_32_xm0 = S_MOV_B32 254
20
21  bb.3:
22    dead %3:sreg_32_xm0 = PHI undef %2, %bb.2, undef %1, %bb.1
23    %4:sreg_32_xm0 = PHI %2, %bb.2, %1, %bb.1
24    S_NOP 0, implicit %4
25...
26
27# CHECK-LABEL: name:            foo
28# CHECK:   bb.3:
29# CHECK-NEXT:     dead %2:sreg_32_xm0 = IMPLICIT_DEF
30# CHECK-NEXT:     %3:sreg_32_xm0 = COPY killed %4
31# CHECK-NEXT:     S_NOP 0, implicit killed %3
32
33
34################################################################################
35# Similar test as above, but with swapped order for the PHI nodes.
36# With this PHI node order we did not hit the assert, but we used to get
37#
38#  bb.3:
39#    dead %3:sreg_32_xm0 = COPY killed %4
40#    %2:sreg_32_xm0 = COPY %4
41#    S_NOP 0, implicit killed %2
42#
43# which looks weird regarding killed flags for %4.
44
45---
46name:            bar
47tracksRegLiveness: true
48body:             |
49  bb.0:
50    S_CBRANCH_SCC0 %bb.2, implicit undef $scc
51
52  bb.1:
53    %1:sreg_32_xm0 = S_MOV_B32 255
54    S_BRANCH %bb.3
55
56  bb.2:
57    %2:sreg_32_xm0 = S_MOV_B32 254
58
59  bb.3:
60    %4:sreg_32_xm0 = PHI %2, %bb.2, %1, %bb.1
61    dead %3:sreg_32_xm0 = PHI undef %2, %bb.2, undef %1, %bb.1
62    S_NOP 0, implicit %4
63...
64
65# CHECK-LABEL: name:            bar
66# CHECK:   bb.3:
67# CHECK-NEXT:     dead %3:sreg_32_xm0 = IMPLICIT_DEF
68# CHECK-NEXT:     %2:sreg_32_xm0 = COPY killed %4
69# CHECK-NEXT:     S_NOP 0, implicit killed %2
70
71
72# The following test crashes in phi-elimination hooks.
73#
74
75---
76name:            bax
77tracksRegLiveness: true
78body:             |
79  bb.0:
80    S_CBRANCH_SCC0 %bb.2, implicit undef $scc
81
82  bb.1:
83    %1:sreg_32_xm0 = S_MOV_B32 255
84    S_BRANCH %bb.3
85
86  bb.2:
87    %2:sreg_32_xm0 = S_MOV_B32 254
88
89  bb.3:
90    %3:sreg_32_xm0 = PHI %2, %bb.2, %1, %bb.1
91...
92
93# CHECK-LABEL: name:            bax
94# CHECK:   bb.3:
95# CHECK-NEXT:     %2:sreg_32_xm0 = COPY killed %3
96