diff --git a/llvm/lib/CodeGen/GlobalISel/Utils.cpp b/llvm/lib/CodeGen/GlobalISel/Utils.cpp index c24ebcf38c5f7..5d062820a49f0 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 0000000000000..16f2d70cd604b --- /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 + +...