<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/54740>54740</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            LLVM 14: optimizer regression wrt. noalias attribute for return value
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          kinke
      </td>
    </tr>
</table>

<pre>
    Input IR: [current3.txt](https://github.com/llvm/llvm-project/files/8410680/current3.txt)

With LLVM 13 (`opt -O3`), the `_Dmain` function is perfectly optimized to:
```LL
define i32 @_Dmain({ i64, { i64, i8* }* } %unnamed) #5 {
  %.frame.i = tail call noalias i8* @_d_allocmemory(i64 4) #1
  %x.i = bitcast i8* %.frame.i to i32*
  store i32 0, i32* %x.i, align 4
  %.gc_struct.i.i = tail call noalias i8* @_d_newitemT(%object.TypeInfo* bitcast (%object.TypeInfo_Struct* @_D28TypeInfo_S3mod9test14846FZ1S6__initZ to %object.TypeInfo*)) #1
  %.vthis.i.i = bitcast i8* %.gc_struct.i.i to i8**
  store i8* %.frame.i, i8** %.vthis.i.i, align 8
  store i32 1, i32* %x.i, align 4
  ret i32 0
}
```

With LLVM 14.0.0, it's a meager and invalid:
```LL
define i32 @_Dmain({ i64, { i64, i8* }* } %unnamed) #5 {
  %.frame.i = tail call noalias i8* @_d_allocmemory(i64 4) #1
  %.gc_struct.i.i = tail call noalias i8* @_d_newitemT(%object.TypeInfo* bitcast (%object.TypeInfo_Struct* @_D28TypeInfo_S3mod9test14846FZ1S6__initZ to %object.TypeInfo*)) #1
  ret i32 0
}
```

The thing is that `_d_newitemT` allocates garbage-collected memory, which is cleaned up at program termination, incl. destructing `%.gc_struct.i.i`, so the store to `%.vthis.i.i` etc. cannot be elided.

Removing the `noalias` function attribute from `_d_newitemT` 'fixes' the testcase. I haven't found anything related in the LLVM 14 changelog.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzdVdtu2zgQ_Rr5ZRBBV1t-0EMbo0CALBZog12gLwZFjSRuKdKgRk68X79Dyk6cywLtawHDokjqnJkzt8a2p_rOHGaCu69R_gmi8rOcnUNDeUxPFJW7KKsGosPEp1H2hX-9omFuYmlHftH6eHncHJz9ByXxa6c0TvysijRZVwmvXoFm2yjZRcmn5f9vxoP7-7_-gDQHZovWiT0Q3PyZ88rfzW6BBgR-2-9GoQwvoJuNJGUNqAkO6Drm1Sfg79So_sUWyHp7FxZGCb_7-2WjxU4ZBJVnEBUXTObdfAa1Ljzd1VJVUcaybHbnB1tYzsaIEVu2jd_y0l9fkMGfxp3j01hBlO-AhNIghdZgrNBKTBdAJm73vG_liKN1JzaAGaE4g6ZXgE9nrEaRFBNdEK6YyHpvePfy1UTWLR4mwYlweMbyG2xKb5jsyupe7idys6RY_ZTtBh8V4fjglctK2_jQxw-nA96ZzvprF3M_vLD_FrgucLusejnJR9tuCSdKi6pYf_meflvv98oo-u4d_ZAspMk74eIjDWp69ue9fq999ipWAeytjm8Ff06My_4z0Yu41ftYpD8TC4d0DtySvZx5r9P4f2qniJN4CTaruplAwIiiRwfCtKDMkWna36cmfrt0_aWwP3A75IwzvW9_NAgKzfHKSe6QQUfBdkEvXMOZcCOt1mwId8eLvLfwOCg5eBSpURg-mg_AcNzKe44YELpRGeE7bQi8kTqGFhflPX9o0W-iEfZuYbKhbS_p75VYrr6UChuJJGOOmTGWoEFAzlFs42tXv7KpR890HgHn2L6aAYLIqWYmhM7Z8QMtuCA69eRH0ibg-GhxsDGGOxjEEdm5DUFnZy4VYU6LtA618GIpE745VxnIQZgete3jVVvn7TbfihUp0lifb_gxehlEjlF6h9PkzXx0FD_n5pXN1t-i2RngIp1xNTtd__LIVdM0h5lbFpsiWQ11l4iikmWaFFtEiUXeZk2a5ZiVsl1322qlRYN6qnniR1nGakGA4DUP_ZWqsyTLkiIp0qJcl3lcFCUKWaWi2pT5Vq65DJCbhI69HbF1_crVwaRm7ic-1Gqi6eVQsAS9QQx0jC9mGqyrfyjzA1eBuA6G_weIxpFc">