void _make_safe_start_end(long in_limit, long *io_start, long *io_end) {
  if (*io_start < 0)
    *io_start = 0;
  else if (*io_start > in_limit)
    *io_start = in_limit;
  if (*io_end < 0)
    *io_end = in_limit;
  else if (*io_end < *io_start)
    *io_end = *io_start;
  else if (*io_end > in_limit)
    *io_end = in_limit;
}


x86 assembly (clang, -O0):
<_make_safe_start_end>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    -0x10(%rbp),%rax
cmpq   $0x0,(%rax)
jge    112e <_make_safe_start_end+0x2e>
mov    -0x10(%rbp),%rax
movq   $0x0,(%rax)
jmp    114f <_make_safe_start_end+0x4f>
mov    -0x10(%rbp),%rax
mov    (%rax),%rax
cmp    -0x8(%rbp),%rax
jle    114a <_make_safe_start_end+0x4a>
mov    -0x8(%rbp),%rcx
mov    -0x10(%rbp),%rax
mov    %rcx,(%rax)
jmp    114f <_make_safe_start_end+0x4f>
mov    -0x18(%rbp),%rax
cmpq   $0x0,(%rax)
jge    116d <_make_safe_start_end+0x6d>
mov    -0x8(%rbp),%rcx
mov    -0x18(%rbp),%rax
mov    %rcx,(%rax)
jmp    11ba <_make_safe_start_end+0xba>
mov    -0x18(%rbp),%rax
mov    (%rax),%rax
mov    -0x10(%rbp),%rcx
cmp    (%rcx),%rax
jge    1194 <_make_safe_start_end+0x94>
mov    -0x10(%rbp),%rax
mov    (%rax),%rcx
mov    -0x18(%rbp),%rax
mov    %rcx,(%rax)
jmp    11b5 <_make_safe_start_end+0xb5>
mov    -0x18(%rbp),%rax
mov    (%rax),%rax
cmp    -0x8(%rbp),%rax
jle    11b0 <_make_safe_start_end+0xb0>
mov    -0x8(%rbp),%rcx
mov    -0x18(%rbp),%rax
mov    %rcx,(%rax)
jmp    11b5 <_make_safe_start_end+0xb5>
jmp    11ba <_make_safe_start_end+0xba>
pop    %rbp
ret

x86 assembly (clang, -O2):
<_make_safe_start_end>:
mov    (%rsi),%rax
test   %rax,%rax
js     1112 <_make_safe_start_end+0x12>
mov    %rdi,%rcx
cmp    %rdi,%rax
jg     1114 <_make_safe_start_end+0x14>
jmp    111a <_make_safe_start_end+0x1a>
xor    %ecx,%ecx
mov    %rcx,(%rsi)
mov    %rcx,%rax
mov    (%rdx),%rcx
test   %rcx,%rcx
js     1130 <_make_safe_start_end+0x30>
cmp    %rax,%rcx
jl     1133 <_make_safe_start_end+0x33>
mov    %rdi,%rax
cmp    %rdi,%rcx
jg     1133 <_make_safe_start_end+0x33>
ret
mov    %rdi,%rax
mov    %rax,(%rdx)
ret

LLVM IR (-O0):
define void @_make_safe_start_end(i64 %0, i64* %1, i64* %2) {
%4 = alloca i64
%5 = alloca i64*
%6 = alloca i64*
store i64 %0, i64* %4
store i64* %1, i64** %5
store i64* %2, i64** %6
%7 = load i64*, i64** %5
%8 = load i64, i64* %7
%9 = icmp slt i64 %8, 0
br i1 %9, label %10, label %12
10: ; preds = %3
%11 = load i64*, i64** %5
store i64 0, i64* %11
br label %21
12: ; preds = %3
%13 = load i64*, i64** %5
%14 = load i64, i64* %13
%15 = load i64, i64* %4
%16 = icmp sgt i64 %14, %15
br i1 %16, label %17, label %20
17: ; preds = %12
%18 = load i64, i64* %4
%19 = load i64*, i64** %5
store i64 %18, i64* %19
br label %20
20: ; preds = %17, %12
br label %21
21: ; preds = %20, %10
%22 = load i64*, i64** %6
%23 = load i64, i64* %22
%24 = icmp slt i64 %23, 0
br i1 %24, label %25, label %28
25: ; preds = %21
%26 = load i64, i64* %4
%27 = load i64*, i64** %6
store i64 %26, i64* %27
br label %48
28: ; preds = %21
%29 = load i64*, i64** %6
%30 = load i64, i64* %29
%31 = load i64*, i64** %5
%32 = load i64, i64* %31
%33 = icmp slt i64 %30, %32
br i1 %33, label %34, label %38
34: ; preds = %28
%35 = load i64*, i64** %5
%36 = load i64, i64* %35
%37 = load i64*, i64** %6
store i64 %36, i64* %37
br label %47
38: ; preds = %28
%39 = load i64*, i64** %6
%40 = load i64, i64* %39
%41 = load i64, i64* %4
%42 = icmp sgt i64 %40, %41
br i1 %42, label %43, label %46
43: ; preds = %38
%44 = load i64, i64* %4
%45 = load i64*, i64** %6
store i64 %44, i64* %45
br label %46
46: ; preds = %43, %38
br label %47
47: ; preds = %46, %34
br label %48
48: ; preds = %47, %25
ret void
}

LLVM IR (-O2):
define void @_make_safe_start_end(i64 %0, i64* nocapture %1, i64* nocapture %2) {
%4 = load i64, i64* %1
%5 = icmp slt i64 %4, 0
br i1 %5, label %8, label %6
6: ; preds = %3
%7 = icmp sgt i64 %4, %0
br i1 %7, label %8, label %10
8: ; preds = %6, %3
%9 = phi i64 [ 0, %3 ], [ %0, %6 ]
store i64 %9, i64* %1
br label %10
10: ; preds = %8, %6
%11 = phi i64 [ %4, %6 ], [ %9, %8 ]
%12 = load i64, i64* %2
%13 = icmp slt i64 %12, 0
br i1 %13, label %18, label %14
14: ; preds = %10
%15 = icmp slt i64 %12, %11
br i1 %15, label %18, label %16
16: ; preds = %14
%17 = icmp sgt i64 %12, %0
br i1 %17, label %18, label %20
18: ; preds = %16, %14, %10
%19 = phi i64 [ %0, %10 ], [ %11, %14 ], [ %0, %16 ]
store i64 %19, i64* %2
br label %20
20: ; preds = %18, %16
ret void
}