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

    <tr>
        <th>Summary</th>
        <td>
            Multiply by a power of 2 and ctz+shift should often be interchangeable
        </td>
    </tr>

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

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

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

<pre>
    The compiler should probably be able to optimize either of these functions to the other one, depending on cost for the particular hardware ([Godbolt link](https://zig.godbolt.org/z/6fcrzqc4b)):



```zig
export fn foo(x: u64, y: u64) u64 {
    return x *% (y & (~y +% 1));
}

export fn bar(x: u64, y: u64) u64 {
    if (y == 0) return 0;
    return x << @intCast(@ctz(y));
}
```

x86 znver4 emit:

```asm
foo:
        blsi    rax, rsi
        imul rax, rdi
        ret

bar:
        tzcnt   rax, rsi
 shlx    rax, rdi, rax
        cmovb   rax, rsi
 ret
```

RISC-V sifive_u74 emit:

```asm
foo:
 neg     a2, a1
        and     a1, a1, a2
        mul     a0, a1, a0
        ret

.LCPI1_0:
        .quad 151050438420815295
.LCPI1_1:
        .ascii "\000\001\002\007\003\r\b\023\004\031\016\034\t\"\024(\005\021\032&\017.\0350\n\037#6\0252)9?\006\f\022\030\033!'\020%-/\036518>\013\027 $,47=\026+3<*;:"
bar:
        beqz    a1, .LBB1_2
        lui a2, %hi(.LCPI1_0)
        neg     a3, a1
        and     a1, a1, a3
 ld      a2, %lo(.LCPI1_0)(a2)
        mul     a1, a1, a2
 lui     a2, %hi(.LCPI1_1)
        srli    a1, a1, 58
        addi a2, a2, %lo(.LCPI1_1)
        add     a1, a1, a2
        lbu     a1, 0(a1)
        sll     a0, a0, a1
        ret
.LBB1_2:
        li a0, 0
        ret
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJycVt2O6yYQfprJDdoIBuPYF7nYOE11pFOpaqtzu8I2jukhJgt4N5uLPnsF-dkkm-3PiSKMZ76Z-RhmMNJ7vR6UmoNYgFhO5Bh66-bfpNGtdN8ntW3f5n_0ijR2s9VGOeJ7O5qWbJ2tZW3eSK2IrI0iwRK7DXqj94ooHXrliO1I6JVXpBuHJmg7-IgKvSL2oB8UYEVatVVDq4c1sQNprA-ksy7BttIF3YxGOtJL175KpwhgAWLxs21rawIxevgOYglY9CFsPfBHwBXgaq_X0_UBM7VuHSWAq7xr3P65yWrAMv75I9Al0HtjTg__vV4fJGq3tS6QbiCdtYDFDvgjGfMsruDtPC_jg8BscTAihBCnwugGsiOAj4AiLuCNAOZx8lecLaKUnSgdLWG2vOTzHr2W7v9E190xIF8CXxIaQUdG9BzsmiavgFcEMqqHUEkfYsYz2oR9dPQpzVPCLlnvipzshxflMqI2Otzm-2Qi_eYgiZk9YcjxVxuvEz-5i4t1Xl_r9WY0Z2V7o3QqXEaMubv1H_bNEO75973ZXQZudXrI3bV9s7Ev9T3799j3UvPbl9-rh2_E606_qKdx9iMZGtQ6UZAYI0t2TUwO7eHJjto44jUm5i5h6AWG_mMOp1-rX7-wJ_ohkdPnUbaECUYFzXiRIS2YwFJcmbGPZtI3WhNABFFRStPI0niQzNLIQVQORFXHN-RJlsWRJyzL0zxKAojq6A2zdFpUlIr0mqAcAROazabpXcSYQ5rOAHnSoUDAsgS-SuZR1iV58ssTS84BGWDihxRQPMSzJypywQrgP6UgiSrOCEQyVTaLjRglOeCCx17Dx9hN8eDCz6u0Vs_7982cfl0s2NPNXppRHysBUPQasDhvFZbX0HPh8P9cOPyIMS25qDlAYexNJCyirvyk0O4VY2R-5fOSPfvgyzujb32J4mYNbXvKxl2mH73K9t_bxdTjBYbGpd6hZ656it5L8bmnTjt5u99GHy0_bcbT0TBp57wteSknas5mjLI8Z5xP-nnBYh_mZSGaUpai4RkrBFUiK4oai1k70XOkmFHOGMtokRVT2rCiyDoURdeKjHLIqNpIbabGvGziZ3SivR_VvMhmOZ8YWSvj08UBcVCvJClT5y0nbh5tHupx7SGjRvvg370EHYya_zKaoLfxBvFGJNna18ONAVP9pa_Nwve6C6cbh-2CGuJ1Qw9BuaaXw1rFm8dkdGZ-_fVf69CP9bSxG8BVDHt8PGyd_VM1AXCVyHrAVVrM3wEAAP__9CFNKw">