void updatePosteriorBoundaries(int d1, int d2, int *min_k, int *max_k,
                               int **min_l, int **max_l) {
  (*min_l)[d1] = (((*min_l)[d1]) < (d2) ? ((*min_l)[d1]) : (d2));
  (*max_l)[d1] = (((*max_l)[d1]) > (d2) ? ((*max_l)[d1]) : (d2));
  *min_k = ((*min_k) < (d1) ? (*min_k) : (d1));
  *max_k = ((*max_k) > (d1) ? (*max_k) : (d1));
}


x86 assembly (clang, -O0):
<updatePosteriorBoundaries>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
mov    %esi,-0x8(%rbp)
mov    %rdx,-0x10(%rbp)
mov    %rcx,-0x18(%rbp)
mov    %r8,-0x20(%rbp)
mov    %r9,-0x28(%rbp)
mov    -0x20(%rbp),%rax
mov    (%rax),%rax
movslq -0x4(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
cmp    -0x8(%rbp),%eax
jge    1147 <updatePosteriorBoundaries+0x47>
mov    -0x20(%rbp),%rax
mov    (%rax),%rax
movslq -0x4(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
mov    %eax,-0x2c(%rbp)
jmp    114d <updatePosteriorBoundaries+0x4d>
mov    -0x8(%rbp),%eax
mov    %eax,-0x2c(%rbp)
mov    -0x2c(%rbp),%edx
mov    -0x20(%rbp),%rax
mov    (%rax),%rax
movslq -0x4(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x28(%rbp),%rax
mov    (%rax),%rax
movslq -0x4(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
cmp    -0x8(%rbp),%eax
jle    118b <updatePosteriorBoundaries+0x8b>
mov    -0x28(%rbp),%rax
mov    (%rax),%rax
movslq -0x4(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
mov    %eax,-0x30(%rbp)
jmp    1191 <updatePosteriorBoundaries+0x91>
mov    -0x8(%rbp),%eax
mov    %eax,-0x30(%rbp)
mov    -0x30(%rbp),%edx
mov    -0x28(%rbp),%rax
mov    (%rax),%rax
movslq -0x4(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x10(%rbp),%rax
mov    (%rax),%eax
cmp    -0x4(%rbp),%eax
jge    11bf <updatePosteriorBoundaries+0xbf>
mov    -0x10(%rbp),%rax
mov    (%rax),%eax
mov    %eax,-0x34(%rbp)
jmp    11c5 <updatePosteriorBoundaries+0xc5>
mov    -0x4(%rbp),%eax
mov    %eax,-0x34(%rbp)
mov    -0x34(%rbp),%ecx
mov    -0x10(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x18(%rbp),%rax
mov    (%rax),%eax
cmp    -0x4(%rbp),%eax
jle    11eb <updatePosteriorBoundaries+0xeb>
mov    -0x18(%rbp),%rax
mov    (%rax),%eax
mov    %eax,-0x38(%rbp)
jmp    11f1 <updatePosteriorBoundaries+0xf1>
mov    -0x4(%rbp),%eax
mov    %eax,-0x38(%rbp)
mov    -0x38(%rbp),%ecx
mov    -0x18(%rbp),%rax
mov    %ecx,(%rax)
pop    %rbp
ret

x86 assembly (clang, -O2):
<updatePosteriorBoundaries>:
mov    (%r8),%r8
movslq %edi,%rdi
mov    (%r8,%rdi,4),%eax
cmp    %esi,%eax
cmovge %esi,%eax
mov    %eax,(%r8,%rdi,4)
mov    (%r9),%r8
mov    (%r8,%rdi,4),%eax
cmp    %esi,%eax
cmovg  %eax,%esi
mov    %esi,(%r8,%rdi,4)
mov    (%rdx),%eax
cmp    %edi,%eax
cmovge %edi,%eax
mov    %eax,(%rdx)
mov    (%rcx),%eax
cmp    %edi,%eax
cmovg  %eax,%edi
mov    %edi,(%rcx)
ret

LLVM IR (-O0):
define void @updatePosteriorBoundaries(i32 %0, i32 %1, i32* %2, i32* %3, i32** %4, i32** %5) {
%7 = alloca i32
%8 = alloca i32
%9 = alloca i32*
%10 = alloca i32*
%11 = alloca i32**
%12 = alloca i32**
store i32 %0, i32* %7
store i32 %1, i32* %8
store i32* %2, i32** %9
store i32* %3, i32** %10
store i32** %4, i32*** %11
store i32** %5, i32*** %12
%13 = load i32**, i32*** %11
%14 = load i32*, i32** %13
%15 = load i32, i32* %7
%16 = sext i32 %15 to i64
%17 = getelementptr inbounds i32, i32* %14, i64 %16
%18 = load i32, i32* %17
%19 = load i32, i32* %8
%20 = icmp slt i32 %18, %19
br i1 %20, label %21, label %28
21: ; preds = %6
%22 = load i32**, i32*** %11
%23 = load i32*, i32** %22
%24 = load i32, i32* %7
%25 = sext i32 %24 to i64
%26 = getelementptr inbounds i32, i32* %23, i64 %25
%27 = load i32, i32* %26
br label %30
28: ; preds = %6
%29 = load i32, i32* %8
br label %30
30: ; preds = %28, %21
%31 = phi i32 [ %27, %21 ], [ %29, %28 ]
%32 = load i32**, i32*** %11
%33 = load i32*, i32** %32
%34 = load i32, i32* %7
%35 = sext i32 %34 to i64
%36 = getelementptr inbounds i32, i32* %33, i64 %35
store i32 %31, i32* %36
%37 = load i32**, i32*** %12
%38 = load i32*, i32** %37
%39 = load i32, i32* %7
%40 = sext i32 %39 to i64
%41 = getelementptr inbounds i32, i32* %38, i64 %40
%42 = load i32, i32* %41
%43 = load i32, i32* %8
%44 = icmp sgt i32 %42, %43
br i1 %44, label %45, label %52
45: ; preds = %30
%46 = load i32**, i32*** %12
%47 = load i32*, i32** %46
%48 = load i32, i32* %7
%49 = sext i32 %48 to i64
%50 = getelementptr inbounds i32, i32* %47, i64 %49
%51 = load i32, i32* %50
br label %54
52: ; preds = %30
%53 = load i32, i32* %8
br label %54
54: ; preds = %52, %45
%55 = phi i32 [ %51, %45 ], [ %53, %52 ]
%56 = load i32**, i32*** %12
%57 = load i32*, i32** %56
%58 = load i32, i32* %7
%59 = sext i32 %58 to i64
%60 = getelementptr inbounds i32, i32* %57, i64 %59
store i32 %55, i32* %60
%61 = load i32*, i32** %9
%62 = load i32, i32* %61
%63 = load i32, i32* %7
%64 = icmp slt i32 %62, %63
br i1 %64, label %65, label %68
65: ; preds = %54
%66 = load i32*, i32** %9
%67 = load i32, i32* %66
br label %70
68: ; preds = %54
%69 = load i32, i32* %7
br label %70
70: ; preds = %68, %65
%71 = phi i32 [ %67, %65 ], [ %69, %68 ]
%72 = load i32*, i32** %9
store i32 %71, i32* %72
%73 = load i32*, i32** %10
%74 = load i32, i32* %73
%75 = load i32, i32* %7
%76 = icmp sgt i32 %74, %75
br i1 %76, label %77, label %80
77: ; preds = %70
%78 = load i32*, i32** %10
%79 = load i32, i32* %78
br label %82
80: ; preds = %70
%81 = load i32, i32* %7
br label %82
82: ; preds = %80, %77
%83 = phi i32 [ %79, %77 ], [ %81, %80 ]
%84 = load i32*, i32** %10
store i32 %83, i32* %84
ret void
}

LLVM IR (-O2):
define void @updatePosteriorBoundaries(i32 %0, i32 %1, i32* nocapture %2, i32* nocapture %3, i32** nocapture %4, i32** nocapture %5) {
%7 = load i32*, i32** %4
%8 = sext i32 %0 to i64
%9 = getelementptr inbounds i32, i32* %7, i64 %8
%10 = load i32, i32* %9
%11 = icmp slt i32 %10, %1
%12 = select i1 %11, i32 %10, i32 %1
store i32 %12, i32* %9
%13 = load i32*, i32** %5
%14 = getelementptr inbounds i32, i32* %13, i64 %8
%15 = load i32, i32* %14
%16 = icmp sgt i32 %15, %1
%17 = select i1 %16, i32 %15, i32 %1
store i32 %17, i32* %14
%18 = load i32, i32* %2
%19 = icmp slt i32 %18, %0
%20 = select i1 %19, i32 %18, i32 %0
store i32 %20, i32* %2
%21 = load i32, i32* %3
%22 = icmp sgt i32 %21, %0
%23 = select i1 %22, i32 %21, i32 %0
store i32 %23, i32* %3
ret void
}