From aff0caeac1ee7cc8017b4cd2f15908a98cb6975a Mon Sep 17 00:00:00 2001 From: Quentin Colombet Date: Thu, 8 Dec 2016 00:06:51 +0000 Subject: [PATCH] [InlineSpiller] Don't call TargetInstrInfo::foldMemoryOperand with an empty list. Since r287792 if we try to do that we will hit an assert. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@289001 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/InlineSpiller.cpp | 5 +++++ test/CodeGen/X86/implicit-use-spill.mir | 22 ++++++++++++++++++++++ 2 files changed, 27 insertions(+) create mode 100644 test/CodeGen/X86/implicit-use-spill.mir diff --git a/lib/CodeGen/InlineSpiller.cpp b/lib/CodeGen/InlineSpiller.cpp index 3e5ae5f5f07..422f2dc2f2f 100644 --- a/lib/CodeGen/InlineSpiller.cpp +++ b/lib/CodeGen/InlineSpiller.cpp @@ -768,6 +768,11 @@ foldMemoryOperand(ArrayRef > Ops, FoldOps.push_back(Idx); } + // If we only have implicit uses, we won't be able to fold that. + // Moreover, TargetInstrInfo::foldMemoryOperand will assert if we try! + if (FoldOps.empty()) + return false; + MachineInstrSpan MIS(MI); MachineInstr *FoldMI = diff --git a/test/CodeGen/X86/implicit-use-spill.mir b/test/CodeGen/X86/implicit-use-spill.mir new file mode 100644 index 00000000000..827f0f186ce --- /dev/null +++ b/test/CodeGen/X86/implicit-use-spill.mir @@ -0,0 +1,22 @@ +# RUN: llc -run-pass=greedy -mtriple=x86_64-apple-macosx -o - %s 2>&1 | FileCheck %s + +# Make sure we don't assert when we try to reload a value that is just implicitly used. +--- +# CHECK: name: foo +# This test forces a spill of %0. +name: foo +registers: + - { id: 0, class: gr64 } +body: | + bb.0: + ; CHECK: NOOP implicit-def [[VAL:%[0-9]+]] + ; VAL should be spilled before csr_noregs, i.e., before we clobber all the registers + ; CHECK-NEXT: MOV64mr [[SLOT:%stack.[0-9]+]], 1, _, 0, _, [[VAL]] + ; CHECK-NEXT: NOOP csr_noregs + ; We need to reload before the (implicit) use. + ; CHECK-NEXT: [[RELOADED_VAL:%[0-9]+]] = MOV64rm [[SLOT]], 1, _, 0, _ + ; CHECK-NEXT: NOOP implicit [[RELOADED_VAL]] + NOOP implicit-def %0 + NOOP csr_noregs + NOOP implicit %0 +... -- 2.50.0