Fixture 09

memory effects

C · 9 functions · 4 lanes · 24 of 36 function-lanes behave identically

4 of 4 lanes have a function that returns a different result after decompilation: clang-O0 (6/9), clang-O2 (6/9), gcc-O0 (6/9), gcc-O2 (6/9).

Memory-effects fixture. Every function that touches memory does so through caller-supplied int* buffers (or an observable volatile counter read back via a getter), so an execution-differential test (original vs. recompiled decompilation) catches a DROPPED store, a reordered load, an unsafe dead-store elimination, or a vectorizer intrinsic lowering that silently loses an effect. Each observable path yields a UNIQUE value.

Targets review #2c (dropped intrinsic effects / unsafe DSE / vectorizable loops). Differential-testable functions are pure over their int* / int args: given an 8-int input buffer they mutate it deterministically and/or return an int, so the gate can diff both the return value and the buffer contents.

Differential vs. structural: - cas_update(), mem_copy(), mem_set(), vec_sum(), vec_transform(): DIFFERENTIAL. Pure over their int* / int arguments; drive with an 8-int buffer. - tick()/tick_n()/read_counter(): the volatile global is a STRUCTURAL target (true MMIO-style volatile semantics / C11-atomic ordering are structural assertions), but the effect is made observable — and thus differential — by driving a call SEQUENCE and reading the count back through read_counter().

No libc: memcpy/memset are written as explicit inline loops; the "atomic" compare-and-swap is plain C. No floats anywhere.

tests/decompiler_fixtures/src/09_memory_effects.c source
/* 09_memory_effects.c
 *
 * Memory-effects fixture. Every function that touches memory does so through
 * caller-supplied int* buffers (or an observable volatile counter read back via
 * a getter), so an execution-differential test (original vs. recompiled
 * decompilation) catches a DROPPED store, a reordered load, an unsafe
 * dead-store elimination, or a vectorizer intrinsic lowering that silently loses
 * an effect. Each observable path yields a UNIQUE value.
 *
 * Targets review #2c (dropped intrinsic effects / unsafe DSE / vectorizable
 * loops). Differential-testable functions are pure over their int* / int args:
 * given an 8-int input buffer they mutate it deterministically and/or return an
 * int, so the gate can diff both the return value and the buffer contents.
 *
 * Differential vs. structural:
 *   - cas_update(), mem_copy(), mem_set(), vec_sum(), vec_transform(): DIFFERENTIAL.
 *     Pure over their int* / int arguments; drive with an 8-int buffer.
 *   - tick()/tick_n()/read_counter(): the volatile global is a STRUCTURAL target
 *     (true MMIO-style volatile semantics / C11-atomic ordering are structural
 *     assertions), but the effect is made observable — and thus differential —
 *     by driving a call SEQUENCE and reading the count back through read_counter().
 *
 * No libc: memcpy/memset are written as explicit inline loops; the "atomic"
 * compare-and-swap is plain C. No floats anywhere.
 */
#include <stdint.h>

/* --- volatile MMIO-style counter --------------------------------------- */

/* A volatile global that must be reloaded/restored on every access. A correct
 * lowering keeps every read and write; an over-eager optimizer that caches or
 * DSE-drops a write diverges the sequence observed through read_counter(). */
static volatile int g_counter = 0;

/* Single observable increment (MMIO-style write). */
void tick(void) {
    g_counter = g_counter + 1;
}

/* n observable increments via an explicit loop — each iteration is a real
 * volatile load+store that must not be coalesced away. */
void tick_n(int n) {
    for (int i = 0; i < n; i++)
        g_counter = g_counter + 1;
}

/* Getter that makes the counter observable, so a driven call sequence becomes
 * differential-testable through this return value. */
int read_counter(void) {
    return g_counter;
}

/* Reset so a differential harness can start each sequence from a known state. */
void reset_counter(void) {
    g_counter = 0;
}

/* --- compare-and-swap, written in plain C (no libc atomics) ------------- */

/* CAS-like update over an int*. Returns 1 and stores `newv` iff *p == oldv,
 * else returns 0 and leaves *p unchanged. Both the return value and the buffer
 * mutation are observable, so a dropped store shows up in the differential. */
int cas_update(int *p, int oldv, int newv) {
    if (*p == oldv) {
        *p = newv;
        return 1;
    }
    return 0;
}

/* --- memcpy / memset as explicit inline loops over int* buffers --------- */

/* Copy `n` ints from src to dst. Written as a loop so a decompiler that
 * recognizes and re-emits a memcpy intrinsic must preserve every element store. */
void mem_copy(int *dst, const int *src, int n) {
    for (int i = 0; i < n; i++)
        dst[i] = src[i];
}

/* Fill `n` ints of dst with `val`. Explicit loop form of memset. */
void mem_set(int *dst, int val, int n) {
    for (int i = 0; i < n; i++)
        dst[i] = val;
}

/* --- vectorizable stack-buffer loops (catch SSE/NEON lowering) ---------- */

/* Sum of `n` ints. At -O2/-O3 this is a prime SSE/NEON reduction candidate; a
 * vectorized lowering that drops a tail element or mishandles the reduction
 * diverges the returned total. Deterministic and pure over (a, n). */
int vec_sum(const int *a, int n) {
    int s = 0;
    for (int i = 0; i < n; i++)
        s += a[i];
    return s;                       /* unique per input buffer */
}

/* In-place transform buf[i] = buf[i]*3 + 7 over `n` ints — an elementwise map a
 * compiler may vectorize. Both the mutated buffer and (as a checksum) the return
 * are observable, so a dropped or reordered store is caught differentially. */
int vec_transform(int *buf, int n) {
    int check = 0;
    for (int i = 0; i < n; i++) {
        buf[i] = buf[i] * 3 + 7;
        check ^= buf[i];
    }
    return check;
}

Recovered C

Generated by glaurung decompile --style decbench at b47f6b43. baseline.json records the result after recompiling the C and calling it beside the original with seeded inputs.

clang -O0

