void bad_par(int *real, int min, int max, char *mes) {
  static char lh[2][5] = {"low", "high"};
  if (*real < min) {
    *real = min;
  } else if (*real > max) {
    *real = max;
  } else
    return;
  dagrab_stderr("%s too %s, setting to %i\n", mes, lh[*real == max], *real);
}


x86 assembly (clang, -O0):
<bad_par>:
push   %rbp
mov    %rsp,%rbp
sub    $0x20,%rsp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %edx,-0x10(%rbp)
mov    %rcx,-0x18(%rbp)
mov    -0x8(%rbp),%rax
mov    (%rax),%eax
cmp    -0xc(%rbp),%eax
jge    1143 <bad_par+0x33>
mov    -0xc(%rbp),%ecx
mov    -0x8(%rbp),%rax
mov    %ecx,(%rax)
jmp    116a <bad_par+0x5a>
mov    -0x8(%rbp),%rax
mov    (%rax),%eax
cmp    -0x10(%rbp),%eax
jle    1160 <bad_par+0x50>
mov    -0x10(%rbp),%ecx
mov    -0x8(%rbp),%rax
mov    %ecx,(%rax)
jmp    1165 <bad_par+0x55>
jmp    11a3 <bad_par+0x93>
jmp    116a <bad_par+0x5a>
mov    -0x18(%rbp),%rsi
mov    -0x8(%rbp),%rax
mov    (%rax),%eax
cmp    -0x10(%rbp),%eax
sete   %al
and    $0x1,%al
movzbl %al,%eax
cltq
lea    0x2ea0(%rip),%rdx
imul   $0x5,%rax,%rax
add    %rax,%rdx
mov    -0x8(%rbp),%rax
mov    (%rax),%ecx
lea    0xe64(%rip),%rdi
mov    $0x0,%al
call   1030 <dagrab_stderr@plt>
add    $0x20,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<bad_par>:
mov    %esi,%eax
mov    (%rdi),%esi
cmp    %eax,%esi
jl     111e <bad_par+0xe>
mov    %edx,%eax
cmp    %edx,%esi
jle    1149 <bad_par+0x39>
mov    %eax,(%rdi)
xor    %esi,%esi
cmp    %edx,%eax
sete   %sil
lea    (%rsi,%rsi,4),%rsi
lea    0x2ef5(%rip),%rdx
add    %rsi,%rdx
lea    0xec3(%rip),%rdi
mov    %rcx,%rsi
mov    %eax,%ecx
xor    %eax,%eax
jmp    1030 <dagrab_stderr@plt>
ret

LLVM IR (-O0):
@bad_par.lh = internal global [2 x [5 x i8]] [[5 x i8] c"low\00\00", [5 x i8] c"high\00"]
@.str = [26 x i8] c"%s too %s, setting to %i\0A\00"
define void @bad_par(i32* %0, i32 %1, i32 %2, i8* %3) {
%5 = alloca i32*
%6 = alloca i32
%7 = alloca i32
%8 = alloca i8*
store i32* %0, i32** %5
store i32 %1, i32* %6
store i32 %2, i32* %7
store i8* %3, i8** %8
%9 = load i32*, i32** %5
%10 = load i32, i32* %9
%11 = load i32, i32* %6
%12 = icmp slt i32 %10, %11
br i1 %12, label %13, label %16
13: ; preds = %4
%14 = load i32, i32* %6
%15 = load i32*, i32** %5
store i32 %14, i32* %15
br label %26
16: ; preds = %4
%17 = load i32*, i32** %5
%18 = load i32, i32* %17
%19 = load i32, i32* %7
%20 = icmp sgt i32 %18, %19
br i1 %20, label %21, label %24
21: ; preds = %16
%22 = load i32, i32* %7
%23 = load i32*, i32** %5
store i32 %22, i32* %23
br label %25
24: ; preds = %16
br label %39
25: ; preds = %21
br label %26
26: ; preds = %25, %13
%27 = load i8*, i8** %8
%28 = load i32*, i32** %5
%29 = load i32, i32* %28
%30 = load i32, i32* %7
%31 = icmp eq i32 %29, %30
%32 = zext i1 %31 to i32
%33 = sext i32 %32 to i64
%34 = getelementptr inbounds [2 x [5 x i8]], [2 x [5 x i8]]* @bad_par.lh, i64 0, i64 %33
%35 = getelementptr inbounds [5 x i8], [5 x i8]* %34, i64 0, i64 0
%36 = load i32*, i32** %5
%37 = load i32, i32* %36
%38 = call i32 (i8*, i8*, i8*, i32, ...) bitcast (i32 (...)* @dagrab_stderr to i32 (i8*, i8*, i8*, i32, ...)*)(i8* getelementptr inbounds ([26 x i8], [26 x i8]* @.str, i64 0, i64 0), i8* %27, i8* %35, i32 %37)
br label %39
39: ; preds = %26, %24
ret void
}

LLVM IR (-O2):
@bad_par.lh = internal global [2 x [5 x i8]] [[5 x i8] c"low\00\00", [5 x i8] c"high\00"]
@.str = [26 x i8] c"%s too %s, setting to %i\0A\00"
define void @bad_par(i32* nocapture %0, i32 %1, i32 %2, i8* %3) {
%5 = load i32, i32* %0
%6 = icmp slt i32 %5, %1
br i1 %6, label %9, label %7
7: ; preds = %4
%8 = icmp sgt i32 %5, %2
br i1 %8, label %9, label %15
9: ; preds = %7, %4
%10 = phi i32 [ %1, %4 ], [ %2, %7 ]
store i32 %10, i32* %0
%11 = icmp eq i32 %10, %2
%12 = zext i1 %11 to i64
%13 = getelementptr inbounds [2 x [5 x i8]], [2 x [5 x i8]]* @bad_par.lh, i64 0, i64 %12, i64 0
%14 = tail call i32 (i8*, i8*, i8*, i32, ...) bitcast (i32 (...)* @dagrab_stderr to i32 (i8*, i8*, i8*, i32, ...)*)(i8* getelementptr inbounds ([26 x i8], [26 x i8]* @.str, i64 0, i64 0), i8* %3, i8* %13, i32 %10)
br label %15
15: ; preds = %7, %9
ret void
}