From 56f506811f622031c1c7e0403bc4db5e89039f03 Mon Sep 17 00:00:00 2001 From: Bjorn Pettersson Date: Tue, 21 Aug 2018 07:49:05 +0000 Subject: [PATCH] [RegisterCoalescer] Do not assert when trying to remat dead values Summary: RegisterCoalescer::reMaterializeTrivialDef used to assert that the input register was live in. But as shown by the new coalesce-dead-lanes.mir test case that seems to be a valid scenario. We now return false instead of the assert, simply avoiding to remat the dead def. Normally a COPY of an undef value is eliminated by eliminateUndefCopy(). Although we only do that when the destination isn't a physical register. So the situation above should be limited to the case when we copy an undef value to a physical register. Reviewers: kparzysz, wmi, tpr Reviewed By: kparzysz Subscribers: MatzeB, qcolombet, tpr, llvm-commits Differential Revision: https://reviews.llvm.org/D50842 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@340255 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/RegisterCoalescer.cpp | 3 ++- test/CodeGen/X86/coalesce-dead-lanes.mir | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 test/CodeGen/X86/coalesce-dead-lanes.mir diff --git a/lib/CodeGen/RegisterCoalescer.cpp b/lib/CodeGen/RegisterCoalescer.cpp index a9cec3f2a01..933d5daf168 100644 --- a/lib/CodeGen/RegisterCoalescer.cpp +++ b/lib/CodeGen/RegisterCoalescer.cpp @@ -1159,7 +1159,8 @@ bool RegisterCoalescer::reMaterializeTrivialDef(const CoalescerPair &CP, LiveInterval &SrcInt = LIS->getInterval(SrcReg); SlotIndex CopyIdx = LIS->getInstructionIndex(*CopyMI); VNInfo *ValNo = SrcInt.Query(CopyIdx).valueIn(); - assert(ValNo && "CopyMI input register not live"); + if (!ValNo) + return false; if (ValNo->isPHIDef() || ValNo->isUnused()) return false; MachineInstr *DefMI = LIS->getInstructionFromIndex(ValNo->def); diff --git a/test/CodeGen/X86/coalesce-dead-lanes.mir b/test/CodeGen/X86/coalesce-dead-lanes.mir new file mode 100644 index 00000000000..a1bd9df9e67 --- /dev/null +++ b/test/CodeGen/X86/coalesce-dead-lanes.mir @@ -0,0 +1,19 @@ +# RUN: llc -run-pass simple-register-coalescing -O0 -mtriple x86_64-pc-linux-gnu -o - %s | FileCheck %s + +--- +name: foo +tracksRegLiveness: true +body: | + bb.0: + undef %18.sub_8bit_hi:gr16_abcd = COPY undef $al + %1:gr16_abcd = COPY killed %18 + dead %8:gr8 = COPY undef %1.sub_8bit_hi + $al = COPY undef %8 +... + +# This used to hit an assertion: +# lib/CodeGen/RegisterCoalescer.cpp:1110: RegisterCoalescer::reMaterializeTrivialDef(...): Assertion `ValNo && "CopyMI input register not live"' failed. +# +# CHECK_LABEL: name: foo +# CHECK: bb.0: +# CHECK-NEXT: $al = COPY undef %2:gr8 -- 2.11.0