6/9
cas_update pass 10 lines
// glaurung: cas_update @ 0x1180
int cas_update(int * arg0, int arg1, int arg2) {
    // x86-64 prologue: save rbp
    if (((unsigned int)(*(int *)((long)arg0)) != (unsigned int)(arg1))) {
        return 0;
    } else {
        *(int *)((long)arg0) = arg2;
        return 1;
    }
}
mem_copy pass 10 lines
// glaurung: mem_copy @ 0x11c0
void mem_copy(int * arg0, const int * arg1, int arg2) {
    int i;
    // x86-64 prologue: save rbp
    for (i = 0; (i < arg2); i++) {
        arg0[(long)(i)] = arg1[(long)(i)];
    }
    // x86-64 epilogue: restore rbp
    return;
}
mem_set pass 10 lines
// glaurung: mem_set @ 0x1210
void mem_set(int * arg0, int arg1, int arg2) {
    int i;
    // x86-64 prologue: save rbp
    for (i = 0; (i < arg2); i++) {
        arg0[(long)(i)] = arg1;
    }
    // x86-64 epilogue: restore rbp
    return;
}
read_counter pass 8 lines
// glaurung: read_counter @ 0x1160
static unsigned char glaurung_global_4024[16] __attribute__((aligned(16)));
int read_counter(void) {
    extern unsigned char glaurung_global_4024[16];
    // x86-64 prologue: save rbp
    // x86-64 epilogue: restore rbp
    return (unsigned int)(*(int *)(&glaurung_global_4024[0]));
}
reset_counter structural 9 lines
// glaurung: reset_counter @ 0x1170
static unsigned char glaurung_global_4024[16] __attribute__((aligned(16)));
void reset_counter(void) {
    extern unsigned char glaurung_global_4024[16];
    // x86-64 prologue: save rbp
    *(int *)(&glaurung_global_4024[0]) = 0;
    // x86-64 epilogue: restore rbp
    return;
}
tick structural 9 lines
// glaurung: tick @ 0x1100
static unsigned char glaurung_global_4024[16] __attribute__((aligned(16)));
void tick(void) {
    extern unsigned char glaurung_global_4024[16];
    // x86-64 prologue: save rbp
    *(int *)(&glaurung_global_4024[0]) = ((unsigned long)((unsigned int)(*(int *)(&glaurung_global_4024[0]))) + 1);
    // x86-64 epilogue: restore rbp
    return;
}
tick_n structural 12 lines
// glaurung: tick_n @ 0x1120
static unsigned char glaurung_global_4024[16] __attribute__((aligned(16)));
void tick_n(int arg0) {
    extern unsigned char glaurung_global_4024[16];
    int i;
    // x86-64 prologue: save rbp
    for (i = 0; (i < arg0); i++) {
        *(int *)(&glaurung_global_4024[0]) = ((unsigned long)((unsigned int)(*(int *)(&glaurung_global_4024[0]))) + 1);
    }
    // x86-64 epilogue: restore rbp
    return;
}
vec_sum pass 12 lines
// glaurung: vec_sum @ 0x1250
int vec_sum(const int * arg0, int arg1) {
    int s;
    int i;
    // x86-64 prologue: save rbp
    s = 0;
    for (i = 0; (i < arg1); i++) {
        s = ((unsigned int)(arg0[(long)(i)]) + s);
    }
    // x86-64 epilogue: restore rbp
    return (unsigned int)(s);
}
vec_transform pass 13 lines
// glaurung: vec_transform @ 0x12a0
int vec_transform(int * arg0, int arg1) {
    int check;
    int i;
    // x86-64 prologue: save rbp
    check = 0;
    for (i = 0; (i < arg1); i++) {
        arg0[(long)(i)] = ((arg0[(long)(i)] * 3) + 7);
        check = ((unsigned int)(arg0[(long)(i)]) ^ check);
    }
    // x86-64 epilogue: restore rbp
    return (unsigned int)(check);
}

clang -O2

