Fixture 198

aggregate return edges

C · 15 functions · 4 lanes · 55 of 60 function-lanes behave identically

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

tests/decompiler_fixtures/src/198_aggregate_return_edges.c source
#include <stdint.h>

/* THE BY-VALUE RETURN CLASSES 195 AND 197 LEAVE OUT.
 *
 * `195_by_value_aggregates` covers SysV's INTEGER (8B, `rax`), INTEGER-pair
 * (16B, `rax:rdx`), split-bank (16B, `rax` + `xmm0`) and MEMORY (32B, hidden
 * pointer) classes. `197_homogeneous_float_aggregates` covers the all-SSE
 * classes (16B and 12B) and AAPCS64's homogeneous float aggregates. Between
 * them every aggregate this corpus returns is 8, 12, 16 or 32 bytes, and every
 * one of them fills its registers exactly or overflows to memory at a multiple
 * of eight.
 *
 * The cells they never reach, all of which classify differently:
 *
 *   struct {int32_t a;}           4B   INTEGER  -> the LOW HALF of rax only
 *   struct {uint8_t a,b,c;}       3B   INTEGER  -> three bytes of rax, and a
 *                                                  size that is not a power of
 *                                                  two, so a load of "the
 *                                                  struct" is not one access
 *   struct {int32_t a,b,c;}      12B   INTEGER,INTEGER -> rax:rdx with rdx
 *                                                  HALF used. This is the
 *                                                  integer twin of 197's
 *                                                  `hfa197_trio3f`, and the
 *                                                  corpus has the float half
 *                                                  of that pair and not the
 *                                                  integer half.
 *   union {int64_t; double;}      8B   the class MERGE: SSE meets INTEGER and
 *                                                  INTEGER wins, so this comes
 *                                                  back in `rax` even though
 *                                                  it holds a `double`. Nothing
 *                                                  in the corpus returns a
 *                                                  union at all, and until
 *                                                  2026-08-18 the DWARF reader
 *                                                  could not describe one
 *                                                  either.
 *   struct {int32_t v[2];}        8B   INTEGER  -> rax, but the member is an
 *                                                  ARRAY, which has an extent
 *                                                  and not just an offset.
 *                                                  `dwarf_signatures.rs` used
 *                                                  to decline array members
 *                                                  outright; since 2026-08-18
 *                                                  it describes them, so this
 *                                                  helper is marshalled rather
 *                                                  than reached only through
 *                                                  its wrapper.
 *   struct {int32_t a..e;}       20B   MEMORY, and NOT a multiple of eight —
 *                                                  195's memory case is exactly
 *                                                  32B, so the tail-padding
 *                                                  copy has never been asked
 *                                                  for.
 *
 * As in 195 and 197, the aggregate-returning helpers are exercised THROUGH
 * callers that return `int32_t`. That is not a stylistic choice: `exec_class`
 * in `tools/diff_decompile.py` classifies EVERY aggregate return as
 * `structural` ("aggregate return — not execution-differential"), because
 * `_ctypes_fn` builds a return type with `_scalar_ctype`, which knows only
 * integers and floats. A struct-returning function can therefore never be
 * called by the differential directly, and the only way to observe the ABI is
 * to make a caller's recovered C get it right in order to call its helper at
 * all. Each caller also witnesses the individual members in a caller-owned
 * buffer with DISTINCT coefficients, so recovering the right total from
 * permuted members is caught instead of passing by luck.
 *
 * TWO NEGATIVE CONTROLS:
 *
 *   `agr198_make_i64` returns an `int64_t` — eight bytes, in `rax`, exactly
 *   where `agr198_make_arr2`'s eight-byte struct arrives, and it is NOT an
 *   aggregate. A recovery that classifies by "eight bytes in the result
 *   register" satisfies every positive case here and fails this one. It is also
 *   the only helper in this file the differential can call directly, so it is
 *   declared REQUIRED and gets its own verdict.
 *
 *   `agr198_scalar_control` runs the same arithmetic and the same buffer writes
 *   with no aggregate anywhere, so a recovery that routes everything through
 *   the hidden-pointer path fails it.
 *
 * `seed` is pinned to small exact values by the manifest, so no product
 * overflows and the `double` written into the union is exactly representable —
 * its bit pattern is then a deterministic constant on both sides. */

#define AGR198_SLOT_A 0
#define AGR198_SLOT_B 1
#define AGR198_SLOT_C 2
#define AGR198_SLOT_D 3
#define AGR198_SLOT_E 4

struct agr198_one {    /*  4 bytes: the low half of one register */
    int32_t a;
};

struct agr198_bytes3 { /*  3 bytes: not a power of two, sub-word */
    uint8_t a;
    uint8_t b;
    uint8_t c;
};

struct agr198_trio {   /* 12 bytes: rax:rdx, rdx half used */
    int32_t a;
    int32_t b;
    int32_t c;
};

union agr198_bits {    /*  8 bytes: SSE merged with INTEGER -> INTEGER */
    int64_t i;
    double d;
};

struct agr198_arr2 {   /*  8 bytes, and the member is an ARRAY */
    int32_t v[2];
};

struct agr198_five {   /* 20 bytes: MEMORY, not a multiple of eight */
    int32_t a;
    int32_t b;
    int32_t c;
    int32_t d;
    int32_t e;
};

__attribute__((noinline)) struct agr198_one agr198_make_one(int32_t seed) {
    struct agr198_one s;
    s.a = seed * 3 + 1;
    return s;
}

__attribute__((noinline)) struct agr198_bytes3 agr198_make_bytes3(int32_t seed) {
    struct agr198_bytes3 s;
    s.a = (uint8_t)(seed + 1);
    s.b = (uint8_t)(seed + 2);
    s.c = (uint8_t)(seed * 3);
    return s;
}

__attribute__((noinline)) struct agr198_trio agr198_make_trio(int32_t seed) {
    struct agr198_trio s;
    s.a = seed + 1;
    s.b = seed * 2;
    s.c = seed * 4;
    return s;
}

/* Writes the `double` member and the caller reads the `int64_t` one: the union
 * is a real type pun at the RETURN boundary, and the result is an exact IEEE
 * bit pattern because `seed` is pinned to small integers. */
__attribute__((noinline)) union agr198_bits agr198_make_bits(int32_t seed) {
    union agr198_bits u;
    u.d = (double)(seed * 2 + 1);
    return u;
}

__attribute__((noinline)) struct agr198_arr2 agr198_make_arr2(int32_t seed) {
    struct agr198_arr2 s;
    s.v[0] = seed + 5;
    s.v[1] = seed * 7;
    return s;
}

__attribute__((noinline)) struct agr198_five agr198_make_five(int32_t seed) {
    struct agr198_five s;
    s.a = seed + 1;
    s.b = seed + 2;
    s.c = seed * 3;
    s.d = seed * 5;
    s.e = seed * 7;
    return s;
}

/* CONTROL helper: eight bytes in `rax` that are NOT an aggregate. Directly
 * executable, unlike every other helper in this file. */
__attribute__((noinline)) int64_t agr198_make_i64(int32_t seed) {
    return (int64_t)seed * 7 + 5;
}

__attribute__((noinline)) int32_t agr198_one_roundtrip(int32_t *scratch, int32_t seed) {
    struct agr198_one s;
    if (scratch == 0) {
        return -1;
    }
    s = agr198_make_one(seed);
    scratch[AGR198_SLOT_A] = s.a;
    return s.a * 3;
}

__attribute__((noinline)) int32_t agr198_bytes3_roundtrip(int32_t *scratch, int32_t seed) {
    struct agr198_bytes3 s;
    if (scratch == 0) {
        return -1;
    }
    /* Three bytes: a recovery that copies four (a whole register's low half)
     * picks up whatever sits in the fourth. */
    s = agr198_make_bytes3(seed);
    scratch[AGR198_SLOT_A] = s.a;
    scratch[AGR198_SLOT_B] = s.b;
    scratch[AGR198_SLOT_C] = s.c;
    return (int32_t)s.a + (int32_t)s.b * 3 + (int32_t)s.c * 5;
}

