<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/131129>131129</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[clang] Inconsistent codegen when using -fcomplex-arithmetic=promoted
</td>
</tr>
<tr>
<th>Labels</th>
<td>
clang:codegen
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
Maetveis
</td>
</tr>
</table>
<pre>
Clang does not consistently generate code when `-fcomplex-arithmetic=promoted` is used:
- Division of a float value by a real value should not cause promotion, but it does
- The divide and assign operator should cause promotion, but it doesn't (uses Smith's algorithm instead)
[See reproducer on compiler explorer](https://godbolt.org/#g:!((g:!((g:!((h:codeEditor,i:(filename:'1',fontScale:14,fontUsePx:'0',j:1,lang:c%2B%2B,selection:(endColumn:2,endLineNumber:16,positionColumn:2,positionLineNumber:16,selectionStartColumn:2,selectionStartLineNumber:16,startColumn:2,startLineNumber:16),source:'float+__complex__+div(float+__complex__+a,+float+__complex__+b)+%7B%0A++++//+Behaves+as+expected%0A++++return+a+/+b%3B%0A%7D%0A%0Afloat+__complex__+div_by_real(float+__complex__+a,+float+b)+%7B%0A++++//+This+promotes+to+double,+but+it+should+not.%0A++++//+Optimizations+will+remove+the+redundant+promotion+/+demotion%0A++++//+but+clang+should+not+generate+it+in+the+first+place%0A++++return+a+/+b%3B%0A%7D%0A%0Afloat+__complex__+div_assign(float+__complex__+a,+float+__complex__+b)+%7B%0A++++//+This+emits+Smith!'s+algorithm+instead+of+promoting+to+double%0A++++return+a+/%3D+b%3B%0A%7D'),l:'5',n:'0',o:'C%2B%2B+source+%231',t:'0')),k:31.1545988258317,l:'4',n:'0',o:'',s:0,t:'0'),(g:!((g:!((h:compiler,i:(compiler:clang_trunk,filters:(b:'0',binary:'1',binaryObject:'1',commentOnly:'0',debugCalls:'1',demangle:'0',directives:'0',execute:'1',intel:'0',libraryCode:'0',trim:'1',verboseDemangling:'0'),flagsViewOpen:'1',fontScale:14,fontUsePx:'0',j:1,lang:c%2B%2B,libs:!(),options:'-O0+-fcomplex-arithmetic%3Dpromoted',overrides:!(),selection:(endColumn:1,endLineNumber:1,positionColumn:1,positionLineNumber:1,selectionStartColumn:1,selectionStartLineNumber:1,startColumn:1,startLineNumber:1),source:1),l:'5',n:'0',o:'+x86-64+clang+(trunk)+(Editor+%231)',t:'0'),(h:ir,i:('-fno-discard-value-names':'0',compilerName:'x86-64+clang+(trunk)',demangle-symbols:'0',editorid:1,filter-attributes:'0',filter-comments:'0',filter-debug-info:'0',filter-instruction-metadata:'0',fontScale:14,fontUsePx:'0',j:1,selection:(endColumn:1,endLineNumber:1,positionColumn:1,positionLineNumber:1,selectionStartColumn:1,selectionStartLineNumber:1,startColumn:1,startLineNumber:1),treeid:0,wrap:'1'),l:'5',n:'0',o:'LLVM+IR+Viewer+x86-64+clang+(trunk)+(Editor+%231,+Compiler+%231)',t:'0')),k:50,l:'4',m:78.48238448485434,n:'0',o:'',s:1,t:'0'),(g:!((h:output,i:(compilerName:'x86-64+clang+(trunk)',editorid:1,fontScale:14,fontUsePx:'0',j:1,wrap:'1'),l:'5',n:'0',o:'Output+of+x86-64+clang+(trunk)+(Compiler+%231)',t:'0')),header:(),l:'4',m:21.51761551514566,n:'0',o:'',s:0,t:'0')),k:68.8454011741683,l:'3',n:'0',o:'',t:'0')),l:'2',n:'0',o:'',t:'0')),version:4)
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzcWNuO4jwSfhpzY4Fi50C44KID29IvzT-92p6d25YTV8Azjo1sh2726Ve2A01o-qidm5VQwIc6uKq-r0yYtWKjAJYor1C-nrDebbVZ_s3A7UHYSa35YbmSTG0w12Cx0g43WllhHSgnD3gDCgxzgBvNAT9uQWFUJNO20d1OwtOUGeG2HTjRoHS9M7rTDjgqEiws7i1wlN6g5GaK12IvrNAK6xYz3ErNHN4z2QOuD5hhA0wOY7vVveTRE9ZbwFGr0ArRFa57h4ULzga9P7aAudgLDpgpjuN5sd55p7U5KntbkUJ07jCiZW_B4vtOuC2ic4uZ3OhwPCyUdcA4oguU-POgvLoHwAZ2RvO-AYO1wj4kQoLB8LST2oBB-RrRcuvczvow0FtEbzea11q6mTabMJFuwhJBtES0fH2wRemNT8E_uHDaILoSYbVshQTFOgijOUF0juiq1crdN0z6WZINE_-28M-nuC2J2375ZURD-r16RHNaDY-VBQlNCFawA4qvtOw7P6SIrkDxb0LB976rwXg9BaKrnbbCi4x2Hidfbj-ZuHfMuJHQeOmK6EuJqxsXfkX3phkCFAoP0erhYSjghwdEKy72PpRX1xiiK0Sr64t1sOBjNveP5CYMTp_b8Kkq2LI9WK_MP-BpB41HyaWAAdcbFW1GaW8gT4-q8_n6-Cu5efUkD_XhwcPpoyf62Bl-bIX3fUC4_-m0t6f7WkJUWPdenfCPCDtEK6Xd7HWldzsnOvEf5hPtVT4KKUMcOr0Hb2ILYch7xZlyJ_sBwkOEOBwnXrMS_WpClY9dQ7Q68tvRc6FOdlthbLApWQN_KlmRsP5k9Q2Zg044_z3Qm2eKUJFHjgtnH1iu0u1zrEPURsl-NxJ5ur4ajnkEpIxYzCMLqREn6ThanXNRNSA4TqQDyblzuUXU_BulNymZkTzLF2VJ8zIl82eD2RsG48DzdHJF9-oD3BzJ_5mZTzPpTai9B2d69duTsZAOTGwJZT1yphaKmcOIy-PUXf0LGjdaaHTXgXJ3Sh5GOjjU_WbFpLSj7Rw6pjYSxnuF8TTryel8Gp6g6d24pwjlQI52SVEbZg4rzcdKnRHdSHQPptYW1tEDoTaX0W0l29ifAh7vdqD-551Mitqepcsb1LtIOUHH9C5BtLp6pfGVfLrUxHLZgzGCw6XGN9oludYur3VL8mq3fL1Zvlx6KflS4Nq-UaskH0YqotVTWUyL7IxjES2HYo_8VB5vLScAL65jeDWgSZzhyGeoVXrKhW2Y4dNwS5z6O4_1YucuHSH3_XQhetu1c1xM7aGrtbwAQvBb8CFuEblT5pwRde8uUDOsDri8uhawORWq1ddWPf-aPmRy2oFjnDk23vc5NPx_1KQzACEDnpgfDdudE8QHi_Tbt59_I1r99S9EK88znqe_Ura-F69OTP9eNR87Up686EGeIOflLCtpWmZZmZV5lmbv9ybykd7kAaR7t_PXnstm9BlkXBb_54rvi5m6GxyPV5D3U_S5bGyB8VBbJ95-mRZKZjmZFyTPSU6yvCi-dmU4Jr8oZ2WWZwkh84wUZfpsM333OnJN5yBMvyS8B2MjH2SILiZ8mfJFumATWHrvyqKkhEy2y6QlGbCWpVCzhLRlUmQ1ny_qLC1oWpN2IpY0oXmSkpRQUuRkBouUzkvecsiagkGBsgQ6JuRMyn3n_-xOhLU9LElKCF1MJKtB2vBSgtLm2LU1hw0oRCnK1xOz9KLTut9YlCVSWGeflTnhZHinEWXzNf5LPb-2wIOm-Lqit0Jt8DtvLCa9kcuLf-rCbft61ugO0Vtvefia7owOlzF6G85kEb0djrVf0v8GAAD__-LADNg">