Skip to content

[RegAlloc][AArch64] Missed optimizate for register spill #150737

@hstk30-hw

Description

@hstk30-hw

https://godbolt.org/z/z4MrMcW4j

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

typedef struct param_s {
    void *a;
    uint32_t b;
    uint32_t c;
    uint8_t d : 1;
} param_t;

typedef _Bool (*IsEnabled)();

typedef struct {
    IsEnabled Enabled;
} FuncCb;

extern FuncCb g_hookFunc;

uint64_t bar(void *flow, uint16_t type);
uint64_t fuzz(void *flow, uint32_t syncType);
uint64_t bob(void *flow);

void foo(param_t *param)
{
    if (param->a == ((void*)0)) {
        return;
    }

    if (__builtin_expect(!!(param->b != 0), 0)) {
        (void)fuzz(param->a, param->b);
    }

    if (__builtin_expect(!!(param->c != 0), 0)) {
        if (g_hookFunc.Enabled()) {
            (void)bar(param->a, (uint16_t)param->c);
        }
    }

    if (__builtin_expect(!!(param->d != 0), 0)) {
        (void)bob(param->a);
    }

    return;
}

For this case, LLVM spill X19 to stack, GCC 15 has optimizated it.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions