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

    <tr>
        <th>Summary</th>
        <td>
            [RISCV] failure to use mulw for 32 bit multiplication
        </td>
    </tr>

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

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

    <tr>
      <th>Reporter</th>
      <td>
          tom-rein
      </td>
    </tr>
</table>

<pre>
    LLVM doesn't use mulw, except when it otherwise would have to introduce a sext.w.

The following code could use only mulw, but LLVM uses mul instead ([godbolt](https://godbolt.org/z/9aoTKK8Kv)):
```C++
int cube(int x) {
 return x * x * x;
}

int squarep1(int x) {
    return x * x + 1;
}

int mulshift(int x) {
    return x * x << 4;
}

void store(int x, int &y) {
    y = x * x;
}

void store(short x, short &y) {
    y = x * x;
}

void store(unsigned char x, unsigned char &y) {
    y = x * x;
}

void store(signed char x, signed char &y) {
    y = x * x;
}

short square16(short x) {
    return x * x;
}

int square(short x) {
    return x * x;
}

unsigned short square16(unsigned short x) {
 return x * x;
}

unsigned char square8(unsigned char x) {
    return x * x;
}

signed char square8(signed char x) {
    return x * x;
}

int square(unsigned char x) {
    return x * x;
}

int square(signed char x) {
    return x * x;
}

long square(unsigned x) {
    return x * x;
}
```

LLVM generates this:
```
cube(int):
        mul     a1, a0, a0
        mulw    a0, a1, a0
        ret

squarep1(int):
        mul a0, a0, a0
        addiw   a0, a0, 1
        ret

mulshift(int):
 mul     a0, a0, a0
        slliw   a0, a0, 4
        ret

store(int, int&):
        mul     a0, a0, a0
        sw      a0, 0(a1)
 ret

store(short, short&):
        mul     a0, a0, a0
        sh      a0, 0(a1)
        ret

store(unsigned char, unsigned char&):
        mul a0, a0, a0
        sb      a0, 0(a1)
        ret

store(signed char, signed char&):
        mul     a0, a0, a0
        sb      a0, 0(a1)
 ret

square16(short):
        mul     a0, a0, a0
        sext.h  a0, a0
        ret

square(short):
        mul     a0, a0, a0
 ret

square16(unsigned short):
        mul     a0, a0, a0
        zext.h a0, a0
        ret

square8(unsigned char):
        mul     a0, a0, a0
 zext.b  a0, a0
        ret

square8(signed char):
        mul a0, a0, a0
        sext.b  a0, a0
        ret

square(unsigned char):
 mul     a0, a0, a0
        ret

square(signed char):
        mul a0, a0, a0
        ret

square(unsigned int):
        mul     a0, a0, a0
        zext.w  a0, a0
        ret
```
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJykV02PozgQ_TXFpdQRmI_AgUM6rUirnr3sjuZuwAleOThrm9A9v35koJOGQCbNRIggyn7vVZV5sqnW_FAxlkL4DOGLQ2tTSpUaeXxSjFdOJov39Nu3H39jIZmugKwN1prhsRYNkC2yt5ydDDYlq5AblKZkquGaYSNrUWBJzwyNRF4ZJYs6Z0hRszezalbgbsDdfC8Z7qUQsuHVAXNZMMzbmZZEVuL9wpTVBlshtWbavkVeacNogUBiCJ8PssikMBC-AIlLY04a_A2QHZBdH1pJdQCy-wlkl1D5_fU1fj0DSezlWy0Qud21BfJsL3fDK4N5nTEgsX18A5IgrG0EFTO1qvANgWw-7uDbEKxfuuTsFP1_TRU7eRMIiLcgz-hNgBxroUu-N4-B-FvwtxiMcM6SF6iNVJ-S2drGIJDofYj4juC_zCQ1wNGlVD1S9_gHWHXVLsUC85KqDnP46k90jpGX43Z5dm31os81mO_J7LpYNP1SlRspo8j8cp1DbOvRAcZTLXlY4zTeUrRBwZaLGtZ9IYiQ1WFCzOMQHy7TwbWWdmAVU9QwjabkeuRG4G6uFnQxK-x_1gjtj3p2WVO3vw8GNO2ALuTdDFDM9D0bWNUk0wV_DEKLgjdXlvbuTZEMrexKcsljjkELccMQTKZx9bje4YBE83Wb5Wvw0wAXSGxrl_Tf0pCq_dwuJriMrpylm0tw8CHc2OWcinkF2ZcVjPgfYL9fg3kFo0V6Nd4FLHb_UeJUaMSygGNK59CVvy74Zyf493pvLPsLXC1J9khV4nHjv7TIHqaZz-W3BZto41K9d0TddeO7vWzu5f9h-06R-kXiJ9RhqbcOXc_1XeI5ZRrvmRtmLIq8jGSZFzJC11EeJGsvJHtSxA5PiUtCN_IiLwn8wF2RYu_HQbIOAhrEdJ9A4LIj5WIlxPlod8UO17pmqRcEASGOoBkTuj0REFKxBtsoEGIPCCq1k56y-qAhcAXXRl9hDDeiPUr889e_2x8QvuCeclGr9gzwcWzAvVToE8x4u7E1_CR4Tg2XlVMrkY627tyUdbbK5RHIzvL0f08nJf9juQGya9VpILte_jklvwIAAP__FQeFBQ">