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

    <tr>
        <th>Summary</th>
        <td>
            [M68k] Inefficient function call/return sequences
        </td>
    </tr>

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

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

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

<pre>
    ```c
short bar(short);

short foo(short x) {
    return bar(x);
}
```
`gcc -O1` produces:
```asm
foo:
        move.w 6(%sp),%a0
        move.l %a0,-(%sp)
        jsr bar
        addq.l #4,%sp
 rts
```
while `clang -O1 -fomit-frame-pointer` produces:
```asm
foo:
        suba.l  #4, %sp
        move.w (10,%sp), %d0
        ext.l   %d0
        move.l  %d0, (%sp)
 jsr     bar
        ext.l   %d0
        adda.l  #4, %sp
 rts
```

The m68k abi does not expect byte or word parameters or return values to be extended at all, thus both `ext.l` instructions can be omitted, as GCC (and the Sierra C Compiler) does.

While clang puts the {sign,zero}ext attribute on all i1, i8, and i16 parameters and return values, removing that attribute does not eliminate argument value extension:
```asm
foo:
        suba.l  #4, %sp
        move.w (10,%sp), %d0
        and.l   #65535, %d0
        move.l  %d0, (%sp)
        jsr     bar
        adda.l  #4, %sp
 rts
```

The following optimizations can be performed on the sequence, in rough increasing order of difficulty:
 - Omit frame pointers by default (#75013)
 - Using quick variant of move, add, and sub instructions
 - Merging stack adjustment with move, using predecrement addressing mode
 - movem optimization (not relevant here) 
 - Remove unnecessary extensions of sub-register-width values
 - Detect and perform sibcall optimization on entire sequence (which GCC performs for `-O2` and greater)
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzEVl1v6jgQ_TXmZRSUOCSBBx5uQaz24arSfmifnXiSuE3s1B_Q3l-_GhMKdNvVSvdhIwTBnjkzc-Z4EuGc6jTilhUPrNgvRPC9sVu9np6GRW3k25aV6fnTsHTP0m-uN9ZDLSzj63jP-IblD-fNW5PWmIsJvDK-AVbNVgAAFn2wesZ5vcOo9vPNJfL7365pIHnMWJnCZI0MDTqWf_tgLdx4XqEELrswX6M54vIEJeNrxgs3UWC-Y7wQ6SeGA5x3-C65dbgzfHI2VnG3KKR8id756gzvptnAevdpdadeDQhE8yB0R1VC0ppR-aS1YsRkMkp7tD9Rugu1WA5wSQpus7pnh_F1lr7nHRkia_mBInz1hPfZ1szevBXdP9JHvNH1D-7-BVZI-WUJXxF7_v6jRxjL9TOIWoE06EAbD_g6YeOhfvMIxsLJWAmTIL49WkdLs0yPYgjowBuokRJELVGC8CCGgRLxfXBQG99TB2MB1Cilnbeh8cpoB43Q5Ewt9SjJSTj4ZRepEVqC7xF-V2itgB3szDipAS0dG8p2eVvLX1EqZ51MwbvoyqoHOsmM736gNaza46sH4b1VdaDqNKUKKqPAah3DawkqK28LpqW7isnO4miOSnfge3ELeWVxUKPSwiMI24URtT97n4lyyuj_W6lCy1lSeVkUefGF2X9Q7c2h_1S8P6fQ1gyDORHXZvJqVD_EnXYmtK2xI0pqJzXd4UtA3WBsqgZrQteD0o1F4SKKlWjBtCBV26omDP7tSnYCj6PyEMcLzOPFQf0GElsRBn-uPq-KNMuvBCTwZ4R-Cap5hqOwSmhPIYi8KCspL-pyob47A-8Q39F2BOK8aJ5ByKfgfNTNSfn-HSnEQJNFiY3FuC-ktOji-mgkvgOSy3hHGmVP4rQ44JFS7NFifApdfH4jXSMErbFB54R9uwrWUUUu1InFTjmPNjkp6fvLqbhA7NHT_KBa596AU3VDJ-0uF6MBtVf22jFK79Srpo8jYHZ20BpLEyR55DQ_CLezKHwcBAu5zeUm34gFbrMq41WVrop80W9rvsqRl21VVJtNXm6wyOQmlat8tcqyjZQLteUpX6WrLM2qfJXly7bMsWyboqw266zJOVulOAo1LIfhOC6N7RbKuYDb9TpP08UgahxcfEPgXOMJ4ibjnF4Y7JZ8kjp0jq3SQTnvrihe-SG-Wnwv18-s2MOvGkmIinrZBh1lAU0cood58FwYcotgh23v_RQfdPzA-KFTvg_1sjEj4weKMv8kkzVP2HjGDzE3x_gh5v53AAAA__8Djp3m">