__attribute__((noinline)) int32_t agr198_trio_roundtrip(int32_t *scratch, int32_t seed) {
    struct agr198_trio s;
    if (scratch == 0) {
        return -1;
    }
    /* rdx is HALF occupied: a recovery that assumes a full second eightbyte
     * reads a fourth member that was never stored. */
    s = agr198_make_trio(seed);
    scratch[AGR198_SLOT_A] = s.a;
    scratch[AGR198_SLOT_B] = s.b;
    scratch[AGR198_SLOT_C] = s.c;
    return s.a + s.b * 3 + s.c * 5;
}

__attribute__((noinline)) int32_t agr198_bits_roundtrip(int32_t *scratch, int32_t seed) {
    union agr198_bits u;
    if (scratch == 0) {
        return -1;
    }
    /* The union arrives in `rax`, not in `xmm0`, even though the value written
     * into it was a `double`. Reading the two halves of the bit pattern proves
     * which register it came back in. */
    u = agr198_make_bits(seed);
    scratch[AGR198_SLOT_A] = (int32_t)(u.i & 0xffffffff);
    scratch[AGR198_SLOT_B] = (int32_t)((uint64_t)u.i >> 32);
    return (int32_t)((uint64_t)u.i >> 52);
}

__attribute__((noinline)) int32_t agr198_arr2_roundtrip(int32_t *scratch, int32_t seed) {
    struct agr198_arr2 s;
    if (scratch == 0) {
        return -1;
    }
    s = agr198_make_arr2(seed);
    scratch[AGR198_SLOT_A] = s.v[0];
    scratch[AGR198_SLOT_B] = s.v[1];
    return s.v[0] + s.v[1] * 3;
}

__attribute__((noinline)) int32_t agr198_five_roundtrip(int32_t *scratch, int32_t seed) {
    struct agr198_five s;
    if (scratch == 0) {
        return -1;
    }
    /* MEMORY class at 20 bytes: the hidden return pointer takes the first
     * argument register AND the copy back is not a whole number of eightbytes. */
    s = agr198_make_five(seed);
    scratch[AGR198_SLOT_A] = s.a;
    scratch[AGR198_SLOT_B] = s.b;
    scratch[AGR198_SLOT_C] = s.c;
    scratch[AGR198_SLOT_D] = s.d;
    scratch[AGR198_SLOT_E] = s.e;
    return s.a + s.b * 3 + s.c * 5 + s.d * 7 + s.e * 11;
}

/* CONTROL: eight bytes in `rax` from a scalar. Must not acquire aggregate
 * handling just because its neighbours have it. */
__attribute__((noinline)) int32_t agr198_i64_control(int32_t *scratch, int32_t seed) {
    int64_t v;
    if (scratch == 0) {
        return -1;
    }
    v = agr198_make_i64(seed);
    scratch[AGR198_SLOT_A] = (int32_t)(v & 0xffffffff);
    scratch[AGR198_SLOT_B] = (int32_t)((uint64_t)v >> 32);
    return (int32_t)v * 3;
}

/* CONTROL: no aggregate anywhere, same buffer discipline. */
__attribute__((noinline)) int32_t agr198_scalar_control(int32_t *scratch, int32_t seed) {
    int32_t a;
    int32_t b;
    int32_t c;
    if (scratch == 0) {
        return -1;
    }
    a = seed + 1;
    b = seed * 2;
    c = seed * 4;
    scratch[AGR198_SLOT_A] = a;
    scratch[AGR198_SLOT_B] = b;
    scratch[AGR198_SLOT_C] = c;
    return a + b * 3 + c * 5;
}

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.

gcc -O2

