int isqrt(int value) {
  int root = 0;
  if ((0x40000000 >> 0) + root <= value) {
    value -= (0x40000000 >> 0) + root;
    root = (root >> 1) | (0x40000000 >> 0);
  } else {
    root >>= 1;
  };
  if ((0x40000000 >> 2) + root <= value) {
    value -= (0x40000000 >> 2) + root;
    root = (root >> 1) | (0x40000000 >> 2);
  } else {
    root >>= 1;
  };
  if ((0x40000000 >> 4) + root <= value) {
    value -= (0x40000000 >> 4) + root;
    root = (root >> 1) | (0x40000000 >> 4);
  } else {
    root >>= 1;
  };
  if ((0x40000000 >> 6) + root <= value) {
    value -= (0x40000000 >> 6) + root;
    root = (root >> 1) | (0x40000000 >> 6);
  } else {
    root >>= 1;
  };
  if ((0x40000000 >> 8) + root <= value) {
    value -= (0x40000000 >> 8) + root;
    root = (root >> 1) | (0x40000000 >> 8);
  } else {
    root >>= 1;
  };
  if ((0x40000000 >> 10) + root <= value) {
    value -= (0x40000000 >> 10) + root;
    root = (root >> 1) | (0x40000000 >> 10);
  } else {
    root >>= 1;
  };
  if ((0x40000000 >> 12) + root <= value) {
    value -= (0x40000000 >> 12) + root;
    root = (root >> 1) | (0x40000000 >> 12);
  } else {
    root >>= 1;
  };
  if ((0x40000000 >> 14) + root <= value) {
    value -= (0x40000000 >> 14) + root;
    root = (root >> 1) | (0x40000000 >> 14);
  } else {
    root >>= 1;
  };
  if ((0x40000000 >> 16) + root <= value) {
    value -= (0x40000000 >> 16) + root;
    root = (root >> 1) | (0x40000000 >> 16);
  } else {
    root >>= 1;
  };
  if ((0x40000000 >> 18) + root <= value) {
    value -= (0x40000000 >> 18) + root;
    root = (root >> 1) | (0x40000000 >> 18);
  } else {
    root >>= 1;
  };
  if ((0x40000000 >> 20) + root <= value) {
    value -= (0x40000000 >> 20) + root;
    root = (root >> 1) | (0x40000000 >> 20);
  } else {
    root >>= 1;
  };
  if ((0x40000000 >> 22) + root <= value) {
    value -= (0x40000000 >> 22) + root;
    root = (root >> 1) | (0x40000000 >> 22);
  } else {
    root >>= 1;
  };
  if ((0x40000000 >> 24) + root <= value) {
    value -= (0x40000000 >> 24) + root;
    root = (root >> 1) | (0x40000000 >> 24);
  } else {
    root >>= 1;
  };
  if ((0x40000000 >> 26) + root <= value) {
    value -= (0x40000000 >> 26) + root;
    root = (root >> 1) | (0x40000000 >> 26);
  } else {
    root >>= 1;
  };
  if ((0x40000000 >> 28) + root <= value) {
    value -= (0x40000000 >> 28) + root;
    root = (root >> 1) | (0x40000000 >> 28);
  } else {
    root >>= 1;
  };
  if ((0x40000000 >> 30) + root <= value) {
    value -= (0x40000000 >> 30) + root;
    root = (root >> 1) | (0x40000000 >> 30);
  } else {
    root >>= 1;
  };
  if (root < value)
    root++;
  return root;
}


