]> granicus.if.org Git - llvm/commitdiff
[X86] Add BLSI to isUseDefConvertible.
authorCraig Topper <craig.topper@intel.com>
Thu, 20 Jun 2019 17:52:53 +0000 (17:52 +0000)
committerCraig Topper <craig.topper@intel.com>
Thu, 20 Jun 2019 17:52:53 +0000 (17:52 +0000)
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

lib/Target/X86/X86InstrInfo.cpp
test/CodeGen/X86/bmi.ll

index 8580af049da88bb8033dabba874b49f36afb128b..3481931ff16918ae6cd012c971342f163e8f1e9a 100644 (file)
@@ -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.
   }
 }
 
index cdad570226c50a070fe8d76cdee46748015e5dc9..f71ed7685c63b3061b6af574569d1491d5317eae 100644 (file)
@@ -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