13/15
agr198_arr2_roundtrip pass 20 lines
// glaurung: agr198_arr2_roundtrip @ 0x13e0
int32_t agr198_arr2_roundtrip(int32_t * arg0, int32_t arg1) {
    extern long agr198_make_arr2(int);
    long local_8;
    long var0;
    long var1;
    long var3;
    long var6;
    local_8 = var0;
    var1 = (long)arg0;
    if ((arg0 == 0)) {
        // x86-64 epilogue: tear down frame
        return 0xffffffff;
    }
    var3 = agr198_make_arr2((unsigned long)((unsigned int)(arg1)));
    *(int *)((var1)) = var3;
    var6 = ((long)(var3) >> 32);
    *(int *)((var1 + 0x4)) = var6;
    return (unsigned int)((var3 + (unsigned long)((unsigned int)((var6 + (var6 * 2))))));
}
agr198_bits_roundtrip pass 18 lines
// glaurung: agr198_bits_roundtrip @ 0x13b0
int32_t agr198_bits_roundtrip(int32_t * arg0, int32_t arg1) {
    extern long agr198_make_bits(int);
    long local_8;
    long var0;
    int * var1;
    long var3;
    local_8 = var0;
    var1 = (int *)arg0;
    if ((arg0 == 0)) {
        // x86-64 epilogue: tear down frame
        return 0xffffffff;
    }
    var3 = agr198_make_bits((unsigned long)((unsigned int)(arg1)));
    *(long *)((var1)) = var3;
    // x86-64 epilogue: tear down frame
    return ((unsigned long)(var3) >> 52);
}
agr198_bytes3_roundtrip pass 22 lines
// glaurung: agr198_bytes3_roundtrip @ 0x1320
int32_t agr198_bytes3_roundtrip(int32_t * arg0, int32_t arg1) {
    extern unsigned int agr198_make_bytes3(int);
    long var0;
    unsigned int var1;
    int var5;
    int var6;
    int var9;
    var0 = (long)arg0;
    if ((arg0 == 0)) {
        return 0xffffffff;
    } else {
        var1 = agr198_make_bytes3((unsigned long)((unsigned int)(arg1)));
        var5 = (unsigned int)((unsigned char)(((long)((int)(var1)) & 255)));
        var6 = (unsigned int)((unsigned char)((((unsigned long)((long)((int)(var1))) >> 8) & 255)));
        *(int *)((var0 + 0x4)) = var6;
        var9 = (unsigned int)((unsigned char)((((unsigned long)((long)((int)(var1))) >> 16) & 255)));
        *(int *)((var0)) = var5;
        *(int *)((var0 + 0x8)) = var9;
        return (unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)((var6 + (var6 * 2)))) + var5))) + (unsigned long)((unsigned int)((var9 + (var9 * 4))))));
    }
}
agr198_five_roundtrip fail 41 lines
// glaurung: agr198_five_roundtrip @ 0x1410
int32_t agr198_five_roundtrip(int32_t * arg0, int32_t arg1) {
    extern __attribute__((noreturn)) void __stack_chk_fail(void);
    extern int * agr198_make_five(char *, int);
    long local_10;
    unsigned char local_28[20];
    long ret;
    long rsp;
    long var11;
    long var3;
    int * var4;
    long var6;
    long var7;
    long var8;
    long var9;
    rsp = (rsp - 8);
    rsp = (rsp - 32);
    local_10 = (long)(0x28);
    if ((arg0 == 0)) {
        ret = 0xffffffff;
    } else {
        var3 = (long)arg0;
        var4 = ((int * (*)(char *))agr198_make_five)((char *)(rsp));
        var6 = (unsigned long)((unsigned int)(*(int *)((&local_28[0] + 4))));
        var7 = (unsigned long)((unsigned int)(*(int *)(&local_28[0])));
        var8 = (unsigned long)((unsigned int)(*(int *)((&local_28[0] + 8))));
        var9 = (unsigned long)((unsigned int)(*(int *)((&local_28[0] + 12))));
        *(int *)((var3 + 0x4)) = var6;
        var11 = (unsigned long)((unsigned int)(*(int *)((&local_28[0] + 16))));
        *(int *)((var3 + 0x8)) = var8;
        *(int *)((var3)) = var7;
        *(int *)((var3 + 0xc)) = var9;
        *(int *)((var3 + 0x10)) = var11;
        ret = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)((var6 + (var6 * 2)))) + var7))) + (unsigned long)((unsigned int)((var8 + (var8 * 4))))))) + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)((var9 * 8))) - var9)))))) + (unsigned long)((unsigned int)((var11 + ((unsigned long)((unsigned int)((var11 + (var11 * 4)))) * 2)))))));
    }
    if ((local_10 != 0x28)) {
        __stack_chk_fail();
    }
    // x86-64 epilogue: tear down frame
    return ret;
}
agr198_i64_control pass 19 lines
// glaurung: agr198_i64_control @ 0x14a0
int32_t agr198_i64_control(int32_t * arg0, int32_t arg1) {
    extern long agr198_make_i64(int);
    long v;
    long local_8;
    long var0;
    int * var1;
    long var3;
    local_8 = var0;
    var1 = (int *)arg0;
    if ((arg0 == 0)) {
        // x86-64 epilogue: tear down frame
        return 0xffffffff;
    }
    var3 = agr198_make_i64((unsigned long)((unsigned int)(arg1)));
    *(long *)((var1)) = var3;
    // x86-64 epilogue: tear down frame
    return (unsigned int)((var3 + (var3 * 2)));
}
agr198_make_arr2 pass 4 lines
// glaurung: agr198_make_arr2 @ 0x1280
unsigned long agr198_make_arr2(int32_t arg0) {
    return ((unsigned long)((unsigned int)((arg0 + 5))) | ((unsigned long)((unsigned int)(((unsigned long)((unsigned int)((arg0 * 8))) - arg0))) << 32));
}
agr198_make_bits pass 4 lines
// glaurung: agr198_make_bits @ 0x1260
double agr198_make_bits(int arg0) {
    return (double)((int)((unsigned long)((unsigned int)(((arg0 + arg0) + 1)))));
}
agr198_make_bytes3 pass 8 lines
// glaurung: agr198_make_bytes3 @ 0x1210
unsigned int agr198_make_bytes3(int32_t arg0) {
    signed char local_2;
    signed char local_3;
    local_3 = (arg0 + 1);
    local_2 = (arg0 + 2);
    return (unsigned int)(((unsigned int)((unsigned short)(((unsigned short)((unsigned char)(local_3)) | ((unsigned short)((unsigned char)(local_2)) << 8)))) | ((unsigned int)((unsigned char)(((unsigned long)((unsigned int)((arg0 + (arg0 * 2)))) & 255))) << 16)));
}
agr198_make_five structural 9 lines
// glaurung: agr198_make_five @ 0x12a0
int * agr198_make_five(char * arg0, int arg1) {
    *(int *)(((long)arg0)) = (arg1 + 1);
    *(int *)(((long)arg0 + 0x4)) = (arg1 + 2);
    *(int *)(((long)arg0 + 0x8)) = (arg1 + (arg1 * 2));
    *(int *)(((long)arg0 + 0xc)) = (arg1 + (arg1 * 4));
    *(int *)(((long)arg0 + 0x10)) = ((unsigned long)((unsigned int)((arg1 * 8))) - arg1);
    return (int *)arg0;
}
agr198_make_i64 pass 4 lines
// glaurung: agr198_make_i64 @ 0x12d0
int64_t agr198_make_i64(int32_t arg0) {
    return ((((long)(arg0) * 8) - (long)(arg0)) + 5);
}
agr198_make_one pass 4 lines
// glaurung: agr198_make_one @ 0x1200
unsigned int agr198_make_one(int32_t arg0) {
    return (unsigned int)(((arg0 + (arg0 * 2)) + 1));
}
agr198_make_trio pass 8 lines
// glaurung: agr198_make_trio @ 0x1240
unsigned __int128 agr198_make_trio(int32_t arg0) {
    int local_10;
    int local_14;
    local_14 = (arg0 + 1);
    local_10 = (arg0 + arg0);
    return ((unsigned __int128)((unsigned long)(((unsigned long)((unsigned int)(local_14)) | ((unsigned long)((unsigned int)(local_10)) << 32)))) | ((unsigned __int128)((unsigned long)((unsigned int)((arg0 * 4)))) << 64));
}
agr198_one_roundtrip pass 18 lines
// glaurung: agr198_one_roundtrip @ 0x12f0
int32_t agr198_one_roundtrip(int32_t * arg0, int32_t arg1) {
    extern unsigned int agr198_make_one(int);
    long local_8;
    long var0;
    int * var1;
    unsigned int var3;
    local_8 = var0;
    var1 = (int *)arg0;
    if ((arg0 == 0)) {
        // x86-64 epilogue: tear down frame
        return 0xffffffff;
    }
    var3 = agr198_make_one((unsigned long)((unsigned int)(arg1)));
    *(int *)((var1)) = var3;
    // x86-64 epilogue: tear down frame
    return (unsigned int)((var3 + (var3 * 2)));
}
agr198_scalar_control pass 16 lines
// glaurung: agr198_scalar_control @ 0x14d0
int32_t agr198_scalar_control(int32_t * arg0, int32_t arg1) {
    int a;
    long var0;
    long var2;
    if ((arg0 == 0)) {
        return 0xffffffff;
    }
    var0 = (unsigned long)((unsigned int)((arg1 + arg1)));
    a = (unsigned long)((unsigned int)((arg1 + 1)));
    var2 = (unsigned long)((unsigned int)((arg1 * 4)));
    *(int *)(((long)arg0 + 0x4)) = var0;
    *(int *)(((long)arg0 + 0x8)) = var2;
    *(int *)(((long)arg0)) = a;
    return (unsigned int)(((unsigned long)((unsigned int)((a + ((unsigned long)((unsigned int)((var0 + arg1))) * 2)))) + ((unsigned long)((unsigned int)((var2 + arg1))) * 4)));
}
agr198_trio_roundtrip pass 20 lines
// glaurung: agr198_trio_roundtrip @ 0x1370
int32_t agr198_trio_roundtrip(int32_t * arg0, int32_t arg1) {
    extern unsigned __int128 agr198_make_trio(int);
    long var0;
    unsigned __int128 var1;
    long var2;
    long var5;
    var0 = (long)arg0;
    if ((arg0 == 0)) {
        return 0xffffffff;
    } else {
        var1 = agr198_make_trio((unsigned long)((unsigned int)(arg1)));
        var2 = (unsigned long)(((unsigned __int128)(var1) >> 64));
        var5 = ((unsigned __int128)(var1) >> 32);
        *(int *)((var0 + 0x8)) = var2;
        *(int *)((var0 + 0x4)) = var5;
        *(int *)((var0)) = var1;
        return (unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)((var5 + (var5 * 2)))) + (unsigned long)((unsigned int)(var1))))) + (unsigned long)((unsigned int)((var2 + (var2 * 4))))));
    }
}

clang -O0

