1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2025-01-31 12:41:49 +01:00

[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
This commit is contained in:
Jonas Paulsson 2018-03-19 13:05:22 +00:00
parent a5e3147218
commit c3aa9a4522
2 changed files with 24 additions and 0 deletions

View 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.

View File

@ -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
}