/* * This code is really good. * $ cc -Wall -O2 -g -o icf icf.c * * GCC 3 - 0 Clang */ #define noinline __attribute__((__noinline__)) static noinline unsigned long a(void) { unsigned long ret, addr; asm volatile( ".pushsection .data\n" "Lval%=: .quad 0\n" ".popsection\n" "adrp %[addr], Lval%=\n" "add %[addr], %[addr], :lo12:Lval%=\n" "ldr %[ret], [%[addr]]\n" "add %[ret], %[ret], #1\n" "str %[ret], [%[addr]]" : [ret] "=&r" (ret), [addr] "=&r" (addr) : : "memory"); return ret; } static noinline unsigned long b(void) { unsigned long ret, addr; asm volatile( ".pushsection .data\n" "Lval%=: .quad 0\n" ".popsection\n" "adrp %[addr], Lval%=\n" "add %[addr], %[addr], :lo12:Lval%=\n" "ldr %[ret], [%[addr]]\n" "add %[ret], %[ret], #1\n" "str %[ret], [%[addr]]" : [ret] "=&r" (ret), [addr] "=&r" (addr) : : "memory"); return ret; } int main(void) { return a() ^ b(); }