]> granicus.if.org Git - llvm/commitdiff
[X86] Add BSR to isUseDefConvertible.
authorCraig Topper <craig.topper@intel.com>
Tue, 18 Dec 2018 20:03:54 +0000 (20:03 +0000)
committerCraig Topper <craig.topper@intel.com>
Tue, 18 Dec 2018 20:03:54 +0000 (20:03 +0000)
We already had BSF here as part of __builtin_ffs improvements and I was just wondering yesterday whether we should have BSR there.

This addresses one issue from PR40090.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@349531 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/X86/X86InstrInfo.cpp
test/CodeGen/X86/pr40090.ll [new file with mode: 0644]

index 98c1a12c7ac7a0f6443cd16d53a6a36ac892288c..40de049bfe8bab671a64ff346ff0f8e358ab7c0d 100644 (file)
@@ -3579,12 +3579,12 @@ static X86::CondCode isUseDefConvertible(const MachineInstr &MI) {
   case X86::TZCNT32rr: case X86::TZCNT32rm:
   case X86::TZCNT64rr: case X86::TZCNT64rm:
     return X86::COND_B;
-  case X86::BSF16rr:
-  case X86::BSF16rm:
-  case X86::BSF32rr:
-  case X86::BSF32rm:
-  case X86::BSF64rr:
-  case X86::BSF64rm:
+  case X86::BSF16rr: case X86::BSF16rm:
+  case X86::BSF32rr: case X86::BSF32rm:
+  case X86::BSF64rr: case X86::BSF64rm:
+  case X86::BSR16rr: case X86::BSR16rm:
+  case X86::BSR32rr: case X86::BSR32rm:
+  case X86::BSR64rr: case X86::BSR64rm:
     return X86::COND_E;
   }
 }
diff --git a/test/CodeGen/X86/pr40090.ll b/test/CodeGen/X86/pr40090.ll
new file mode 100644 (file)
index 0000000..d1c38e4
--- /dev/null
@@ -0,0 +1,24 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+; RUN: llc < %s -mtriple=x86_64-unknown-unknown | FileCheck %s
+
+define i64 @foo(i64 %x, i64 %y) {
+; CHECK-LABEL: foo:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    bsrq %rdi, %rax
+; CHECK-NEXT:    xorq $64, %rax
+; CHECK-NEXT:    bsrq %rsi, %rcx
+; CHECK-NEXT:    cmoveq %rax, %rcx
+; CHECK-NEXT:    movl $63, %eax
+; CHECK-NEXT:    subq %rcx, %rax
+; CHECK-NEXT:    retq
+  %1 = tail call i64 @llvm.ctlz.i64(i64 %x, i1 true)
+  %2 = xor i64 %1, 127
+  %3 = tail call i64 @llvm.ctlz.i64(i64 %y, i1 true)
+  %4 = xor i64 %3, 63
+  %5 = icmp eq i64 %y, 0
+  %6 = select i1 %5, i64 %2, i64 %4
+  %7 = sub nsw i64 63, %6
+  ret i64 %7
+}
+
+declare i64 @llvm.ctlz.i64(i64, i1)