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

    <tr>
        <th>Summary</th>
        <td>
            Bad codegen after commit f9c2a341b94ca71508dcefa109ece843459f7f13
        </td>
    </tr>

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

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

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

<pre>
    We have an internal test which recently started failing due to bad codegen which I bisected back to commit f9c2a341b94ca71508dcefa109ece843459f7f13. Here is a somewhat reduced version of the original code:
```c++
extern "C" {
void printf(...);
void sprintf(...);
}
typedef unsigned __v4su __attribute__((__vector_size__(16)));
typedef long __m128i __attribute__((__vector_size__(16)));
__m128i _mm_max_epu32(__m128i __V1, __m128i __V2) {
  return __builtin_elementwise_max((__v4su)__V1, (__v4su)__V2);
}
typedef long __m256i __attribute__((__vector_size__(32)));
template <typename T> T zero_upper(T in, unsigned) { return in; }
void init(char pred, void *data, unsigned size) {
  unsigned char *bytes = (unsigned char *)data;
  for (unsigned i = 0; i != size; ++i)
    bytes[i] = pred + i;
}
char print_tmp[1];
void print(void *data, unsigned size) {
  unsigned char *bytes = (unsigned char *)data;
  for (unsigned i = 0; i != size; ++i)
 sprintf(print_tmp + i * 2, "%02x", bytes[size - 1 - i]);
 printf(print_tmp);
}
__m256i test17___trans_tmp_8;
__m128i test17___trans_tmp_7, test17___trans_tmp_6, test17___trans_tmp_5,
 test17___trans_tmp_4, test17_id3723, test17_id3728, test17_id3733,
 test17_id3736, test17_id3739, test17_id3741, test17_id3742, test17_id3744,
    test17_id3746;
void test17() {
  init(139, &test17_id3723, sizeof(test17_id3723));
  __m128i id3720 = _mm_max_epu32(test17_id3723, test17_id3728), id3731;
  init(240, &id3731, sizeof(id3731));
  __m128i descriptor = id3731;
  unsigned index(id3731[0]);
  if (index > 4 || id3731[0] && index)
    descriptor &= 8;
  test17___trans_tmp_4 = __builtin_ia32_extrq(id3720, descriptor);
  init(13, &test17_id3733, sizeof(test17_id3733));
  for (char id3734_idx = 0; id3734_idx < 78; ++id3734_idx) {
    init(16, &test17_id3736, sizeof(test17_id3736));
    init(80, &test17_id3739, sizeof(test17_id3739));
    for (char id3740_idx = 0; id3740_idx < 122; ++id3740_idx) {
      init(17, &test17_id3741, sizeof(test17_id3741));
 test17_id3739 -= test17_id3741;
    }
    init(119, &test17_id3742, sizeof(test17_id3742));
    for (char id3743_idx = 0; id3743_idx < id3734_idx; ++id3743_idx) {
      init(8, &test17_id3744, sizeof(test17_id3744));
      test17_id3742 *= test17_id3744;
    }
 test17___trans_tmp_5 =
        __builtin_ia32_pshufb128(test17_id3739, test17_id3742);
    init(192, &test17_id3746, sizeof(test17_id3746));
 test17___trans_tmp_6 =
 __builtin_ia32_pmaddwd128(test17___trans_tmp_5, test17_id3746);
 test17___trans_tmp_7 =
        __builtin_ia32_pavgb128(test17_id3736, test17___trans_tmp_6);
    test17_id3733 += test17___trans_tmp_7;
 }
  int id3732(__builtin_ia32_vec_ext_v8hi(test17_id3733, 0));
 __m128i id3718(__builtin_ia32_vec_set_v8hi(test17___trans_tmp_4, id3732, 4));
  test17___trans_tmp_8 = __builtin_shufflevector(id3718, id3718, 0, 1, 1, 1);
  __m256i id3717(zero_upper(test17___trans_tmp_8, 8));
  long id3716(__builtin_ia32_vec_ext_v4di(id3717, 1));
  print(&id3716, sizeof(id3716));
}
int main() { test17(); }
```
If you attempt to compile this code with optimizations using the options `-mavx -msse4a -O2 repro.cpp -Wno-constant-conversion -o repro.out`, and run the resulting binary, you will notice that the value output changes.
```
$ good/clang++ --version
clang version 17.0.0 (https://github.com/llvm/llvm-project.git d2b768bba301aa80e2874d3d935a721eb1148f29)
Target: x86_64-unknown-linux-gnu
Thread model: posix

$ good/clang++ -mavx -msse4a -O2 repro.cpp -Wno-constant-conversion -o repro.good.out

$ bad/clang++ --version
clang version 17.0.0 (https://github.com/llvm/llvm-project.git f9c2a341b94ca71508dcefa109ece843459f7f13)
Target: x86_64-unknown-linux-gnu
Thread model: posix

$ bad/clang++ -mavx -msse4a -O2 repro.cpp -Wno-constant-conversion -o repro.bad.out

$ ./repro.good.out
0000000000009c04

$ ./repro.bad.out
9a99989796959c04
```
@zhuhan0 this was due to your change, can you take a look?
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzUWEuP47gR_jX0pWBDoqjXwYdudxrZUy6D3aNASZTFjEQqIuV2z68PSD2sl3tnM0iADIRpmSx-_OpjVZEUVYpfBWNn5L8i_-1AO13K9px_duJ6SGX-ef6DQUlvDKgALjRrBa1AM6Xho-RZCS3LmNDVJyhNW81yKCivuLhC3jHQElKaQyZzdmViGPEbpFyxzNimNPtujDJZ11xDEWeYesRNY5LR0PWdKM9YQV0nZhmLiEf8uAgL1zvB31nLgCugoGTNPkqqoWV5l7EcbqxVXAqQBeiSgWz5lRvOhgTyXpDzhpwXFDj9kyH8ah7byu7GP0AYXxDGgMKh_SZ5Dk3LhS4Qjk6nE8Ix8uad6lkvCt_6F_3ZsJwV0AkreA5JciOqgyShWrc87TRLEoQjhKMkubFMyzZR_Eff6AYGs39G5BGwkuIKSVK7OOL_OdoEUNdJTe8JazoP29Ej8O8uwpfZRL9jhOOHRgAt010rIEnSjleai4RVrGZCf3DFDOZEh6gO4XhEXLXhL9UbncV-8JPOenhHOlY3FdUMkHcxyILWDL4h72_wDX6wViZd07AW4egbcGE4jos2eDy6ygXyXmEiaSOBC64RjrKSttC0ZsgFbAfCLznVdA4HhuVKxanPIiD8kn5qpgB5b0apTS_CsUX1JoBCtgtLbsc6hikHhF3zy85rqNvg50abYTSAnQ_5rxz5b3ao8cJYAt-uy-AmFzrRdYP8Vxf5b8vUsL0IR_8_IjySefKs99_MBbgPWoyw7-C7fblMohlMOIILRzD6zYMOtqi7oT5Gt6mxbpgkiW6pUMY8iTbpumMUGj477cGTdh_hy8Bwp5fMRvHcC7G3bohWDZ63AbTNwdouXjUQd92A1w3kAQ2w6AmWQdd32ZqwCKwhO91-coSDjWtmBaVZpVXPooDAVAdtt2Oja106_0w1S8Eq4c6AB4aYOAPDwWJObWx6wilnKmt5o00OeG_bKR5ZIXJ2f-D5r846ZoEXJo-sIZgCSQCFFxROxPsxhifCwQg4qyZzLjgwdKIZ-l7A9VpOmwinHk7YXbf_GohiK8wDd8V3XODt-npP19fbru9QQGyFsSYk4fl9VkXmbRcIo1klmbpWwfdgF-ywC56yCzbsJqTI2UGKnyKtN0KDtPaUOFtPp7YLuBgvXe37Nq4-nA23FIn7jCLZhPWCPxwNr6X93Jmpis4JuDvJ3teWXQb4Z0TydkTyJpFmIbDUyvtaq2iHKHlKlOwQXVZFbHfHlWLkiWJ7e4PxcA4O68xsVNkVqWsPX18Wd_wkgt0Y7zj9NBnIJhn2troZ7TXfmub5R74gvN4NYTPfV5OFf64RvV13JHq2IQdrpRaVykbTY0WXO_80apYHXOg-Hvvj_ILZjWWmtia3qOTbkngBZy32fNtzo31AxdaAmwPFyOcC2xjeO_es9gQTc0XF-qP-sC240Qjcv9nC6M7_W22V9pBl7c05YXHs3z164QtEG7L2PmJBgi_UJTkfWYYTmQXOeEge9ns32Oz37jrwpyU2C1xTc1EZTzuL48_iijLde_ufvxXwKTug2tyI9HATb3jFQJdc2SszfHBdgmw0r_kPqrkUCjplLvj2dt30LShwjjW93eFYK8UIheM_MLSsaeUpaxo4_iHkMZNCaSq0eRkv6Uc5WMlOG1b4AlTk0HbCwrdMdUbPK6Rc0PbT9BvCH7yqQEjNM8OUamt8o1XHQHa66bS5GogrU6ddtxEmcJUyR_g9q6i49gUajseB1nC3MV3T5wQ3PDknx2wCpdaNQt4Lwu8Iv1-5Lrv0lMka4fequo1_jk0r_8kyfbpyDTlOwyBKU-o5LqWRw3AUktzLY8-nIXZZ6rokKvr1tXN_o-2VaeS9wD0KkoAcO_FdyA9xrLjo7ser6Aa7smU0h1rmrDLWjVT8Pjj5pau_tFgG0K7YaqKU_u8k_dlvRf8dSXc8_SVFU7or6Anh9z3Jndm_OHPI83EL4JjGcRzFYRzE_mzYKjmI86PsSiqcvgh8UDV-y_uUXTtklsnEjAqbjZp-Z0ChkvI78t4P-dkEdkwP7OwGYUTcICbkUJ7jwM_9vCAsclKWeVnkRk7hhHHqxXHk0PTAz9jBnuO5joN9n5BTynBEiiinPs3yIssQcVhNeXUy0XCS7fXAlerYOXA9NzpUNGWVsh8yMRbsA2ynuaD7b4f2bCMo7a4KEafiSqsHiua6YufX2ZdKWmjW_tXPkoeurc5_LZQRfrcsFcLv1ot_BwAA__8CSFF6">