int step(int k) {
  if (k < 1024) {
    k = k * 2;
  } else if (k < 4 * 1024) {
    k += 1024;
  } else if (k < 32 * 1024) {
    k += 2048;
  } else if (k < 64 * 1024) {
    k += 4096;
  } else if (k < 128 * 1024) {
    k += 8192;
  } else if (k < 256 * 1024) {
    k += 16384;
  } else if (k < 512 * 1024) {
    k += 32 * 1024;
  } else {
    k += 512 * 1024;
  }
  return (k);
}


x86 assembly (clang, -O0):
<step>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
cmpl   $0x400,-0x4(%rbp)
jge    1122 <step+0x22>
mov    -0x4(%rbp),%eax
shl    $0x1,%eax
mov    %eax,-0x4(%rbp)
jmp    11f9 <step+0xf9>
cmpl   $0x1000,-0x4(%rbp)
jge    113f <step+0x3f>
mov    -0x4(%rbp),%eax
add    $0x400,%eax
mov    %eax,-0x4(%rbp)
jmp    11f4 <step+0xf4>
cmpl   $0x8000,-0x4(%rbp)
jge    115c <step+0x5c>
mov    -0x4(%rbp),%eax
add    $0x800,%eax
mov    %eax,-0x4(%rbp)
jmp    11ef <step+0xef>
cmpl   $0x10000,-0x4(%rbp)
jge    1179 <step+0x79>
mov    -0x4(%rbp),%eax
add    $0x1000,%eax
mov    %eax,-0x4(%rbp)
jmp    11ea <step+0xea>
cmpl   $0x20000,-0x4(%rbp)
jge    1196 <step+0x96>
mov    -0x4(%rbp),%eax
add    $0x2000,%eax
mov    %eax,-0x4(%rbp)
jmp    11e5 <step+0xe5>
cmpl   $0x40000,-0x4(%rbp)
jge    11b3 <step+0xb3>
mov    -0x4(%rbp),%eax
add    $0x4000,%eax
mov    %eax,-0x4(%rbp)
jmp    11e0 <step+0xe0>
cmpl   $0x80000,-0x4(%rbp)
jge    11d0 <step+0xd0>
mov    -0x4(%rbp),%eax
add    $0x8000,%eax
mov    %eax,-0x4(%rbp)
jmp    11db <step+0xdb>
mov    -0x4(%rbp),%eax
add    $0x80000,%eax
mov    %eax,-0x4(%rbp)
jmp    11e0 <step+0xe0>
jmp    11e5 <step+0xe5>
jmp    11ea <step+0xea>
jmp    11ef <step+0xef>
jmp    11f4 <step+0xf4>
jmp    11f9 <step+0xf9>
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<step>:
mov    %edi,%eax
cmp    $0x3ff,%edi
jg     110d <step+0xd>
add    %eax,%eax
ret
cmp    $0xfff,%eax
ja     111a <step+0x1a>
add    $0x400,%eax
ret
cmp    $0x7fff,%eax
ja     1127 <step+0x27>
add    $0x800,%eax
ret
cmp    $0xffff,%eax
ja     1134 <step+0x34>
add    $0x1000,%eax
ret
cmp    $0x1ffff,%eax
ja     1141 <step+0x41>
add    $0x2000,%eax
ret
cmp    $0x3ffff,%eax
ja     114e <step+0x4e>
add    $0x4000,%eax
ret
cmp    $0x7ffff,%eax
ja     115b <step+0x5b>
add    $0x8000,%eax
ret
add    $0x80000,%eax
ret

