Fixture 119
branch hints
C · 2 functions · 4 lanes · 8 of 8 function-lanes behave identically
All 4 lanes recompile and return the same results as the original.
__builtin_expect reorders the emitted blocks without changing semantics, so the hot path becomes the fallthrough and the cold path is moved out of line. The two functions below are identical apart from the hint.
#include <stdint.h>
/* __builtin_expect reorders the emitted blocks without changing semantics, so
* the hot path becomes the fallthrough and the cold path is moved out of line.
* The two functions below are identical apart from the hint. */
#define LIKELY(x) __builtin_expect(!!(x), 1)
#define UNLIKELY(x) __builtin_expect(!!(x), 0)
__attribute__((noinline)) int32_t
hinted_validation(const int32_t *values, int32_t count) {
int32_t total = 0;
int32_t index;
if (UNLIKELY(values == 0) || UNLIKELY(count < 0) || UNLIKELY(count > 16)) {
return -1;
}
for (index = 0; index < count; ++index) {
if (LIKELY(values[index] >= 0)) {
total += values[index];
} else {
total -= 1;
}
}
return total;
}
__attribute__((noinline)) int32_t
unhinted_validation(const int32_t *values, int32_t count) {
int32_t total = 0;
int32_t index;
if (values == 0 || count < 0 || count > 16) {
return -1;
}
for (index = 0; index < count; ++index) {
if (values[index] >= 0) {
total += values[index];
} else {
total -= 1;
}
}
return total;
} 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
2/2hinted_validation pass 29 lines
// glaurung: hinted_validation @ 0x1100
int32_t hinted_validation(const int32_t * arg0, int32_t arg1) {
int total;
int index;
int local_4;
// x86-64 prologue: save rbp
total = 0;
if (((long)((int)((unsigned char)((((((arg0 == 0) ^ -1) & 255) ^ -1) & 1)))) != 0)) {
local_4 = -1;
// x86-64 epilogue: restore rbp
return (unsigned int)(local_4);
}
if (((long)((int)((unsigned char)(((((((long)(arg1) < 0) ^ -1) & 255) ^ -1) & 1)))) != 0)) {
local_4 = -1;
// x86-64 epilogue: restore rbp
return (unsigned int)(local_4);
}
if (((long)((int)((unsigned char)(((((((((unsigned long)((unsigned int)(arg1)) == 16) | ((long)(arg1) < 16)) == 0) ^ -1) & 255) ^ -1) & 1)))) != 0)) {
local_4 = -1;
// x86-64 epilogue: restore rbp
return (unsigned int)(local_4);
}
for (index = 0; (index < arg1); index++) {
total = (((long)((int)((unsigned char)((((((0 <= (long)((int)(arg0[(long)(index)]))) ^ -1) & 255) ^ -1) & 1)))) == 0) ? ((unsigned long)((unsigned int)(total)) - 1) : ((unsigned long)((unsigned int)(arg0[(long)(index)])) + (unsigned long)((unsigned int)(total))));
}
local_4 = total;
// x86-64 epilogue: restore rbp
return (unsigned int)(local_4);
} unhinted_validation pass 29 lines
// glaurung: unhinted_validation @ 0x11f0
int32_t unhinted_validation(const int32_t * arg0, int32_t arg1) {
int total;
int index;
int local_4;
// x86-64 prologue: save rbp
total = 0;
if ((arg0 == 0)) {
local_4 = -1;
// x86-64 epilogue: restore rbp
return (unsigned int)(local_4);
}
if (((long)(arg1) < 0)) {
local_4 = -1;
// x86-64 epilogue: restore rbp
return (unsigned int)(local_4);
}
if (((((unsigned long)((unsigned int)(arg1)) == 16) | ((long)(arg1) < 16)) == 0)) {
local_4 = -1;
// x86-64 epilogue: restore rbp
return (unsigned int)(local_4);
}
for (index = 0; (index < arg1); index++) {
total = (((long)((int)(arg0[(long)(index)])) < 0) ? ((unsigned long)((unsigned int)(total)) - 1) : ((unsigned long)((unsigned int)(arg0[(long)(index)])) + (unsigned long)((unsigned int)(total))));
}
local_4 = total;
// x86-64 epilogue: restore rbp
return (unsigned int)(local_4);
} clang -O2
2/2hinted_validation pass 163 lines
// glaurung: hinted_validation @ 0x1100
int32_t hinted_validation(const int32_t * arg0, int32_t arg1) {
int total;
int index;
long ret;
long var1;
int var100;
int var101;
int var102;
int var103;
long var11;
int var110;
int var111;
int var112;
int var113;
int var12;
int var13;
int var14;
long var143;
long var144;
int var15;
int var17;
int var18;
int var19;
int var20;
int var26;
int var27;
int var28;
int var29;
int var38;
int var39;
int var40;
int var41;
int var42;
int var43;
int var44;
int var45;
int var52;
int var53;
int var54;
int var55;
long var6;
int var69;
long var7;
int var70;
int var71;
int var72;
int var74;
int var75;
int var76;
int var77;
int var83;
int var84;
int var85;
int var86;
ret = 0xffffffff;
if ((arg0 == 0)) {
return ret;
}
ret = 0xffffffff;
if (((unsigned long)(16) < (unsigned long)((unsigned long)((unsigned int)(arg1))))) {
return ret;
}
if (((unsigned long)((unsigned int)(arg1)) != 0)) {
var1 = (unsigned long)((unsigned int)(arg1));
if (((unsigned long)(4) <= (unsigned long)((unsigned long)((unsigned int)(arg1))))) {
goto L_112e;
}
var6 = 0;
var7 = 0;
goto L_11e0;
}
return 0;
L_112e: ;
var11 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var1)) & -4)));
var12 = *(int *)(((long)arg0));
var13 = *(int *)(((long)arg0 + 0x4));
var14 = *(int *)(((long)arg0 + 0x8));
var15 = *(int *)(((long)arg0 + 0xc));
var17 = -1;
var18 = -1;
var19 = -1;
var20 = -1;
var26 = (-(-1 < var12));
var27 = (-(-1 < var13));
var28 = (-(-1 < var14));
var29 = (-(-1 < var15));
var38 = ((var26 ^ -1) | (var12 & var26));
var39 = ((var27 ^ -1) | (var13 & var27));
var40 = ((var28 ^ -1) | (var14 & var28));
var41 = ((var29 ^ -1) | (var15 & var29));
if ((var11 != 4)) {
var42 = *(int *)(((long)arg0 + 0x10));
var43 = *(int *)(((long)arg0 + 0x14));
var44 = *(int *)(((long)arg0 + 0x18));
var45 = *(int *)(((long)arg0 + 0x1c));
var52 = (-(var17 < var42));
var53 = (-(var18 < var43));
var54 = (-(var19 < var44));
var55 = (-(var20 < var45));
var38 = (var38 + ((var52 & var42) | (var17 ^ var52)));
var39 = (var39 + ((var53 & var43) | (var18 ^ var53)));
var40 = (var40 + ((var54 & var44) | (var19 ^ var54)));
var41 = (var41 + ((var55 & var45) | (var20 ^ var55)));
if (((unsigned long)((unsigned int)(var11)) != 8)) {
var69 = *(int *)(((long)arg0 + 0x20));
var70 = *(int *)(((long)arg0 + 0x24));
var71 = *(int *)(((long)arg0 + 0x28));
var72 = *(int *)(((long)arg0 + 0x2c));
var74 = -1;
var75 = -1;
var76 = -1;
var77 = -1;
var83 = (-(-1 < var69));
var84 = (-(-1 < var70));
var85 = (-(-1 < var71));
var86 = (-(-1 < var72));
var38 = (var38 + ((var83 ^ -1) | (var69 & var83)));
var39 = (var39 + ((var84 ^ -1) | (var70 & var84)));
var40 = (var40 + ((var85 ^ -1) | (var71 & var85)));
var41 = (var41 + ((var86 ^ -1) | (var72 & var86)));
if (((unsigned long)((unsigned int)(var11)) != 12)) {
var100 = *(int *)(((long)arg0 + 0x30));
var101 = *(int *)(((long)arg0 + 0x34));
var102 = *(int *)(((long)arg0 + 0x38));
var103 = *(int *)(((long)arg0 + 0x3c));
var110 = (-(var74 < var100));
var111 = (-(var75 < var101));
var112 = (-(var76 < var102));
var113 = (-(var77 < var103));
var38 = (var38 + ((var110 & var100) | (var74 ^ var110)));
var39 = (var39 + ((var111 & var101) | (var75 ^ var111)));
var40 = (var40 + ((var112 & var102) | (var76 ^ var112)));
var41 = (var41 + ((var113 & var103) | (var77 ^ var113)));
}
}
}
var143 = (unsigned long)((unsigned int)(((var41 + var39) + (var40 + var38))));
var6 = var143;
var7 = var11;
if ((var11 != var1)) {
goto L_11e0;
}
return var143;
L_11d7: ;
var144 = 0xffffffff;
goto L_11e7;
L_11e0: ;
var144 = (unsigned long)((unsigned int)(*(int *)(((long)arg0 + var7 * 4))));
if (((long)((int)(var144)) < 0)) {
goto L_11d7;
}
L_11e7: ;
total = (var6 + var144);
index = (var7 + 1);
var6 = (unsigned long)((unsigned int)(total));
var7 = (unsigned long)((unsigned int)(index));
ret = (unsigned long)((unsigned int)(total));
if ((var1 != index)) {
goto L_11e0;
}
return ret;
} unhinted_validation pass 158 lines
// glaurung: unhinted_validation @ 0x1200
int32_t unhinted_validation(const int32_t * arg0, int32_t arg1) {
int index;
int total;
long ret;
int var104;
int var105;
int var106;
int var107;
int var11;
int var12;
int var13;
long var137;
long var138;
long var139;
int var14;
long var140;
long var141;
long var143;
long var2;
int var20;
int var21;
int var22;
int var23;
int var32;
int var33;
int var34;
int var35;
int var36;
int var37;
int var38;
int var39;
int var46;
int var47;
int var48;
int var49;
long var5;
int var6;
int var63;
int var64;
int var65;
int var66;
int var68;
int var69;
int var7;
int var70;
int var71;
int var77;
int var78;
int var79;
int var8;
int var80;
int var9;
int var94;
int var95;
int var96;
int var97;
ret = 0xffffffff;
if ((arg0 == 0)) {
return ret;
}
ret = 0xffffffff;
if (((unsigned long)(16) < (unsigned long)((unsigned long)((unsigned int)(arg1))))) {
return ret;
}
if (((unsigned long)((unsigned int)(arg1)) == 0)) {
return 0;
}
var2 = (unsigned long)((unsigned int)(arg1));
if (((unsigned long)(4) <= (unsigned long)((unsigned long)((unsigned int)(arg1))))) {
var5 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var2)) & -4)));
var6 = *(int *)(((long)arg0));
var7 = *(int *)(((long)arg0 + 0x4));
var8 = *(int *)(((long)arg0 + 0x8));
var9 = *(int *)(((long)arg0 + 0xc));
var11 = -1;
var12 = -1;
var13 = -1;
var14 = -1;
var20 = (-(-1 < var6));
var21 = (-(-1 < var7));
var22 = (-(-1 < var8));
var23 = (-(-1 < var9));
var32 = ((var20 ^ -1) | (var6 & var20));
var33 = ((var21 ^ -1) | (var7 & var21));
var34 = ((var22 ^ -1) | (var8 & var22));
var35 = ((var23 ^ -1) | (var9 & var23));
if ((var5 != 4)) {
var36 = *(int *)(((long)arg0 + 0x10));
var37 = *(int *)(((long)arg0 + 0x14));
var38 = *(int *)(((long)arg0 + 0x18));
var39 = *(int *)(((long)arg0 + 0x1c));
var46 = (-(var11 < var36));
var47 = (-(var12 < var37));
var48 = (-(var13 < var38));
var49 = (-(var14 < var39));
var32 = (var32 + ((var46 & var36) | (var11 ^ var46)));
var33 = (var33 + ((var47 & var37) | (var12 ^ var47)));
var34 = (var34 + ((var48 & var38) | (var13 ^ var48)));
var35 = (var35 + ((var49 & var39) | (var14 ^ var49)));
if (((unsigned long)((unsigned int)(var5)) != 8)) {
var63 = *(int *)(((long)arg0 + 0x20));
var64 = *(int *)(((long)arg0 + 0x24));
var65 = *(int *)(((long)arg0 + 0x28));
var66 = *(int *)(((long)arg0 + 0x2c));
var68 = -1;
var69 = -1;
var70 = -1;
var71 = -1;
var77 = (-(-1 < var63));
var78 = (-(-1 < var64));
var79 = (-(-1 < var65));
var80 = (-(-1 < var66));
var32 = (var32 + ((var77 ^ -1) | (var63 & var77)));
var33 = (var33 + ((var78 ^ -1) | (var64 & var78)));
var34 = (var34 + ((var79 ^ -1) | (var65 & var79)));
var35 = (var35 + ((var80 ^ -1) | (var66 & var80)));
if (((unsigned long)((unsigned int)(var5)) != 12)) {
var94 = *(int *)(((long)arg0 + 0x30));
var95 = *(int *)(((long)arg0 + 0x34));
var96 = *(int *)(((long)arg0 + 0x38));
var97 = *(int *)(((long)arg0 + 0x3c));
var104 = (-(var68 < var94));
var105 = (-(var69 < var95));
var106 = (-(var70 < var96));
var107 = (-(var71 < var97));
var32 = (var32 + ((var104 & var94) | (var68 ^ var104)));
var33 = (var33 + ((var105 & var95) | (var69 ^ var105)));
var34 = (var34 + ((var106 & var96) | (var70 ^ var106)));
var35 = (var35 + ((var107 & var97) | (var71 ^ var107)));
}
}
}
var137 = (unsigned long)((unsigned int)(((var35 + var33) + (var34 + var32))));
var138 = var137;
var139 = var5;
ret = var137;
if ((var5 == var2)) {
return ret;
}
L_12d7: ;
var140 = 0xffffffff;
var141 = var138;
index = var139;
do {
var143 = (unsigned long)((unsigned int)(*(int *)(((long)arg0 + index * 4))));
total = (var141 + (((long)((int)(var143)) < 0) ? var140 : var143));
var141 = (unsigned long)((unsigned int)(total));
index = (index + 1);
ret = (unsigned long)((unsigned int)(total));
} while ((var2 != index));
} else {
var138 = 0;
var139 = 0;
goto L_12d7;
}
return ret;
} gcc -O0
2/2hinted_validation pass 24 lines
// glaurung: hinted_validation @ 0x10f9
int32_t hinted_validation(const int32_t * arg0, int32_t arg1) {
int total;
int index;
// x86-64 prologue: save rbp
total = 0;
if ((arg0 == 0)) {
// x86-64 epilogue: restore rbp
return 0xffffffff;
}
if (((unsigned int)((unsigned char)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(arg1)) >> 31))) & 255))) != 0)) {
// x86-64 epilogue: restore rbp
return 0xffffffff;
}
if (((((unsigned long)((unsigned int)(arg1)) == 16) | ((long)(arg1) < 16)) == 0)) {
// x86-64 epilogue: restore rbp
return 0xffffffff;
}
for (index = 0; (index < arg1); index++) {
total = (((unsigned int)((unsigned char)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)((~(unsigned long)((unsigned int)(arg0[(long)(index)]))))) >> 31))) & 255))) == 0) ? ((unsigned long)((unsigned int)(total)) - 1) : ((unsigned long)((unsigned int)(total)) + (unsigned long)((unsigned int)(arg0[(long)(index)]))));
}
// x86-64 epilogue: restore rbp
return (unsigned int)(total);
} unhinted_validation pass 24 lines
// glaurung: unhinted_validation @ 0x119f
int32_t unhinted_validation(const int32_t * arg0, int32_t arg1) {
int total;
int index;
// x86-64 prologue: save rbp
total = 0;
if ((arg0 == 0)) {
// x86-64 epilogue: restore rbp
return 0xffffffff;
}
if (((long)(arg1) < 0)) {
// x86-64 epilogue: restore rbp
return 0xffffffff;
}
if (((((unsigned long)((unsigned int)(arg1)) == 16) | ((long)(arg1) < 16)) == 0)) {
// x86-64 epilogue: restore rbp
return 0xffffffff;
}
for (index = 0; (index < arg1); index++) {
total = (((long)((int)(arg0[(long)(index)])) < 0) ? ((unsigned long)((unsigned int)(total)) - 1) : ((unsigned long)((unsigned int)(total)) + (unsigned long)((unsigned int)(arg0[(long)(index)]))));
}
// x86-64 epilogue: restore rbp
return (unsigned int)(total);
} gcc -O2
2/2hinted_validation pass 28 lines
// glaurung: hinted_validation @ 0x1100
int32_t hinted_validation(const int32_t * arg0, int32_t arg1) {
int total;
int index;
long ret;
long var2;
long var6;
long var7;
if ((arg0 == 0)) {
return 0xffffffff;
}
if (((unsigned long)(16) < (unsigned long)((unsigned long)((unsigned int)(arg1))))) {
return 0xffffffff;
}
if (((unsigned long)((unsigned int)(arg1)) == 0)) {
return 0;
}
var2 = (long)((((long)arg0 + ((unsigned long)((unsigned int)((arg1 - 1))) * 4)) + 4));
total = 0;
var6 = (long)arg0;
do {
var7 = (unsigned long)((unsigned int)(*(int *)((var6))));
ret = ((0 <= (long)((int)(var7))) ? (unsigned long)((unsigned int)((total + var7))) : (unsigned long)((unsigned int)((total - 1))));
var6 = (var6 + 4);
total = ret;
} while ((var6 != var2));
return ret;
} unhinted_validation pass 28 lines
// glaurung: unhinted_validation @ 0x1160
int32_t unhinted_validation(const int32_t * arg0, int32_t arg1) {
int total;
int index;
long ret;
long var2;
long var6;
long var7;
if ((arg0 == 0)) {
return 0xffffffff;
}
if (((unsigned long)(16) < (unsigned long)((unsigned long)((unsigned int)(arg1))))) {
return 0xffffffff;
}
if (((unsigned long)((unsigned int)(arg1)) == 0)) {
return 0;
}
var2 = (long)((((long)arg0 + ((unsigned long)((unsigned int)((arg1 - 1))) * 4)) + 4));
total = 0;
var6 = (long)arg0;
do {
var7 = (unsigned long)((unsigned int)(*(int *)((var6))));
ret = ((0 <= (long)((int)(var7))) ? (unsigned long)((unsigned int)((total + var7))) : (unsigned long)((unsigned int)((total - 1))));
var6 = (var6 + 4);
total = ret;
} while ((var6 != var2));
return ret;
}