<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/75601>75601</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Missing optimization: @malloc call not conditionally placed inside if branch
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
0xdeafbeef
</td>
</tr>
</table>
<pre>
[Alive2 proof](https://alive2.llvm.org/ce/z/c3yvcs)
## Description
The LLVM optimizer does not move the `malloc` call into the conditional branch for a function that conditionally allocates memory based on an input parameter. This optimization is expected to reduce unnecessary allocations when the condition is not met.
## Steps to Reproduce
Consider the following C function `alloc_escape`:
```c
char* alloc_escape(int alloc) {
char* alloced = malloc(10);
if (alloc) {
return alloced;
} else {
free(alloced);
return NULL;
}
}
```
or more opaque rust version:
```rust
pub fn alloc_escape(alloc: bool) -> Option<Vec<u8>> {
let alloced = vec![0; 10];
if alloc {
Some(alloced)
} else {
None
}
}
```
## Expected Behavior
The memory allocation should be moved inside the conditional branch to ensure that it only occurs when necessary, based on the condition.
## Actual Behavior
The memory allocation is not moved into the conditional branch, leading to a pair of unnecessary allocations and deallocations.
Llvm version - 17.0.6
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyUVU2PozgQ_TXOpdSRMQGSA4d8dE6ZWWlndq4rYxfBK2OztklP5tePDKQTMh_StFoEqsrPVc_1ytx7dTaIJcl2JDsseB8a60r6VSKvK8R6UVl5jd6tVhdk0Dlra5IdCFs3IXSepFvCjoQd-eBfan1pl9adCTsKJOz4Lb6k14vwhG0IPRC6nZ4sJSyFA3rhVBeUNaP9c4NwOn35ALYLqlXf0IG06MHYAK29IIQGgeS05VpbQXIKgmsNygQ7uIQ1UkU4rqFy3IgGauuAQ90bEe0QGh4ew_QVBiwe0EOLrXVXqLhHCdYAN6BM1wfouOMtBnRL-Nwof0uPD5DKA37tUASUECw4lL1A6I1Bgd5z976DssbDW4NmnmsEGArEsPwJSZ8Cdj4C_42dsxF7dO-t8UqiG8Bqq7V9U-YM-3utJKfDzv-iF7xDktN4YI875HT8F-O3aLgjbAuzVWytTBhNhG2AFLsxGGbRKIGkB5gOhq0TGo88vcUCgKqBsPVPcKY_h6F35oY2W0qKA6D2-OOi2iHeUFE-b_kA-_Gf0-kZcyLh_eXGxvhpHbTWIdiO_98juN4HuKDzsVnTZwKjdzR1fQW1eaZwLDvdQmWtjuW_kPQV_hpbP91_QUHSfb8m6Wu0z8rUGGYUX1AQlpBsR0m6g4RGPT7xPIT_SNYn2z6R9TuGP1qDf0DXrGdfb3rYYcMvyrrHmCjySWl3YYBvbK8lVDgIXYIauvtXqg4W0Pje4ShoFcAafQUrRO8mjb3Lj7D9XdIzvOUs6a0IPdd_kLK6Dyb5uxkUE9DIZZRnsMCh48qBrX85I7iRIPHBMpsLJ31pb50ILwBJsaTLfHYKw3Mhy1Ru0g1fYJkUlOWrjLL1oilpsa7qTbpaVUW24jKrsxyTfFMUm4qt8rxeqJJRliYsyRKWFXS9FExmDKuUJ3UtxCohK4otV_p94i-U9z2WRZbTZKF5hdoPtwpjBt9gcBLG4iXjyrjmperPnqyoVj74O0pQQWP5QXkfuXqcslE7ZDUN_nHqR-7nk7zTXNxbR9UT_4ve6XJ-YZ1VaPpqKWxL2DFuP_28dM7-hyIQdhyS9oQdh6K-BwAA__-4sDix">