From 7edae4c403871a8e97878b8424f5a8f62905357b Mon Sep 17 00:00:00 2001 From: Nicolai Haehnle Date: Tue, 23 Apr 2019 13:12:52 +0000 Subject: [PATCH] AMDGPU: Fix LCSSA phi lowering in SILowerI1Copies Summary: When an LCSSA phi survives through instruction selection, the pass ends up removing that phi entirely because it is dominated by the logic that does the lanemask merging. This then used to trigger an assertion when processing a dependent phi instruction. Change-Id: Id4949719f8298062fe476a25718acccc109113b6 Reviewers: llvm-commits Subscribers: kzhuravl, jvesely, wdng, yaxunl, t-tye, tpr, dstuttard, rtaylor, arsenm Tags: #llvm Differential Revision: https://reviews.llvm.org/D60999 llvm-svn: 358983 --- llvm/lib/Target/AMDGPU/SILowerI1Copies.cpp | 9 ++++++- llvm/test/CodeGen/AMDGPU/si-lower-i1-copies.mir | 33 +++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 llvm/test/CodeGen/AMDGPU/si-lower-i1-copies.mir diff --git a/llvm/lib/Target/AMDGPU/SILowerI1Copies.cpp b/llvm/lib/Target/AMDGPU/SILowerI1Copies.cpp index 823c904..15ccef8 100644 --- a/llvm/lib/Target/AMDGPU/SILowerI1Copies.cpp +++ b/llvm/lib/Target/AMDGPU/SILowerI1Copies.cpp @@ -504,6 +504,9 @@ void SILowerI1Copies::lowerPhis() { SmallVector IncomingBlocks; SmallVector IncomingRegs; SmallVector IncomingUpdated; +#ifndef NDEBUG + DenseSet PhiRegisters; +#endif for (MachineBasicBlock &MBB : *MF) { LF.initialize(MBB); @@ -531,13 +534,17 @@ void SILowerI1Copies::lowerPhis() { } else if (IncomingDef->getOpcode() == AMDGPU::IMPLICIT_DEF) { continue; } else { - assert(IncomingDef->isPHI()); + assert(IncomingDef->isPHI() || PhiRegisters.count(IncomingReg)); } IncomingBlocks.push_back(IncomingMBB); IncomingRegs.push_back(IncomingReg); } +#ifndef NDEBUG + PhiRegisters.insert(DstReg); +#endif + // Phis in a loop that are observed outside the loop receive a simple but // conservatively correct treatment. MachineBasicBlock *PostDomBound = &MBB; diff --git a/llvm/test/CodeGen/AMDGPU/si-lower-i1-copies.mir b/llvm/test/CodeGen/AMDGPU/si-lower-i1-copies.mir new file mode 100644 index 0000000..9312322 --- /dev/null +++ b/llvm/test/CodeGen/AMDGPU/si-lower-i1-copies.mir @@ -0,0 +1,33 @@ +# RUN: llc -mtriple=amdgcn-amd-amdhsa -verify-machineinstrs -run-pass=si-i1-copies -o - %s | FileCheck -check-prefixes=GCN %s + +# GCN-LABEL: name: lcssa_phi +--- +name: lcssa_phi +tracksRegLiveness: true +body: | + bb.0: + %0:sreg_64 = S_MOV_B64 0 + %8:vreg_1 = IMPLICIT_DEF + %10:sreg_64 = IMPLICIT_DEF + %11:sreg_64 = SI_IF %10, %bb.3, implicit-def dead $exec, implicit-def dead $scc, implicit $exec + S_BRANCH %bb.1 + + bb.1: + %1:sreg_64 = PHI %0, %bb.0, %3, %bb.1 + %2:sreg_64 = IMPLICIT_DEF + %3:sreg_64 = SI_IF_BREAK %2, %1, implicit-def dead $scc + %4:sreg_64 = IMPLICIT_DEF + %5:vreg_1 = COPY %4 + SI_LOOP %3, %bb.1, implicit-def dead $exec, implicit-def dead $scc, implicit $exec + S_BRANCH %bb.2 + + bb.2: + %6:vreg_1 = PHI %5, %bb.1 + SI_END_CF %3, implicit-def dead $exec, implicit-def dead $scc, implicit $exec + + bb.3: + %7:vreg_1 = PHI %6, %bb.2, %8, %bb.0 + SI_END_CF %11, implicit-def dead $exec, implicit-def dead $scc, implicit $exec + S_ENDPGM 0 + +... -- 2.7.4