<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/141437>141437</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            Expanding to an imm is not always the best solution
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          AZero13
      </td>
    </tr>
</table>

<pre>
    Take the following:

define i32 @test1_known_not_zero_mul(i32 %a) {
; CHECK-LABEL: test1_known_not_zero_mul:
; CHECK:       // %bb.0:
; CHECK-NEXT:    mov w8, #4093 // =0xffd
; CHECK-NEXT:    mov w9, #12288 // =0x3000
; CHECK-NEXT: movk w8, #65520, lsl #16
; CHECK-NEXT:    movk w9, #7, lsl #16
; CHECK-NEXT:    and w8, w0, w8
; CHECK-NEXT:    orr w0, w8, w9
; CHECK-NEXT: ret
  %and = and i32 %a, -1044483
  %or = or disjoint i32 %and, 471040
 ret i32 %or
}

Now, here is a case where adding an instruction actually makes the code faster:

define i32 @test1_known_not_zero_mul(i32 %a) {
; CHECK-LABEL: test1_known_not_zero_mul:
; CHECK:       // %bb.0:
; CHECK-NEXT:    mul w9, w0, w0
; CHECK-NEXT:    mov w8, #12288 // =0x3000
; CHECK-NEXT:    movk w8, #7, lsl #16
; CHECK-NEXT:    and w9, w9, #0xfff03fff
; CHECK-NEXT:    orr w0, w9, w8
; CHECK-NEXT:    ret
  %mul = mul i32 %a, %a ; We set the second bit to 0.
  %and = and i32 %mul, -1044483
  %or = or disjoint i32 %and, 471040
  ret i32 %or
}

So, this means, we can just rewrite the first one, at minimum to:

; CHECK-NEXT: mov w9, w0
; CHECK-NEXT:    mov w8, #12288 // =0x3000
; CHECK-NEXT:    movk w8, #7, lsl #16
; CHECK-NEXT:    and w9, w9, #0xfff03fff
; CHECK-NEXT: orr w0, w9, w8
; CHECK-NEXT:    ret

Instead of decomposing the and. How can we do this?
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzUlU9v4zYQxT8NdRnYoEj9Pejg_DG26GIvXaBFLwEljmzGFBmQVLTppy9IK_F2kQQb9LSGYdrQe3zSzM9D4b06GMSOlFekvMnEHI7Wdbu_0dmcZ72VT91XcUIIR4TRam0XZQ6E7wiNb4mjMgiKMyAFDehDfncydjF3xoa7f9DZu2nWhDVJwUpBWAukvopufgXXn26vf9983l3dfiZ8B2_6z3HPhig9vwjbE7aPG_f9lv4g23y5_evrqp3sIywNYddAGC9oy1-s_IZ-G0f5rrFdjTljTfMfJ6eUvmqd7OPpkliVJaPxu_Y6bVS9k3e6BNY_5RFGrlFLClmat5TWuYsmfravKh0GQneQGmZkfNKUcenhNWxyWhRFw5911iWZdSCVv7fKhBe5kdFQ1DktYq3i7s_XrIv59c0Zpi92icojOgTlQcAgPMKSfgsplTmAMKCMD24egrIGxBBmofUTTOKEPjE6WIkwCh_Q_XqUznrt_dqk19n6kecPYPlCWPNxwtqVmLMx_mtGysdx_AnY2vex_I63WIIIUly_5y2uEM1_IngMqdUeB2sk9CpAsEC37zCb2vu_qH0b2z9sVIaj8jChMD49K8IgDNzPPoDDxamwTlDlfABrMIpEgEkZNc0TBPsC66uz5ILFrwrER2kgdPeb8QGFBDuCxMFOD9bHGRDrKIzcwie7pCovCNKmBhC-z2THZctbkWGX10XD8qYqq-zYsbYYx3rsi17mVTPkjDaUjQW2XMqmR5qpjlFW0pJVlOY1r7ayYG1elT2XtJXtUJGC4iSU3mr9OG2tO2TK-xm7vMgLXmda9Kh9OkgZM7hAukoYi-eq66Jp088HTwqqlQ_-sk1QQWN3--1BmDTlgk2DbpriGDQ2gNCLeDrPtx59AG_1HAdgNjvdHUN48BGf1O-DCse53w52ImwfE9Zl8-DsPQ6BsH26L0_Yfr3xx479GwAA__9zsThp">