summaryrefslogtreecommitdiffstats
path: root/llvm
diff options
context:
space:
mode:
authorJonas Paulsson <paulsson@linux.vnet.ibm.com>2018-03-19 13:05:22 +0000
committerJonas Paulsson <paulsson@linux.vnet.ibm.com>2018-03-19 13:05:22 +0000
commita6216ec4ccb393138d75bd3b12e64e4f91f4a150 (patch)
tree321d65ff99a706644621f91c63193c29f416d496 /llvm
parentfcefdb877cf98bf453891bfa8359b98d49e4b055 (diff)
downloadbcm5719-llvm-a6216ec4ccb393138d75bd3b12e64e4f91f4a150.tar.gz
bcm5719-llvm-a6216ec4ccb393138d75bd3b12e64e4f91f4a150.zip
[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 llvm-svn: 327834
Diffstat (limited to 'llvm')
-rw-r--r--llvm/lib/Target/SystemZ/SystemZISelLowering.cpp4
-rw-r--r--llvm/test/CodeGen/SystemZ/memcmp-02.ll20
2 files changed, 24 insertions, 0 deletions
diff --git a/llvm/lib/Target/SystemZ/SystemZISelLowering.cpp b/llvm/lib/Target/SystemZ/SystemZISelLowering.cpp
index bf2d1833515..5de324d1d46 100644
--- a/llvm/lib/Target/SystemZ/SystemZISelLowering.cpp
+++ b/llvm/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/llvm/test/CodeGen/SystemZ/memcmp-02.ll b/llvm/test/CodeGen/SystemZ/memcmp-02.ll
new file mode 100644
index 00000000000..303e015ec99
--- /dev/null
+++ b/llvm/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
+}
OpenPOWER on IntegriCloud