<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">