<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/57268>57268</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Opimization about structure
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
qincheng189231
</td>
</tr>
</table>
<pre>
I'm wondering why the llvm fails to optimize the following code (with -O2 ):
```
#include <stdio.h>
struct A {
float *ptr;
};
float data[1] = {0.1};
A struct_= {data};
int main() {
const float *ptr = struct_.ptr;
printf("%f\n", struct_.ptr[0]);
}
```
The expected IR code is:
```
@data = global [1 x float] [float 0x3FB99999A0000000], align 4
@struct_ = local_unnamed_addr global %struct.A { float* getelementptr inbounds ([1 x float], [1 x float]* @data, i32 0, i32 0) }, align 8
@.str = private unnamed_addr constant [4 x i8] c"%f\0A\00", align 1
define i32 @main() local_unnamed_addr #0 {
%1 = load float, float* data
%2 = fpext float %1 to double
%3 = tail call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i64 0, i64 0), double %2)
ret i32 0
}
```
But it fail to combine the reduandant load instruction in structure and finally get IR code :
```
@data = global [1 x float] [float 0x3FB99999A0000000], align 4
@struct_ = local_unnamed_addr global %struct.A { float* getelementptr inbounds ([1 x float], [1 x float]* @data, i32 0, i32 0) }, align 8
@.str = private unnamed_addr constant [4 x i8] c"%f\0A\00", align 1
define i32 @main() local_unnamed_addr #0 {
%1 = load float*, float** getelementptr inbounds (%struct.A, %struct.A* @struct_, i64 0, i32 0), align 8, !tbaa !2
%2 = load float, float* %1, align 4, !tbaa !7
%3 = fpext float %2 to double
%4 = tail call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i64 0, i64 0), double %3)
ret i32 0
}
```
is't there simply no optimizations currently available to handle this patten? Or am I missing any options?
```
%1 = load float*, float** getelementptr
%2 = load float, float* %1
```
Or am I missing any options?
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJztVsGOozgQ_Rq4WIOMgYQcOJBkW-pTS6u9tww24JGxWTCd7v36LRtPIJNMr2ZPu9KgKLFxuerVe1WOK80-iueA7Ht00YrxUagWXboPZDqOpHzrUUOFnJDRSA9G9OIv7pYaLaW-WONaM44Ckl-E6dCXFwLjQ5CUAT4HuAx22H-WKUmEquVsdySnyTChoy5IfvOr7nsy41wbVKJgf1zeIHgaqakB1-VgxiA52lfI79qf4cXWw2LLqKFBdoyD7AzBztYdjuJ76xItEV-9kdt3ZyWUQT0VChKF_G6x1VpN5gahC-jdRgvi1XwAjk3jHJGAZE2QnZQbnm62ZEcM0B2ZxzXTR6z-AXrw94HXhjP0_PuiiJhWER5KkWKbqUPaSl1RiSxb6H1JxLGWHZek8HvydDzYp8TL45CdEJWiVSi9evT4nVOpaypfZ6Voz9krZWy8xiHZYhg5kX1AUqKWGy55z5WxHApV6VmxyRbXd9Bs7LtX4GzJya6KhCC8GVjJNpDzK-Ro8nKBLG_UcHSD2ElLQXuIlkI0kVti6lU58AFf2Ou3OI-3tDPeCMUdDIi2KaEH_EB74G1pQYzYc0nZN5pOK18u2dWWONtm4O9rNYIDaF2m50ryjWniTA20NgIUcoFHckiPlDZEFEWOsxRfq9WtfS7RlSGvz2buxLFcO012qRdnGRzseMHo8rBvPNaRGy_hpy1wnMHMuLPK5lvrvrKs25Nq5GymilkRHY1CLcUntIKxb7l55AiMEGgFdHzYNK-d9MPD7FcH_T87qNw20T-wthLtGNtOHVvf_jtuqtoTtiXLbY5NRan9JXdd-4MOt_i3ZXLrZn_X0d81P3nY_Ol_ufmTn29-_w89wS3G2JaHXp5EP0Abq-uthdp-n1A9jyPAhyX6BvlTGxQo6qD37agTExqoMVwFyRN6GRHt0TPqxTTZmw5VH84dOILlh1D-XcX9TDWgh3E_hxryIt7tYpzhfUJCViTskBxoaISRvHgZrvwgCoqa9UgM51EWnTGDu0uQJ_i0cMubqwgOWJjY-6H_-TKM-ivcQGAKEGYOYjxle7LLw64gNN_VccNSsqsPLKvyNKkaktBqB_lUJAlBBy6nAooGTgHFL8i5sCdCdg5FQTAhOCcxJlmexVFDDjWlNeMZx_s9SaG2OJwKMrI4Ij224Vg4SNXcTrAoxWSmdZECQ63i3IUD_3Q2nR6LP-Fi2nHVxvmBJHHoEBQug78BGpwunA">