[PATCH] D92557: [MachineLICM] delete dead flag if the duplicated def outside of loop is dead.

ChenZheng via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Dec 3 02:03:53 PST 2020


shchenz created this revision.
shchenz added reviewers: qcolombet, efriedma, MatzeB, jsji, PowerPC.
Herald added subscribers: llvm-commits, pengfei, asbirlea, hiraditya, nemanjai.
Herald added a project: LLVM.
shchenz requested review of this revision.

This is exposed by `https://reviews.llvm.org/D92068`. In that patch, after adding `liveintervals` to machinecombiner pass, some definitions in some cases are set to dead. Before the dead definition is eliminated, it is CSE-ed in machineLICM pass, but the dead flag in the duplicated instruction outside of loop is not cleaned, so we get verify error: `Virtual register defs don't dominate all uses.` for case `CodeGen/X86/coalescer-dce.ll`

Create this patch to fix that issue.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D92557

Files:
  llvm/lib/CodeGen/MachineLICM.cpp
  llvm/test/CodeGen/PowerPC/machinelicm-cse-dead-flag.mir


Index: llvm/test/CodeGen/PowerPC/machinelicm-cse-dead-flag.mir
===================================================================
--- /dev/null
+++ llvm/test/CodeGen/PowerPC/machinelicm-cse-dead-flag.mir
@@ -0,0 +1,43 @@
+# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
+# RUN: llc -run-pass early-machinelicm -mtriple=powerpc64le-unknown-linux-gnu \
+# RUN:   -verify-machineinstrs %s -o - | FileCheck %s
+---
+name: deadFlagAfterCSE
+tracksRegLiveness: true
+body: |
+  ; CHECK-LABEL: name: deadFlagAfterCSE
+  ; CHECK: bb.0:
+  ; CHECK:   successors: %bb.1(0x80000000)
+  ; CHECK:   liveins: $x3, $x4
+  ; CHECK:   [[COPY:%[0-9]+]]:g8rc = COPY $x3
+  ; CHECK:   [[COPY1:%[0-9]+]]:g8rc = COPY $x4
+  ; CHECK:   [[ADD8_:%[0-9]+]]:g8rc_and_g8rc_nox0 = ADD8 [[COPY]], [[COPY1]]
+  ; CHECK:   [[ADDI8_:%[0-9]+]]:g8rc_and_g8rc_nox0 = ADDI8 [[ADD8_]], 100
+  ; CHECK:   B %bb.1
+  ; CHECK: bb.1:
+  ; CHECK:   successors: %bb.1(0x80000000)
+  ; CHECK:   [[PHI:%[0-9]+]]:g8rc_and_g8rc_nox0 = PHI [[ADD8_]], %bb.0, %5, %bb.1
+  ; CHECK:   STDX [[PHI]], [[ADDI8_]], [[ADD8_]]
+  ; CHECK:   [[ADDI8_1:%[0-9]+]]:g8rc = nuw ADDI8 [[PHI]], 1
+  ; CHECK:   B %bb.1
+  ; CHECK: bb.2:
+  ; CHECK:   BLR8 implicit $lr8, implicit $rm
+  bb.0:
+    liveins: $x3, $x4
+    %0:g8rc = COPY $x3
+    %1:g8rc = COPY $x4
+    %2:g8rc_and_g8rc_nox0 = ADD8 %0, %1
+    dead %3:g8rc_and_g8rc_nox0 = ADDI8 %2, 100
+    B %bb.1
+
+  bb.1:
+    %4:g8rc_and_g8rc_nox0 = PHI %2, %bb.0, %6, %bb.1
+    %5:g8rc_and_g8rc_nox0 = ADDI8 %2, 100
+    STDX %4, %5, %2
+    %6:g8rc = nuw ADDI8 %4, 1
+    B %bb.1
+
+  bb.2:
+    BLR8 implicit $lr8, implicit $rm
+...
+
Index: llvm/lib/CodeGen/MachineLICM.cpp
===================================================================
--- llvm/lib/CodeGen/MachineLICM.cpp
+++ llvm/lib/CodeGen/MachineLICM.cpp
@@ -1466,6 +1466,8 @@
       Register DupReg = Dup->getOperand(Idx).getReg();
       MRI->replaceRegWith(Reg, DupReg);
       MRI->clearKillFlags(DupReg);
+      // clear Dup dead flag if any, we will reuse it soon.
+      const_cast<MachineInstr *>(Dup)->getOperand(Idx).setIsDead(false);
     }
 
     MI->eraseFromParent();


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D92557.309190.patch
Type: text/x-patch
Size: 2169 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20201203/bf5e49b6/attachment.bin>


More information about the llvm-commits mailing list