[llvm] r349531 - [X86] Add BSR to isUseDefConvertible.

Craig Topper via llvm-commits llvm-commits at lists.llvm.org
Tue Dec 18 12:03:54 PST 2018


Author: ctopper
Date: Tue Dec 18 12:03:54 2018
New Revision: 349531

URL: http://llvm.org/viewvc/llvm-project?rev=349531&view=rev
Log:
[X86] Add BSR to isUseDefConvertible.

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.

Added:
    llvm/trunk/test/CodeGen/X86/pr40090.ll
Modified:
    llvm/trunk/lib/Target/X86/X86InstrInfo.cpp

Modified: llvm/trunk/lib/Target/X86/X86InstrInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86InstrInfo.cpp?rev=349531&r1=349530&r2=349531&view=diff
==============================================================================
--- llvm/trunk/lib/Target/X86/X86InstrInfo.cpp (original)
+++ llvm/trunk/lib/Target/X86/X86InstrInfo.cpp Tue Dec 18 12:03:54 2018
@@ -3579,12 +3579,12 @@ static X86::CondCode isUseDefConvertible
   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;
   }
 }

Added: llvm/trunk/test/CodeGen/X86/pr40090.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/pr40090.ll?rev=349531&view=auto
==============================================================================
--- llvm/trunk/test/CodeGen/X86/pr40090.ll (added)
+++ llvm/trunk/test/CodeGen/X86/pr40090.ll Tue Dec 18 12:03:54 2018
@@ -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)




More information about the llvm-commits mailing list