<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/108904>108904</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
ppc64el miscompilation on signed integer argument passing
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
tpearson-ssc
</td>
</tr>
</table>
<pre>
On all Clang versions after Clang 16, llc miscompiles a simple C++ test program testing integer argument passing:
```
#include <stdio.h>
#include <math.h>
int main() {
volatile double result;
volatile int exp = -53;
volatile double base = 3635833917682146;
result = ldexp(base, exp);
printf("Result: %f\n", result);
return 0;
}
```
The program should output `0.403659`, but on Clang 17 and newer outputs `inf`.
On calling ldexp, `r4` is used to pass `exp`. Unfortunately, only the lower 32 bits of `exp` are passed in `r4`, leading to an incorrect result. This is due to incorrect backend code generation:
```
8bc: 60 00 3f c8 lfd f1,96(r31)
- 8c0: 6e 00 9f e8 lwa r4,108(r31) <-- CORRECT (sign extends values for signed 64-bit integer parameter passing in r4)
+ 8c0: 6c 00 9f 80 lwz r4,108(r31) <-- WRONG (zeroes upper 32 bits of parameter in r4)
8c4: 9d fd ff 4b bl 660 <0000001b.plt_call.ldexp@@GLIBC_2.17>
8c8: 18 00 41 e8 ld r2,24(r1)
8cc: 70 00 3f d8 stfd f1,112(r31)
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyEVU1v4zYQ_TX0ZWCBImV9HHRYK5tFgaIBgi16XFDkyGZLkQJJZZP99QVpxU72ozUEyRLnzTzOmxmKEPTJIvbkcCSHu51Y49n5Pi4ofHB2H4LcjU699A8WhDEwGGFP8IQ-aGcDiCmi3z6WNWEDGCNh1kG6edEGAwgIel4MwkDYkbAjRAwRFu9OXsz5RdsTaBvxhB6EP60z2ghLImZPhH8g9I7Q13tNt-vyyri20qwKgfAhRKVdcSb8489WZxHPbxfzXdsIs9CWsJawDkhzvHyH7ffkjIjaICi3jgbBY1hNJPz41skPxskrPi9A-B3sD_xq_iuvowiYjXnNDy3nXdnULSur-vtAl_DZ1Ch8XghrEzalPb91P4RavLZxyttjjxv5D0DYYSKHwRLGEnbb1Rv4eyce4-ot0Ntyc_dzPfL98xmv-oazW40Ct8ZljUBqSouK8vrQJQwbYFwjOPtaQA0Iq8DiV_QbJCSMthOpafE2xoMFKYxJpbNlYkiWviI1BR1gDaggulxGaSGZ1LQA-NNOzsfViojmJaGcNS8QzwjGpbCcwahjADfdYCA8Zk-oQNtrnFztKFQiER0IC9pK5z3KuKW0APh81iERUismo5vFKOQ_aBVIpxBOaNGLqJ3974IHaEeZFISaAqXAJ5Bt1shMCqaSsKGrCWs9L5OcGbOHVtILBhOmmwA3zFdx0bcibChp-waYLz7s9zA8PD5-HD4DYW2aFIDPEa0K8CTMigEm5yFPEAV1tR91vLbyIryYMeZ_uZdT7lKo7rU9jzdmcmPW0o3Zt_9n9tfjwx-fEq9v6B0GWJflvYA3Bu8jA7SyynE7BSlvE1RjjjeaS8XXNU0zg-ZfORaLiV9SvRWXYqsoqein3387Dl9YUTbXoZIct9lx2aYNVeU11Qp86jVWpa2U76hcBG1eBVUXRIiTSs8salmy71S9FsZO9Vx1vBM77MuG1QfOedvuzv3YtSOXUk68kx1FVIw3TTvJqZa0qhTudM8oq2hXNpTymrWFKstSlg09TLJVzaRIRXEW2hTGPM2F86edDmHFvqRtR6udESOakA8Oxix-hbyaZsrhbuf7BNqP6ymQihodYri5iToa7JdF1hWa22mRGyCNg62gfnUo7FZv-nOMS0jdwu4Juz_peF7HQrqZsPsUZ3vsF-_-RhkJu8_sAmH3G_2nnv0bAAD__7u8A58">