diff options
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/lib/CodeGen/MachineVerifier.cpp | 17 | ||||
| -rw-r--r-- | llvm/test/CodeGen/Generic/undef-phi.ll | 26 | 
2 files changed, 37 insertions, 6 deletions
diff --git a/llvm/lib/CodeGen/MachineVerifier.cpp b/llvm/lib/CodeGen/MachineVerifier.cpp index 92d9356e83b..a443b51d15e 100644 --- a/llvm/lib/CodeGen/MachineVerifier.cpp +++ b/llvm/lib/CodeGen/MachineVerifier.cpp @@ -1049,7 +1049,7 @@ void MachineVerifier::visitMachineFunctionAfter() {    // Now check liveness info if available    calcRegsRequired(); -  if (MRI->isSSA() && !MF->empty()) { +  if (!MF->empty()) {      BBInfo &MInfo = MBBInfoMap[&MF->front()];      for (RegSet::iterator           I = MInfo.vregsRequired.begin(), E = MInfo.vregsRequired.end(); I != E; @@ -1332,15 +1332,18 @@ void MachineVerifier::verifyLiveIntervals() {            ++MFI;            continue;          } + +        // Is VNI a PHI-def in the current block? +        bool IsPHI = VNI->isPHIDef() && +                     VNI->def == LiveInts->getMBBStartIdx(MFI); +          // Check that VNI is live-out of all predecessors.          for (MachineBasicBlock::const_pred_iterator PI = MFI->pred_begin(),               PE = MFI->pred_end(); PI != PE; ++PI) {            SlotIndex PEnd = LiveInts->getMBBEndIdx(*PI);            const VNInfo *PVNI = LI.getVNInfoBefore(PEnd); -          if (VNI->isPHIDef() && VNI->def == LiveInts->getMBBStartIdx(MFI)) -            continue; - +          // All predecessors must have a live-out value.            if (!PVNI) {              report("Register not marked live out of predecessor", *PI);              *OS << "Valno #" << VNI->id << " live into BB#" << MFI->getNumber() @@ -1349,12 +1352,14 @@ void MachineVerifier::verifyLiveIntervals() {              continue;            } -          if (PVNI != VNI) { +          // Only PHI-defs can take different predecessor values. +          if (!IsPHI && PVNI != VNI) {              report("Different value live out of predecessor", *PI);              *OS << "Valno #" << PVNI->id << " live out of BB#"                  << (*PI)->getNumber() << '@' << PEnd                  << "\nValno #" << VNI->id << " live into BB#" << MFI->getNumber() -                << '@' << LiveInts->getMBBStartIdx(MFI) << " in " << LI << '\n'; +                << '@' << LiveInts->getMBBStartIdx(MFI) << " in " +                << PrintReg(Reg) << ": " << LI << '\n';            }          }          if (&*MFI == EndMBB) diff --git a/llvm/test/CodeGen/Generic/undef-phi.ll b/llvm/test/CodeGen/Generic/undef-phi.ll new file mode 100644 index 00000000000..10899f9fa2d --- /dev/null +++ b/llvm/test/CodeGen/Generic/undef-phi.ll @@ -0,0 +1,26 @@ +; RUN: llc < %s -verify-machineinstrs -verify-coalescing +; +; This function has a PHI with one undefined input. Verify that PHIElimination +; inserts an IMPLICIT_DEF instruction in the predecessor so all paths to the use +; pass through a def. + +%struct.xx_stack = type { i32, %struct.xx_stack* } + +define i32 @push(%struct.xx_stack* %stack) nounwind uwtable readonly ssp { +entry: +  %tobool1 = icmp eq %struct.xx_stack* %stack, null +  br i1 %tobool1, label %for.end, label %for.body + +for.body: +  %stack.addr.02 = phi %struct.xx_stack* [ %0, %for.body ], [ %stack, %entry ] +  %next = getelementptr inbounds %struct.xx_stack* %stack.addr.02, i64 0, i32 1 +  %0 = load %struct.xx_stack** %next, align 8 +  %tobool = icmp eq %struct.xx_stack* %0, null +  br i1 %tobool, label %for.end, label %for.body + +for.end: +  %top.0.lcssa = phi %struct.xx_stack* [ undef, %entry ], [ %stack.addr.02, %for.body ] +  %first = getelementptr inbounds %struct.xx_stack* %top.0.lcssa, i64 0, i32 0 +  %1 = load i32* %first, align 4 +  ret i32 %1 +}  | 

