diff options
| -rw-r--r-- | llvm/lib/CodeGen/MachineVerifier.cpp | 3 | ||||
| -rw-r--r-- | llvm/test/CodeGen/X86/verifier-phi-fail0.mir | 30 | ||||
| -rw-r--r-- | llvm/test/CodeGen/X86/verifier-phi.mir | 34 |
3 files changed, 66 insertions, 1 deletions
diff --git a/llvm/lib/CodeGen/MachineVerifier.cpp b/llvm/lib/CodeGen/MachineVerifier.cpp index fd00a2d7501..6834059234e 100644 --- a/llvm/lib/CodeGen/MachineVerifier.cpp +++ b/llvm/lib/CodeGen/MachineVerifier.cpp @@ -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); } } diff --git a/llvm/test/CodeGen/X86/verifier-phi-fail0.mir b/llvm/test/CodeGen/X86/verifier-phi-fail0.mir new file mode 100644 index 00000000000..655cd2ab7c7 --- /dev/null +++ b/llvm/test/CodeGen/X86/verifier-phi-fail0.mir @@ -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 +... diff --git a/llvm/test/CodeGen/X86/verifier-phi.mir b/llvm/test/CodeGen/X86/verifier-phi.mir new file mode 100644 index 00000000000..1a2f13c3d4f --- /dev/null +++ b/llvm/test/CodeGen/X86/verifier-phi.mir @@ -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 +... |

