From ea7c1d4e4e18cf5c5eb7dcae53458c2bfb363d21 Mon Sep 17 00:00:00 2001 From: Jonas Paulsson Date: Mon, 19 Mar 2018 13:05:22 +0000 Subject: [PATCH] [SystemZ] Bugfix of CC liveness in emitMemMemWrapper (CLC). If DoneMBB becomes empty it must have CC added to its live-in list, since it will fall-through into EndMBB. This happens when the CLC loop does the complete range. Review: Ulrich Weigand git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@327834 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/SystemZ/SystemZISelLowering.cpp | 4 ++++ test/CodeGen/SystemZ/memcmp-02.ll | 20 ++++++++++++++++++++ 2 files changed, 24 insertions(+) create mode 100644 test/CodeGen/SystemZ/memcmp-02.ll diff --git a/lib/Target/SystemZ/SystemZISelLowering.cpp b/lib/Target/SystemZ/SystemZISelLowering.cpp index bf2d1833515..5de324d1d46 100644 --- a/lib/Target/SystemZ/SystemZISelLowering.cpp +++ b/lib/Target/SystemZ/SystemZISelLowering.cpp @@ -6626,6 +6626,10 @@ MachineBasicBlock *SystemZTargetLowering::emitMemMemWrapper( DestBase = MachineOperand::CreateReg(NextDestReg, false); SrcBase = MachineOperand::CreateReg(NextSrcReg, false); Length &= 255; + if (EndMBB && !Length) + // If the loop handled the whole CLC range, DoneMBB will be empty with + // CC live-through into EndMBB, so add it as live-in. + DoneMBB->addLiveIn(SystemZ::CC); MBB = DoneMBB; } // Handle any remaining bytes with straight-line code. diff --git a/test/CodeGen/SystemZ/memcmp-02.ll b/test/CodeGen/SystemZ/memcmp-02.ll new file mode 100644 index 00000000000..303e015ec99 --- /dev/null +++ b/test/CodeGen/SystemZ/memcmp-02.ll @@ -0,0 +1,20 @@ +; Test memcmp using CLC. In this test case the CLC loop will do all the work +; and the DoneMBB becomes empty. It will not pass the mischeduling verifiers +; if DoneMBB does not have CC in its live-in list. + +; RUN: llc < %s -mtriple=s390x-linux-gnu -misched=shuffle | FileCheck %s + +declare i32 @memcmp(i8* nocapture, i8* nocapture, i64) + +define i32 @fun() { +; CHECK-LABEL: fun + %call = call signext i32 @memcmp(i8* nonnull undef, i8* nonnull undef, i64 2048) + %cmp = icmp eq i32 %call, 0 + br i1 %cmp, label %labT, label %labF + +labT: + ret i32 0 + +labF: + ret i32 1 +}