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 @@ -38282,6 +38282,13 @@ Known.resetAll(); switch (Opc) { default: break; + case X86ISD::MUL_IMM: { + KnownBits Known2; + Known = DAG.computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1); + Known2 = DAG.computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1); + Known = KnownBits::mul(Known, Known2); + break; + } case X86ISD::SETCC: Known.Zero.setBitsFrom(1); break; diff --git a/llvm/test/CodeGen/X86/pr57402.ll b/llvm/test/CodeGen/X86/pr57402.ll --- a/llvm/test/CodeGen/X86/pr57402.ll +++ b/llvm/test/CodeGen/X86/pr57402.ll @@ -6,8 +6,7 @@ ; CHECK: # %bb.0: # %entry ; CHECK-NEXT: notl %eax ; CHECK-NEXT: andl $-2, %eax -; CHECK-NEXT: leal (%rax,%rax,2), %ecx -; CHECK-NEXT: orl $1, %ecx +; CHECK-NEXT: leal 1(%rax,%rax,2), %ecx ; CHECK-NEXT: movswq %cx, %rsi ; CHECK-NEXT: xorl %edi, %edi ; CHECK-NEXT: movq $-1, %rax diff --git a/llvm/test/CodeGen/X86/select-constant-lea.ll b/llvm/test/CodeGen/X86/select-constant-lea.ll --- a/llvm/test/CodeGen/X86/select-constant-lea.ll +++ b/llvm/test/CodeGen/X86/select-constant-lea.ll @@ -8,8 +8,7 @@ ; BASE-NEXT: xorl %eax, %eax ; BASE-NEXT: cmpl $10, %edi ; BASE-NEXT: setae %al -; BASE-NEXT: leal (%rax,%rax,4), %eax -; BASE-NEXT: orl $8, %eax +; BASE-NEXT: leal 8(%rax,%rax,4), %eax ; BASE-NEXT: retq ; ; SLOWLEA3-LABEL: select_unsigned_lt_10_8_13j: @@ -18,7 +17,7 @@ ; SLOWLEA3-NEXT: cmpl $10, %edi ; SLOWLEA3-NEXT: setae %al ; SLOWLEA3-NEXT: leal (%rax,%rax,4), %eax -; SLOWLEA3-NEXT: orl $8, %eax +; SLOWLEA3-NEXT: addl $8, %eax ; SLOWLEA3-NEXT: retq %2 = icmp ult i32 %0, 10 %3 = select i1 %2, i32 8, i32 13