14/15
agr198_arr2_roundtrip pass 18 lines
// glaurung: agr198_arr2_roundtrip @ 0x14b0
__attribute__((no_stack_protector)) int32_t agr198_arr2_roundtrip(int32_t * arg0, int32_t arg1) {
    extern long agr198_make_arr2(int);
    unsigned char local_20[8];
    long local_28;
    long var0;
    // x86-64 prologue: save rbp, frame 48 bytes
    if ((arg0 != 0)) {
        var0 = agr198_make_arr2((unsigned long)((unsigned int)(arg1)));
        local_28 = var0;
        *(long *)(&local_20[0]) = local_28;
        *(int *)((long)arg0) = *(int *)(&local_20[0]);
        *(int *)(((long)arg0 + 0x4)) = *(int *)((&local_20[0] + 4));
        return (unsigned int)(((unsigned long)((unsigned int)(*(int *)(&local_20[0]))) + (*(int *)((&local_20[0] + 4)) * 3)));
    } else {
        return (unsigned int)(-1);
    }
}
agr198_bits_roundtrip pass 18 lines
// glaurung: agr198_bits_roundtrip @ 0x1430
__attribute__((no_stack_protector)) int32_t agr198_bits_roundtrip(int32_t * arg0, int32_t arg1) {
    extern long agr198_make_bits(int);
    unsigned char local_20[8];
    long local_28;
    long var0;
    // x86-64 prologue: save rbp, frame 48 bytes
    if ((arg0 != 0)) {
        var0 = agr198_make_bits((unsigned long)((unsigned int)(arg1)));
        local_28 = var0;
        *(long *)(&local_20[0]) = local_28;
        *(int *)((long)arg0) = *(long *)(&local_20[0]);
        *(int *)(((long)arg0 + 0x4)) = ((unsigned long)(*(long *)(&local_20[0])) >> 32);
        return (unsigned int)(((unsigned long)(*(long *)(&local_20[0])) >> 52));
    } else {
        return (unsigned int)(-1);
    }
}
agr198_bytes3_roundtrip pass 26 lines
// glaurung: agr198_bytes3_roundtrip @ 0x1300
__attribute__((no_stack_protector)) int32_t agr198_bytes3_roundtrip(int32_t * arg0, int32_t arg1) {
    extern unsigned int agr198_make_bytes3(int);
    unsigned char local_18[3];
    signed char local_1e;
    short local_20;
    signed char local_22;
    short local_24;
    unsigned int var0;
    // x86-64 prologue: save rbp, frame 48 bytes
    if ((arg0 != 0)) {
        var0 = agr198_make_bytes3((unsigned long)((unsigned int)(arg1)));
        local_24 = var0;
        local_22 = ((unsigned long)(var0) >> 16);
        local_20 = local_24;
        local_1e = local_22;
        *(short *)(&local_18[0]) = local_20;
        *(signed char *)((&local_18[0] + 2)) = local_1e;
        *(int *)((long)arg0) = (unsigned char)(*(char *)(&local_18[0]));
        *(int *)(((long)arg0 + 0x4)) = (unsigned char)(*(char *)((&local_18[0] + 1)));
        *(int *)(((long)arg0 + 0x8)) = (unsigned char)(*(char *)((&local_18[0] + 2)));
        return (unsigned int)(((unsigned long)((unsigned int)(((unsigned int)((unsigned char)(*(char *)(&local_18[0]))) + ((unsigned int)((unsigned char)(*(char *)((&local_18[0] + 1)))) * 3)))) + ((unsigned int)((unsigned char)(*(char *)((&local_18[0] + 2)))) * 5)));
    } else {
        return (unsigned int)(-1);
    }
}
agr198_five_roundtrip pass 22 lines
// glaurung: agr198_five_roundtrip @ 0x1520
__attribute__((no_stack_protector)) int32_t agr198_five_roundtrip(int32_t * arg0, int32_t arg1) {
    extern int * agr198_make_five(char *, int);
    unsigned char local_28[20];
    unsigned char local_40[24];
    int * var0;
    // x86-64 prologue: save rbp, frame 64 bytes
    if ((arg0 != 0)) {
        var0 = agr198_make_five((char *)(&local_40[0]), (unsigned long)((unsigned int)(arg1)));
        *(long *)(&local_28[0]) = *(long *)(&local_40[0]);
        *(long *)((&local_28[0] + 8)) = *(long *)((&local_40[0] + 8));
        *(int *)((&local_28[0] + 16)) = *(int *)((&local_40[0] + 16));
        *(int *)((long)arg0) = *(int *)(&local_28[0]);
        *(int *)(((long)arg0 + 0x4)) = *(int *)((&local_28[0] + 4));
        *(int *)(((long)arg0 + 0x8)) = *(int *)((&local_28[0] + 8));
        *(int *)(((long)arg0 + 0xc)) = *(int *)((&local_28[0] + 12));
        *(int *)(((long)arg0 + 0x10)) = *(int *)((&local_28[0] + 16));
        return (unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)(&local_28[0]))) + (*(int *)((&local_28[0] + 4)) * 3)))) + (*(int *)((&local_28[0] + 8)) * 5)))) + (*(int *)((&local_28[0] + 12)) * 7)))) + (*(int *)((&local_28[0] + 16)) * 11)));
    } else {
        return (unsigned int)(-1);
    }
}
agr198_i64_control pass 16 lines
// glaurung: agr198_i64_control @ 0x15c0
int32_t agr198_i64_control(int32_t * arg0, int32_t arg1) {
    extern long agr198_make_i64(int);
    long v;
    long var0;
    // x86-64 prologue: save rbp, frame 32 bytes
    if ((arg0 != 0)) {
        var0 = agr198_make_i64((unsigned long)((unsigned int)(arg1)));
        v = var0;
        *(int *)((long)arg0) = v;
        *(int *)(((long)arg0 + 0x4)) = ((unsigned long)(v) >> 32);
        return (unsigned int)((v * 3));
    } else {
        return (unsigned int)(-1);
    }
}
agr198_make_arr2 pass 9 lines
// glaurung: agr198_make_arr2 @ 0x1230
__attribute__((no_stack_protector)) unsigned long agr198_make_arr2(int32_t arg0) {
    unsigned char local_8[8];
    // x86-64 prologue: save rbp
    *(int *)(&local_8[0]) = ((unsigned long)((unsigned int)(arg0)) + 5);
    *(int *)((&local_8[0] + 4)) = (arg0 * 7);
    // x86-64 epilogue: restore rbp
    return *(long *)(&local_8[0]);
}
agr198_make_bits pass 8 lines
// glaurung: agr198_make_bits @ 0x1210
__attribute__((no_stack_protector)) double agr198_make_bits(int arg0) {
    unsigned char local_8[8];
    // x86-64 prologue: save rbp
    *(double *)(&local_8[0]) = (double)((int)((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(arg0)) << 1))) + 1)))));
    // x86-64 epilogue: restore rbp
    return *(double *)(&local_8[0]);
}
agr198_make_bytes3 pass 14 lines
// glaurung: agr198_make_bytes3 @ 0x1190
__attribute__((no_stack_protector)) unsigned int agr198_make_bytes3(int32_t arg0) {
    short local_10;
    unsigned char local_8[3];
    signed char local_e;
    // x86-64 prologue: save rbp
    *(signed char *)(&local_8[0]) = (((unsigned char)(arg0) & 255) + 1);
    *(signed char *)((&local_8[0] + 1)) = (((unsigned char)(arg0) & 255) + 2);
    *(signed char *)((&local_8[0] + 2)) = ((unsigned long)((unsigned int)(arg0)) + ((unsigned long)((unsigned int)(arg0)) * 2));
    local_e = *(char *)((&local_8[0] + 2));
    local_10 = *(short *)(&local_8[0]);
    // x86-64 epilogue: restore rbp
    return (unsigned int)(((unsigned int)((unsigned short)(local_10)) | (unsigned long)((unsigned int)(((unsigned int)((unsigned char)(local_e)) << 16)))));
}
agr198_make_five structural 11 lines
// glaurung: agr198_make_five @ 0x1250
int * agr198_make_five(char * arg0, int arg1) {
    // x86-64 prologue: save rbp
    *(int *)(((long)arg0)) = ((unsigned long)((unsigned int)(arg1)) + 1);
    *(int *)(((long)arg0 + 0x4)) = ((unsigned long)((unsigned int)(arg1)) + 2);
    *(int *)(((long)arg0 + 0x8)) = (arg1 * 3);
    *(int *)(((long)arg0 + 0xc)) = (arg1 * 5);
    *(int *)(((long)arg0 + 0x10)) = (arg1 * 7);
    // x86-64 epilogue: restore rbp
    return (int *)arg0;
}
agr198_make_i64 pass 6 lines
// glaurung: agr198_make_i64 @ 0x1290
int64_t agr198_make_i64(int32_t arg0) {
    // x86-64 prologue: save rbp
    // x86-64 epilogue: restore rbp
    return (((long)(arg0) * 7) + 5);
}
agr198_make_one pass 8 lines
// glaurung: agr198_make_one @ 0x1170
__attribute__((no_stack_protector)) unsigned int agr198_make_one(int32_t arg0) {
    unsigned char local_8[4];
    // x86-64 prologue: save rbp
    *(int *)(&local_8[0]) = ((arg0 * 3) + 1);
    // x86-64 epilogue: restore rbp
    return (unsigned int)(*(int *)(&local_8[0]));
}
agr198_make_trio pass 14 lines
// glaurung: agr198_make_trio @ 0x11d0
__attribute__((no_stack_protector)) unsigned __int128 agr198_make_trio(int32_t arg0) {
    unsigned char local_10[12];
    int local_20;
    long local_28;
    // x86-64 prologue: save rbp
    *(int *)(&local_10[0]) = ((unsigned long)((unsigned int)(arg0)) + 1);
    *(int *)((&local_10[0] + 4)) = ((unsigned long)((unsigned int)(arg0)) + (unsigned long)((unsigned int)(arg0)));
    *(int *)((&local_10[0] + 8)) = ((unsigned long)((unsigned int)(arg0)) << 2);
    local_20 = *(int *)((&local_10[0] + 8));
    local_28 = *(long *)(&local_10[0]);
    // x86-64 epilogue: restore rbp
    return ((unsigned __int128)((unsigned long)(local_28)) | ((unsigned __int128)((unsigned long)((unsigned int)(local_20))) << 64));
}
agr198_one_roundtrip pass 17 lines
// glaurung: agr198_one_roundtrip @ 0x12b0
__attribute__((no_stack_protector)) int32_t agr198_one_roundtrip(int32_t * arg0, int32_t arg1) {
    extern unsigned int agr198_make_one(int);
    unsigned char local_18[4];
    int local_20;
    unsigned int var0;
    // x86-64 prologue: save rbp, frame 32 bytes
    if ((arg0 != 0)) {
        var0 = agr198_make_one((unsigned long)((unsigned int)(arg1)));
        local_20 = var0;
        *(int *)(&local_18[0]) = local_20;
        *(int *)((long)arg0) = *(int *)(&local_18[0]);
        return (unsigned int)((*(int *)(&local_18[0]) * 3));
    } else {
        return (unsigned int)(-1);
    }
}
agr198_scalar_control pass 18 lines
// glaurung: agr198_scalar_control @ 0x1630
int32_t agr198_scalar_control(int32_t * arg0, int32_t arg1) {
    int a;
    int b;
    int c;
    // x86-64 prologue: save rbp
    if ((arg0 != 0)) {
        a = ((unsigned int)(arg1) + 1);
        b = ((unsigned long)((unsigned int)(arg1)) << 1);
        c = ((unsigned long)((unsigned int)(arg1)) << 2);
        *(int *)((long)arg0) = a;
        *(int *)(((long)arg0 + 0x4)) = b;
        *(int *)(((long)arg0 + 0x8)) = c;
        return (unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(a)) + (b * 3)))) + (c * 5)));
    } else {
        return (unsigned int)(-1);
    }
}
agr198_trio_roundtrip pass 26 lines
// glaurung: agr198_trio_roundtrip @ 0x13a0
__attribute__((no_stack_protector)) int32_t agr198_trio_roundtrip(int32_t * arg0, int32_t arg1) {
    extern unsigned __int128 agr198_make_trio(int);
    unsigned char local_20[12];
    int local_28;
    long local_30;
    int local_38;
    long local_40;
    unsigned __int128 var0;
    // x86-64 prologue: save rbp, frame 64 bytes
    if ((arg0 != 0)) {
        var0 = agr198_make_trio((unsigned long)((unsigned int)(arg1)));
        local_38 = ((unsigned __int128)(var0) >> 64);
        local_40 = var0;
        local_30 = local_40;
        local_28 = local_38;
        *(long *)(&local_20[0]) = local_30;
        *(int *)((&local_20[0] + 8)) = local_28;
        *(int *)((long)arg0) = *(int *)(&local_20[0]);
        *(int *)(((long)arg0 + 0x4)) = *(int *)((&local_20[0] + 4));
        *(int *)(((long)arg0 + 0x8)) = *(int *)((&local_20[0] + 8));
        return (unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)(&local_20[0]))) + (*(int *)((&local_20[0] + 4)) * 3)))) + (*(int *)((&local_20[0] + 8)) * 5)));
    } else {
        return (unsigned int)(-1);
    }
}

