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

    <tr>
        <th>Summary</th>
        <td>
            SimplfyCFG removes needed path of computed goto
        </td>
    </tr>

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

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

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

<pre>
    We have determined a case where required code in a computed goto flow is removed incorrectly. The included source has been cut-down from a more complex example and appears to be the simplest we can create to reproduce the fault. In the code the [0]th part of the computed goto is removed and replaced by the [2]nd path of the goto (can be determined by the the constant -0XDEADBEEF being absent from the assembly output). 

It appears the commit 
@
> commit fc6bdb8549842613da51b9d570b29e27cc709f69
Author: XChy <xxs_chy@outlook.com>
Date:   Sat Oct 28 17:10:20 2023 +0800

 [SimplifyCFG] Reland transform for redirecting phis between unmergeable BB and SuccBB (#68473)

    Reland #67275 with #68953 resolved.

introduced this regression. 

Small.CPP: '-S -O2' will reproduce. 
```
#typedef unsigned char uint8_t;
typedef unsigned short int uint16_t;
typedef short int int16_t;
typedef unsigned int uint32_t;
typedef int int32_t;
typedef unsigned long long uint64_t;
using u8    = uint8_t;
using s16   = int16_t;
using u16   = uint16_t;
using s32   = int32_t;
using u32   = uint32_t;
union u128 {
  struct
  {
    uint32_t  w0, w1;
    uint32_t w2, w3;
  };
  struct
  {
    uint64_t d0;
    uint64_t d1;
 };
};
namespace IDX{
enum _enum_t : u8
{
  x0 = 0,
  x1,    x2,
  x3, x4,    x5,

  Invalid,
};
}


template< typename T >
union eState_t
{
  struct
  {
    T x0, x1, x2,
      x3, x4, x5;
  };
  T m_r[IDX::Invalid];
};

using Pack128 = u128;
using eState128 = eState_t<Pack128>;
struct State
{
  eState128  sdta; 
};



void qaz(uint8_t *mem, State &__restrict data){
  uint32_t switchval = ~0;
 data.sdta.m_r[(IDX::x5)].d0 = data.sdta.m_r[(IDX::x3)].d0;
  switchval = data.sdta.m_r[(IDX::x2)].d0;
  static constexpr void *switchdispatch[] = {
 &&L10,
    &&L20,
    &&L30,
    &&L40,
  };
  goto *switchdispatch[switchval];
  return;

L10:
  data.sdta.m_r[(IDX::x3)].d0 = 0xDEADBEEF;
  goto L200;
L20:
  if (auto reason = (data.sdta.m_r[(IDX::x1)].d0) == (data.sdta.m_r[(IDX::x0)].d0); (data.sdta.m_r[(IDX::x1)].d0 = (0x005b << 16)), reason) { goto L100; };
  if (auto reason = (0 == 0); (data.sdta.m_r[(IDX::x3)].d0 = (int32_t((data.sdta.m_r[(IDX::x1)].w0) + 0x5d00))), reason) { goto L200; };
L30:
  data.sdta.m_r[(IDX::x1)].d0 = (0x005b << 16) ;
  if (auto reason = (0 == 0); (data.sdta.m_r[(IDX::x3)].d0 = (int32_t((data.sdta.m_r[(IDX::x1)].d0) + 0x5d40))), reason) { goto L200; };
L40:
  if(auto reason = ((data.sdta.m_r[(IDX::x1)].d0) != ( 0 )); reason) { (data.sdta.m_r[(IDX::x3)].d0 = (s32)((s32 &)mem[(u32)(((IDX::x5)) + (0x398))])); goto L200; };
L100:
  data.sdta.m_r[(IDX::x1)].d0 = (0x005b << 16);
  data.sdta.m_r[(IDX::x3)].d0 = data.sdta.m_r[(IDX::x1)].w0 + 0x5ce0;
L200:
  if(auto reason = ((data.sdta.m_r[(IDX::x3)].d0) == ( 0 )); data.sdta.m_r[(IDX::x1)].d0 = ((data.sdta.m_r[(IDX::x3)].d0) + 0), reason) { goto L300; };
  data.sdta.m_r[(IDX::x2)].d0 = (uint32_t)(uint32_t((u16)((s16 &)mem[(u32)(( data.sdta.m_r[(IDX::x3)].d0) + (0xa))])));
L300:
 return;

}
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzMWElv67oV_jX05iAGRWrywgs7TooAF3gXTYDeXUCRx5b6NF2Sip0u-tsLUoOnJHDaLh5gKBLPwO98_DhFGFPsasQlidYk2sxEZ_NGLx9LUeFL086yRr0v_4GQizcEhRZ1VdSoQIAUBmGfo0bQ-LsrNCqQjUIoamdtqrazqGDX2Aa2ZbOHwoDGqnlDBUUtG61R2vJ9Di-5i5Flp1CBaTotXXcGMsQaZGfvVLOvYaubCgRUjUafvMQD4EG4FxC1AtG2KLQB20CGYHMEUzijsbBHkKIGqVFYdA4aW92oTvZ-W9GVdg5Ptf_yJbgXEq0piTY2h1ZoC812MJ_WdVKSw6CxLYVEBdn7mIKRaFMraIXNxxQ-krDUYcrOSB3C-n5qY0Vt4Y7-2jysNuuHh0fIsKh3IDKDte0Jca7CGKyy8h2azradJWwxB0JXhK6e7JGWHntVWG8LqXvyh7FtK-NMZWkULtKQxQFXIgqyhYoSmrEFskTKhC628YLQ1corhPAV_LrP34Hw-8PBvMr8nYS06WzZNH_OZVMR_kDoaiMsOleAZ2HhD2mBpRAkhK8CSviKUWCUcSBsTVNKe9SOtmc3dsX2_f7xbyTawN-xdPxaLWqzbXQF20aDRlU4DTlO2rxwgrF7p5murlDvUGQlwnrtR-a5k3K9dqwTxuM0TDhhi6E7gDG_syUsiWBf2Nx_pYuIg0bTlG-o5n1AUdtePQps7hWw02hM0dQj78-VKMv5_c-frnTCkrtnuPuDEZbAvijLo_x6_5gOP7oijNv3FhVuoav9xFQgc6GhK2qbvlrC14SurlxM3mgLRW29XxBfOh7tH5qnPGMGzi5dhthrwxRbNvWuf7gMcTg6dsaNT5c6mgnfnFfSG00QD8YzeEPkZOw-sBrOjqFHdEPoZDwvqquLpoYuYCmQZO0lYKzupPWvYxNMUQB7Stg97IM-_sy2Z97ERxNJNuPrp0kdO6Doeba-cexiSjO91KJC0wqJ8LT51efDuqvg1T1fLTitdamP6NMeqK_dQe-_A4cUAA5sauKu6RCOhqg3eNtT_SbKQg0tp3C8g9MAVm3pJ_g9OD04hPAC_czvScZnKyy-2hNYH7LyAgdPcY_xCNCjOgF5iD7g-QWqV02iteOFrwhfjdCjSw4nafwU8k8__k4cAUtPZdNjHq1TBfx-CHL1efe-EvAOJwUe48EoKwhfwwWG_vfWFAp-i38Rlg6TAghbVVi5Qn0OICx-fdVorC6kBSWscMvW0M8kQbMvrMzfROkB_3vUlXOfOwTznh7C0okhN9ILEm3mqhfJl7588p2Ufdbjl8HsOtgKW8h-h8NDq8ETQdiqz6oK0wor8_5A4jsYKiYsJiz-EdCjOoYmdt3Er5vCqelEPMNufN35VOMkIwCNttP1NI4__CbmLTcS2M_Iw7ijn4H4wejAkatnyFts3aYlOn9qEaape0JY-mWHwZF0tnARtwTR0yCv2pt7GUHRA6VR5s4Ebk0IYufgfvcDeI8mWQ_1Br7e08H4tFo6FnErNn6FbdwC3BHgtrr2PXtsDfQQKUrHaj4tiF0U5ER4iz5uIhL-miSpM5LC_4Kk8ETsHxf2XSzBEAcUBix8fYHl-9QY7pcyj8YdO_yisnDLtQ_tTszXK-1AkR9ZvkgHVNHmCO8Tcvwc-X9JaFTQdyq_caaMCpB4XMP-53HlnyxjZ-P6TVq-2aer6gsx86sl7MbNcIQznUy9drqz-dcNC6hXXBB_pbibN_BTIYpLGY4K6cvyY3ex4w3Hv_HKMlNLrhZ8IWa4DBLOYh7GQTzLlyKmseRJGGCSZnJBQxFkaUi32ZZzsQjCWbFklIVBwOIgYpyHc0YlTZlMZCK2KWOShBQrUZTzsnyr5o3ezQpjOlwGQZKwcFaKDEvj_2vBWI178FbC3H17ppcu6C7rdoaEtCyMNcc0trAlLv0F098vhxu8gRpR4fGqfnbTn3W6XObWtsbxwh4Je9wVNu8yf9Vljy778Oeu1c0_UVrCHj0mQ9jjAPptyf4TAAD__z164S4">