Issue 114381
Summary clang optimizer problem
Labels clang
Assignees
Reporter joevt
    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=""


_______________________________________________
llvm-bugs mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to