Fixture 209
out of line guard handlers
C · 3 functions · 4 lanes · 12 of 12 function-lanes behave identically
All 4 lanes recompile and return the same results as the original.
A chain of if (c) { handler; } guards whose handlers the compiler moves OUT OF LINE, so each one sits after the function's tail and jumps back.
THE LARGEST MEASURED DEFECT CLASS. Over the 250 scored DecBench sample-set functions, 28.8% render as goto soup (40.5% on x86-64). A census of those splits them by how much of the function was lost: only 2.6% are whole- function bailouts, so build_full's three refusals are NOT the cause. The loss is detect_if_shape declining shape by shape and taking the remainder of the walk with it — one conditional fails to match, and every block after it lands in Region::Unstructured, which the renderer emits as one label per block.
bin_090.elf sub_7370 in the frozen sample-set is the smallest instance: 15 blocks, 12 of them labelled. This fixture is that shape in C.
WHY EXECUTION CANNOT SEE IT. Goto soup is FAITHFUL. Every arm is present, every edge is real, the C compiles and returns the right answer for every input. It is simply not the source's control flow. That is why this fixture carries goto_free and switch structural assertions rather than relying on the execution differential — before those predicates existed the corpus had no way to state the property at all.
NOT 105_goto_ladder (which is ABOUT goto, in the source), and not 107_short_circuit (which is about operand evaluation order). The source here contains no goto whatsoever.
__builtin_expect marks the handlers cold so gcc and clang both sink them below the return. The cold attribute would be stronger but is not available on every toolchain in the matrix.
#include <stdint.h>
/* A chain of `if (c) { handler; }` guards whose handlers the compiler moves OUT
* OF LINE, so each one sits after the function's tail and jumps back.
*
* THE LARGEST MEASURED DEFECT CLASS. Over the 250 scored DecBench sample-set
* functions, 28.8% render as goto soup (40.5% on x86-64). A census of those
* splits them by how much of the function was lost: only 2.6% are whole-
* function bailouts, so `build_full`'s three refusals are NOT the cause. The
* loss is `detect_if_shape` declining shape by shape and taking the remainder
* of the walk with it — one conditional fails to match, and every block after
* it lands in `Region::Unstructured`, which the renderer emits as one label per
* block.
*
* `bin_090.elf sub_7370` in the frozen sample-set is the smallest instance: 15
* blocks, 12 of them labelled. This fixture is that shape in C.
*
* WHY EXECUTION CANNOT SEE IT. Goto soup is FAITHFUL. Every arm is present,
* every edge is real, the C compiles and returns the right answer for every
* input. It is simply not the source's control flow. That is why this fixture
* carries `goto_free` and `switch` structural assertions rather than relying on
* the execution differential — before those predicates existed the corpus had
* no way to state the property at all.
*
* NOT `105_goto_ladder` (which is ABOUT goto, in the source), and not
* `107_short_circuit` (which is about operand evaluation order). The source
* here contains no goto whatsoever.
*
* `__builtin_expect` marks the handlers cold so gcc and clang both sink them
* below the return. The `cold` attribute would be stronger but is not available
* on every toolchain in the matrix.
*/
/* The out-of-line note sink, kept in this translation unit so nothing links
* against libc. `static` on purpose: it is covered inside its callers. */
static int32_t sink_value;
static int32_t record(int32_t value) {
sink_value = value;
return value;
}
/* Six guards, each with an out-of-line handler that rejoins the chain. The
* source has no goto and no switch, so a faithful recovery is a nest of ifs. */
__attribute__((noinline)) int32_t guard_chain_rejoins(int32_t a, int32_t b,
int32_t c, int32_t d) {
int32_t acc = 0;
if (__builtin_expect(a > 100, 0)) {
acc += record(a) & 0xf;
}
if (__builtin_expect(b > 100, 0)) {
acc += record(b) & 0xf;
}
if (__builtin_expect(c > 100, 0)) {
acc += record(c) & 0xf;
}
if (__builtin_expect(d > 100, 0)) {
acc += record(d) & 0xf;
}
if (__builtin_expect(a > b, 0)) {
acc += record(a - b) & 0xf;
}
if (__builtin_expect(c > d, 0)) {
acc += record(c - d) & 0xf;
}
return acc + 1;
}
/* The same chain, but two of the guards EXIT through a shared epilogue instead
* of rejoining. That mixture is what defeats the shape matcher: an exclusively
* owned multi-block return chain has no owner among the shapes, because a
* single terminal block is the early-exit case and a shared chain is the clone
* case. */
__attribute__((noinline)) int32_t guard_chain_mixed_exits(int32_t a, int32_t b,
int32_t c,
int32_t *out) {
int32_t acc = 0;
if (out == 0) {
return -1;
}
if (__builtin_expect(a > 100, 0)) {
acc += record(a) & 0xf;
}
if (__builtin_expect(b < 0, 0)) {
*out = acc;
return -2; /* exits through the epilogue */
}
if (__builtin_expect(c > 100, 0)) {
acc += record(c) & 0xf;
}
if (__builtin_expect(a > b, 0)) {
*out = acc * 2;
return -3; /* a second, distinct exit */
}
*out = acc;
return acc + 1;
}
/* A guard whose handler is EXCLUSIVELY its own and reaches the return through
* one further block. This is the exact shape that falls between every existing
* pattern. */
__attribute__((noinline)) int32_t exclusive_handler_chain(int32_t a,
int32_t b) {
int32_t acc = a ^ b;
if (__builtin_expect(a < 0, 0)) {
acc = record(acc);
acc &= 0xff;
return acc; /* two blocks, owned by this guard */
}
if (__builtin_expect(b < 0, 0)) {
acc = record(-acc);
acc |= 0x100;
return acc;
}
return acc + 1;
} 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
3/3exclusive_handler_chain pass 24 lines
// glaurung: exclusive_handler_chain @ 0x1350
int32_t exclusive_handler_chain(int32_t arg0, int32_t arg1) {
extern int record(int);
int acc;
int var21;
int var27;
// x86-64 prologue: save rbp, frame 16 bytes
acc = ((unsigned int)(arg0) ^ arg1);
if ((0 <= (long)(arg0))) {
if ((0 <= (long)(arg1))) {
return (unsigned int)(((unsigned long)((unsigned int)(acc)) + 1));
} else {
var21 = record((unsigned long)((unsigned int)((0 - acc))));
acc = var21;
acc = ((unsigned int)(acc) | 256);
return (unsigned int)(acc);
}
} else {
var27 = record((unsigned long)((unsigned int)(acc)));
acc = var27;
acc = ((unsigned int)(acc) & 255);
return (unsigned int)(acc);
}
} guard_chain_mixed_exits pass 33 lines
// glaurung: guard_chain_mixed_exits @ 0x1250
int32_t guard_chain_mixed_exits(int32_t arg0, int32_t arg1, int32_t arg2, int32_t * arg3) {
extern int record(int);
int acc;
int var24;
int var6;
// x86-64 prologue: save rbp, frame 32 bytes
acc = 0;
if ((arg3 != 0)) {
if (((((unsigned long)((unsigned int)(arg0)) == 100) | ((long)(arg0) < 100)) == 0)) {
var6 = record((unsigned long)((unsigned int)(arg0)));
acc = ((unsigned int)((var6 & 15)) + acc);
}
if ((0 <= (long)(arg1))) {
if (((((unsigned long)((unsigned int)(arg2)) == 100) | ((long)(arg2) < 100)) == 0)) {
var24 = record((unsigned long)((unsigned int)(arg2)));
acc = ((unsigned int)((var24 & 15)) + acc);
}
if (((((unsigned int)(arg0) == (unsigned int)(arg1)) | (arg0 < arg1)) != 0)) {
*(int *)((long)arg3) = acc;
return (unsigned int)(((unsigned long)((unsigned int)(acc)) + 1));
} else {
*(int *)((long)arg3) = ((unsigned long)((unsigned int)(acc)) << 1);
return (unsigned int)(-3);
}
} else {
*(int *)((long)arg3) = acc;
return (unsigned int)(-2);
}
} else {
return (unsigned int)(-1);
}
} guard_chain_rejoins pass 39 lines
// glaurung: guard_chain_rejoins @ 0x1100
int32_t guard_chain_rejoins(int32_t arg0, int32_t arg1, int32_t arg2, int32_t arg3) {
extern int record(int);
int acc;
int var18;
int var30;
int var42;
int var57;
int var6;
int var72;
// x86-64 prologue: save rbp, frame 32 bytes
acc = 0;
if (((((unsigned long)((unsigned int)(arg0)) == 100) | ((long)(arg0) < 100)) == 0)) {
var6 = record((unsigned long)((unsigned int)(arg0)));
acc = ((unsigned int)((var6 & 15)) + acc);
}
if (((((unsigned long)((unsigned int)(arg1)) == 100) | ((long)(arg1) < 100)) == 0)) {
var18 = record((unsigned long)((unsigned int)(arg1)));
acc = ((unsigned int)((var18 & 15)) + acc);
}
if (((((unsigned long)((unsigned int)(arg2)) == 100) | ((long)(arg2) < 100)) == 0)) {
var30 = record((unsigned long)((unsigned int)(arg2)));
acc = ((unsigned int)((var30 & 15)) + acc);
}
if (((((unsigned long)((unsigned int)(arg3)) == 100) | ((long)(arg3) < 100)) == 0)) {
var42 = record((unsigned long)((unsigned int)(arg3)));
acc = ((unsigned int)((var42 & 15)) + acc);
}
if (((((unsigned int)(arg0) == (unsigned int)(arg1)) | (arg0 < arg1)) == 0)) {
var57 = record((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(arg0)) - arg1))));
acc = ((unsigned int)((var57 & 15)) + acc);
}
if (((((unsigned int)(arg2) == (unsigned int)(arg3)) | (arg2 < arg3)) == 0)) {
var72 = record((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(arg2)) - arg3))));
acc = ((unsigned int)((var72 & 15)) + acc);
}
// x86-64 epilogue: restore rbp
return (unsigned int)(((unsigned long)((unsigned int)(acc)) + 1));
} clang -O2
3/3exclusive_handler_chain pass 12 lines
// glaurung: exclusive_handler_chain @ 0x11c0
int32_t exclusive_handler_chain(int32_t arg0, int32_t arg1) {
int acc;
acc = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(arg1)) ^ arg0)));
if (((long)(arg0) < 0)) {
return (unsigned int)((unsigned char)((acc & 255)));
}
if (((long)(arg1) < 0)) {
return (unsigned int)(((-acc) | 256));
}
return (unsigned int)((acc + 1));
} guard_chain_mixed_exits pass 54 lines
// glaurung: guard_chain_mixed_exits @ 0x1170
int32_t guard_chain_mixed_exits(int32_t arg0, int32_t arg1, int32_t arg2, int32_t * arg3) {
int acc;
long var1;
int var11;
long var3;
long var4;
long var8;
if ((arg3 == 0)) {
goto L_118f;
}
var1 = 0;
if ((101 <= (long)(arg0))) {
goto L_1195;
}
acc = var1;
var3 = var1;
if (((long)(arg1) < 0)) {
goto L_119e;
}
L_1180: ;
if ((101 <= (long)(arg2))) {
goto L_11a6;
}
var4 = (unsigned long)((unsigned int)(acc));
if (((((unsigned int)(arg0) == (unsigned int)(arg1)) | (arg0 < arg1)) == 0)) {
goto L_11af;
}
L_1189: ;
*(int *)(((long)arg3)) = acc;
return (unsigned int)((acc + 1));
L_118f: ;
return 0xffffffff;
L_1195: ;
var8 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(arg0)) & 15)));
acc = var8;
var3 = var8;
if ((0 <= (long)(arg1))) {
goto L_1180;
}
L_119e: ;
*(int *)(((long)arg3)) = var3;
return 0xfffffffe;
L_11a6: ;
var11 = (acc + (unsigned int)((arg2 & 15)));
acc = (unsigned long)((unsigned int)(var11));
var4 = (unsigned long)((unsigned int)(var11));
if ((((unsigned int)(arg0) == (unsigned int)(arg1)) | (arg0 < arg1))) {
goto L_1189;
}
L_11af: ;
*(int *)(((long)arg3)) = (var4 + var4);
return 0xfffffffd;
} guard_chain_rejoins pass 96 lines
// glaurung: guard_chain_rejoins @ 0x1100
int32_t guard_chain_rejoins(int32_t arg0, int32_t arg1, int32_t arg2, int32_t arg3) {
int acc;
long var1;
long var10;
long var11;
long var15;
int var19;
int var23;
int var27;
int var28;
long var3;
int var31;
int var32;
long var4;
long var5;
int var6;
long var7;
long var8;
int var9;
var1 = 0;
if ((101 <= (long)(arg0))) {
goto L_1122;
}
acc = var1;
var3 = var1;
if ((101 <= (long)(arg1))) {
goto L_112c;
}
L_110c: ;
var4 = (unsigned long)((unsigned int)(acc));
if ((101 <= (long)(arg2))) {
goto L_113b;
}
L_1111: ;
var5 = (unsigned long)((unsigned int)(acc));
if ((101 <= (long)(arg3))) {
goto L_114a;
}
L_1116: ;
var6 = (arg0 - arg1);
var7 = (unsigned long)((unsigned int)(var6));
var8 = (unsigned long)((unsigned int)(acc));
if (((((unsigned long)((unsigned int)(var6)) == 0) | (arg0 < arg1)) == 0)) {
goto L_1158;
}
L_111a: ;
var9 = (arg2 - arg3);
var10 = (unsigned long)((unsigned int)(var9));
var11 = (unsigned long)((unsigned int)(acc));
if (((((unsigned long)((unsigned int)(var9)) == 0) | (arg2 < arg3)) == 0)) {
return (unsigned int)(((unsigned long)((unsigned int)((var11 + (unsigned long)((unsigned int)((var10 & 15)))))) + 1));
}
L_111e: ;
return (unsigned int)((acc + 1));
L_1122: ;
var15 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(arg0)) & 15)));
acc = var15;
var3 = var15;
if (((long)(arg1) < 101)) {
goto L_110c;
}
L_112c: ;
var19 = (var3 + (unsigned int)(((unsigned long)((unsigned int)(arg1)) & 15)));
acc = (unsigned long)((unsigned int)(var19));
var4 = (unsigned long)((unsigned int)(var19));
if (((long)(arg2) < 101)) {
goto L_1111;
}
L_113b: ;
var23 = (var4 + (unsigned int)(((unsigned long)((unsigned int)(arg2)) & 15)));
acc = (unsigned long)((unsigned int)(var23));
var5 = (unsigned long)((unsigned int)(var23));
if (((long)(arg3) < 101)) {
goto L_1116;
}
L_114a: ;
var27 = (var5 + (unsigned int)(((unsigned long)((unsigned int)(arg3)) & 15)));
acc = (unsigned long)((unsigned int)(var27));
var28 = (arg0 - arg1);
var7 = (unsigned long)((unsigned int)(var28));
var8 = (unsigned long)((unsigned int)(var27));
if ((((unsigned long)((unsigned int)(var28)) == 0) | (arg0 < arg1))) {
goto L_111a;
}
L_1158: ;
var31 = (var8 + (unsigned int)((var7 & 15)));
acc = (unsigned long)((unsigned int)(var31));
var32 = (arg2 - arg3);
var10 = (unsigned long)((unsigned int)(var32));
var11 = (unsigned long)((unsigned int)(var31));
if ((((unsigned long)((unsigned int)(var32)) == 0) | (arg2 < arg3))) {
goto L_111e;
}
return (unsigned int)(((unsigned long)((unsigned int)((var11 + (unsigned long)((unsigned int)((var10 & 15)))))) + 1));
} gcc -O0
3/3exclusive_handler_chain pass 24 lines
// glaurung: exclusive_handler_chain @ 0x12bf
int32_t exclusive_handler_chain(int32_t arg0, int32_t arg1) {
extern int record(int);
int acc;
int var17;
int var20;
// x86-64 prologue: save rbp, frame 24 bytes
acc = ((unsigned int)(arg0) ^ arg1);
if (((unsigned int)((unsigned char)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(arg0)) >> 31))) & 255))) == 0)) {
if (((unsigned int)((unsigned char)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(arg1)) >> 31))) & 255))) == 0)) {
return (unsigned int)(((unsigned long)((unsigned int)(acc)) + 1));
} else {
var17 = record((unsigned long)((unsigned int)((-(unsigned long)((unsigned int)(acc))))));
acc = var17;
acc = (acc | 256);
return (unsigned int)(acc);
}
} else {
var20 = record((unsigned long)((unsigned int)(acc)));
acc = var20;
acc = (acc & 255);
return (unsigned int)(acc);
}
} guard_chain_mixed_exits pass 33 lines
// glaurung: guard_chain_mixed_exits @ 0x11fd
int32_t guard_chain_mixed_exits(int32_t arg0, int32_t arg1, int32_t arg2, int32_t * arg3) {
extern int record(int);
int acc;
int var17;
int var4;
// x86-64 prologue: save rbp, frame 40 bytes
acc = 0;
if ((arg3 != 0)) {
if (((((unsigned long)((unsigned int)(arg0)) == 100) | ((long)(arg0) < 100)) == 0)) {
var4 = record((unsigned long)((unsigned int)(arg0)));
acc = (acc + (unsigned int)((var4 & 15)));
}
if (((unsigned int)((unsigned char)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(arg1)) >> 31))) & 255))) == 0)) {
if (((((unsigned long)((unsigned int)(arg2)) == 100) | ((long)(arg2) < 100)) == 0)) {
var17 = record((unsigned long)((unsigned int)(arg2)));
acc = (acc + (unsigned int)((var17 & 15)));
}
if (((((unsigned int)(arg0) == (unsigned int)(arg1)) | (arg0 < arg1)) != 0)) {
*(int *)((long)arg3) = acc;
return (unsigned int)(((unsigned long)((unsigned int)(acc)) + 1));
} else {
*(int *)((long)arg3) = ((unsigned long)((unsigned int)(acc)) + (unsigned long)((unsigned int)(acc)));
return 0xfffffffd;
}
} else {
*(int *)((long)arg3) = acc;
return 0xfffffffe;
}
} else {
return 0xffffffff;
}
} guard_chain_rejoins pass 39 lines
// glaurung: guard_chain_rejoins @ 0x1112
int32_t guard_chain_rejoins(int32_t arg0, int32_t arg1, int32_t arg2, int32_t arg3) {
extern int record(int);
int acc;
int var12;
int var20;
int var28;
int var39;
int var4;
int var50;
// x86-64 prologue: save rbp, frame 32 bytes
acc = 0;
if (((((unsigned long)((unsigned int)(arg0)) == 100) | ((long)(arg0) < 100)) == 0)) {
var4 = record((unsigned long)((unsigned int)(arg0)));
acc = (acc + (unsigned int)((var4 & 15)));
}
if (((((unsigned long)((unsigned int)(arg1)) == 100) | ((long)(arg1) < 100)) == 0)) {
var12 = record((unsigned long)((unsigned int)(arg1)));
acc = (acc + (unsigned int)((var12 & 15)));
}
if (((((unsigned long)((unsigned int)(arg2)) == 100) | ((long)(arg2) < 100)) == 0)) {
var20 = record((unsigned long)((unsigned int)(arg2)));
acc = (acc + (unsigned int)((var20 & 15)));
}
if (((((unsigned long)((unsigned int)(arg3)) == 100) | ((long)(arg3) < 100)) == 0)) {
var28 = record((unsigned long)((unsigned int)(arg3)));
acc = (acc + (unsigned int)((var28 & 15)));
}
if (((((unsigned int)(arg0) == (unsigned int)(arg1)) | (arg0 < arg1)) == 0)) {
var39 = record((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(arg0)) - arg1))));
acc = (acc + (unsigned int)((var39 & 15)));
}
if (((((unsigned int)(arg2) == (unsigned int)(arg3)) | (arg2 < arg3)) == 0)) {
var50 = record((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(arg2)) - arg3))));
acc = (acc + (unsigned int)((var50 & 15)));
}
// x86-64 epilogue: restore rbp
return (unsigned int)(((unsigned long)((unsigned int)(acc)) + 1));
} gcc -O2
3/3exclusive_handler_chain pass 12 lines
// glaurung: exclusive_handler_chain @ 0x11d0
int32_t exclusive_handler_chain(int32_t arg0, int32_t arg1) {
int acc;
long t136;
long var2;
var2 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(arg0)) ^ arg1)));
if (((long)(arg0) < 0)) {
return (unsigned int)((unsigned char)((var2 & 255)));
}
t136 = (-(unsigned long)((unsigned int)(var2)));
return (((long)(arg1) < 0) ? ((t136 & -0xff01LL) | ((((((unsigned long)(t136) >> 8) & 255) | 1) & 255) << 8)) : (unsigned long)((unsigned int)((var2 + 1))));
} guard_chain_mixed_exits pass 20 lines
// glaurung: guard_chain_mixed_exits @ 0x1170
int32_t guard_chain_mixed_exits(int32_t arg0, int32_t arg1, int32_t arg2, int32_t * arg3) {
int acc;
int var5;
if ((arg3 == 0)) {
return 0xffffffff;
}
var5 = ((((unsigned long)((unsigned int)(arg0)) == 100) | ((long)(arg0) < 100)) ? 0 : (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(arg0)) & 15))));
if (((long)(arg1) < 0)) {
*(int *)(((long)arg3)) = var5;
return 0xfffffffe;
}
acc = (((((unsigned long)((unsigned int)(arg2)) == 100) | ((long)(arg2) < 100)) == 0) ? (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(arg2)) & 15))) + var5))) : var5);
if (((((unsigned int)(arg0) == (unsigned int)(arg1)) | (arg0 < arg1)) == 0)) {
*(int *)(((long)arg3)) = (acc + acc);
return 0xfffffffd;
}
*(int *)(((long)arg3)) = acc;
return (unsigned int)((acc + 1));
} guard_chain_rejoins pass 33 lines
// glaurung: guard_chain_rejoins @ 0x1100
int32_t guard_chain_rejoins(int32_t arg0, int32_t arg1, int32_t arg2, int32_t arg3) {
int acc;
int var11;
int var17;
long var23;
long var24;
long var25;
int var31;
int var5;
var5 = ((((unsigned long)((unsigned int)(arg0)) == 100) | ((long)(arg0) < 100)) ? 0 : (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(arg0)) & 15))));
var11 = (((((unsigned long)((unsigned int)(arg1)) == 100) | ((long)(arg1) < 100)) == 0) ? (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(arg1)) & 15))) + var5))) : var5);
var17 = (((((unsigned long)((unsigned int)(arg2)) == 100) | ((long)(arg2) < 100)) == 0) ? (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(arg2)) & 15))) + var11))) : var11);
var23 = (((((unsigned long)((unsigned int)(arg3)) == 100) | ((long)(arg3) < 100)) == 0) ? (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(arg3)) & 15))) + var17))) : var17);
if (((((unsigned int)(arg0) == (unsigned int)(arg1)) | (arg0 < arg1)) == 0)) {
goto L_1158;
}
var24 = var23;
var25 = var23;
if (((((unsigned int)(arg2) == (unsigned int)(arg3)) | (arg2 < arg3)) == 0)) {
return (unsigned int)(((unsigned long)((unsigned int)((var25 + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)((arg2 - arg3))) & 15)))))) + 1));
}
L_114e: ;
return (unsigned int)((var24 + 1));
L_1158: ;
var31 = (var23 + (unsigned int)(((unsigned long)((unsigned int)((arg0 - arg1))) & 15)));
var24 = (unsigned long)((unsigned int)(var31));
var25 = (unsigned long)((unsigned int)(var31));
if ((((unsigned int)(arg2) == (unsigned int)(arg3)) | (arg2 < arg3))) {
goto L_114e;
}
return (unsigned int)(((unsigned long)((unsigned int)((var25 + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)((arg2 - arg3))) & 15)))))) + 1));
}