MachineVerifier: undef phi arg doesn't need to be live-out from predecessor

Differential Revision: https://reviews.llvm.org/D40756

llvm-svn: 319674
This commit is contained in:
Matthias Braun 2017-12-04 18:57:48 +00:00
parent d4a774d57f
commit 7eae251bae
3 changed files with 66 additions and 1 deletions

View File

@ -1652,7 +1652,8 @@ void MachineVerifier::checkPHIOps(const MachineBasicBlock &MBB) {
if (MInfo.reachable) {
seen.insert(&Pre);
BBInfo &PrInfo = MBBInfoMap[&Pre];
if (PrInfo.reachable && !PrInfo.isLiveOut(MO0.getReg()))
if (!MO0.isUndef() && PrInfo.reachable &&
!PrInfo.isLiveOut(MO0.getReg()))
report("PHI operand is not live-out from predecessor", &MO0, I);
}
}

View File

@ -0,0 +1,30 @@
# RUN: not llc -o - %s -verify-machineinstrs -run-pass=none 2>&1 | FileCheck %s
---
# CHECK: Bad machine code: PHI operand is not live-out from predecessor
# CHECK: - function: func0
# CHECK: - basic block: %bb.3
# CHECK: - instruction: %0<def> = PHI
# CHECK: - operand 1: %1
#
# CHECK: Bad machine code: PHI operand is not live-out from predecessor
# CHECK: - function: func0
# CHECK: - basic block: %bb.3
# CHECK: - instruction: %0<def> = PHI
# CHECK: - operand 3: %0
name: func0
tracksRegLiveness: true
body: |
bb.0:
JE_1 %bb.1, implicit undef %eflags
JMP_1 %bb.2
bb.1:
%0:gr32 = IMPLICIT_DEF
JMP_1 %bb.3
bb.2:
%1:gr32 = IMPLICIT_DEF
bb.3:
%0:gr32 = PHI %1, %bb.1, %0, %bb.2
...

View File

@ -0,0 +1,34 @@
# RUN: llc -o - %s -verify-machineinstrs -run-pass=none | FileCheck %s
# This should cleanly pass the machine verifier
---
# CHECK-LABEL: name: func0
# CHECK: %0:gr32 = PHI undef %1:gr32, %bb.0, undef %1:gr32, %bb.1
name: func0
tracksRegLiveness: true
body: |
bb.0:
JE_1 %bb.1, implicit undef %eflags
JMP_1 %bb.2
bb.1:
bb.2:
%0 : gr32 = PHI undef %1 : gr32, %bb.0, undef %1 : gr32, %bb.1
...
---
# CHECK-LABEL: name: func1
# CHECK: %2:gr32 = PHI %0, %bb.0, %1, %bb.1
name: func1
tracksRegLiveness: true
body: |
bb.0:
%0 : gr32 = IMPLICIT_DEF
JE_1 %bb.1, implicit undef %eflags
JMP_1 %bb.2
bb.1:
%1 : gr32 = IMPLICIT_DEF
bb.2:
%2 : gr32 = PHI %0, %bb.0, %1, %bb.1
...