x86 assembly (clang, -O0):
<isqrt>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
movl   $0x0,-0x8(%rbp)
mov    -0x8(%rbp),%eax
add    $0x40000000,%eax
cmp    -0x4(%rbp),%eax
jg     1143 <isqrt+0x43>
mov    -0x8(%rbp),%ecx
add    $0x40000000,%ecx
mov    -0x4(%rbp),%eax
sub    %ecx,%eax
mov    %eax,-0x4(%rbp)
mov    -0x8(%rbp),%eax
sar    $0x1,%eax
or     $0x40000000,%eax
mov    %eax,-0x8(%rbp)
jmp    114c <isqrt+0x4c>
mov    -0x8(%rbp),%eax
sar    $0x1,%eax
mov    %eax,-0x8(%rbp)
mov    -0x8(%rbp),%eax
add    $0x10000000,%eax
cmp    -0x4(%rbp),%eax
jg     1181 <isqrt+0x81>
mov    -0x8(%rbp),%ecx
add    $0x10000000,%ecx
mov    -0x4(%rbp),%eax
sub    %ecx,%eax
mov    %eax,-0x4(%rbp)
mov    -0x8(%rbp),%eax
sar    $0x1,%eax
or     $0x10000000,%eax
mov    %eax,-0x8(%rbp)
jmp    118a <isqrt+0x8a>
mov    -0x8(%rbp),%eax
sar    $0x1,%eax
mov    %eax,-0x8(%rbp)
mov    -0x8(%rbp),%eax
add    $0x4000000,%eax
cmp    -0x4(%rbp),%eax
jg     11bf <isqrt+0xbf>
mov    -0x8(%rbp),%ecx
add    $0x4000000,%ecx
mov    -0x4(%rbp),%eax
sub    %ecx,%eax
mov    %eax,-0x4(%rbp)
mov    -0x8(%rbp),%eax
sar    $0x1,%eax
or     $0x4000000,%eax
mov    %eax,-0x8(%rbp)
jmp    11c8 <isqrt+0xc8>
mov    -0x8(%rbp),%eax
sar    $0x1,%eax
mov    %eax,-0x8(%rbp)
mov    -0x8(%rbp),%eax
add    $0x1000000,%eax
cmp    -0x4(%rbp),%eax
jg     11fd <isqrt+0xfd>
mov    -0x8(%rbp),%ecx
add    $0x1000000,%ecx
mov    -0x4(%rbp),%eax
sub    %ecx,%eax
mov    %eax,-0x4(%rbp)
mov    -0x8(%rbp),%eax
sar    $0x1,%eax
or     $0x1000000,%eax
mov    %eax,-0x8(%rbp)
jmp    1206 <isqrt+0x106>
mov    -0x8(%rbp),%eax
sar    $0x1,%eax
mov    %eax,-0x8(%rbp)
mov    -0x8(%rbp),%eax
add    $0x400000,%eax
cmp    -0x4(%rbp),%eax
jg     123b <isqrt+0x13b>
mov    -0x8(%rbp),%ecx
add    $0x400000,%ecx
mov    -0x4(%rbp),%eax
sub    %ecx,%eax
mov    %eax,-0x4(%rbp)
mov    -0x8(%rbp),%eax
sar    $0x1,%eax
or     $0x400000,%eax
mov    %eax,-0x8(%rbp)
jmp    1244 <isqrt+0x144>
mov    -0x8(%rbp),%eax
sar    $0x1,%eax
mov    %eax,-0x8(%rbp)
mov    -0x8(%rbp),%eax
add    $0x100000,%eax
cmp    -0x4(%rbp),%eax
jg     1279 <isqrt+0x179>
mov    -0x8(%rbp),%ecx
add    $0x100000,%ecx
mov    -0x4(%rbp),%eax
sub    %ecx,%eax
mov    %eax,-0x4(%rbp)
mov    -0x8(%rbp),%eax
sar    $0x1,%eax
or     $0x100000,%eax
mov    %eax,-0x8(%rbp)
jmp    1282 <isqrt+0x182>
mov    -0x8(%rbp),%eax
sar    $0x1,%eax
mov    %eax,-0x8(%rbp)
mov    -0x8(%rbp),%eax
add    $0x40000,%eax
cmp    -0x4(%rbp),%eax
jg     12b7 <isqrt+0x1b7>
mov    -0x8(%rbp),%ecx
add    $0x40000,%ecx
mov    -0x4(%rbp),%eax
sub    %ecx,%eax
mov    %eax,-0x4(%rbp)
mov    -0x8(%rbp),%eax
sar    $0x1,%eax
or     $0x40000,%eax
mov    %eax,-0x8(%rbp)
jmp    12c0 <isqrt+0x1c0>
mov    -0x8(%rbp),%eax
sar    $0x1,%eax
mov    %eax,-0x8(%rbp)
mov    -0x8(%rbp),%eax
add    $0x10000,%eax
cmp    -0x4(%rbp),%eax
jg     12f5 <isqrt+0x1f5>
mov    -0x8(%rbp),%ecx
add    $0x10000,%ecx
mov    -0x4(%rbp),%eax
sub    %ecx,%eax
mov    %eax,-0x4(%rbp)
mov    -0x8(%rbp),%eax
sar    $0x1,%eax
or     $0x10000,%eax
mov    %eax,-0x8(%rbp)
jmp    12fe <isqrt+0x1fe>
mov    -0x8(%rbp),%eax
sar    $0x1,%eax
mov    %eax,-0x8(%rbp)
mov    -0x8(%rbp),%eax
add    $0x4000,%eax
cmp    -0x4(%rbp),%eax
jg     1333 <isqrt+0x233>
mov    -0x8(%rbp),%ecx
add    $0x4000,%ecx
mov    -0x4(%rbp),%eax
sub    %ecx,%eax
mov    %eax,-0x4(%rbp)
mov    -0x8(%rbp),%eax
sar    $0x1,%eax
or     $0x4000,%eax
mov    %eax,-0x8(%rbp)
jmp    133c <isqrt+0x23c>
mov    -0x8(%rbp),%eax
sar    $0x1,%eax
mov    %eax,-0x8(%rbp)
mov    -0x8(%rbp),%eax
add    $0x1000,%eax
cmp    -0x4(%rbp),%eax
jg     1371 <isqrt+0x271>
mov    -0x8(%rbp),%ecx
add    $0x1000,%ecx
mov    -0x4(%rbp),%eax
sub    %ecx,%eax
mov    %eax,-0x4(%rbp)
mov    -0x8(%rbp),%eax
sar    $0x1,%eax
or     $0x1000,%eax
mov    %eax,-0x8(%rbp)
jmp    137a <isqrt+0x27a>
mov    -0x8(%rbp),%eax
sar    $0x1,%eax
mov    %eax,-0x8(%rbp)
mov    -0x8(%rbp),%eax
add    $0x400,%eax
cmp    -0x4(%rbp),%eax
jg     13af <isqrt+0x2af>
mov    -0x8(%rbp),%ecx
add    $0x400,%ecx
mov    -0x4(%rbp),%eax
sub    %ecx,%eax
mov    %eax,-0x4(%rbp)
mov    -0x8(%rbp),%eax
sar    $0x1,%eax
or     $0x400,%eax
mov    %eax,-0x8(%rbp)
jmp    13b8 <isqrt+0x2b8>
mov    -0x8(%rbp),%eax
sar    $0x1,%eax
mov    %eax,-0x8(%rbp)
mov    -0x8(%rbp),%eax
add    $0x100,%eax
cmp    -0x4(%rbp),%eax
jg     13ed <isqrt+0x2ed>
mov    -0x8(%rbp),%ecx
add    $0x100,%ecx
mov    -0x4(%rbp),%eax
sub    %ecx,%eax
mov    %eax,-0x4(%rbp)
mov    -0x8(%rbp),%eax
sar    $0x1,%eax
or     $0x100,%eax
mov    %eax,-0x8(%rbp)
jmp    13f6 <isqrt+0x2f6>
mov    -0x8(%rbp),%eax
sar    $0x1,%eax
mov    %eax,-0x8(%rbp)
mov    -0x8(%rbp),%eax
add    $0x40,%eax
cmp    -0x4(%rbp),%eax
jg     1424 <isqrt+0x324>
mov    -0x8(%rbp),%ecx
add    $0x40,%ecx
mov    -0x4(%rbp),%eax
sub    %ecx,%eax
mov    %eax,-0x4(%rbp)
mov    -0x8(%rbp),%eax
sar    $0x1,%eax
or     $0x40,%eax
mov    %eax,-0x8(%rbp)
jmp    142d <isqrt+0x32d>
mov    -0x8(%rbp),%eax
sar    $0x1,%eax
mov    %eax,-0x8(%rbp)
mov    -0x8(%rbp),%eax
add    $0x10,%eax
cmp    -0x4(%rbp),%eax
jg     145b <isqrt+0x35b>
mov    -0x8(%rbp),%ecx
add    $0x10,%ecx
mov    -0x4(%rbp),%eax
sub    %ecx,%eax
mov    %eax,-0x4(%rbp)
mov    -0x8(%rbp),%eax
sar    $0x1,%eax
or     $0x10,%eax
mov    %eax,-0x8(%rbp)
jmp    1464 <isqrt+0x364>
mov    -0x8(%rbp),%eax
sar    $0x1,%eax
mov    %eax,-0x8(%rbp)
mov    -0x8(%rbp),%eax
add    $0x4,%eax
cmp    -0x4(%rbp),%eax
jg     1492 <isqrt+0x392>
mov    -0x8(%rbp),%ecx
add    $0x4,%ecx
mov    -0x4(%rbp),%eax
sub    %ecx,%eax
mov    %eax,-0x4(%rbp)
mov    -0x8(%rbp),%eax
sar    $0x1,%eax
or     $0x4,%eax
mov    %eax,-0x8(%rbp)
jmp    149b <isqrt+0x39b>
mov    -0x8(%rbp),%eax
sar    $0x1,%eax
mov    %eax,-0x8(%rbp)
mov    -0x8(%rbp),%eax
add    $0x1,%eax
cmp    -0x4(%rbp),%eax
jg     14c9 <isqrt+0x3c9>
mov    -0x8(%rbp),%ecx
add    $0x1,%ecx
mov    -0x4(%rbp),%eax
sub    %ecx,%eax
mov    %eax,-0x4(%rbp)
mov    -0x8(%rbp),%eax
sar    $0x1,%eax
or     $0x1,%eax
mov    %eax,-0x8(%rbp)
jmp    14d2 <isqrt+0x3d2>
mov    -0x8(%rbp),%eax
sar    $0x1,%eax
mov    %eax,-0x8(%rbp)
mov    -0x8(%rbp),%eax
cmp    -0x4(%rbp),%eax
jge    14e7 <isqrt+0x3e7>
mov    -0x8(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x8(%rbp)
mov    -0x8(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<isqrt>:
lea    -0x40000000(%rdi),%ecx
xor    %edx,%edx
cmp    $0x40000000,%edi
setge  %dl
cmovl  %edi,%ecx
shl    $0x1e,%edx
lea    0x10000000(%rdx),%esi
shr    %edx
lea    0x10000000(%rdx),%edi
xor    %eax,%eax
cmp    %esi,%ecx
cmovl  %eax,%esi
cmovl  %edx,%edi
sub    %esi,%ecx
lea    0x4000000(%rdi),%edx
shr    %edi
cmp    %edx,%ecx
cmovl  %eax,%edx
lea    0x4000000(%rdi),%esi
cmovl  %edi,%esi
sub    %edx,%ecx
lea    0x1000000(%rsi),%edx
shr    %esi
mov    %esi,%edi
or     $0x1000000,%edi
cmp    %edx,%ecx
cmovl  %eax,%edx
cmovl  %esi,%edi
sub    %edx,%ecx
lea    0x400000(%rdi),%edx
shr    %edi
mov    %edi,%esi
or     $0x400000,%esi
cmp    %edx,%ecx
cmovl  %eax,%edx
cmovl  %edi,%esi
sub    %edx,%ecx
lea    0x100000(%rsi),%edx
shr    %esi
mov    %esi,%edi
or     $0x100000,%edi
cmp    %edx,%ecx
cmovl  %eax,%edx
cmovl  %esi,%edi
sub    %edx,%ecx
lea    0x40000(%rdi),%edx
shr    %edi
mov    %edi,%esi
or     $0x40000,%esi
cmp    %edx,%ecx
cmovl  %eax,%edx
cmovl  %edi,%esi
sub    %edx,%ecx
lea    0x10000(%rsi),%edx
shr    %esi
mov    %esi,%edi
or     $0x10000,%edi
cmp    %edx,%ecx
cmovl  %eax,%edx
cmovl  %esi,%edi
sub    %edx,%ecx
lea    0x4000(%rdi),%edx
shr    %edi
mov    %edi,%esi
or     $0x4000,%esi
cmp    %edx,%ecx
cmovl  %eax,%edx
cmovl  %edi,%esi
sub    %edx,%ecx
lea    0x1000(%rsi),%edx
shr    %esi
mov    %esi,%edi
or     $0x1000,%edi
cmp    %edx,%ecx
cmovl  %eax,%edx
cmovl  %esi,%edi
sub    %edx,%ecx
lea    0x400(%rdi),%edx
shr    %edi
mov    %edi,%esi
or     $0x400,%esi
cmp    %edx,%ecx
cmovl  %eax,%edx
cmovl  %edi,%esi
sub    %edx,%ecx
lea    0x100(%rsi),%edx
shr    %esi
mov    %esi,%edi
or     $0x100,%edi
cmp    %edx,%ecx
cmovl  %eax,%edx
cmovl  %esi,%edi
sub    %edx,%ecx
lea    0x40(%rdi),%edx
shr    %edi
mov    %edi,%esi
or     $0x40,%esi
cmp    %edx,%ecx
cmovl  %eax,%edx
cmovl  %edi,%esi
sub    %edx,%ecx
lea    0x10(%rsi),%edx
shr    %esi
mov    %esi,%edi
or     $0x10,%edi
cmp    %edx,%ecx
cmovl  %eax,%edx
cmovl  %esi,%edi
sub    %edx,%ecx
lea    0x4(%rdi),%esi
shr    %edi
mov    %edi,%edx
or     $0x4,%edx
cmp    %esi,%ecx
cmovl  %eax,%esi
cmovl  %edi,%edx
sub    %esi,%ecx
cmp    %edx,%ecx
jle    1280 <isqrt+0x180>
mov    %edx,%eax
not    %eax
add    %eax,%ecx
shr    %edx
or     $0x1,%edx
jmp    1282 <isqrt+0x182>
shr    %edx
xor    %eax,%eax
cmp    %ecx,%edx
setl   %al
add    %edx,%eax
ret

LLVM IR (-O0):
define i32 @isqrt(i32 %0) {
%2 = alloca i32
%3 = alloca i32
store i32 %0, i32* %2
store i32 0, i32* %3
%4 = load i32, i32* %3
%5 = add nsw i32 1073741824, %4
%6 = load i32, i32* %2
%7 = icmp sle i32 %5, %6
br i1 %7, label %8, label %16
8: ; preds = %1
%9 = load i32, i32* %3
%10 = add nsw i32 1073741824, %9
%11 = load i32, i32* %2
%12 = sub nsw i32 %11, %10
store i32 %12, i32* %2
%13 = load i32, i32* %3
%14 = ashr i32 %13, 1
%15 = or i32 %14, 1073741824
store i32 %15, i32* %3
br label %19
16: ; preds = %1
%17 = load i32, i32* %3
%18 = ashr i32 %17, 1
store i32 %18, i32* %3
br label %19
19: ; preds = %16, %8
%20 = load i32, i32* %3
%21 = add nsw i32 268435456, %20
%22 = load i32, i32* %2
%23 = icmp sle i32 %21, %22
br i1 %23, label %24, label %32
24: ; preds = %19
%25 = load i32, i32* %3
%26 = add nsw i32 268435456, %25
%27 = load i32, i32* %2
%28 = sub nsw i32 %27, %26
store i32 %28, i32* %2
%29 = load i32, i32* %3
%30 = ashr i32 %29, 1
%31 = or i32 %30, 268435456
store i32 %31, i32* %3
br label %35
32: ; preds = %19
%33 = load i32, i32* %3
%34 = ashr i32 %33, 1
store i32 %34, i32* %3
br label %35
35: ; preds = %32, %24
%36 = load i32, i32* %3
%37 = add nsw i32 67108864, %36
%38 = load i32, i32* %2
%39 = icmp sle i32 %37, %38
br i1 %39, label %40, label %48
40: ; preds = %35
%41 = load i32, i32* %3
%42 = add nsw i32 67108864, %41
%43 = load i32, i32* %2
%44 = sub nsw i32 %43, %42
store i32 %44, i32* %2
%45 = load i32, i32* %3
%46 = ashr i32 %45, 1
%47 = or i32 %46, 67108864
store i32 %47, i32* %3
br label %51
48: ; preds = %35
%49 = load i32, i32* %3
%50 = ashr i32 %49, 1
store i32 %50, i32* %3
br label %51
51: ; preds = %48, %40
%52 = load i32, i32* %3
%53 = add nsw i32 16777216, %52
%54 = load i32, i32* %2
%55 = icmp sle i32 %53, %54
br i1 %55, label %56, label %64
56: ; preds = %51
%57 = load i32, i32* %3
%58 = add nsw i32 16777216, %57
%59 = load i32, i32* %2
%60 = sub nsw i32 %59, %58
store i32 %60, i32* %2
%61 = load i32, i32* %3
%62 = ashr i32 %61, 1
%63 = or i32 %62, 16777216
store i32 %63, i32* %3
br label %67
64: ; preds = %51
%65 = load i32, i32* %3
%66 = ashr i32 %65, 1
store i32 %66, i32* %3
br label %67
67: ; preds = %64, %56
%68 = load i32, i32* %3
%69 = add nsw i32 4194304, %68
%70 = load i32, i32* %2
%71 = icmp sle i32 %69, %70
br i1 %71, label %72, label %80
72: ; preds = %67
%73 = load i32, i32* %3
%74 = add nsw i32 4194304, %73
%75 = load i32, i32* %2
%76 = sub nsw i32 %75, %74
store i32 %76, i32* %2
%77 = load i32, i32* %3
%78 = ashr i32 %77, 1
%79 = or i32 %78, 4194304
store i32 %79, i32* %3
br label %83
80: ; preds = %67
%81 = load i32, i32* %3
%82 = ashr i32 %81, 1
store i32 %82, i32* %3
br label %83
83: ; preds = %80, %72
%84 = load i32, i32* %3
%85 = add nsw i32 1048576, %84
%86 = load i32, i32* %2
%87 = icmp sle i32 %85, %86
br i1 %87, label %88, label %96
88: ; preds = %83
%89 = load i32, i32* %3
%90 = add nsw i32 1048576, %89
%91 = load i32, i32* %2
%92 = sub nsw i32 %91, %90
store i32 %92, i32* %2
%93 = load i32, i32* %3
%94 = ashr i32 %93, 1
%95 = or i32 %94, 1048576
store i32 %95, i32* %3
br label %99
96: ; preds = %83
%97 = load i32, i32* %3
%98 = ashr i32 %97, 1
store i32 %98, i32* %3
br label %99
99: ; preds = %96, %88
%100 = load i32, i32* %3
%101 = add nsw i32 262144, %100
%102 = load i32, i32* %2
%103 = icmp sle i32 %101, %102
br i1 %103, label %104, label %112
104: ; preds = %99
%105 = load i32, i32* %3
%106 = add nsw i32 262144, %105
%107 = load i32, i32* %2
%108 = sub nsw i32 %107, %106
store i32 %108, i32* %2
%109 = load i32, i32* %3
%110 = ashr i32 %109, 1
%111 = or i32 %110, 262144
store i32 %111, i32* %3
br label %115
112: ; preds = %99
%113 = load i32, i32* %3
%114 = ashr i32 %113, 1
store i32 %114, i32* %3
br label %115
115: ; preds = %112, %104
%116 = load i32, i32* %3
%117 = add nsw i32 65536, %116
%118 = load i32, i32* %2
%119 = icmp sle i32 %117, %118
br i1 %119, label %120, label %128
120: ; preds = %115
%121 = load i32, i32* %3
%122 = add nsw i32 65536, %121
%123 = load i32, i32* %2
%124 = sub nsw i32 %123, %122
store i32 %124, i32* %2
%125 = load i32, i32* %3
%126 = ashr i32 %125, 1
%127 = or i32 %126, 65536
store i32 %127, i32* %3
br label %131
128: ; preds = %115
%129 = load i32, i32* %3
%130 = ashr i32 %129, 1
store i32 %130, i32* %3
br label %131
131: ; preds = %128, %120
%132 = load i32, i32* %3
%133 = add nsw i32 16384, %132
%134 = load i32, i32* %2
%135 = icmp sle i32 %133, %134
br i1 %135, label %136, label %144
136: ; preds = %131
%137 = load i32, i32* %3
%138 = add nsw i32 16384, %137
%139 = load i32, i32* %2
%140 = sub nsw i32 %139, %138
store i32 %140, i32* %2
%141 = load i32, i32* %3
%142 = ashr i32 %141, 1
%143 = or i32 %142, 16384
store i32 %143, i32* %3
br label %147
144: ; preds = %131
%145 = load i32, i32* %3
%146 = ashr i32 %145, 1
store i32 %146, i32* %3
br label %147
147: ; preds = %144, %136
%148 = load i32, i32* %3
%149 = add nsw i32 4096, %148
%150 = load i32, i32* %2
%151 = icmp sle i32 %149, %150
br i1 %151, label %152, label %160
152: ; preds = %147
%153 = load i32, i32* %3
%154 = add nsw i32 4096, %153
%155 = load i32, i32* %2
%156 = sub nsw i32 %155, %154
store i32 %156, i32* %2
%157 = load i32, i32* %3
%158 = ashr i32 %157, 1
%159 = or i32 %158, 4096
store i32 %159, i32* %3
br label %163
160: ; preds = %147
%161 = load i32, i32* %3
%162 = ashr i32 %161, 1
store i32 %162, i32* %3
br label %163
163: ; preds = %160, %152
%164 = load i32, i32* %3
%165 = add nsw i32 1024, %164
%166 = load i32, i32* %2
%167 = icmp sle i32 %165, %166
br i1 %167, label %168, label %176
168: ; preds = %163
%169 = load i32, i32* %3
%170 = add nsw i32 1024, %169
%171 = load i32, i32* %2
%172 = sub nsw i32 %171, %170
store i32 %172, i32* %2
%173 = load i32, i32* %3
%174 = ashr i32 %173, 1
%175 = or i32 %174, 1024
store i32 %175, i32* %3
br label %179
176: ; preds = %163
%177 = load i32, i32* %3
%178 = ashr i32 %177, 1
store i32 %178, i32* %3
br label %179
179: ; preds = %176, %168
%180 = load i32, i32* %3
%181 = add nsw i32 256, %180
%182 = load i32, i32* %2
%183 = icmp sle i32 %181, %182
br i1 %183, label %184, label %192
184: ; preds = %179
%185 = load i32, i32* %3
%186 = add nsw i32 256, %185
%187 = load i32, i32* %2
%188 = sub nsw i32 %187, %186
store i32 %188, i32* %2
%189 = load i32, i32* %3
%190 = ashr i32 %189, 1
%191 = or i32 %190, 256
store i32 %191, i32* %3
br label %195
192: ; preds = %179
%193 = load i32, i32* %3
%194 = ashr i32 %193, 1
store i32 %194, i32* %3
br label %195
195: ; preds = %192, %184
%196 = load i32, i32* %3
%197 = add nsw i32 64, %196
%198 = load i32, i32* %2
%199 = icmp sle i32 %197, %198
br i1 %199, label %200, label %208
200: ; preds = %195
%201 = load i32, i32* %3
%202 = add nsw i32 64, %201
%203 = load i32, i32* %2
%204 = sub nsw i32 %203, %202
store i32 %204, i32* %2
%205 = load i32, i32* %3
%206 = ashr i32 %205, 1
%207 = or i32 %206, 64
store i32 %207, i32* %3
br label %211
208: ; preds = %195
%209 = load i32, i32* %3
%210 = ashr i32 %209, 1
store i32 %210, i32* %3
br label %211
211: ; preds = %208, %200
%212 = load i32, i32* %3
%213 = add nsw i32 16, %212
%214 = load i32, i32* %2
%215 = icmp sle i32 %213, %214
br i1 %215, label %216, label %224
216: ; preds = %211
%217 = load i32, i32* %3
%218 = add nsw i32 16, %217
%219 = load i32, i32* %2
%220 = sub nsw i32 %219, %218
store i32 %220, i32* %2
%221 = load i32, i32* %3
%222 = ashr i32 %221, 1
%223 = or i32 %222, 16
store i32 %223, i32* %3
br label %227
224: ; preds = %211
%225 = load i32, i32* %3
%226 = ashr i32 %225, 1
store i32 %226, i32* %3
br label %227
227: ; preds = %224, %216
%228 = load i32, i32* %3
%229 = add nsw i32 4, %228
%230 = load i32, i32* %2
%231 = icmp sle i32 %229, %230
br i1 %231, label %232, label %240
232: ; preds = %227
%233 = load i32, i32* %3
%234 = add nsw i32 4, %233
%235 = load i32, i32* %2
%236 = sub nsw i32 %235, %234
store i32 %236, i32* %2
%237 = load i32, i32* %3
%238 = ashr i32 %237, 1
%239 = or i32 %238, 4
store i32 %239, i32* %3
br label %243
240: ; preds = %227
%241 = load i32, i32* %3
%242 = ashr i32 %241, 1
store i32 %242, i32* %3
br label %243
243: ; preds = %240, %232
%244 = load i32, i32* %3
%245 = add nsw i32 1, %244
%246 = load i32, i32* %2
%247 = icmp sle i32 %245, %246
br i1 %247, label %248, label %256
248: ; preds = %243
%249 = load i32, i32* %3
%250 = add nsw i32 1, %249
%251 = load i32, i32* %2
%252 = sub nsw i32 %251, %250
store i32 %252, i32* %2
%253 = load i32, i32* %3
%254 = ashr i32 %253, 1
%255 = or i32 %254, 1
store i32 %255, i32* %3
br label %259
256: ; preds = %243
%257 = load i32, i32* %3
%258 = ashr i32 %257, 1
store i32 %258, i32* %3
br label %259
259: ; preds = %256, %248
%260 = load i32, i32* %3
%261 = load i32, i32* %2
%262 = icmp slt i32 %260, %261
br i1 %262, label %263, label %266
263: ; preds = %259
%264 = load i32, i32* %3
%265 = add nsw i32 %264, 1
store i32 %265, i32* %3
br label %266
266: ; preds = %263, %259
%267 = load i32, i32* %3
ret i32 %267
}

LLVM IR (-O2):
define i32 @isqrt(i32 %0) {
%2 = icmp sgt i32 %0, 1073741823
%3 = add nsw i32 %0, -1073741824
%4 = select i1 %2, i32 %3, i32 %0
%5 = select i1 %2, i32 1073741824, i32 0
%6 = or i32 %5, 268435456
%7 = icmp slt i32 %4, %6
%8 = lshr exact i32 %5, 1
%9 = or i32 %8, 268435456
%10 = select i1 %7, i32 0, i32 %6
%11 = sub nsw i32 %4, %10
%12 = select i1 %7, i32 %8, i32 %9
%13 = or i32 %12, 67108864
%14 = icmp slt i32 %11, %13
%15 = lshr exact i32 %12, 1
%16 = or i32 %15, 67108864
%17 = select i1 %14, i32 0, i32 %13
%18 = sub nsw i32 %11, %17
%19 = select i1 %14, i32 %15, i32 %16
%20 = add nuw nsw i32 %19, 16777216
%21 = icmp slt i32 %18, %20
%22 = lshr i32 %19, 1
%23 = or i32 %22, 16777216
%24 = select i1 %21, i32 0, i32 %20
%25 = sub nsw i32 %18, %24
%26 = select i1 %21, i32 %22, i32 %23
%27 = add nuw nsw i32 %26, 4194304
%28 = icmp slt i32 %25, %27
%29 = lshr i32 %26, 1
%30 = or i32 %29, 4194304
%31 = select i1 %28, i32 0, i32 %27
%32 = sub nsw i32 %25, %31
%33 = select i1 %28, i32 %29, i32 %30
%34 = add nuw nsw i32 %33, 1048576
%35 = icmp slt i32 %32, %34
%36 = lshr i32 %33, 1
%37 = or i32 %36, 1048576
%38 = select i1 %35, i32 0, i32 %34
%39 = sub nsw i32 %32, %38
%40 = select i1 %35, i32 %36, i32 %37
%41 = add nuw nsw i32 %40, 262144
%42 = icmp slt i32 %39, %41
%43 = lshr i32 %40, 1
%44 = or i32 %43, 262144
%45 = select i1 %42, i32 0, i32 %41
%46 = sub nsw i32 %39, %45
%47 = select i1 %42, i32 %43, i32 %44
%48 = add nuw nsw i32 %47, 65536
%49 = icmp slt i32 %46, %48
%50 = lshr i32 %47, 1
%51 = or i32 %50, 65536
%52 = select i1 %49, i32 0, i32 %48
%53 = sub nsw i32 %46, %52
%54 = select i1 %49, i32 %50, i32 %51
%55 = add nuw nsw i32 %54, 16384
%56 = icmp slt i32 %53, %55
%57 = lshr i32 %54, 1
%58 = or i32 %57, 16384
%59 = select i1 %56, i32 0, i32 %55
%60 = sub nsw i32 %53, %59
%61 = select i1 %56, i32 %57, i32 %58
%62 = add nuw nsw i32 %61, 4096
%63 = icmp slt i32 %60, %62
%64 = lshr i32 %61, 1
%65 = or i32 %64, 4096
%66 = select i1 %63, i32 0, i32 %62
%67 = sub nsw i32 %60, %66
%68 = select i1 %63, i32 %64, i32 %65
%69 = add nuw nsw i32 %68, 1024
%70 = icmp slt i32 %67, %69
%71 = lshr i32 %68, 1
%72 = or i32 %71, 1024
%73 = select i1 %70, i32 0, i32 %69
%74 = sub nsw i32 %67, %73
%75 = select i1 %70, i32 %71, i32 %72
%76 = add nuw nsw i32 %75, 256
%77 = icmp slt i32 %74, %76
%78 = lshr i32 %75, 1
%79 = or i32 %78, 256
%80 = select i1 %77, i32 0, i32 %76
%81 = sub nsw i32 %74, %80
%82 = select i1 %77, i32 %78, i32 %79
%83 = add nuw nsw i32 %82, 64
%84 = icmp slt i32 %81, %83
%85 = lshr i32 %82, 1
%86 = or i32 %85, 64
%87 = select i1 %84, i32 0, i32 %83
%88 = sub nsw i32 %81, %87
%89 = select i1 %84, i32 %85, i32 %86
%90 = add nuw nsw i32 %89, 16
%91 = icmp slt i32 %88, %90
%92 = lshr i32 %89, 1
%93 = or i32 %92, 16
%94 = select i1 %91, i32 0, i32 %90
%95 = sub nsw i32 %88, %94
%96 = select i1 %91, i32 %92, i32 %93
%97 = add nuw nsw i32 %96, 4
%98 = icmp slt i32 %95, %97
%99 = lshr i32 %96, 1
%100 = or i32 %99, 4
%101 = select i1 %98, i32 0, i32 %97
%102 = sub nsw i32 %95, %101
%103 = select i1 %98, i32 %99, i32 %100
%104 = icmp sgt i32 %102, %103
br i1 %104, label %105, label %110
105: ; preds = %1
%106 = xor i32 %103, -1
%107 = add i32 %102, %106
%108 = lshr i32 %103, 1
%109 = or i32 %108, 1
br label %112
110: ; preds = %1
%111 = lshr i32 %103, 1
br label %112
112: ; preds = %110, %105
%113 = phi i32 [ %107, %105 ], [ %102, %110 ]
%114 = phi i32 [ %109, %105 ], [ %111, %110 ]
%115 = icmp slt i32 %114, %113
%116 = zext i1 %115 to i32
%117 = add nsw i32 %114, %116
ret i32 %117
}