From b9c21d43bb0c9e1a6d51f624f4369c717516a459 Mon Sep 17 00:00:00 2001 From: Matt Arsenault Date: Fri, 23 Oct 2020 15:45:43 -0400 Subject: [PATCH] RegAlloc: Clear isSSA The MIR parser may infer SSA, so -run-pass=regallocgreedy would hit a verifier error after multiple vreg defs are added. --- llvm/lib/CodeGen/RegAllocBasic.cpp | 5 +++ llvm/lib/CodeGen/RegAllocFast.cpp | 5 +++ llvm/lib/CodeGen/RegAllocGreedy.cpp | 5 +++ llvm/lib/CodeGen/RegAllocPBQP.cpp | 5 +++ .../greedy-broken-ssa-verifier-error.mir | 40 +++++++++++++++++++ 5 files changed, 60 insertions(+) create mode 100644 llvm/test/CodeGen/AMDGPU/greedy-broken-ssa-verifier-error.mir diff --git a/llvm/lib/CodeGen/RegAllocBasic.cpp b/llvm/lib/CodeGen/RegAllocBasic.cpp index 58e1e364d285..1b748b84841b 100644 --- a/llvm/lib/CodeGen/RegAllocBasic.cpp +++ b/llvm/lib/CodeGen/RegAllocBasic.cpp @@ -111,6 +111,11 @@ public: MachineFunctionProperties::Property::NoPHIs); } + MachineFunctionProperties getClearedProperties() const override { + return MachineFunctionProperties().set( + MachineFunctionProperties::Property::IsSSA); + } + // Helper for spilling all live virtual registers currently unified under preg // that interfere with the most recently queried lvr. Return true if spilling // was successful, and append any new spilled/split intervals to splitLVRs. diff --git a/llvm/lib/CodeGen/RegAllocFast.cpp b/llvm/lib/CodeGen/RegAllocFast.cpp index 78a797da8459..13eb896518a6 100644 --- a/llvm/lib/CodeGen/RegAllocFast.cpp +++ b/llvm/lib/CodeGen/RegAllocFast.cpp @@ -203,6 +203,11 @@ namespace { MachineFunctionProperties::Property::NoVRegs); } + MachineFunctionProperties getClearedProperties() const override { + return MachineFunctionProperties().set( + MachineFunctionProperties::Property::IsSSA); + } + private: bool runOnMachineFunction(MachineFunction &MF) override; diff --git a/llvm/lib/CodeGen/RegAllocGreedy.cpp b/llvm/lib/CodeGen/RegAllocGreedy.cpp index 6f4905fe286f..ecb9a5a2c53a 100644 --- a/llvm/lib/CodeGen/RegAllocGreedy.cpp +++ b/llvm/lib/CodeGen/RegAllocGreedy.cpp @@ -430,6 +430,11 @@ public: MachineFunctionProperties::Property::NoPHIs); } + MachineFunctionProperties getClearedProperties() const override { + return MachineFunctionProperties().set( + MachineFunctionProperties::Property::IsSSA); + } + static char ID; private: diff --git a/llvm/lib/CodeGen/RegAllocPBQP.cpp b/llvm/lib/CodeGen/RegAllocPBQP.cpp index 1ea587cb8f3c..4d610abc3dfe 100644 --- a/llvm/lib/CodeGen/RegAllocPBQP.cpp +++ b/llvm/lib/CodeGen/RegAllocPBQP.cpp @@ -140,6 +140,11 @@ public: MachineFunctionProperties::Property::NoPHIs); } + MachineFunctionProperties getClearedProperties() const override { + return MachineFunctionProperties().set( + MachineFunctionProperties::Property::IsSSA); + } + private: using LI2NodeMap = std::map; using Node2LIMap = std::vector; diff --git a/llvm/test/CodeGen/AMDGPU/greedy-broken-ssa-verifier-error.mir b/llvm/test/CodeGen/AMDGPU/greedy-broken-ssa-verifier-error.mir new file mode 100644 index 000000000000..537bea7d2cfb --- /dev/null +++ b/llvm/test/CodeGen/AMDGPU/greedy-broken-ssa-verifier-error.mir @@ -0,0 +1,40 @@ +# RUN: llc -march=amdgcn -mcpu=gfx1030 -verify-machineinstrs -run-pass=greedy -stress-regalloc=2 %s -o - | FileCheck -check-prefix=GCN %s + +# Make sure there's no verifier error after register allocation +# introduces vreg defs when the MIR parser infers SSA. + +--- +name: ra_introduces_vreg_def +tracksRegLiveness: true +machineFunctionInfo: + scratchRSrcReg: '$sgpr0_sgpr1_sgpr2_sgpr3' + frameOffsetReg: '$sgpr33' + stackPtrOffsetReg: '$sgpr32' + argumentInfo: + privateSegmentBuffer: { reg: '$sgpr0_sgpr1_sgpr2_sgpr3' } +body: | + ; GCN-LABEL: name: ra_introduces_vreg_def + ; GCN: [[COPY_V0:%[0-9]+]]:vgpr_32 = COPY $vgpr0 + ; GCN: [[COPY_V0]]:vgpr_32 = + bb.0: + liveins: $vgpr0, $vgpr1 + %0:vgpr_32 = COPY $vgpr0 + %1:vgpr_32 = COPY $vgpr1 + S_NOP 0, implicit %0 + S_NOP 0, implicit %1 + + bb.1: + $vgpr0 = V_MOV_B32_e32 0, implicit $exec + $vgpr1 = V_MOV_B32_e32 1, implicit $exec + S_NOP 0, implicit %0 + S_NOP 0, implicit %1 + + bb.2: + S_CBRANCH_EXECNZ %bb.1, implicit $exec + + bb.3: + $exec_lo = S_OR_B32 $exec_lo, undef $sgpr4, implicit-def $scc + $vgpr0 = COPY %0 + S_SETPC_B64_return undef $sgpr30_sgpr31, implicit $vgpr0 + +...