<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">