From: Craig Topper Date: Thu, 20 Jun 2019 17:52:53 +0000 (+0000) Subject: [X86] Add BLSI to isUseDefConvertible. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d99a7ea8cd2b634d0dcb13c44d06c4bdd4436c4e;p=llvm [X86] Add BLSI to isUseDefConvertible. Summary: BLSI sets the C flag is the input is not zero. So if its followed by a TEST of the input where only the Z flag is consumed, we can replace it with the opposite check of the C flag. We should be able to do the same for BLSMSK and BLSR, but the naive test case for those is being optimized to a subo by CodeGenPrepare. Reviewers: spatel, RKSimon Subscribers: hiraditya, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D63589 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@363957 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Target/X86/X86InstrInfo.cpp b/lib/Target/X86/X86InstrInfo.cpp index 8580af049da..3481931ff16 100644 --- a/lib/Target/X86/X86InstrInfo.cpp +++ b/lib/Target/X86/X86InstrInfo.cpp @@ -3369,6 +3369,10 @@ static X86::CondCode isUseDefConvertible(const MachineInstr &MI) { case X86::BSR32rr: case X86::BSR64rr: return X86::COND_E; + case X86::BLSI32rr: + case X86::BLSI64rr: + return X86::COND_AE; + // TODO: BLSR, BLSMSK, and TBM instructions. } } diff --git a/test/CodeGen/X86/bmi.ll b/test/CodeGen/X86/bmi.ll index cdad570226c..f71ed7685c6 100644 --- a/test/CodeGen/X86/bmi.ll +++ b/test/CodeGen/X86/bmi.ll @@ -1240,8 +1240,7 @@ define i32 @blsi_cflag_32(i32 %x, i32 %y) nounwind { ; X64-LABEL: blsi_cflag_32: ; X64: # %bb.0: ; X64-NEXT: blsil %edi, %eax -; X64-NEXT: testl %edi, %edi -; X64-NEXT: cmovel %esi, %eax +; X64-NEXT: cmovael %esi, %eax ; X64-NEXT: retq %tobool = icmp eq i32 %x, 0 %sub = sub nsw i32 0, %x @@ -1279,8 +1278,7 @@ define i64 @blsi_cflag_64(i64 %x, i64 %y) nounwind { ; X64-LABEL: blsi_cflag_64: ; X64: # %bb.0: ; X64-NEXT: blsiq %rdi, %rax -; X64-NEXT: testq %rdi, %rdi -; X64-NEXT: cmoveq %rsi, %rax +; X64-NEXT: cmovaeq %rsi, %rax ; X64-NEXT: retq %tobool = icmp eq i64 %x, 0 %sub = sub nsw i64 0, %x