set_log_bit(char *s, int node, int k) {
  int j, i;
  unsigned char c;
  j = (node - 1) / 8;
  i = (node - 1) % 8;
  c = 0x80 >> i;
  if (k)
    s[j] |= c;
  else
    s[j] &= ~c;
}


x86 assembly (clang, -O0):
<set_log_bit>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
mov    %edx,-0x18(%rbp)
mov    -0x14(%rbp),%eax
sub    $0x1,%eax
mov    $0x8,%ecx
cltd
idiv   %ecx
mov    %eax,-0x1c(%rbp)
mov    -0x14(%rbp),%eax
sub    $0x1,%eax
mov    $0x8,%ecx
cltd
idiv   %ecx
mov    %edx,-0x20(%rbp)
mov    -0x20(%rbp),%ecx
mov    $0x80,%eax
sar    %cl,%eax
mov    %al,-0x21(%rbp)
cmpl   $0x0,-0x18(%rbp)
je     1161 <set_log_bit+0x61>
movzbl -0x21(%rbp),%esi
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsbl (%rax,%rcx,1),%edx
or     %esi,%edx
mov    %dl,(%rax,%rcx,1)
jmp    1179 <set_log_bit+0x79>
movzbl -0x21(%rbp),%esi
xor    $0xffffffff,%esi
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsbl (%rax,%rcx,1),%edx
and    %esi,%edx
mov    %dl,(%rax,%rcx,1)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<set_log_bit>:
lea    -0x1(%rsi),%ecx
add    $0x6,%esi
test   %ecx,%ecx
cmovns %ecx,%esi
sar    $0x3,%esi
and    $0x7,%ecx
test   %edx,%edx
je     1123 <set_log_bit+0x23>
mov    $0x80,%eax
shr    %cl,%eax
movslq %esi,%rcx
or     %al,(%rdi,%rcx,1)
ret
mov    $0xffffff7f,%eax
sar    %cl,%eax
movslq %esi,%rcx
and    %al,(%rdi,%rcx,1)
ret

LLVM IR (-O0):
define i32 @set_log_bit(i8* %0, i32 %1, i32 %2) {
%4 = alloca i32
%5 = alloca i8*
%6 = alloca i32
%7 = alloca i32
%8 = alloca i32
%9 = alloca i32
%10 = alloca i8
store i8* %0, i8** %5
store i32 %1, i32* %6
store i32 %2, i32* %7
%11 = load i32, i32* %6
%12 = sub nsw i32 %11, 1
%13 = sdiv i32 %12, 8
store i32 %13, i32* %8
%14 = load i32, i32* %6
%15 = sub nsw i32 %14, 1
%16 = srem i32 %15, 8
store i32 %16, i32* %9
%17 = load i32, i32* %9
%18 = ashr i32 128, %17
%19 = trunc i32 %18 to i8
store i8 %19, i8* %10
%20 = load i32, i32* %7
%21 = icmp ne i32 %20, 0
br i1 %21, label %22, label %33
22: ; preds = %3
%23 = load i8, i8* %10
%24 = zext i8 %23 to i32
%25 = load i8*, i8** %5
%26 = load i32, i32* %8
%27 = sext i32 %26 to i64
%28 = getelementptr inbounds i8, i8* %25, i64 %27
%29 = load i8, i8* %28
%30 = sext i8 %29 to i32
%31 = or i32 %30, %24
%32 = trunc i32 %31 to i8
store i8 %32, i8* %28
br label %45
33: ; preds = %3
%34 = load i8, i8* %10
%35 = zext i8 %34 to i32
%36 = xor i32 %35, -1
%37 = load i8*, i8** %5
%38 = load i32, i32* %8
%39 = sext i32 %38 to i64
%40 = getelementptr inbounds i8, i8* %37, i64 %39
%41 = load i8, i8* %40
%42 = sext i8 %41 to i32
%43 = and i32 %42, %36
%44 = trunc i32 %43 to i8
store i8 %44, i8* %40
br label %45
45: ; preds = %33, %22
%46 = load i32, i32* %4
ret i32 %46
}

LLVM IR (-O2):
define i32 @set_log_bit(i8* nocapture %0, i32 %1, i32 %2) {
%4 = add nsw i32 %1, -1
%5 = sdiv i32 %4, 8
%6 = and i32 %4, 7
%7 = icmp eq i32 %2, 0
br i1 %7, label %15, label %8
8: ; preds = %3
%9 = lshr i32 128, %6
%10 = sext i32 %5 to i64
%11 = getelementptr inbounds i8, i8* %0, i64 %10
%12 = load i8, i8* %11
%13 = trunc i32 %9 to i8
%14 = or i8 %12, %13
store i8 %14, i8* %11
br label %22
15: ; preds = %3
%16 = ashr i32 -129, %6
%17 = sext i32 %5 to i64
%18 = getelementptr inbounds i8, i8* %0, i64 %17
%19 = load i8, i8* %18
%20 = trunc i32 %16 to i8
%21 = and i8 %19, %20
store i8 %21, i8* %18
br label %22
22: ; preds = %15, %8
ret i32 undef
}