OSDN Git Service

[SystemZ] Bugfix of CC liveness in emitMemMemWrapper (CLC).
authorJonas Paulsson <paulsson@linux.vnet.ibm.com>
Mon, 19 Mar 2018 13:05:22 +0000 (13:05 +0000)
committerJonas Paulsson <paulsson@linux.vnet.ibm.com>
Mon, 19 Mar 2018 13:05:22 +0000 (13:05 +0000)
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
test/CodeGen/SystemZ/memcmp-02.ll [new file with mode: 0644]

index bf2d183..5de324d 100644 (file)
@@ -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 (file)
index 0000000..303e015
--- /dev/null
@@ -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
+}