<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/101335>101335</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
IPSCCP causes constants to be inlined into unrelated functions
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
DaMatrix
</td>
</tr>
</table>
<pre>
Minimal example ([Godbolt link](https://godbolt.org/#g:!((g:!((g:!((h:codeEditor,i:(filename:'1',fontScale:14,fontUsePx:'0',j:1,lang:c%2B%2B,selection:(endColumn:1,endLineNumber:4,positionColumn:1,positionLineNumber:4,selectionStartColumn:1,selectionStartLineNumber:4,startColumn:1,startLineNumber:4),source:'static+int+create(int+b)+%7B%0A++++return+b%3B%0A%7D%0A%0Aint+a()+%7B%0A++++int+undef%3B%0A++++return+create(undef)%3B%0A%7D%0A%0Aint+b()+%7B%0A++++return+create(1337)%3B%0A%7D'),l:'5',n:'1',o:'C%2B%2B+source+%231',t:'0')),k:50,l:'4',n:'0',o:'',s:0,t:'0'),(g:!((h:compiler,i:(compiler:clang1810,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:'-O1',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+18.1.0+(Editor+%231)',t:'0')),k:50,l:'4',n:'0',o:'',s:0,t:'0')),l:'2',n:'0',o:'',t:'0')),version:4)):
```c++
static int create(int b) {
return b;
}
int a() {
int undef;
return create(undef);
}
int b() {
return create(1337);
}
```
compiles into the following instructions using clang 18.1.0 (x86-64) on all optimization levels:
```asm
a():
mov eax, 1337
ret
b():
mov eax, 1337
ret
```
I would expect `a()` to compile into a single `ret` instruction.
[If `create()` is not marked as `static`](https://godbolt.org/#g:!((g:!((g:!((h:codeEditor,i:(filename:'1',fontScale:14,fontUsePx:'0',j:1,lang:c%2B%2B,selection:(endColumn:1,endLineNumber:1,positionColumn:1,positionLineNumber:1,selectionStartColumn:1,selectionStartLineNumber:1,startColumn:1,startLineNumber:1),source:'int+create(int+b)+%7B%0A++++return+b%3B%0A%7D%0A%0Aint+a()+%7B%0A++++int+undef%3B%0A++++return+create(undef)%3B%0A%7D%0A%0Aint+b()+%7B%0A++++return+create(1337)%3B%0A%7D'),l:'5',n:'1',o:'C%2B%2B+source+%231',t:'0')),k:50,l:'4',n:'0',o:'',s:0,t:'0'),(g:!((h:compiler,i:(compiler:clang1810,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:'-O1',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+18.1.0+(Editor+%231)',t:'0')),k:50,l:'4',n:'0',o:'',s:0,t:'0')),l:'2',n:'0',o:'',t:'0')),version:4), both `a()` and `b()` are optimized as expected.
A brief look at [Godbolt's LLVM opt pipeline view](https://godbolt.org/#g:!((g:!((g:!((h:codeEditor,i:(filename:'1',fontScale:14,fontUsePx:'0',j:1,lang:c%2B%2B,selection:(endColumn:8,endLineNumber:1,positionColumn:8,positionLineNumber:1,selectionStartColumn:8,selectionStartLineNumber:1,startColumn:8,startLineNumber:1),source:'static+int+create(int+b)+%7B%0A++++return+b%3B%0A%7D%0A%0Aint+a()+%7B%0A++++int+undef%3B%0A++++return+create(undef)%3B%0A%7D%0A%0Aint+b()+%7B%0A++++return+create(1337)%3B%0A%7D'),l:'5',n:'1',o:'C%2B%2B+source+%231',t:'0')),k:14.495028780743068,l:'4',n:'0',o:'',s:0,t:'0'),(g:!((h:compiler,i:(compiler:clang1810,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:'-O1',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+18.1.0+(Editor+%231)',t:'0')),k:14.242101758504521,l:'4',n:'0',o:'',s:0,t:'0'),(g:!((h:optPipelineView,i:('-fno-discard-value-names':'0',compilerName:'x86-64+clang+18.1.0',demangle-symbols:'0',dump-full-module:'1',editorid:1,filter-debug-info:'0',filter-inconsequential-passes:'0',filter-instruction-metadata:'0',fontScale:14,fontUsePx:'0',j:1,selectedGroup:'a()',selectedIndex:10,sidebarWidth:250,treeid:0),l:'5',n:'0',o:'Opt+Pipeline+Viewer+x86-64+clang+18.1.0+(Editor+%231,+Compiler+%231)',t:'0')),k:71.26286946075241,l:'4',n:'0',o:'',s:0,t:'0')),l:'2',n:'0',o:'',t:'0')),version:4) seems to indicate that the unnecessary constant value is being added to `a()` during IPSCCPPass.
For context as to how this sort of code might show up in practice, I originally noticed it while experimenting with rust enums, as can be seen in the [following](https://rust.godbolt.org/#g:!((g:!((g:!((h:codeEditor,i:(filename:'1',fontScale:14,fontUsePx:'0',j:1,lang:rust,selection:(endColumn:1,endLineNumber:5,positionColumn:1,positionLineNumber:5,selectionStartColumn:1,selectionStartLineNumber:5,startColumn:1,startLineNumber:5),source:'pub+enum+E+%7B%0A++++A,%0A++++B(u64),%0A%7D%0A%0Apub+fn+a()+-%3E+Box%3CE%3E+%7B%0A++++E::A.into()%0A%7D%0Apub+fn+b()+-%3E+Box%3CE%3E+%7B%0A++++E::B(1337).into()%0A%7D'),l:'5',n:'1',o:'Rust+source+%231',t:'0')),k:42.98822142975516,l:'4',n:'0',o:'',s:0,t:'0'),(g:!((h:compiler,i:(compiler:r1800,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:rust,libs:!(),options:'-Copt-level%3D1',overrides:!((name:edition,value:'2021')),selection:(endColumn:1,endLineNumber:1,positionColumn:1,positionLineNumber:1,selectionStartColumn:1,selectionStartLineNumber:1,startColumn:1,startLineNumber:1),source:1),l:'5',n:'0',o:'+rustc+1.80.0+(Editor+%231)',t:'0')),k:57.011778570244836,l:'4',n:'0',o:'',s:0,t:'0')),l:'2',n:'0',o:'',t:'0')),version:4) [examples](https://rust.godbolt.org/#g:!((g:!((g:!((h:codeEditor,i:(filename:'1',fontScale:14,fontUsePx:'0',j:1,lang:rust,selection:(endColumn:1,endLineNumber:9,positionColumn:1,positionLineNumber:9,selectionStartColumn:1,selectionStartLineNumber:9,startColumn:1,startLineNumber:9),source:'pub+enum+E+%7B%0A++++A,%0A++++B(u64),%0A%7D%0A%0Afn+create(e:+E)+-%3E+E+%7B%0A++++e%0A%7D%0A%0Apub+fn+a()+-%3E+E+%7B%0A++++create(E::A)%0A%7D%0Apub+fn+b()+-%3E+E+%7B%0A++++create(E::B(1337))%0A%7D'),l:'5',n:'1',o:'Rust+source+%231',t:'0')),k:45.32548095317011,l:'4',n:'0',o:'',s:0,t:'0'),(g:!((h:compiler,i:(compiler:r1800,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:rust,libs:!(),options:'-Copt-level%3D1',overrides:!((name:edition,value:'2021')),selection:(endColumn:1,endLineNumber:1,positionColumn:1,positionLineNumber:1,selectionStartColumn:1,selectionStartLineNumber:1,startColumn:1,startLineNumber:1),source:1),l:'5',n:'0',o:'+rustc+1.80.0+(Editor+%231)',t:'0')),k:54.67451904682989,l:'4',n:'0',o:'',s:0,t:'0')),l:'2',n:'0',o:'',t:'0')),version:4).
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzsWl9zGjkS_zTiRQWl0fx_4AFwvJWqZO261O09a2Ya0EYjcZIG2_fpr3pmwAzYCWS9SWqDy4WZVqtbanX372eBcE6uNMCUxHMS34xE49fGTm_ER-GtfBwVpnqafpRa1kJReBT1RgElPCPx_DdTFUZ5qqT-TOIbwrO19xtHwhnht4TfrrrxibGrVhCu2qEAZ_Ps9Yc1CWelqeBdJb2xhC9kO5otpQItamif0oDwlPDF0mj_qRQKpUHUC_7t4P6xU2Od2p84TPhCCY2-SsJjPu9fFg4UlF4a3fkBXS2MamrdzwFdfZAafm_qAiwJZ-hlY5zEGQPFnfBEe-_gkxfWD-YMh05nnk54SS_HAdPYsg-O88LLkvC51J7weWlBeCA86x6LdgJuP8UXNmsf-l8LvrG604rD3Xic3uzesVlnRbSn9bqhTqvRFSwPLb3gab-8Xjn_iufiK55PDQdhmL5ktxMuVBe1uMsVPUgw0z0tDjNm3se6E4S9pj_MuLyz_JmEs5g9u4gGLtjARfeA9cNesLZ4uUzqjVRwUCR7STgrMdmDLEBrS6k82K42s2LgvZBa2KfBnjvRXfEnlH4wUJq6Bu3vtHoa2KigaFYLoZQbqFdQC71SMNSVFjN-C24ghkcoGz8sbqk9qIGWkoUV9mlhqqFRb2U9mLoFWxgHN90KpF4dh3OpxMr9IeHhbgP6zVuKkoU7OCx0aDZY5v2mx3e79NqCtbKCY-0Le1JwUU86bTzn9qTgzJ4UHPWk4AuFdlwF88csGScR1m8bWz4PskkwYW25ZTtU2Jde_j2q72Dx_KtGXpq8Beu604x6WTijhN0QNiMJ637LvoO10q6FU6k9PWzfFJs3JWmvRSmlXbujBQl7IUlv-jftK87qm_VwIg50LTc8NXfalL9gvnjJ_LGhXRM-tbMLAO0j0jcxhys01K-BLo1S5kHqFZXaedu06elo41DUpgntkgS5yS5_cmo0FUpRLL1a_k_gJKpgC22fOg6_cHUn2SFbOHveDP7UZtv-BfFI-IK2--kULPjDkBQXG-h_nu3sFnVo9j19MI2qKDxuoPQUl9w7Shj1hvZh66ImKMYGyVrC0GzCDkM3ObRL4vn7Jertj6q3KR3VxtNa2M9QUeFQp6cWCfuVKN_P3l4JT69M78r0rkzvyvR-dCu6Mr0jpreghfHrI7QWukJJcSCxsOMpHdZ2KA_VAKpntLASllQZ85kKT5-vYfC_fvrhwx8f0QrdyA0oqYFuJTz8U5E6O7c8sm8oj-zS8sjORerr5cxPBNlBNInymPEszVgahSzJrhB-hfArhP8YCA-iCY94wII0zmIWxTz426rRbPx9D5KYWM9FiQe-1GZcSVcKW423QjUwRmxzaPDQ-65-f98D36vROKywsXuqC6OGJVU19Wa8bJQa16Zq1LC2oI2jrPoj7BrEuC3ksdRLM7DUj0pdGu3gvw1oL4Uab4RzR2W819zfC4xr8KISXgz1LiuyLiWh-s2aZtNp7PEoPRh_rytAC23Tc7KCQtj_yMrj8fCWzXkL0O6anZ2SdxtEod3REj7H08Wme2GmLgifL_Yd-9wEToMJT3iW5FHC0phHb5K_b0xJqQOoHfWGSl3JUnigfi18e8_WaA0lOCfsE8X08UJ72lYAlY4WIPWKiqqCCqcPKW3VWBx9f_9psbi_F84NiOutsWjQw6NHcusNXZsH6tfSUWesp2ZJkVbSWq7WnjocbDZUarqxovQS8XxB31Nj5UpqodQT1QbFFZWePqylgpYwW4mQh-t4kH5NbeM8Bd3UDqcLR0uhaQEYAY3Gccsknu9vF19iymhj8hPTZVzf5RgUX4RB8TdjUHwmBsWnPHnTFITP8fQIn797lVDO2lo9EmJJN0m0a_-nZLUzvtQDrjxGDoqe5uYR3y7e7QQvu36HCw1ns4nU3uysDHwduCn-qpv5M1d-xeH5jPlfbdJcRpUjPsmzjPMg4nkax0HyY5iyDTJ2ZcnfgyX3neWr9Bgfx-3HKpjHN18gy1nf85DPYKviixZbemxjPDjMuV-ZVWPoS6Qok4x9831YOmFBkKZZnDIeRVn4JgX71mSExPP-a0Xu10Hf_KJczb85V_MzczX_zui7HFwAdR7RyQAdX3cKlyP668b2y9ih-aUofr7p-eFt1_dE7ngS8jjKWB6HQcqCv--_6ityX5H7itx_GbmjSZJGcZCzKMl4nuU_IXBPRtU0rPIwFyOYBinnURilLB-tp0mSAAvjsMpjCDJWCA4sS5KEp2G0XMb5SE454xFLwyCIWMzySZSIMEsylqZLwZMwJRGDWkg1UWpbI-qPpHMNTAMWhGE8UqIA5dpvLHOu4YG2o4RzEt-M7BQnjYtm5UjElHTePZvx0iuYdlcUtBSNA7e_5mgvJQqgUiupoeq-RdNoC0p4qOiy0d2XjkaNVdOjD9OkXzfFpDQ14bforP8z3ljTti1-2y7REX7b72E75f8PAAD__0g3fzQ">