diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -34040,6 +34040,11 @@ Known.resetAll(); switch (Opc) { default: break; + case X86ISD::BSR: { + // TODO: Bound with input known bits? + Known.Zero.setBitsFrom(Log2_32(BitWidth)); + break; + } case X86ISD::SETCC: Known.Zero.setBitsFrom(1); break; diff --git a/llvm/test/CodeGen/X86/clz.ll b/llvm/test/CodeGen/X86/clz.ll --- a/llvm/test/CodeGen/X86/clz.ll +++ b/llvm/test/CodeGen/X86/clz.ll @@ -245,7 +245,7 @@ ; X86-NOCMOV-NEXT: # %bb.2: ; X86-NOCMOV-NEXT: bsrl {{[0-9]+}}(%esp), %eax ; X86-NOCMOV-NEXT: xorl $31, %eax -; X86-NOCMOV-NEXT: addl $32, %eax +; X86-NOCMOV-NEXT: orl $32, %eax ; X86-NOCMOV-NEXT: xorl %edx, %edx ; X86-NOCMOV-NEXT: retl ; X86-NOCMOV-NEXT: .LBB7_1: @@ -261,7 +261,7 @@ ; X86-CMOV-NEXT: xorl $31, %edx ; X86-CMOV-NEXT: bsrl {{[0-9]+}}(%esp), %eax ; X86-CMOV-NEXT: xorl $31, %eax -; X86-CMOV-NEXT: addl $32, %eax +; X86-CMOV-NEXT: orl $32, %eax ; X86-CMOV-NEXT: testl %ecx, %ecx ; X86-CMOV-NEXT: cmovnel %edx, %eax ; X86-CMOV-NEXT: xorl %edx, %edx diff --git a/llvm/test/CodeGen/X86/pr40090.ll b/llvm/test/CodeGen/X86/pr40090.ll --- a/llvm/test/CodeGen/X86/pr40090.ll +++ b/llvm/test/CodeGen/X86/pr40090.ll @@ -5,7 +5,7 @@ ; CHECK-LABEL: foo: ; CHECK: # %bb.0: ; CHECK-NEXT: bsrq %rdi, %rax -; CHECK-NEXT: xorq $64, %rax +; CHECK-NEXT: orq $64, %rax ; CHECK-NEXT: bsrq %rsi, %rcx ; CHECK-NEXT: cmoveq %rax, %rcx ; CHECK-NEXT: movl $63, %eax diff --git a/llvm/test/CodeGen/X86/scheduler-backtracking.ll b/llvm/test/CodeGen/X86/scheduler-backtracking.ll --- a/llvm/test/CodeGen/X86/scheduler-backtracking.ll +++ b/llvm/test/CodeGen/X86/scheduler-backtracking.ll @@ -268,7 +268,7 @@ ; ILP-NEXT: andq %rdx, %r10 ; ILP-NEXT: bsrq %r10, %rdx ; ILP-NEXT: xorq $63, %r8 -; ILP-NEXT: addq $64, %rcx +; ILP-NEXT: orq $64, %rcx ; ILP-NEXT: testq %rdi, %rdi ; ILP-NEXT: movq $0, 24(%rax) ; ILP-NEXT: movq $0, 16(%rax) @@ -306,7 +306,7 @@ ; HYBRID-NEXT: andq %rcx, %rdi ; HYBRID-NEXT: bsrq %rdi, %rcx ; HYBRID-NEXT: xorq $63, %rcx -; HYBRID-NEXT: addq $64, %rcx +; HYBRID-NEXT: orq $64, %rcx ; HYBRID-NEXT: testq %r9, %r9 ; HYBRID-NEXT: cmovneq %r8, %rcx ; HYBRID-NEXT: andq %rdx, %r10 @@ -346,7 +346,7 @@ ; BURR-NEXT: andq %rcx, %rdi ; BURR-NEXT: bsrq %rdi, %rcx ; BURR-NEXT: xorq $63, %rcx -; BURR-NEXT: addq $64, %rcx +; BURR-NEXT: orq $64, %rcx ; BURR-NEXT: testq %r9, %r9 ; BURR-NEXT: cmovneq %r8, %rcx ; BURR-NEXT: andq %rdx, %r10 @@ -388,7 +388,7 @@ ; SRC-NEXT: xorq $63, %rcx ; SRC-NEXT: bsrq %r9, %rdx ; SRC-NEXT: xorq $63, %rdx -; SRC-NEXT: addq $64, %rdx +; SRC-NEXT: orq $64, %rdx ; SRC-NEXT: testq %rdi, %rdi ; SRC-NEXT: cmovneq %rcx, %rdx ; SRC-NEXT: bsrq %r10, %rcx @@ -434,7 +434,7 @@ ; LIN-NEXT: andq %rcx, %rsi ; LIN-NEXT: bsrq %rsi, %rcx ; LIN-NEXT: xorq $63, %rcx -; LIN-NEXT: addq $64, %rcx +; LIN-NEXT: orq $64, %rcx ; LIN-NEXT: sbbq %r8, %r9 ; LIN-NEXT: andq %r8, %r9 ; LIN-NEXT: bsrq %r9, %rdi @@ -476,7 +476,7 @@ ; ILP-NEXT: andq %r10, %r8 ; ILP-NEXT: bsrq %r8, %r10 ; ILP-NEXT: xorq $63, %r10 -; ILP-NEXT: addq $64, %rdi +; ILP-NEXT: orq $64, %rdi ; ILP-NEXT: bsrq %rdx, %r11 ; ILP-NEXT: notq %rsi ; ILP-NEXT: testq %r8, %r8 @@ -519,7 +519,7 @@ ; HYBRID-NEXT: andq %r11, %rcx ; HYBRID-NEXT: bsrq %rcx, %rdi ; HYBRID-NEXT: xorq $63, %rdi -; HYBRID-NEXT: addq $64, %rdi +; HYBRID-NEXT: orq $64, %rdi ; HYBRID-NEXT: testq %r8, %r8 ; HYBRID-NEXT: cmovneq %rbx, %rdi ; HYBRID-NEXT: notq %rdx @@ -565,7 +565,7 @@ ; BURR-NEXT: andq %r11, %rcx ; BURR-NEXT: bsrq %rcx, %rdi ; BURR-NEXT: xorq $63, %rdi -; BURR-NEXT: addq $64, %rdi +; BURR-NEXT: orq $64, %rdi ; BURR-NEXT: testq %r8, %r8 ; BURR-NEXT: cmovneq %rbx, %rdi ; BURR-NEXT: notq %rdx @@ -614,7 +614,7 @@ ; SRC-NEXT: xorq $63, %r9 ; SRC-NEXT: bsrq %rcx, %rdi ; SRC-NEXT: xorq $63, %rdi -; SRC-NEXT: addq $64, %rdi +; SRC-NEXT: orq $64, %rdi ; SRC-NEXT: testq %r8, %r8 ; SRC-NEXT: cmovneq %r9, %rdi ; SRC-NEXT: bsrq %rdx, %r9 @@ -663,7 +663,7 @@ ; LIN-NEXT: andq %rdx, %rcx ; LIN-NEXT: bsrq %rcx, %rdx ; LIN-NEXT: xorq $63, %rdx -; LIN-NEXT: addq $64, %rdx +; LIN-NEXT: orq $64, %rdx ; LIN-NEXT: sbbq %r8, %r9 ; LIN-NEXT: notq %r8 ; LIN-NEXT: andq %r9, %r8 @@ -796,16 +796,16 @@ ; ILP-NEXT: xorq $63, %rcx ; ILP-NEXT: bsrq %r10, %rsi ; ILP-NEXT: xorq $63, %rsi -; ILP-NEXT: addq $64, %rsi +; ILP-NEXT: orq $64, %rsi ; ILP-NEXT: testq %rdi, %rdi ; ILP-NEXT: cmovneq %rcx, %rsi ; ILP-NEXT: xorq $63, %rdx ; ILP-NEXT: bsrq %rbx, %rcx ; ILP-NEXT: xorq $63, %rcx -; ILP-NEXT: addq $64, %rcx +; ILP-NEXT: orq $64, %rcx ; ILP-NEXT: testq %r11, %r11 ; ILP-NEXT: cmovneq %rdx, %rcx -; ILP-NEXT: subq $-128, %rcx +; ILP-NEXT: orq $128, %rcx ; ILP-NEXT: xorl %r9d, %r9d ; ILP-NEXT: orq %rdi, %r10 ; ILP-NEXT: cmovneq %rsi, %rcx @@ -842,17 +842,17 @@ ; HYBRID-NEXT: xorq $63, %rcx ; HYBRID-NEXT: bsrq %r10, %rdx ; HYBRID-NEXT: xorq $63, %rdx -; HYBRID-NEXT: addq $64, %rdx +; HYBRID-NEXT: orq $64, %rdx ; HYBRID-NEXT: testq %rdi, %rdi ; HYBRID-NEXT: cmovneq %rcx, %rdx ; HYBRID-NEXT: bsrq %r11, %rsi ; HYBRID-NEXT: xorq $63, %rsi ; HYBRID-NEXT: bsrq %rbx, %rcx ; HYBRID-NEXT: xorq $63, %rcx -; HYBRID-NEXT: addq $64, %rcx +; HYBRID-NEXT: orq $64, %rcx ; HYBRID-NEXT: testq %r11, %r11 ; HYBRID-NEXT: cmovneq %rsi, %rcx -; HYBRID-NEXT: subq $-128, %rcx +; HYBRID-NEXT: orq $128, %rcx ; HYBRID-NEXT: orq %rdi, %r10 ; HYBRID-NEXT: cmovneq %rdx, %rcx ; HYBRID-NEXT: xorl %r9d, %r9d @@ -889,17 +889,17 @@ ; BURR-NEXT: xorq $63, %rcx ; BURR-NEXT: bsrq %r10, %rdx ; BURR-NEXT: xorq $63, %rdx -; BURR-NEXT: addq $64, %rdx +; BURR-NEXT: orq $64, %rdx ; BURR-NEXT: testq %rdi, %rdi ; BURR-NEXT: cmovneq %rcx, %rdx ; BURR-NEXT: bsrq %r11, %rsi ; BURR-NEXT: xorq $63, %rsi ; BURR-NEXT: bsrq %rbx, %rcx ; BURR-NEXT: xorq $63, %rcx -; BURR-NEXT: addq $64, %rcx +; BURR-NEXT: orq $64, %rcx ; BURR-NEXT: testq %r11, %r11 ; BURR-NEXT: cmovneq %rsi, %rcx -; BURR-NEXT: subq $-128, %rcx +; BURR-NEXT: orq $128, %rcx ; BURR-NEXT: orq %rdi, %r10 ; BURR-NEXT: cmovneq %rdx, %rcx ; BURR-NEXT: xorl %r9d, %r9d @@ -936,17 +936,17 @@ ; SRC-NEXT: xorq $63, %rcx ; SRC-NEXT: bsrq %r10, %rdx ; SRC-NEXT: xorq $63, %rdx -; SRC-NEXT: addq $64, %rdx +; SRC-NEXT: orq $64, %rdx ; SRC-NEXT: testq %rdi, %rdi ; SRC-NEXT: cmovneq %rcx, %rdx ; SRC-NEXT: bsrq %r11, %rsi ; SRC-NEXT: xorq $63, %rsi ; SRC-NEXT: bsrq %rbx, %rcx ; SRC-NEXT: xorq $63, %rcx -; SRC-NEXT: addq $64, %rcx +; SRC-NEXT: orq $64, %rcx ; SRC-NEXT: testq %r11, %r11 ; SRC-NEXT: cmovneq %rsi, %rcx -; SRC-NEXT: subq $-128, %rcx +; SRC-NEXT: orq $128, %rcx ; SRC-NEXT: orq %rdi, %r10 ; SRC-NEXT: cmovneq %rdx, %rcx ; SRC-NEXT: xorl %r9d, %r9d @@ -981,15 +981,15 @@ ; LIN-NEXT: # %bb.2: # %cond.false ; LIN-NEXT: bsrq %rbx, %rcx ; LIN-NEXT: xorq $63, %rcx -; LIN-NEXT: addq $64, %rcx +; LIN-NEXT: orq $64, %rcx ; LIN-NEXT: bsrq %rdi, %rdx ; LIN-NEXT: xorq $63, %rdx ; LIN-NEXT: testq %rdi, %rdi ; LIN-NEXT: cmoveq %rcx, %rdx -; LIN-NEXT: subq $-128, %rdx +; LIN-NEXT: orq $128, %rdx ; LIN-NEXT: bsrq %r10, %rsi ; LIN-NEXT: xorq $63, %rsi -; LIN-NEXT: addq $64, %rsi +; LIN-NEXT: orq $64, %rsi ; LIN-NEXT: bsrq %r11, %rcx ; LIN-NEXT: xorq $63, %rcx ; LIN-NEXT: testq %r11, %r11