LLVM IR (-O0):
define i32 @step(i32 %0) {
%2 = alloca i32
store i32 %0, i32* %2
%3 = load i32, i32* %2
%4 = icmp slt i32 %3, 1024
br i1 %4, label %5, label %8
5: ; preds = %1
%6 = load i32, i32* %2
%7 = mul nsw i32 %6, 2
store i32 %7, i32* %2
br label %53
8: ; preds = %1
%9 = load i32, i32* %2
%10 = icmp slt i32 %9, 4096
br i1 %10, label %11, label %14
11: ; preds = %8
%12 = load i32, i32* %2
%13 = add nsw i32 %12, 1024
store i32 %13, i32* %2
br label %52
14: ; preds = %8
%15 = load i32, i32* %2
%16 = icmp slt i32 %15, 32768
br i1 %16, label %17, label %20
17: ; preds = %14
%18 = load i32, i32* %2
%19 = add nsw i32 %18, 2048
store i32 %19, i32* %2
br label %51
20: ; preds = %14
%21 = load i32, i32* %2
%22 = icmp slt i32 %21, 65536
br i1 %22, label %23, label %26
23: ; preds = %20
%24 = load i32, i32* %2
%25 = add nsw i32 %24, 4096
store i32 %25, i32* %2
br label %50
26: ; preds = %20
%27 = load i32, i32* %2
%28 = icmp slt i32 %27, 131072
br i1 %28, label %29, label %32
29: ; preds = %26
%30 = load i32, i32* %2
%31 = add nsw i32 %30, 8192
store i32 %31, i32* %2
br label %49
32: ; preds = %26
%33 = load i32, i32* %2
%34 = icmp slt i32 %33, 262144
br i1 %34, label %35, label %38
35: ; preds = %32
%36 = load i32, i32* %2
%37 = add nsw i32 %36, 16384
store i32 %37, i32* %2
br label %48
38: ; preds = %32
%39 = load i32, i32* %2
%40 = icmp slt i32 %39, 524288
br i1 %40, label %41, label %44
41: ; preds = %38
%42 = load i32, i32* %2
%43 = add nsw i32 %42, 32768
store i32 %43, i32* %2
br label %47
44: ; preds = %38
%45 = load i32, i32* %2
%46 = add nsw i32 %45, 524288
store i32 %46, i32* %2
br label %47
47: ; preds = %44, %41
br label %48
48: ; preds = %47, %35
br label %49
49: ; preds = %48, %29
br label %50
50: ; preds = %49, %23
br label %51
51: ; preds = %50, %17
br label %52
52: ; preds = %51, %11
br label %53
53: ; preds = %52, %5
%54 = load i32, i32* %2
ret i32 %54
}

LLVM IR (-O2):
define i32 @step(i32 %0) {
%2 = icmp slt i32 %0, 1024
br i1 %2, label %3, label %5
3: ; preds = %1
%4 = shl nsw i32 %0, 1
br label %31
5: ; preds = %1
%6 = icmp ult i32 %0, 4096
br i1 %6, label %7, label %9
7: ; preds = %5
%8 = add nuw nsw i32 %0, 1024
br label %31
9: ; preds = %5
%10 = icmp ult i32 %0, 32768
br i1 %10, label %11, label %13
11: ; preds = %9
%12 = add nuw nsw i32 %0, 2048
br label %31
13: ; preds = %9
%14 = icmp ult i32 %0, 65536
br i1 %14, label %15, label %17
15: ; preds = %13
%16 = add nuw nsw i32 %0, 4096
br label %31
17: ; preds = %13
%18 = icmp ult i32 %0, 131072
br i1 %18, label %19, label %21
19: ; preds = %17
%20 = add nuw nsw i32 %0, 8192
br label %31
21: ; preds = %17
%22 = icmp ult i32 %0, 262144
br i1 %22, label %23, label %25
23: ; preds = %21
%24 = add nuw nsw i32 %0, 16384
br label %31
25: ; preds = %21
%26 = icmp ult i32 %0, 524288
br i1 %26, label %27, label %29
27: ; preds = %25
%28 = add nuw nsw i32 %0, 32768
br label %31
29: ; preds = %25
%30 = add nuw nsw i32 %0, 524288
br label %31
31: ; preds = %7, %15, %23, %29, %27, %19, %11, %3
%32 = phi i32 [ %4, %3 ], [ %8, %7 ], [ %12, %11 ], [ %16, %15 ], [ %20, %19 ], [ %24, %23 ], [ %28, %27 ], [ %30, %29 ]
ret i32 %32
}