clang -O2

14/15
agr198_arr2_roundtrip pass 16 lines
// glaurung: agr198_arr2_roundtrip @ 0x1300
int32_t agr198_arr2_roundtrip(int32_t * arg0, int32_t arg1) {
    extern long agr198_make_arr2(int);
    int * var0;
    long var1;
    long var4;
    if ((arg0 == 0)) {
        return 0xffffffff;
    }
    var0 = (int *)arg0;
    var1 = agr198_make_arr2((unsigned long)((unsigned int)(arg1)));
    *(long *)((var0)) = var1;
    var4 = ((unsigned long)(var1) >> 32);
    // x86-64 epilogue: tear down frame
    return (unsigned int)(((unsigned long)((unsigned int)((var4 + (var4 * 2)))) + var1));
}
agr198_bits_roundtrip pass 14 lines
// glaurung: agr198_bits_roundtrip @ 0x12e0
int32_t agr198_bits_roundtrip(int32_t * arg0, int32_t arg1) {
    extern long agr198_make_bits(int);
    int * var0;
    long var1;
    if ((arg0 == 0)) {
        return 0xffffffff;
    }
    var0 = (int *)arg0;
    var1 = agr198_make_bits((unsigned long)((unsigned int)(arg1)));
    *(long *)((var0)) = var1;
    // x86-64 epilogue: tear down frame
    return ((unsigned long)(var1) >> 52);
}
agr198_bytes3_roundtrip pass 24 lines
// glaurung: agr198_bytes3_roundtrip @ 0x1260
int32_t agr198_bytes3_roundtrip(int32_t * arg0, int32_t arg1) {
    extern unsigned int agr198_make_bytes3(int);
    long var0;
    unsigned int var1;
    int var3;
    long var5;
    int var6;
    long var9;
    if ((arg0 == 0)) {
        return 0xffffffff;
    }
    var0 = (long)arg0;
    var1 = agr198_make_bytes3((unsigned long)((unsigned int)(arg1)));
    var3 = (unsigned int)((unsigned char)((var1 & 255)));
    var5 = (unsigned long)((unsigned int)((var1 & 0xffffff)));
    var6 = (unsigned int)((unsigned char)((((unsigned long)(var5) >> 8) & 255)));
    var9 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var5)) >> 16)));
    *(int *)((var0)) = var3;
    *(int *)((var0 + 0x4)) = var6;
    *(int *)((var0 + 0x8)) = var9;
    // x86-64 epilogue: tear down frame
    return (unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)((var9 + (var9 * 4)))) + var3))) + (unsigned long)((unsigned int)((var6 + (var6 * 2))))));
}
agr198_five_roundtrip pass 29 lines
// glaurung: agr198_five_roundtrip @ 0x1330
__attribute__((no_stack_protector)) int32_t agr198_five_roundtrip(int32_t * arg0, int32_t arg1) {
    extern int * agr198_make_five(char *, int);
    unsigned char local_20[24];
    long var0;
    int * var1;
    long var3;
    long var4;
    long var5;
    long var6;
    long var7;
    if ((arg0 == 0)) {
        return 0xffffffff;
    }
    var0 = (long)arg0;
    var1 = ((int * (*)(char *))agr198_make_five)((char *)(&local_20[0]));
    var3 = (unsigned long)((unsigned int)(*(int *)(&local_20[0])));
    var4 = (unsigned long)((unsigned int)(*(int *)((&local_20[0] + 4))));
    var5 = (unsigned long)((unsigned int)(*(int *)((&local_20[0] + 8))));
    var6 = (unsigned long)((unsigned int)(*(int *)((&local_20[0] + 12))));
    var7 = (unsigned long)((unsigned int)(*(int *)((&local_20[0] + 16))));
    *(int *)((var0)) = var3;
    *(int *)((var0 + 0x4)) = var4;
    *(int *)((var0 + 0x8)) = var5;
    *(int *)((var0 + 0xc)) = var6;
    *(int *)((var0 + 0x10)) = var7;
    // x86-64 epilogue: tear down frame
    return (unsigned int)(((unsigned long)((unsigned int)((var7 + ((unsigned long)((unsigned int)((var7 + (var7 * 4)))) * 2)))) + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)((var6 * 8))) - var6))) + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)((var5 + (var5 * 4)))) + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)((var4 + (var4 * 2)))) + var3)))))))))));
}
agr198_i64_control pass 15 lines
// glaurung: agr198_i64_control @ 0x13a0
int32_t agr198_i64_control(int32_t * arg0, int32_t arg1) {
    extern long agr198_make_i64(int);
    long v;
    int * var0;
    long var1;
    if ((arg0 == 0)) {
        return 0xffffffff;
    }
    var0 = (int *)arg0;
    var1 = agr198_make_i64((unsigned long)((unsigned int)(arg1)));
    *(long *)((var0)) = var1;
    // x86-64 epilogue: tear down frame
    return (unsigned int)((var1 + (var1 * 2)));
}
agr198_make_arr2 pass 4 lines
// glaurung: agr198_make_arr2 @ 0x11d0
unsigned long agr198_make_arr2(int32_t arg0) {
    return ((unsigned long)((unsigned int)((arg0 + 5))) | ((unsigned long)((unsigned int)(((unsigned long)((unsigned int)((arg0 * 8))) - arg0))) << 32));
}
agr198_make_bits pass 4 lines
// glaurung: agr198_make_bits @ 0x11c0
double agr198_make_bits(int arg0) {
    return (double)((int)((unsigned long)((unsigned int)(((unsigned long)((unsigned int)((arg0 + arg0))) + 1)))));
}
agr198_make_bytes3 pass 6 lines
// glaurung: agr198_make_bytes3 @ 0x1180
unsigned int agr198_make_bytes3(int32_t arg0) {
    long var3;
    var3 = (unsigned long)((unsigned int)((arg0 << 16)));
    return (unsigned int)(((unsigned long)((unsigned int)(((unsigned int)((unsigned char)(((unsigned long)((unsigned int)((arg0 + 1))) & 255))) | (unsigned long)((unsigned int)((var3 + (var3 * 2))))))) | (unsigned long)((unsigned int)(((unsigned int)((unsigned char)(((unsigned long)((unsigned int)((arg0 + 2))) & 255))) << 8)))));
}
agr198_make_five structural 9 lines
// glaurung: agr198_make_five @ 0x11f0
int * agr198_make_five(char * arg0, int arg1) {
    *(int *)(((long)arg0)) = (arg1 + 1);
    *(int *)(((long)arg0 + 0x4)) = (arg1 + 2);
    *(int *)(((long)arg0 + 0x8)) = (arg1 + (arg1 * 2));
    *(int *)(((long)arg0 + 0xc)) = (arg1 + (arg1 * 4));
    *(int *)(((long)arg0 + 0x10)) = ((unsigned long)((unsigned int)((arg1 * 8))) - arg1);
    return (int *)arg0;
}
agr198_make_i64 pass 4 lines
// glaurung: agr198_make_i64 @ 0x1220
int64_t agr198_make_i64(int32_t arg0) {
    return ((((long)(arg0) * 8) - (long)(arg0)) + 5);
}
agr198_make_one pass 4 lines
// glaurung: agr198_make_one @ 0x1170
unsigned int agr198_make_one(int32_t arg0) {
    return (unsigned int)(((unsigned long)((unsigned int)((arg0 + (arg0 * 2)))) + 1));
}
agr198_make_trio pass 4 lines
// glaurung: agr198_make_trio @ 0x11a0
unsigned __int128 agr198_make_trio(int32_t arg0) {
    return ((unsigned __int128)((unsigned long)(((unsigned long)((unsigned int)((arg0 + 1))) | ((unsigned long)((unsigned int)(arg0)) << 33)))) | ((unsigned __int128)((unsigned long)((unsigned int)((arg0 * 4)))) << 64));
}
agr198_one_roundtrip pass 14 lines
// glaurung: agr198_one_roundtrip @ 0x1240
int32_t agr198_one_roundtrip(int32_t * arg0, int32_t arg1) {
    extern unsigned int agr198_make_one(int);
    int * var0;
    unsigned int var1;
    if ((arg0 == 0)) {
        return 0xffffffff;
    }
    var0 = (int *)arg0;
    var1 = agr198_make_one((unsigned long)((unsigned int)(arg1)));
    *(int *)((var0)) = var1;
    // x86-64 epilogue: tear down frame
    return (unsigned int)((var1 + (var1 * 2)));
}
agr198_scalar_control pass 15 lines
// glaurung: agr198_scalar_control @ 0x13c0
int32_t agr198_scalar_control(int32_t * arg0, int32_t arg1) {
    int a;
    int b;
    int c;
    long var3;
    if ((arg0 == 0)) {
        return 0xffffffff;
    }
    *(int *)(((long)arg0)) = (arg1 + 1);
    *(int *)(((long)arg0 + 0x4)) = (arg1 + arg1);
    *(int *)(((long)arg0 + 0x8)) = (arg1 * 4);
    var3 = (unsigned long)((unsigned int)((arg1 + (arg1 * 4))));
    return (unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)((var3 + (var3 * 4)))) + arg1))) + arg1))) + 1));
}
agr198_trio_roundtrip pass 20 lines
// glaurung: agr198_trio_roundtrip @ 0x12a0
int32_t agr198_trio_roundtrip(int32_t * arg0, int32_t arg1) {
    extern unsigned __int128 agr198_make_trio(int);
    long var0;
    unsigned __int128 var1;
    long var2;
    long var8;
    if ((arg0 == 0)) {
        return 0xffffffff;
    }
    var0 = (long)arg0;
    var1 = agr198_make_trio((unsigned long)((unsigned int)(arg1)));
    var2 = (unsigned long)(((unsigned __int128)(var1) >> 64));
    *(int *)((var0)) = var1;
    var8 = ((unsigned __int128)(var1) >> 32);
    *(int *)((var0 + 0x4)) = var8;
    *(int *)((var0 + 0x8)) = var2;
    // x86-64 epilogue: tear down frame
    return (unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)((var2 + (var2 * 4)))) + var1))) + (unsigned long)((unsigned int)((var8 + (var8 * 2))))));
}

