[llvm] 28963d8 - [GlobalISel] Don't DCE LIFETIME_START/LIFETIME_END markers.

Amara Emerson via llvm-commits llvm-commits at lists.llvm.org
Wed Mar 17 18:21:10 PDT 2021


Author: Amara Emerson
Date: 2021-03-17T18:02:08-07:00
New Revision: 28963d895b529e90b8b99716516ae4e422592797

URL: https://github.com/llvm/llvm-project/commit/28963d895b529e90b8b99716516ae4e422592797
DIFF: https://github.com/llvm/llvm-project/commit/28963d895b529e90b8b99716516ae4e422592797.diff

LOG: [GlobalISel] Don't DCE LIFETIME_START/LIFETIME_END markers.

These are pseudos without any users, so DCE was killing them in the combiner.

Marking them as having side effects doesn't seem quite right since they don't.

Gives a nice 0.3% geomean size win on CTMark -Os.

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

Added: 
    llvm/test/CodeGen/AArch64/GlobalISel/lifetime-marker-no-dce.mir

Modified: 
    llvm/lib/CodeGen/GlobalISel/Utils.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/lib/CodeGen/GlobalISel/Utils.cpp b/llvm/lib/CodeGen/GlobalISel/Utils.cpp
index c24ebcf38c5f..5d062820a49f 100644
--- a/llvm/lib/CodeGen/GlobalISel/Utils.cpp
+++ b/llvm/lib/CodeGen/GlobalISel/Utils.cpp
@@ -200,6 +200,10 @@ bool llvm::isTriviallyDead(const MachineInstr &MI,
   // Don't delete frame allocation labels.
   if (MI.getOpcode() == TargetOpcode::LOCAL_ESCAPE)
     return false;
+  // LIFETIME markers should be preserved even if they seem dead.
+  if (MI.getOpcode() == TargetOpcode::LIFETIME_START ||
+      MI.getOpcode() == TargetOpcode::LIFETIME_END)
+    return false;
 
   // If we can move an instruction, we can remove it.  Otherwise, it has
   // a side-effect of some sort.

diff  --git a/llvm/test/CodeGen/AArch64/GlobalISel/lifetime-marker-no-dce.mir b/llvm/test/CodeGen/AArch64/GlobalISel/lifetime-marker-no-dce.mir
new file mode 100644
index 000000000000..16f2d70cd604
--- /dev/null
+++ b/llvm/test/CodeGen/AArch64/GlobalISel/lifetime-marker-no-dce.mir
@@ -0,0 +1,24 @@
+# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
+# RUN: llc -mtriple aarch64 -run-pass=aarch64-prelegalizer-combiner -global-isel -verify-machineinstrs %s -o - | FileCheck %s
+# Check that we don't DCE the lifetime markers even though they don't have any users.
+---
+name:            test_lifetime_no_dce
+alignment:       4
+tracksRegLiveness: true
+frameInfo:
+  maxAlignment:    4
+stack:
+  - { id: 0, size: 4, alignment: 4 }
+machineFunctionInfo: {}
+body:             |
+  bb.1:
+    ;%0:_(p0) = G_FRAME_INDEX %stack.0.slot
+    ; CHECK-LABEL: name: test_lifetime_no_dce
+    ; CHECK: LIFETIME_START %stack.0
+    ; CHECK: LIFETIME_END %stack.0
+    ; CHECK: RET_ReallyLR
+    LIFETIME_START %stack.0
+    LIFETIME_END %stack.0
+    RET_ReallyLR
+
+...


        


More information about the llvm-commits mailing list