6/9
cas_update pass 10 lines
// glaurung: cas_update @ 0x1190
int cas_update(int * arg0, int arg1, int arg2) {
    long ret;
    ret = 0;
    if (((unsigned int)(*(int *)(((long)arg0))) == (unsigned int)(arg1))) {
        *(int *)(((long)arg0)) = arg2;
        ret = 1;
    }
    return ret;
}
mem_copy pass 161 lines
// glaurung: mem_copy @ 0x11a0
void mem_copy(int * arg0, const int * arg1, int arg2) {
    int i;
    long ret;
    long var0;
    long var16;
    long var17;
    long var20;
    long var23;
    long var25;
    long var26;
    long var28;
    int var30;
    int var31;
    int var32;
    unsigned char var33[16] __attribute__((aligned(16)));
    int var35;
    int var36;
    int var37;
    unsigned char var38[16] __attribute__((aligned(16)));
    long var4;
    int var40;
    int var41;
    int var42;
    unsigned char var43[16] __attribute__((aligned(16)));
    int var45;
    int var46;
    int var47;
    unsigned char var48[16] __attribute__((aligned(16)));
    long var50;
    long var52;
    long var53;
    long var55;
    int var56;
    int var57;
    int var58;
    int var59;
    unsigned char var60[16] __attribute__((aligned(16)));
    long var7;
    long var9;
    if ((((unsigned long)((unsigned int)(arg2)) == 0) | ((long)(arg2) < 0))) {
        return;
    }
    var0 = (unsigned long)((unsigned int)(arg2));
    if (((unsigned long)(8) <= (unsigned long)((unsigned long)((unsigned int)(arg2))))) {
        if (((unsigned long)(((long)arg1 + (var0 * 4))) <= (unsigned long)((long)arg0))) {
            goto L_122c;
        }
        ret = (long)(((long)arg0 + (var0 * 4)));
        if (((unsigned long)(ret) <= (unsigned long)((long)arg1))) {
            goto L_122c;
        }
    }
    var4 = 0;
    L_11c4: ;
    var7 = ((~var4) + var0);
    var9 = (var0 & 3);
    if ((var9 != 0)) {
        i = var4;
        while ((var9 != 0)) {
            ret = (unsigned long)((unsigned int)(*(int *)(((long)arg1 + i * 4))));
            *(int *)(((long)arg0 + i * 4)) = ret;
            i = (i + 1);
            var9 = (var9 - 1);
            var4 = (unsigned long)((unsigned int)(i));
        }
    }
    if (((unsigned long)(var7) < (unsigned long)(3))) {
        return;
    }
    do {
        *(int *)(((long)arg0 + var4 * 4)) = *(int *)(((long)arg1 + var4 * 4));
        *(int *)(((long)arg0 + var4 * 4 + 0x4)) = *(int *)(((long)arg1 + var4 * 4 + 0x4));
        *(int *)(((long)arg0 + var4 * 4 + 0x8)) = *(int *)(((long)arg1 + var4 * 4 + 0x8));
        ret = (unsigned long)((unsigned int)(*(int *)(((long)arg1 + var4 * 4 + 0xc))));
        *(int *)(((long)arg0 + var4 * 4 + 0xc)) = ret;
        var4 = (var4 + 4);
    } while ((var0 != var4));
    return;
    L_122c: ;
    var16 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var0)) & -8)));
    var17 = (var16 - 8);
    var20 = (((unsigned long)(var17) >> 3) + 1);
    var23 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var20)) & 3)));
    if (((unsigned long)(var17) < (unsigned long)(24))) {
        ret = 0;
        var25 = 0;
        goto L_12b8;
    }
    var26 = (var20 & -4);
    var28 = 0;
    do {
        var30 = *(int *)(((long)arg1 + var28 * 4 + 0x4));
        var31 = *(int *)(((long)arg1 + var28 * 4 + 0x8));
        var32 = *(int *)(((long)arg1 + var28 * 4 + 0xc));
        __builtin_memcpy(var33, (void *)(((long)arg1 + var28 * 4 + 0x10)), 16);
        *(int *)(((long)arg0 + var28 * 4)) = *(int *)(((long)arg1 + var28 * 4));
        *(int *)(((long)arg0 + var28 * 4 + 0x4)) = var30;
        *(int *)(((long)arg0 + var28 * 4 + 0x8)) = var31;
        *(int *)(((long)arg0 + var28 * 4 + 0xc)) = var32;
        __builtin_memmove((void *)(((long)arg0 + var28 * 4 + 0x10)), var33, 16);
        var35 = *(int *)(((long)arg1 + var28 * 4 + 0x24));
        var36 = *(int *)(((long)arg1 + var28 * 4 + 0x28));
        var37 = *(int *)(((long)arg1 + var28 * 4 + 0x2c));
        __builtin_memcpy(var38, (void *)(((long)arg1 + var28 * 4 + 0x30)), 16);
        *(int *)(((long)arg0 + var28 * 4 + 0x20)) = *(int *)(((long)arg1 + var28 * 4 + 0x20));
        *(int *)(((long)arg0 + var28 * 4 + 0x24)) = var35;
        *(int *)(((long)arg0 + var28 * 4 + 0x28)) = var36;
        *(int *)(((long)arg0 + var28 * 4 + 0x2c)) = var37;
        __builtin_memmove((void *)(((long)arg0 + var28 * 4 + 0x30)), var38, 16);
        var40 = *(int *)(((long)arg1 + var28 * 4 + 0x44));
        var41 = *(int *)(((long)arg1 + var28 * 4 + 0x48));
        var42 = *(int *)(((long)arg1 + var28 * 4 + 0x4c));
        __builtin_memcpy(var43, (void *)(((long)arg1 + var28 * 4 + 0x50)), 16);
        *(int *)(((long)arg0 + var28 * 4 + 0x40)) = *(int *)(((long)arg1 + var28 * 4 + 0x40));
        *(int *)(((long)arg0 + var28 * 4 + 0x44)) = var40;
        *(int *)(((long)arg0 + var28 * 4 + 0x48)) = var41;
        *(int *)(((long)arg0 + var28 * 4 + 0x4c)) = var42;
        __builtin_memmove((void *)(((long)arg0 + var28 * 4 + 0x50)), var43, 16);
        var45 = *(int *)(((long)arg1 + var28 * 4 + 0x64));
        var46 = *(int *)(((long)arg1 + var28 * 4 + 0x68));
        var47 = *(int *)(((long)arg1 + var28 * 4 + 0x6c));
        __builtin_memcpy(var48, (void *)(((long)arg1 + var28 * 4 + 0x70)), 16);
        *(int *)(((long)arg0 + var28 * 4 + 0x60)) = *(int *)(((long)arg1 + var28 * 4 + 0x60));
        *(int *)(((long)arg0 + var28 * 4 + 0x64)) = var45;
        *(int *)(((long)arg0 + var28 * 4 + 0x68)) = var46;
        *(int *)(((long)arg0 + var28 * 4 + 0x6c)) = var47;
        __builtin_memmove((void *)(((long)arg0 + var28 * 4 + 0x70)), var48, 16);
        ret = (var28 + 32);
        var26 = (var26 - 4);
        var28 = ret;
        var25 = ret;
        var20 = var26;
    } while ((var26 != 0));
    L_12b8: ;
    if ((var23 != 0)) {
        var50 = (long)((((long)arg0 + (var25 * 4)) + 16));
        var52 = (long)((((long)arg1 + (var25 * 4)) + 16));
        var53 = (var23 << 5);
        var55 = 0;
        do {
            var56 = *(int *)((var52 + var55 - 0x10));
            var57 = *(int *)((var52 + var55 - 0xc));
            var58 = *(int *)((var52 + var55 - 0x8));
            var59 = *(int *)((var52 + var55 - 0x4));
            ret = ((unsigned long)((unsigned int)(var57)) | (unsigned long)((unsigned int)(var56)));
            __builtin_memcpy(var60, (void *)((var52 + var55)), 16);
            *(int *)((var50 + var55 - 0x10)) = var56;
            *(int *)((var50 + var55 - 0xc)) = var57;
            *(int *)((var50 + var55 - 0x8)) = var58;
            *(int *)((var50 + var55 - 0x4)) = var59;
            __builtin_memmove((void *)((var50 + var55)), var60, 16);
            var55 = (var55 + 32);
        } while ((var53 != var55));
    }
    var4 = var16;
    if ((var16 != var0)) {
        goto L_11c4;
    }
    return;
}
mem_set pass 140 lines
// glaurung: mem_set @ 0x1310
void mem_set(int * arg0, int arg1, int arg2) {
    int i;
    long ret;
    long var0;
    int var10;
    int var11;
    long var12;
    long var15;
    long var18;
    long var19;
    long var21;
    long var22;
    long var25;
    long var27;
    long var3;
    int var8;
    int var9;
    if ((((unsigned long)((unsigned int)(arg2)) == 0) | ((long)(arg2) < 0))) {
        return;
    }
    var0 = (unsigned long)((unsigned int)(arg2));
    if (((unsigned long)(8) <= (unsigned long)((unsigned long)((unsigned int)(arg2))))) {
        var3 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var0)) & -8)));
        var8 = arg1;
        var9 = arg1;
        var10 = arg1;
        var11 = arg1;
        var12 = (var3 - 8);
        var15 = (((unsigned long)(var12) >> 3) + 1);
        var18 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var15)) & 7)));
        if (((unsigned long)(56) <= (unsigned long)(var12))) {
            var19 = (var15 & -8);
            var21 = 0;
            do {
                *(int *)(((long)arg0 + var21 * 4)) = var8;
                *(int *)(((long)arg0 + var21 * 4 + 0x4)) = var9;
                *(int *)(((long)arg0 + var21 * 4 + 0x8)) = var10;
                *(int *)(((long)arg0 + var21 * 4 + 0xc)) = var11;
                *(int *)(((long)arg0 + var21 * 4 + 0x10)) = var8;
                *(int *)(((long)arg0 + var21 * 4 + 0x14)) = var9;
                *(int *)(((long)arg0 + var21 * 4 + 0x18)) = var10;
                *(int *)(((long)arg0 + var21 * 4 + 0x1c)) = var11;
                *(int *)(((long)arg0 + var21 * 4 + 0x20)) = var8;
                *(int *)(((long)arg0 + var21 * 4 + 0x24)) = var9;
                *(int *)(((long)arg0 + var21 * 4 + 0x28)) = var10;
                *(int *)(((long)arg0 + var21 * 4 + 0x2c)) = var11;
                *(int *)(((long)arg0 + var21 * 4 + 0x30)) = var8;
                *(int *)(((long)arg0 + var21 * 4 + 0x34)) = var9;
                *(int *)(((long)arg0 + var21 * 4 + 0x38)) = var10;
                *(int *)(((long)arg0 + var21 * 4 + 0x3c)) = var11;
                *(int *)(((long)arg0 + var21 * 4 + 0x40)) = var8;
                *(int *)(((long)arg0 + var21 * 4 + 0x44)) = var9;
                *(int *)(((long)arg0 + var21 * 4 + 0x48)) = var10;
                *(int *)(((long)arg0 + var21 * 4 + 0x4c)) = var11;
                *(int *)(((long)arg0 + var21 * 4 + 0x50)) = var8;
                *(int *)(((long)arg0 + var21 * 4 + 0x54)) = var9;
                *(int *)(((long)arg0 + var21 * 4 + 0x58)) = var10;
                *(int *)(((long)arg0 + var21 * 4 + 0x5c)) = var11;
                *(int *)(((long)arg0 + var21 * 4 + 0x60)) = var8;
                *(int *)(((long)arg0 + var21 * 4 + 0x64)) = var9;
                *(int *)(((long)arg0 + var21 * 4 + 0x68)) = var10;
                *(int *)(((long)arg0 + var21 * 4 + 0x6c)) = var11;
                *(int *)(((long)arg0 + var21 * 4 + 0x70)) = var8;
                *(int *)(((long)arg0 + var21 * 4 + 0x74)) = var9;
                *(int *)(((long)arg0 + var21 * 4 + 0x78)) = var10;
                *(int *)(((long)arg0 + var21 * 4 + 0x7c)) = var11;
                *(int *)(((long)arg0 + var21 * 4 + 0x80)) = var8;
                *(int *)(((long)arg0 + var21 * 4 + 0x84)) = var9;
                *(int *)(((long)arg0 + var21 * 4 + 0x88)) = var10;
                *(int *)(((long)arg0 + var21 * 4 + 0x8c)) = var11;
                *(int *)(((long)arg0 + var21 * 4 + 0x90)) = var8;
                *(int *)(((long)arg0 + var21 * 4 + 0x94)) = var9;
                *(int *)(((long)arg0 + var21 * 4 + 0x98)) = var10;
                *(int *)(((long)arg0 + var21 * 4 + 0x9c)) = var11;
                *(int *)(((long)arg0 + var21 * 4 + 0xa0)) = var8;
                *(int *)(((long)arg0 + var21 * 4 + 0xa4)) = var9;
                *(int *)(((long)arg0 + var21 * 4 + 0xa8)) = var10;
                *(int *)(((long)arg0 + var21 * 4 + 0xac)) = var11;
                *(int *)(((long)arg0 + var21 * 4 + 0xb0)) = var8;
                *(int *)(((long)arg0 + var21 * 4 + 0xb4)) = var9;
                *(int *)(((long)arg0 + var21 * 4 + 0xb8)) = var10;
                *(int *)(((long)arg0 + var21 * 4 + 0xbc)) = var11;
                *(int *)(((long)arg0 + var21 * 4 + 0xc0)) = var8;
                *(int *)(((long)arg0 + var21 * 4 + 0xc4)) = var9;
                *(int *)(((long)arg0 + var21 * 4 + 0xc8)) = var10;
                *(int *)(((long)arg0 + var21 * 4 + 0xcc)) = var11;
                *(int *)(((long)arg0 + var21 * 4 + 0xd0)) = var8;
                *(int *)(((long)arg0 + var21 * 4 + 0xd4)) = var9;
                *(int *)(((long)arg0 + var21 * 4 + 0xd8)) = var10;
                *(int *)(((long)arg0 + var21 * 4 + 0xdc)) = var11;
                *(int *)(((long)arg0 + var21 * 4 + 0xe0)) = var8;
                *(int *)(((long)arg0 + var21 * 4 + 0xe4)) = var9;
                *(int *)(((long)arg0 + var21 * 4 + 0xe8)) = var10;
                *(int *)(((long)arg0 + var21 * 4 + 0xec)) = var11;
                *(int *)(((long)arg0 + var21 * 4 + 0xf0)) = var8;
                *(int *)(((long)arg0 + var21 * 4 + 0xf4)) = var9;
                *(int *)(((long)arg0 + var21 * 4 + 0xf8)) = var10;
                *(int *)(((long)arg0 + var21 * 4 + 0xfc)) = var11;
                ret = (var21 + 64);
                var19 = (var19 - 8);
                var21 = ret;
                var22 = ret;
                var15 = var19;
            } while ((var19 != 0));
        } else {
            ret = 0;
            var22 = 0;
        }
        if ((var18 != 0)) {
            ret = (long)((((long)arg0 + (var22 * 4)) + 16));
            var25 = (var18 << 5);
            var27 = 0;
            do {
                *(int *)((ret + var27 - 0x10)) = var8;
                *(int *)((ret + var27 - 0xc)) = var9;
                *(int *)((ret + var27 - 0x8)) = var10;
                *(int *)((ret + var27 - 0x4)) = var11;
                *(int *)((ret + var27)) = var8;
                *(int *)((ret + var27 + 0x4)) = var9;
                *(int *)((ret + var27 + 0x8)) = var10;
                *(int *)((ret + var27 + 0xc)) = var11;
                var27 = (var27 + 32);
            } while ((var25 != var27));
        }
        if ((var3 == var0)) {
            return;
        }
        L_1420: ;
        do {
            *(int *)(((long)arg0 + var3 * 4)) = arg1;
            i = (var3 + 1);
            var3 = (unsigned long)((unsigned int)(i));
        } while ((var0 != i));
    } else {
        var3 = 0;
        goto L_1420;
    }
    return;
}
read_counter pass 6 lines
// glaurung: read_counter @ 0x1170
static unsigned char glaurung_global_4024[16] __attribute__((aligned(16)));
int read_counter(void) {
    extern unsigned char glaurung_global_4024[16];
    return (unsigned int)(*(int *)(&glaurung_global_4024[0]));
}
reset_counter structural 7 lines
// glaurung: reset_counter @ 0x1180
static unsigned char glaurung_global_4024[16] __attribute__((aligned(16)));
void reset_counter(void) {
    extern unsigned char glaurung_global_4024[16];
    *(int *)(&glaurung_global_4024[0]) = 0;
    return;
}
tick structural 7 lines
// glaurung: tick @ 0x1100
static unsigned char glaurung_global_4024[16] __attribute__((aligned(16)));
void tick(void) {
    extern unsigned char glaurung_global_4024[16];
    *(int *)(&glaurung_global_4024[0]) = (*(int *)(&glaurung_global_4024[0]) + 1);
    return;
}
tick_n structural 36 lines
// glaurung: tick_n @ 0x1110
static unsigned char glaurung_global_4024[16] __attribute__((aligned(16)));
void tick_n(int arg0) {
    extern unsigned char glaurung_global_4024[16];
    int i;
    long ret;
    long var4;
    int var5;
    long var6;
    int var7;
    if ((((unsigned long)((unsigned int)(arg0)) != 0) && (0 <= (long)(arg0)))) {
        ret = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(arg0)) & 3)));
        if (((unsigned long)(3) <= (unsigned long)((unsigned long)((unsigned int)((arg0 - 1)))))) {
            var4 = (unsigned long)((unsigned int)((arg0 & -4)));
            do {
                *(int *)(&glaurung_global_4024[0]) = (*(int *)(&glaurung_global_4024[0]) + 1);
                *(int *)(&glaurung_global_4024[0]) = (*(int *)(&glaurung_global_4024[0]) + 1);
                *(int *)(&glaurung_global_4024[0]) = (*(int *)(&glaurung_global_4024[0]) + 1);
                *(int *)(&glaurung_global_4024[0]) = (*(int *)(&glaurung_global_4024[0]) + 1);
                var5 = (var4 - 4);
                var4 = (unsigned long)((unsigned int)(var5));
            } while (((unsigned long)((unsigned int)(var5)) != 0));
        }
        if (((unsigned long)((unsigned int)(ret)) == 0)) {
            return;
        }
        var6 = ret;
        do {
            *(int *)(&glaurung_global_4024[0]) = (*(int *)(&glaurung_global_4024[0]) + 1);
            var7 = (var6 - 1);
            ret = (unsigned long)((unsigned int)(var7));
            var6 = (unsigned long)((unsigned int)(var7));
        } while (((unsigned long)((unsigned int)(var7)) != 0));
    }
    return;
}
vec_sum pass 147 lines
// glaurung: vec_sum @ 0x1430
int vec_sum(const int * arg0, int arg1) {
    int s;
    int i;
    long ret;
    long var1;
    int var100;
    int var101;
    long var103;
    long var104;
    long var106;
    long var11;
    long var12;
    long var136;
    int var14;
    int var15;
    int var16;
    int var17;
    long var19;
    int var21;
    int var22;
    int var23;
    int var24;
    long var4;
    long var5;
    long var8;
    long var82;
    int var83;
    int var84;
    int var85;
    int var86;
    int var87;
    int var88;
    int var89;
    int var90;
    int var94;
    int var95;
    int var96;
    int var97;
    int var98;
    int var99;
    if ((((unsigned long)((unsigned int)(arg1)) == 0) | ((long)(arg1) < 0))) {
        return 0;
    }
    var1 = (unsigned long)((unsigned int)(arg1));
    if (((unsigned long)(8) <= (unsigned long)((unsigned long)((unsigned int)(arg1))))) {
        var4 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var1)) & -8)));
        var5 = (var4 - 8);
        var8 = (((unsigned long)(var5) >> 3) + 1);
        var11 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var8)) & 3)));
        if (((unsigned long)(24) <= (unsigned long)(var5))) {
            var12 = (var8 & -4);
            var14 = 0;
            var15 = 0;
            var16 = 0;
            var17 = 0;
            var19 = 0;
            var21 = 0;
            var22 = 0;
            var23 = 0;
            var24 = 0;
            do {
                var14 = (*(int *)(((long)arg0 + var19 * 4 + 0x60)) + ((*(int *)(((long)arg0 + var19 * 4 + 0x40)) + *(int *)(((long)arg0 + var19 * 4 + 0x20))) + (*(int *)(((long)arg0 + var19 * 4)) + var14)));
                var15 = (*(int *)(((long)arg0 + var19 * 4 + 0x64)) + ((*(int *)(((long)arg0 + var19 * 4 + 0x44)) + *(int *)(((long)arg0 + var19 * 4 + 0x24))) + (*(int *)(((long)arg0 + var19 * 4 + 0x4)) + var15)));
                var16 = (*(int *)(((long)arg0 + var19 * 4 + 0x68)) + ((*(int *)(((long)arg0 + var19 * 4 + 0x48)) + *(int *)(((long)arg0 + var19 * 4 + 0x28))) + (*(int *)(((long)arg0 + var19 * 4 + 0x8)) + var16)));
                var17 = (*(int *)(((long)arg0 + var19 * 4 + 0x6c)) + ((*(int *)(((long)arg0 + var19 * 4 + 0x4c)) + *(int *)(((long)arg0 + var19 * 4 + 0x2c))) + (*(int *)(((long)arg0 + var19 * 4 + 0xc)) + var17)));
                ret = ((unsigned long)((unsigned int)(var15)) | (unsigned long)((unsigned int)(var14)));
                var21 = (*(int *)(((long)arg0 + var19 * 4 + 0x70)) + ((*(int *)(((long)arg0 + var19 * 4 + 0x50)) + *(int *)(((long)arg0 + var19 * 4 + 0x30))) + (*(int *)(((long)arg0 + var19 * 4 + 0x10)) + var21)));
                var22 = (*(int *)(((long)arg0 + var19 * 4 + 0x74)) + ((*(int *)(((long)arg0 + var19 * 4 + 0x54)) + *(int *)(((long)arg0 + var19 * 4 + 0x34))) + (*(int *)(((long)arg0 + var19 * 4 + 0x14)) + var22)));
                var23 = (*(int *)(((long)arg0 + var19 * 4 + 0x78)) + ((*(int *)(((long)arg0 + var19 * 4 + 0x58)) + *(int *)(((long)arg0 + var19 * 4 + 0x38))) + (*(int *)(((long)arg0 + var19 * 4 + 0x18)) + var23)));
                var24 = (*(int *)(((long)arg0 + var19 * 4 + 0x7c)) + ((*(int *)(((long)arg0 + var19 * 4 + 0x5c)) + *(int *)(((long)arg0 + var19 * 4 + 0x3c))) + (*(int *)(((long)arg0 + var19 * 4 + 0x1c)) + var24)));
                var19 = (var19 + 32);
                var12 = (var12 - 4);
                var82 = var19;
                var83 = var14;
                var84 = var15;
                var85 = var16;
                var86 = var17;
                var87 = var21;
                var88 = var22;
                var89 = var23;
                var90 = var24;
            } while ((var12 != 0));
        } else {
            var83 = 0;
            var84 = 0;
            var85 = 0;
            var86 = 0;
            var82 = 0;
            var87 = 0;
            var88 = 0;
            var89 = 0;
            var90 = 0;
        }
        var94 = var83;
        var95 = var84;
        var96 = var85;
        var97 = var86;
        var98 = var87;
        var99 = var88;
        var100 = var89;
        var101 = var90;
        if ((var11 != 0)) {
            var103 = (long)((((long)arg0 + (var82 * 4)) + 16));
            var104 = (var11 << 5);
            var106 = 0;
            do {
                var83 = (var83 + *(int *)((var103 + var106 - 0x10)));
                var84 = (var84 + *(int *)((var103 + var106 - 0xc)));
                var85 = (var85 + *(int *)((var103 + var106 - 0x8)));
                var86 = (var86 + *(int *)((var103 + var106 - 0x4)));
                ret = ((unsigned long)((unsigned int)(var84)) | (unsigned long)((unsigned int)(var83)));
                var87 = (var87 + *(int *)((var103 + var106)));
                var88 = (var88 + *(int *)((var103 + var106 + 0x4)));
                var89 = (var89 + *(int *)((var103 + var106 + 0x8)));
                var90 = (var90 + *(int *)((var103 + var106 + 0xc)));
                var106 = (var106 + 32);
                var94 = var83;
                var95 = var84;
                var96 = var85;
                var97 = var86;
                var98 = var87;
                var99 = var88;
                var100 = var89;
                var101 = var90;
            } while ((var104 != var106));
        }
        var136 = (unsigned long)((unsigned int)((((var97 + var101) + (var95 + var99)) + ((var96 + var100) + (var94 + var98)))));
        ret = var136;
        if ((var4 == var1)) {
            return ret;
        }
        L_1540: ;
        do {
            s = (var136 + *(int *)(((long)arg0 + var4 * 4)));
            i = (var4 + 1);
            var136 = (unsigned long)((unsigned int)(s));
            var4 = (unsigned long)((unsigned int)(i));
            ret = (unsigned long)((unsigned int)(s));
        } while ((var1 != i));
    } else {
        var136 = 0;
        var4 = 0;
        goto L_1540;
    }
    return ret;
}
vec_transform pass 278 lines
// glaurung: vec_transform @ 0x1550
int vec_transform(int * arg0, int arg1) {
    int i;
    int check;
    long ret;
    long var1;
    int var10;
    int var100;
    int var101;
    int var102;
    int var104;
    int var105;
    int var106;
    int var107;
    int var108;
    int var109;
    int var11;
    int var110;
    int var111;
    int var12;
    int var135;
    int var136;
    int var137;
    int var138;
    long var14;
    int var143;
    int var144;
    int var145;
    int var146;
    int var16;
    int var17;
    int var177;
    int var178;
    int var179;
    int var18;
    int var180;
    int var185;
    int var186;
    int var187;
    int var188;
    int var19;
    int var20;
    int var21;
    long var212;
    long var213;
    int var215;
    long var218;
    int var22;
    int var23;
    int var25;
    int var26;
    int var27;
    int var28;
    long var4;
    long var5;
    int var56;
    int var57;
    int var58;
    int var59;
    int var64;
    int var65;
    int var66;
    int var67;
    int var68;
    int var69;
    int var70;
    int var71;
    int var72;
    int var73;
    int var74;
    int var75;
    long var77;
    int var79;
    long var8;
    int var80;
    int var81;
    int var82;
    long var84;
    int var85;
    int var86;
    int var87;
    int var88;
    int var9;
    int var90;
    int var91;
    int var92;
    int var93;
    int var94;
    int var95;
    int var96;
    int var97;
    int var99;
    if ((((unsigned long)((unsigned int)(arg1)) == 0) | ((long)(arg1) < 0))) {
        return 0;
    }
    var1 = (unsigned long)((unsigned int)(arg1));
    if (((unsigned long)(8) <= (unsigned long)((unsigned long)((unsigned int)(arg1))))) {
        var4 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var1)) & -8)));
        var5 = (var4 - 8);
        var8 = (((unsigned long)(var5) >> 3) + 1);
        if ((var5 == 0)) {
            ret = 0;
            var9 = 0;
            var10 = 0;
            var11 = 0;
            var12 = 0;
            var14 = 0;
            var16 = 0;
            var17 = 0;
            var18 = 0;
            var19 = 0;
            if (((unsigned long)((unsigned char)((var8 & 1))) != 0)) {
                L_163e: ;
                var20 = *(int *)(((long)arg0 + var14 * 4));
                var21 = *(int *)(((long)arg0 + var14 * 4 + 0x4));
                var22 = *(int *)(((long)arg0 + var14 * 4 + 0x8));
                var23 = *(int *)(((long)arg0 + var14 * 4 + 0xc));
                var25 = *(int *)(((long)arg0 + var14 * 4 + 0x10));
                var26 = *(int *)(((long)arg0 + var14 * 4 + 0x14));
                var27 = *(int *)(((long)arg0 + var14 * 4 + 0x18));
                var28 = *(int *)(((long)arg0 + var14 * 4 + 0x1c));
                var56 = ((var20 + 7) + (var20 + var20));
                var57 = ((var21 + 7) + (var21 + var21));
                var58 = ((var22 + 7) + (var22 + var22));
                var59 = ((var23 + 7) + (var23 + var23));
                var64 = ((var25 + 7) + (var25 + var25));
                var65 = ((var26 + 7) + (var26 + var26));
                var66 = ((var27 + 7) + (var27 + var27));
                var67 = ((var28 + 7) + (var28 + var28));
                *(int *)(((long)arg0 + var14 * 4)) = var56;
                *(int *)(((long)arg0 + var14 * 4 + 0x4)) = var57;
                *(int *)(((long)arg0 + var14 * 4 + 0x8)) = var58;
                *(int *)(((long)arg0 + var14 * 4 + 0xc)) = var59;
                *(int *)(((long)arg0 + var14 * 4 + 0x10)) = var64;
                *(int *)(((long)arg0 + var14 * 4 + 0x14)) = var65;
                *(int *)(((long)arg0 + var14 * 4 + 0x18)) = var66;
                *(int *)(((long)arg0 + var14 * 4 + 0x1c)) = var67;
                var68 = (var9 ^ var56);
                var69 = (var10 ^ var57);
                var70 = (var11 ^ var58);
                var71 = (var12 ^ var59);
                var72 = (var16 ^ var64);
                var73 = (var17 ^ var65);
                var74 = (var18 ^ var66);
                var75 = (var19 ^ var67);
            } else {
                var68 = var9;
                var69 = var10;
                var70 = var11;
                var71 = var12;
                var72 = var16;
                var73 = var17;
                var74 = var18;
                var75 = var19;
            }
        } else {
            var77 = (var8 & -2);
            var79 = 0;
            var80 = 0;
            var81 = 0;
            var82 = 0;
            var84 = 0;
            var85 = 7;
            var86 = 7;
            var87 = 7;
            var88 = 7;
            var90 = 0;
            var91 = 0;
            var92 = 0;
            var93 = 0;
            do {
                var94 = *(int *)(((long)arg0 + var84 * 4));
                var95 = *(int *)(((long)arg0 + var84 * 4 + 0x4));
                var96 = *(int *)(((long)arg0 + var84 * 4 + 0x8));
                var97 = *(int *)(((long)arg0 + var84 * 4 + 0xc));
                var99 = *(int *)(((long)arg0 + var84 * 4 + 0x10));
                var100 = *(int *)(((long)arg0 + var84 * 4 + 0x14));
                var101 = *(int *)(((long)arg0 + var84 * 4 + 0x18));
                var102 = *(int *)(((long)arg0 + var84 * 4 + 0x1c));
                var104 = *(int *)(((long)arg0 + var84 * 4 + 0x20));
                var105 = *(int *)(((long)arg0 + var84 * 4 + 0x24));
                var106 = *(int *)(((long)arg0 + var84 * 4 + 0x28));
                var107 = *(int *)(((long)arg0 + var84 * 4 + 0x2c));
                ret = ((unsigned long)((unsigned int)(var105)) | (unsigned long)((unsigned int)(var104)));
                var108 = *(int *)(((long)arg0 + var84 * 4 + 0x30));
                var109 = *(int *)(((long)arg0 + var84 * 4 + 0x34));
                var110 = *(int *)(((long)arg0 + var84 * 4 + 0x38));
                var111 = *(int *)(((long)arg0 + var84 * 4 + 0x3c));
                var135 = ((var94 + var85) + (var94 + var94));
                var136 = ((var95 + var86) + (var95 + var95));
                var137 = ((var96 + var87) + (var96 + var96));
                var138 = ((var97 + var88) + (var97 + var97));
                var143 = ((var99 + var85) + (var99 + var99));
                var144 = ((var100 + var86) + (var100 + var100));
                var145 = ((var101 + var87) + (var101 + var101));
                var146 = ((var102 + var88) + (var102 + var102));
                *(int *)(((long)arg0 + var84 * 4)) = var135;
                *(int *)(((long)arg0 + var84 * 4 + 0x4)) = var136;
                *(int *)(((long)arg0 + var84 * 4 + 0x8)) = var137;
                *(int *)(((long)arg0 + var84 * 4 + 0xc)) = var138;
                *(int *)(((long)arg0 + var84 * 4 + 0x10)) = var143;
                *(int *)(((long)arg0 + var84 * 4 + 0x14)) = var144;
                *(int *)(((long)arg0 + var84 * 4 + 0x18)) = var145;
                *(int *)(((long)arg0 + var84 * 4 + 0x1c)) = var146;
                var177 = ((var104 + var85) + (var104 + var104));
                var178 = ((var105 + var86) + (var105 + var105));
                var179 = ((var106 + var87) + (var106 + var106));
                var180 = ((var107 + var88) + (var107 + var107));
                var185 = ((var108 + var85) + (var108 + var108));
                var186 = ((var109 + var86) + (var109 + var109));
                var187 = ((var110 + var87) + (var110 + var110));
                var188 = ((var111 + var88) + (var111 + var111));
                *(int *)(((long)arg0 + var84 * 4 + 0x20)) = var177;
                *(int *)(((long)arg0 + var84 * 4 + 0x24)) = var178;
                *(int *)(((long)arg0 + var84 * 4 + 0x28)) = var179;
                *(int *)(((long)arg0 + var84 * 4 + 0x2c)) = var180;
                *(int *)(((long)arg0 + var84 * 4 + 0x30)) = var185;
                *(int *)(((long)arg0 + var84 * 4 + 0x34)) = var186;
                *(int *)(((long)arg0 + var84 * 4 + 0x38)) = var187;
                *(int *)(((long)arg0 + var84 * 4 + 0x3c)) = var188;
                var9 = (var177 ^ (var135 ^ var79));
                var10 = (var178 ^ (var136 ^ var80));
                var11 = (var179 ^ (var137 ^ var81));
                var12 = (var180 ^ (var138 ^ var82));
                var16 = (var185 ^ (var143 ^ var90));
                var17 = (var186 ^ (var144 ^ var91));
                var18 = (var187 ^ (var145 ^ var92));
                var19 = (var188 ^ (var146 ^ var93));
                ret = (var84 + 16);
                var79 = var9;
                var80 = var10;
                var81 = var11;
                var82 = var12;
                var90 = var16;
                var91 = var17;
                var92 = var18;
                var93 = var19;
                var77 = (var77 - 2);
                var84 = ret;
            } while ((var77 != 0));
            var14 = ret;
            var68 = var9;
            var69 = var10;
            var70 = var11;
            var71 = var12;
            var72 = var16;
            var73 = var17;
            var74 = var18;
            var75 = var19;
            if (((unsigned long)((unsigned char)((var8 & 1))) == 0)) {
                goto L_1684;
            }
            goto L_163e;
        }
        L_1684: ;
        var212 = (unsigned long)((unsigned int)((((var71 ^ var75) ^ (var69 ^ var73)) ^ ((var70 ^ var74) ^ (var68 ^ var72)))));
        ret = var212;
        if ((var4 == var1)) {
            return ret;
        }
        L_16b0: ;
        do {
            var213 = (unsigned long)((unsigned int)(*(int *)(((long)arg0 + var4 * 4))));
            var215 = ((unsigned int)((var213 + (var213 * 2))) + 7);
            *(int *)(((long)arg0 + var4 * 4)) = var215;
            var218 = (unsigned long)((unsigned int)((var212 ^ (unsigned long)((unsigned int)(var215)))));
            i = (var4 + 1);
            var212 = var218;
            var4 = (unsigned long)((unsigned int)(i));
            ret = var218;
        } while ((var1 != i));
    } else {
        var212 = 0;
        var4 = 0;
        goto L_16b0;
    }
    return ret;
}

