diff options
| -rw-r--r-- | llvm/lib/Target/SystemZ/SystemZISelLowering.cpp | 4 | ||||
| -rw-r--r-- | llvm/test/CodeGen/SystemZ/memcmp-02.ll | 20 |
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 +} |

