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

    <tr>
        <th>Summary</th>
        <td>
            clang optimizer problem
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            clang
      </td>
    </tr>

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

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

<pre>
    Problem with clang versions up to 19.1

```C++
#include <iostream>

typedef unsigned int uint32_t;
typedef unsigned char uint8_t;
typedef unsigned short uint16_t;

uint32_t mem_start[] = { 0x80008000, 0xFFFF8000 };
uint32_t ext_mem_start[] = { 0x01010000, 0xFFFF0202 };
uint32_t mem_end[]       = { 0xFF7FFF7F, 0xFFFFFF7F };
uint32_t ext_mem_end[]   = { 0x01010000, 0xFFFF0202 };
uint8_t mem_bank_en     = 0x3F;

bool add_ram_region(uint32_t start_addr, uint32_t size) {
    printf("add_ram_region start:%08x size:%08x\n", start_addr, size);
    return true;
}

void setup_ram() {
 uint32_t bank_start[8];
    uint32_t bank_end[8];
    int bank_order[8];
    int bank_count = 0;
    int region_count = 0;

    // get non-empty banks
    for (int bank = 0; bank < 8; bank++) {
        if (mem_bank_en & (1 << bank)) {
            int b = bank >= 4;
            bank_start[bank_count] = (((ext_mem_start[b] >> bank * 8) & 3) << 28) |
                (((mem_start[b] >> bank * 8) & 0xFF) << 20);
            bank_end[bank_count] = (((ext_mem_end[b] >> bank * 8) & 3) << 28) |
                (((mem_end[b] >> bank * 8) & 0xFF) << 20) | 0xFFFFFUL;
            bank_order[bank_count] = bank_count;
 //printf("b:%d start:%X end:%X\n", b, bank_start[bank_count], bank_start[bank_count]);
            bank_count++;
        }
 }

    // sort banks by start address
    for (int i = 0; i < bank_count; i++) {
        for (int j = i + 1; j < bank_count; j++) {
 if (bank_start[bank_order[j]] < bank_start[bank_order[i]]) {
 int temp = bank_order[i];
                bank_order[i] = bank_order[j];
                bank_order[j] = temp;
            }
 }
    }

    // squash adjacent banks into memory regions
 for (int i = 0; i < bank_count; i++) {
        if (region_count > 0 && bank_start[bank_order[i]] == bank_end[bank_order[region_count - 1]] + 1)
 bank_end[bank_order[region_count - 1]] = bank_end[bank_order[i]];
        else {
 bank_order[region_count] = bank_order[i];
            region_count++;
 }
    }

    // allocate memory regions
    for (int i = 0; i < region_count; i++) {
        uint32_t region_size = bank_end[bank_order[i]] - bank_start[bank_order[i]] + 1;
        if (!add_ram_region(bank_start[bank_order[i]], region_size)) {
 printf("nope");
        }
    }
}

int main() {
 setup_ram();
}
```
<img width="1669" alt="Compiler Explorer" src="https://github.com/user-attachments/assets/893dfa3f-b1cb-4155-ac5d-e9b0d30cf2f6">


</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy0V0-TqjgQ_zTxknIqJKJ44DCjctrDXrZqb1YgUeNCwiZhnvM-_VYIIP90fFX7ptSB0P3rP7_uJqHGiLPkPAbhBwj3C1rZi9LxVfFPu0gV-4r_1CrNeQF_CHuBWU7lGX5ybYSSBlYltAoG27cAoD1A783vGvnPDuAP9_GrmAiZ5RXjEJCdUMZqTgtADn1V-1Vyxk-wkrVbDAppYSWkJfhoAfl4IJVdqK7FomdS5qK0RwvWPTn_2xqBBS-OxlJtfUYgIHsINh8Q3SKEkPsCvIPoliRJ4u4g2Ow7rA6F3-zxMRIKUIAGSAgjPI_kULhkDYb_uyMlySZx3zuSu3vuUx_tl32KGpdSKv85ctm5g24kGaU0VSqHlLGjpsVR87NQEuCoc6dOzZEypp3J-7L4yQHeOq88jLNQaiHtCeAIYDxE9DCAvAMcoujm1ds7EO4kwNjhD601RjqHnQ3NbaUltLri90A2-35En0owaLitSudB7U7f0S6GOjkt9REI9wNDQzHPxkTIFX79XGnG9VOJTFXSehImAj5JsyJ3QYATgBN45hZKJZe8KO1XDW3uMielIcBRa7TDau92MGrvmq4fc1i7dHIg_foBeO2WAgfhUDzAdla7i7q23hg-uOvVIPD2b0DDPVVdLzr-3GfcrKmXOAByaKzgd-i5xmtI6gvvbVsBu6lxn9jGwuvorvX6BtC4TAfB-eJ5IbRG8LcE9gr2XFgOvh1af_3xOMi2A6Zh9lY6bV_M_YGR-nnA-qPib-i89pe9KZHWPw_L5runT5jyQr4zxkLdlIGjedNrTuPeXXVPwvTLR-Jmq-ZmvknFvUMFbBuryxUUT5q0h3KtUQQE-AMGTu86g3Wdw_KdPk1WS-bVJaymcS6lrZTwUiNoaaHlRXkvgYH4HAWTWhKDEho49ZL-tdV3jsyqzJA6WJ4y_G9FzQVSdqUZly3ZQlrlXrhKfzXDvOX7_yHb8zR6TRwgcl3rGvdbbpzpLpG9edSKDaCXMGi16orC28abX9V-YrCtmTEpPDe8F_9DM7OV8bCyBpqj9n6ReJrnKqOWz9P8TVsP7H_DdbfxaJTcLuiVVMLlK2XQjIi58gI4mOwDX2j6Xd_RyaagP-KlKnk9wqcT-AEJQzZcagsq5GRLN9rszWwM28NOc0t2ojjDH4LZi2sMjIP1egswhjS3fmGnilLkXMPDrcyV5to9NTrzTy_WlqZ-MbnaOAt7qdK3TBUAJ5Xhekmtpdml4NIagBNqDK8voi1hJ0pOyzTI0uUqCMMlzUK25NsUMYKyEz6tXYKGx60Fiwnbki1d8DjYEETWG0w2i0uMo82GBehEEF2vVigIt3gdRhRnq5CEmKOFiDHCqwCRAG0JCTdvhKWUZQTx8LReBRsKVogXVORvef5ZvCl9XghjKh4HwYpEwSKnKc9NferEuD5VOu_C_ULHTmGZVmcDVigXxpo7hBU257E_hKrSikL85BqW_oS6qHQeP0mfQ2n-LUutrjyzACe1Vy6DjWOfMf4vAAD__-5QKzs">