gcc -O0

6/9
cas_update pass 10 lines
// glaurung: cas_update @ 0x116b
int cas_update(int * arg0, int arg1, int arg2) {
    // x86-64 prologue: save rbp
    if (((unsigned int)(arg1) != (unsigned int)(*(int *)((long)arg0)))) {
        return 0;
    } else {
        *(int *)((long)arg0) = arg2;
        return 1;
    }
}
mem_copy pass 10 lines
// glaurung: mem_copy @ 0x119f
void mem_copy(int * arg0, const int * arg1, int arg2) {
    int i;
    // x86-64 prologue: save rbp
    for (i = 0; (i < arg2); i++) {
        arg0[(long)(i)] = arg1[(long)(i)];
    }
    // x86-64 epilogue: restore rbp
    return;
}
mem_set pass 10 lines
// glaurung: mem_set @ 0x11f8
void mem_set(int * arg0, int arg1, int arg2) {
    int i;
    // x86-64 prologue: save rbp
    for (i = 0; (i < arg2); i++) {
        arg0[(long)(i)] = arg1;
    }
    // x86-64 epilogue: restore rbp
    return;
}
read_counter pass 8 lines
// glaurung: read_counter @ 0x1146
static unsigned char glaurung_global_4024[16] __attribute__((aligned(16)));
int read_counter(void) {
    extern unsigned char glaurung_global_4024[16];
    // x86-64 prologue: save rbp
    // x86-64 epilogue: restore rbp
    return (unsigned int)(*(int *)(&glaurung_global_4024[0]));
}
reset_counter structural 9 lines
// glaurung: reset_counter @ 0x1156
static unsigned char glaurung_global_4024[16] __attribute__((aligned(16)));
void reset_counter(void) {
    extern unsigned char glaurung_global_4024[16];
    // x86-64 prologue: save rbp
    *(int *)(&glaurung_global_4024[0]) = 0;
    // x86-64 epilogue: restore rbp
    return;
}
tick structural 9 lines
// glaurung: tick @ 0x10f9
static unsigned char glaurung_global_4024[16] __attribute__((aligned(16)));
void tick(void) {
    extern unsigned char glaurung_global_4024[16];
    // x86-64 prologue: save rbp
    *(int *)(&glaurung_global_4024[0]) = ((unsigned long)((unsigned int)(*(int *)(&glaurung_global_4024[0]))) + 1);
    // x86-64 epilogue: restore rbp
    return;
}
tick_n structural 12 lines
// glaurung: tick_n @ 0x1113
static unsigned char glaurung_global_4024[16] __attribute__((aligned(16)));
void tick_n(int arg0) {
    extern unsigned char glaurung_global_4024[16];
    int i;
    // x86-64 prologue: save rbp
    for (i = 0; (i < arg0); i++) {
        *(int *)(&glaurung_global_4024[0]) = ((unsigned long)((unsigned int)(*(int *)(&glaurung_global_4024[0]))) + 1);
    }
    // x86-64 epilogue: restore rbp
    return;
}
vec_sum pass 12 lines
// glaurung: vec_sum @ 0x123c
int vec_sum(const int * arg0, int arg1) {
    int s;
    int i;
    // x86-64 prologue: save rbp
    s = 0;
    for (i = 0; (i < arg1); i++) {
        s = (s + (unsigned int)(arg0[(long)(i)]));
    }
    // x86-64 epilogue: restore rbp
    return (unsigned int)(s);
}
vec_transform pass 15 lines
// glaurung: vec_transform @ 0x1285
int vec_transform(int * arg0, int arg1) {
    int check;
    int i;
    long var6;
    // x86-64 prologue: save rbp
    check = 0;
    for (i = 0; (i < arg1); i++) {
        var6 = (unsigned long)((unsigned int)(arg0[(long)(i)]));
        arg0[(long)(i)] = ((unsigned long)((unsigned int)((var6 + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var6)) + (unsigned long)((unsigned int)(var6)))))))) + 7);
        check = (check ^ (unsigned int)(arg0[(long)(i)]));
    }
    // x86-64 epilogue: restore rbp
    return (unsigned int)(check);
}

