[llvm] r353847 - [Codegen] Make sure kill flags are not incorrect from removed machine phi's

David Green via llvm-commits llvm-commits at lists.llvm.org
Tue Feb 12 07:02:58 PST 2019


Author: dmgreen
Date: Tue Feb 12 07:02:57 2019
New Revision: 353847

URL: http://llvm.org/viewvc/llvm-project?rev=353847&view=rev
Log:
[Codegen] Make sure kill flags are not incorrect from removed machine phi's

We need to clear the kill flags on both SingleValReg and OldReg, to ensure they remain
conservatively correct.

Differential Revision: https://reviews.llvm.org/D58114

Added:
    llvm/trunk/test/CodeGen/Thumb/opt-phis.mir
Modified:
    llvm/trunk/lib/CodeGen/OptimizePHIs.cpp

Modified: llvm/trunk/lib/CodeGen/OptimizePHIs.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/OptimizePHIs.cpp?rev=353847&r1=353846&r2=353847&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/OptimizePHIs.cpp (original)
+++ llvm/trunk/lib/CodeGen/OptimizePHIs.cpp Tue Feb 12 07:02:57 2019
@@ -181,11 +181,12 @@ bool OptimizePHIs::OptimizeBB(MachineBas
       if (!MRI->constrainRegClass(SingleValReg, MRI->getRegClass(OldReg)))
         continue;
 
-      // for the case SingleValReg taken from copy instr
-      MRI->clearKillFlags(SingleValReg);
-
       MRI->replaceRegWith(OldReg, SingleValReg);
       MI->eraseFromParent();
+
+      // The kill flags on OldReg and SingleValReg may no longer be correct.
+      MRI->clearKillFlags(SingleValReg);
+
       ++NumPHICycles;
       Changed = true;
       continue;

Added: llvm/trunk/test/CodeGen/Thumb/opt-phis.mir
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/Thumb/opt-phis.mir?rev=353847&view=auto
==============================================================================
--- llvm/trunk/test/CodeGen/Thumb/opt-phis.mir (added)
+++ llvm/trunk/test/CodeGen/Thumb/opt-phis.mir Tue Feb 12 07:02:57 2019
@@ -0,0 +1,38 @@
+# RUN: llc -mtriple thumbv6m-none-eabi -run-pass=opt-phis -verify-machineinstrs -o - %s | FileCheck %s
+--- |
+  target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
+  target triple = "thumbv6m-arm-none-eabi"
+
+  define i32 @funca() { unreachable }
+
+...
+---
+name:            funca
+tracksRegLiveness: true
+body:             |
+  bb.0:
+    successors: %bb.2(0x40000000), %bb.3(0x40000000)
+
+    %0:tgpr, dead $cpsr = tMOVi8 255, 14, $noreg
+    %1:tgpr, dead $cpsr = tMOVi8 128, 14, $noreg
+    tCMPi8 %0, 0, 14, $noreg, implicit-def $cpsr
+    tBcc %bb.3, 1, $cpsr
+
+  bb.2:
+    successors: %bb.3(0x80000000)
+
+  bb.3:
+    successors: %bb.0(0x80000000)
+
+    %2:tgpr = PHI %0, %bb.2, %0, %bb.0
+    %3:tgpr, $cpsr = tSUBrr %1, killed %2, 14, $noreg
+    %4:tgpr, $cpsr = tADDrr killed %3, killed %0, 14, $noreg
+    tB %bb.0, 14, $noreg
+
+# Make sure the kill flags are not incorrect
+# CHECK-LABEL: name: funca
+# CHECK-NOT: PHI
+# CHECK: tSUBrr %1, %0
+# CHECK: tADDrr killed %3, %0
+
+...




More information about the llvm-commits mailing list