RegAlloc: Clear isSSA
authorMatt Arsenault <Matthew.Arsenault@amd.com>
Fri, 23 Oct 2020 19:45:43 +0000 (15:45 -0400)
committerMatt Arsenault <Matthew.Arsenault@amd.com>
Wed, 28 Oct 2020 16:02:16 +0000 (12:02 -0400)
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
llvm/lib/CodeGen/RegAllocFast.cpp
llvm/lib/CodeGen/RegAllocGreedy.cpp
llvm/lib/CodeGen/RegAllocPBQP.cpp
llvm/test/CodeGen/AMDGPU/greedy-broken-ssa-verifier-error.mir [new file with mode: 0644]

index 58e1e36..1b748b8 100644 (file)
@@ -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.
index 78a797d..13eb896 100644 (file)
@@ -203,6 +203,11 @@ namespace {
           MachineFunctionProperties::Property::NoVRegs);
     }
 
+    MachineFunctionProperties getClearedProperties() const override {
+      return MachineFunctionProperties().set(
+        MachineFunctionProperties::Property::IsSSA);
+    }
+
   private:
     bool runOnMachineFunction(MachineFunction &MF) override;
 
index 6f4905f..ecb9a5a 100644 (file)
@@ -430,6 +430,11 @@ public:
         MachineFunctionProperties::Property::NoPHIs);
   }
 
+  MachineFunctionProperties getClearedProperties() const override {
+    return MachineFunctionProperties().set(
+      MachineFunctionProperties::Property::IsSSA);
+  }
+
   static char ID;
 
 private:
index 1ea587c..4d610ab 100644 (file)
@@ -140,6 +140,11 @@ public:
         MachineFunctionProperties::Property::NoPHIs);
   }
 
+  MachineFunctionProperties getClearedProperties() const override {
+    return MachineFunctionProperties().set(
+      MachineFunctionProperties::Property::IsSSA);
+  }
+
 private:
   using LI2NodeMap = std::map<const LiveInterval *, unsigned>;
   using Node2LIMap = std::vector<const LiveInterval *>;
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 (file)
index 0000000..537bea7
--- /dev/null
@@ -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
+
+...