gcc -O0

14/15
agr198_arr2_roundtrip pass 27 lines
// glaurung: agr198_arr2_roundtrip @ 0x1561
int32_t agr198_arr2_roundtrip(int32_t * arg0, int32_t arg1) {
    extern __attribute__((noreturn)) void __stack_chk_fail(void);
    extern long agr198_make_arr2(int);
    unsigned char local_10[8];
    long local_8;
    long ret;
    long var12;
    long var4;
    // x86-64 prologue: save rbp, frame 32 bytes
    local_8 = (long)(0x28);
    if ((arg0 != 0)) {
        var4 = agr198_make_arr2((unsigned long)((unsigned int)(arg1)));
        *(long *)(&local_10[0]) = var4;
        *(int *)((long)arg0) = *(int *)(&local_10[0]);
        *(int *)((arg0 + 1)) = *(int *)((&local_10[0] + 4));
        var12 = (unsigned long)((unsigned int)(*(int *)((&local_10[0] + 4))));
        ret = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var12)) + (unsigned long)((unsigned int)(var12))))) + var12))) + (unsigned long)((unsigned int)(*(int *)(&local_10[0]))))));
    } else {
        ret = 0xffffffff;
    }
    if ((local_8 != 0x28)) {
        __stack_chk_fail();
    }
    // x86-64 epilogue: restore rbp
    return ret;
}
agr198_bits_roundtrip pass 16 lines
// glaurung: agr198_bits_roundtrip @ 0x1507
__attribute__((no_stack_protector)) int32_t agr198_bits_roundtrip(int32_t * arg0, int32_t arg1) {
    extern long agr198_make_bits(int);
    unsigned char local_8[8];
    long var1;
    // x86-64 prologue: save rbp, frame 32 bytes
    if ((arg0 != 0)) {
        var1 = agr198_make_bits((unsigned long)((unsigned int)(arg1)));
        *(long *)(&local_8[0]) = var1;
        *(int *)((long)arg0) = *(long *)(&local_8[0]);
        *(int *)((arg0 + 1)) = ((unsigned long)(*(long *)(&local_8[0])) >> 32);
        return ((unsigned long)(*(long *)(&local_8[0])) >> 52);
    } else {
        return 0xffffffff;
    }
}
agr198_bytes3_roundtrip pass 25 lines
// glaurung: agr198_bytes3_roundtrip @ 0x13f7
__attribute__((no_stack_protector)) int32_t agr198_bytes3_roundtrip(int32_t * arg0, int32_t arg1) {
    extern long agr198_make_bytes3(int);
    unsigned char local_3[3];
    long var1;
    int var22;
    int var31;
    long var5;
    // x86-64 prologue: save rbp, frame 32 bytes
    if ((arg0 != 0)) {
        var1 = agr198_make_bytes3((unsigned long)((unsigned int)(arg1)));
        *(signed char *)(&local_3[0]) = var1;
        *(signed char *)((&local_3[0] + 1)) = ((unsigned long)((long)((int)(var1))) >> 8);
        var5 = ((unsigned long)((long)((int)(var1))) >> 16);
        *(signed char *)((&local_3[0] + 2)) = ((var5 & -0xff01LL) | ((((unsigned long)(var5) >> 8) & 255) << 8));
        *(int *)((long)arg0) = (unsigned char)(((unsigned int)((unsigned char)(*(char *)(&local_3[0]))) & 255));
        *(int *)((arg0 + 1)) = (unsigned char)(((unsigned int)((unsigned char)(*(char *)((&local_3[0] + 1)))) & 255));
        *(int *)((arg0 + 2)) = (unsigned char)(((unsigned int)((unsigned char)(*(char *)((&local_3[0] + 2)))) & 255));
        var22 = (unsigned int)((unsigned char)(((unsigned int)((unsigned char)(*(char *)((&local_3[0] + 1)))) & 255)));
        var31 = (unsigned int)((unsigned char)(((unsigned int)((unsigned char)(*(char *)((&local_3[0] + 2)))) & 255)));
        return (unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var31)) << 2))) + var31))) + (unsigned long)((unsigned int)(((unsigned int)((unsigned char)(((unsigned int)((unsigned char)(*(char *)(&local_3[0]))) & 255))) + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var22)) + (unsigned long)((unsigned int)(var22))))) + var22))))))));
    } else {
        return 0xffffffff;
    }
}
agr198_five_roundtrip pass 37 lines
// glaurung: agr198_five_roundtrip @ 0x15d9
int32_t agr198_five_roundtrip(int32_t * arg0, int32_t arg1) {
    extern __attribute__((noreturn)) void __stack_chk_fail(void);
    extern long agr198_make_five(char *, int);
    unsigned char local_20[20];
    long local_8;
    long ret;
    long var22;
    long var30;
    long var38;
    long var46;
    long var5;
    int var50;
    // x86-64 prologue: save rbp, frame 48 bytes
    local_8 = (long)(0x28);
    if ((arg0 != 0)) {
        var5 = agr198_make_five((char *)(&local_20[0]), (unsigned long)((unsigned int)(arg1)));
        *(int *)((long)arg0) = *(int *)(&local_20[0]);
        *(int *)((arg0 + 1)) = *(int *)((&local_20[0] + 4));
        *(int *)((arg0 + 2)) = *(int *)((&local_20[0] + 8));
        *(int *)((arg0 + 3)) = *(int *)((&local_20[0] + 12));
        *(int *)((arg0 + 4)) = *(int *)((&local_20[0] + 16));
        var22 = (unsigned long)((unsigned int)(*(int *)((&local_20[0] + 4))));
        var30 = (unsigned long)((unsigned int)(*(int *)((&local_20[0] + 8))));
        var38 = (unsigned long)((unsigned int)(*(int *)((&local_20[0] + 12))));
        var46 = (unsigned long)((unsigned int)(*(int *)((&local_20[0] + 16))));
        var50 = ((unsigned int)(((unsigned long)((unsigned int)(var46)) << 2)) + var46);
        ret = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var50)) + (unsigned long)((unsigned int)(var50))))) + var46))) + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)(&local_20[0]))) + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var22)) + (unsigned long)((unsigned int)(var22))))) + var22)))))) + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var30)) << 2))) + var30)))))) + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var38)) << 3))) - var38)))))))));
    } else {
        ret = 0xffffffff;
    }
    if ((local_8 != 0x28)) {
        __stack_chk_fail();
    }
    // x86-64 epilogue: restore rbp
    return ret;
}
agr198_i64_control pass 16 lines
// glaurung: agr198_i64_control @ 0x16a6
int32_t agr198_i64_control(int32_t * arg0, int32_t arg1) {
    extern long agr198_make_i64(int);
    long v;
    long var1;
    // x86-64 prologue: save rbp, frame 32 bytes
    if ((arg0 != 0)) {
        var1 = agr198_make_i64((unsigned long)((unsigned int)(arg1)));
        v = var1;
        *(int *)((long)arg0) = v;
        *(int *)((arg0 + 1)) = ((unsigned long)(v) >> 32);
        return (unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(v)) + (unsigned long)((unsigned int)(v))))) + (unsigned long)((unsigned int)(v))));
    } else {
        return 0xffffffff;
    }
}
agr198_make_arr2 pass 17 lines
// glaurung: agr198_make_arr2 @ 0x12e0
unsigned long agr198_make_arr2(int32_t arg0) {
    extern __attribute__((noreturn)) void __stack_chk_fail(void);
    unsigned char local_10[8];
    long local_8;
    long ret;
    // x86-64 prologue: save rbp, frame 32 bytes
    local_8 = (long)(0x28);
    *(int *)(&local_10[0]) = ((unsigned long)((unsigned int)(arg0)) + 5);
    *(int *)((&local_10[0] + 4)) = ((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(arg0)) << 3))) - (unsigned long)((unsigned int)(arg0)));
    ret = *(long *)(&local_10[0]);
    if ((local_8 != 0x28)) {
        __stack_chk_fail();
    }
    // x86-64 epilogue: restore rbp
    return ret;
}
agr198_make_bits pass 8 lines
// glaurung: agr198_make_bits @ 0x12ba
__attribute__((no_stack_protector)) double agr198_make_bits(int arg0) {
    unsigned char local_8[8];
    // x86-64 prologue: save rbp
    *(double *)(&local_8[0]) = (double)((int)((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(arg0)) + (unsigned long)((unsigned int)(arg0))))) + 1)))));
    // x86-64 epilogue: restore rbp
    return *(double *)(&local_8[0]);
}
agr198_make_bytes3 pass 14 lines
// glaurung: agr198_make_bytes3 @ 0x1218
__attribute__((no_stack_protector)) unsigned int agr198_make_bytes3(int32_t arg0) {
    signed char local_1;
    short local_3;
    unsigned char local_6[3];
    // x86-64 prologue: save rbp
    *(signed char *)(&local_6[0]) = ((unsigned long)((unsigned int)(arg0)) + 1);
    *(signed char *)((&local_6[0] + 1)) = ((unsigned long)((unsigned int)(arg0)) + 2);
    *(signed char *)((&local_6[0] + 2)) = ((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(arg0)) + (unsigned long)((unsigned int)(arg0))))) + (unsigned long)((unsigned int)(arg0)));
    local_3 = *(short *)(&local_6[0]);
    local_1 = *(char *)((&local_6[0] + 2));
    // x86-64 epilogue: restore rbp
    return (((unsigned int)((unsigned short)(((unsigned int)((unsigned short)(local_3)) & 0xffff))) & -0xff0001LL) | ((unsigned int)((unsigned char)(((unsigned int)((unsigned char)(local_1)) & 255))) << 16));
}
agr198_make_five structural 19 lines
// glaurung: agr198_make_five @ 0x132e
__attribute__((no_stack_protector)) char * agr198_make_five(char * arg0, int arg1) {
    unsigned char local_20[20];
    long var24;
    long var26;
    // x86-64 prologue: save rbp
    *(int *)(&local_20[0]) = ((unsigned long)((unsigned int)(arg1)) + 1);
    *(int *)((&local_20[0] + 4)) = ((unsigned long)((unsigned int)(arg1)) + 2);
    *(int *)((&local_20[0] + 8)) = ((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(arg1)) + (unsigned long)((unsigned int)(arg1))))) + (unsigned long)((unsigned int)(arg1)));
    *(int *)((&local_20[0] + 12)) = ((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(arg1)) << 2))) + (unsigned long)((unsigned int)(arg1)));
    *(int *)((&local_20[0] + 16)) = ((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(arg1)) << 3))) - (unsigned long)((unsigned int)(arg1)));
    var24 = (long)arg0;
    var26 = *(long *)((&local_20[0] + 8));
    *(long *)((long)arg0) = *(long *)(&local_20[0]);
    *(long *)((var24 + 0x8)) = var26;
    *(int *)((var24 + 0x10)) = *(int *)((&local_20[0] + 16));
    // x86-64 epilogue: restore rbp
    return arg0;
}
agr198_make_i64 pass 6 lines
// glaurung: agr198_make_i64 @ 0x1394
int64_t agr198_make_i64(int32_t arg0) {
    // x86-64 prologue: save rbp
    // x86-64 epilogue: restore rbp
    return ((((long)(arg0) << 3) - (long)(arg0)) + 5);
}
agr198_make_one pass 8 lines
// glaurung: agr198_make_one @ 0x11f9
__attribute__((no_stack_protector)) unsigned int agr198_make_one(int32_t arg0) {
    unsigned char local_4[4];
    // x86-64 prologue: save rbp
    *(int *)(&local_4[0]) = ((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(arg0)) + (unsigned long)((unsigned int)(arg0))))) + (unsigned long)((unsigned int)(arg0))))) + 1);
    // x86-64 epilogue: restore rbp
    return (unsigned int)(*(int *)(&local_4[0]));
}
agr198_make_trio pass 14 lines
// glaurung: agr198_make_trio @ 0x127b
__attribute__((no_stack_protector)) unsigned __int128 agr198_make_trio(int32_t arg0) {
    unsigned char local_18[12];
    int local_4;
    long local_c;
    // x86-64 prologue: save rbp
    *(int *)(&local_18[0]) = ((unsigned long)((unsigned int)(arg0)) + 1);
    *(int *)((&local_18[0] + 4)) = ((unsigned long)((unsigned int)(arg0)) + (unsigned long)((unsigned int)(arg0)));
    *(int *)((&local_18[0] + 8)) = ((unsigned long)((unsigned int)(arg0)) << 2);
    local_c = *(long *)(&local_18[0]);
    local_4 = *(int *)((&local_18[0] + 8));
    // x86-64 epilogue: restore rbp
    return ((unsigned __int128)((unsigned long)(local_c)) | ((unsigned __int128)((unsigned long)((unsigned int)(local_4))) << 64));
}
agr198_one_roundtrip pass 17 lines
// glaurung: agr198_one_roundtrip @ 0x13b5
__attribute__((no_stack_protector)) int32_t agr198_one_roundtrip(int32_t * arg0, int32_t arg1) {
    extern unsigned int agr198_make_one(int);
    unsigned char local_4[4];
    unsigned int var1;
    long var5;
    // x86-64 prologue: save rbp, frame 32 bytes
    if ((arg0 != 0)) {
        var1 = agr198_make_one((unsigned long)((unsigned int)(arg1)));
        *(int *)(&local_4[0]) = var1;
        *(int *)((long)arg0) = *(int *)(&local_4[0]);
        var5 = (unsigned long)((unsigned int)(*(int *)(&local_4[0])));
        return (unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var5)) + (unsigned long)((unsigned int)(var5))))) + var5));
    } else {
        return 0xffffffff;
    }
}
agr198_scalar_control pass 18 lines
// glaurung: agr198_scalar_control @ 0x1704
int32_t agr198_scalar_control(int32_t * arg0, int32_t arg1) {
    int a;
    int b;
    int c;
    // x86-64 prologue: save rbp
    if ((arg0 != 0)) {
        a = ((unsigned int)(arg1) + 1);
        b = ((unsigned int)(arg1) + (unsigned int)(arg1));
        c = ((unsigned long)((unsigned int)(arg1)) << 2);
        *(int *)((long)arg0) = a;
        *(int *)((arg0 + 1)) = b;
        *(int *)((arg0 + 2)) = c;
        return (unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(c)) << 2))) + (unsigned long)((unsigned int)(c))))) + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(b)) + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(b)) + (unsigned long)((unsigned int)(b)))))))) + (unsigned long)((unsigned int)(a)))))));
    } else {
        return 0xffffffff;
    }
}
agr198_trio_roundtrip pass 22 lines
// glaurung: agr198_trio_roundtrip @ 0x148e
__attribute__((no_stack_protector)) int32_t agr198_trio_roundtrip(int32_t * arg0, int32_t arg1) {
    extern unsigned __int128 agr198_make_trio(int);
    unsigned char local_c[12];
    unsigned __int128 var1;
    long var18;
    long var26;
    // x86-64 prologue: save rbp, frame 32 bytes
    if ((arg0 != 0)) {
        var1 = agr198_make_trio((unsigned long)((unsigned int)(arg1)));
        *(long *)(&local_c[0]) = var1;
        *(int *)((&local_c[0] + 8)) = ((unsigned __int128)(var1) >> 64);
        *(int *)((long)arg0) = *(int *)(&local_c[0]);
        *(int *)((arg0 + 1)) = *(int *)((&local_c[0] + 4));
        *(int *)((arg0 + 2)) = *(int *)((&local_c[0] + 8));
        var18 = (unsigned long)((unsigned int)(*(int *)((&local_c[0] + 4))));
        var26 = (unsigned long)((unsigned int)(*(int *)((&local_c[0] + 8))));
        return (unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var26)) << 2))) + var26))) + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)(&local_c[0]))) + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var18)) + (unsigned long)((unsigned int)(var18))))) + var18))))))));
    } else {
        return 0xffffffff;
    }
}

← 213 fixtures