gcc -O2

6/9
cas_update pass 10 lines
// glaurung: cas_update @ 0x1170
int cas_update(int * arg0, int arg1, int arg2) {
    long ret;
    ret = 0;
    if (((unsigned int)(*(int *)(((long)arg0))) == (unsigned int)(arg1))) {
        *(int *)(((long)arg0)) = arg2;
        return 1;
    }
    return ret;
}
mem_copy pass 16 lines
// glaurung: mem_copy @ 0x1190
void mem_copy(int * arg0, const int * arg1, int arg2) {
    int i;
    long ret;
    long var0;
    if ((((unsigned long)((unsigned int)(arg2)) != 0) && (0 <= (long)(arg2)))) {
        var0 = (long)(arg2);
        i = 0;
        do {
            *(int *)(((long)arg0 + i * 4)) = *(int *)(((long)arg1 + i * 4));
            ret = ((unsigned long)((unsigned int)(i)) + 1);
            i = ret;
        } while ((ret != var0));
    }
    return;
}
mem_set pass 15 lines
// glaurung: mem_set @ 0x11b0
void mem_set(int * arg0, int arg1, int arg2) {
    int i;
    long ret;
    long var1;
    if ((((unsigned long)((unsigned int)(arg2)) != 0) && (0 <= (long)(arg2)))) {
        ret = (long)((((long)arg0 + ((unsigned long)((unsigned int)((arg2 - 1))) * 4)) + 4));
        var1 = (long)arg0;
        do {
            *(int *)((var1)) = arg1;
            var1 = (var1 + 4);
        } while ((var1 != ret));
    }
    return;
}
read_counter pass 6 lines
// glaurung: read_counter @ 0x1150
static unsigned char glaurung_global_4024[16] __attribute__((aligned(16)));
int read_counter(void) {
    extern unsigned char glaurung_global_4024[16];
    return (unsigned int)(*(int *)(&glaurung_global_4024[0]));
}
reset_counter structural 7 lines
// glaurung: reset_counter @ 0x1160
static unsigned char glaurung_global_4024[16] __attribute__((aligned(16)));
void reset_counter(void) {
    extern unsigned char glaurung_global_4024[16];
    *(int *)(&glaurung_global_4024[0]) = 0;
    return;
}
tick structural 7 lines
// glaurung: tick @ 0x1100
static unsigned char glaurung_global_4024[16] __attribute__((aligned(16)));
void tick(void) {
    extern unsigned char glaurung_global_4024[16];
    *(int *)(&glaurung_global_4024[0]) = ((unsigned long)((unsigned int)(*(int *)(&glaurung_global_4024[0]))) + 1);
    return;
}
tick_n structural 16 lines
// glaurung: tick_n @ 0x1120
static unsigned char glaurung_global_4024[16] __attribute__((aligned(16)));
void tick_n(int arg0) {
    extern unsigned char glaurung_global_4024[16];
    int i;
    int var4;
    if ((((unsigned long)((unsigned int)(arg0)) != 0) && (0 <= (long)(arg0)))) {
        i = 0;
        do {
            var4 = (i + 1);
            i = (unsigned long)((unsigned int)(var4));
            *(int *)(&glaurung_global_4024[0]) = ((unsigned long)((unsigned int)(*(int *)(&glaurung_global_4024[0]))) + 1);
        } while (((unsigned int)(arg0) != (unsigned int)(var4)));
    }
    return;
}
vec_sum pass 19 lines
// glaurung: vec_sum @ 0x11d0
int vec_sum(const int * arg0, int arg1) {
    int i;
    int s;
    long ret;
    long var2;
    long var5;
    if ((((unsigned long)((unsigned int)(arg1)) == 0) | ((long)(arg1) < 0))) {
        return 0;
    }
    var2 = (long)((((long)arg0 + ((unsigned long)((unsigned int)((arg1 - 1))) * 4)) + 4));
    ret = 0;
    var5 = (long)arg0;
    do {
        ret = (unsigned long)((unsigned int)((ret + *(int *)((var5)))));
        var5 = (var5 + 4);
    } while ((var5 != var2));
    return ret;
}
vec_transform pass 24 lines
// glaurung: vec_transform @ 0x1200
int vec_transform(int * arg0, int arg1) {
    int check;
    int i;
    long var5;
    long var6;
    long var7;
    long var8;
    long var9;
    if ((((unsigned long)((unsigned int)(arg1)) == 0) | ((long)(arg1) < 0))) {
        return 0;
    }
    var5 = (long)((((long)arg0 + ((unsigned long)((unsigned int)((arg1 - 1))) * 4)) + 4));
    var6 = 0;
    var7 = (long)arg0;
    do {
        var8 = (unsigned long)((unsigned int)(*(int *)((var7))));
        var7 = (var7 + 4);
        var9 = (unsigned long)((unsigned int)(((var8 + (var8 * 2)) + 7)));
        *(int *)((var7 - 0x4)) = var9;
        var6 = (unsigned long)((unsigned int)((var6 ^ var9)));
    } while ((var7 != var5));
    return (unsigned int)(var6);
}

← 213 fixtures