int max_func(int a, int b, int c, int d) {
  return (((((((a) > (b)) ? (a) : (b)))) > (((((c) > (d)) ? (c) : (d)))))
              ? (((((a) > (b)) ? (a) : (b))))
              : (((((c) > (d)) ? (c) : (d)))));
}


x86 assembly (clang, -O0):
<max_func>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
mov    %esi,-0x8(%rbp)
mov    %edx,-0xc(%rbp)
mov    %ecx,-0x10(%rbp)
mov    -0x4(%rbp),%eax
cmp    -0x8(%rbp),%eax
jle    1127 <max_func+0x27>
mov    -0x4(%rbp),%eax
mov    %eax,-0x14(%rbp)
jmp    112d <max_func+0x2d>
mov    -0x8(%rbp),%eax
mov    %eax,-0x14(%rbp)
mov    -0x14(%rbp),%eax
mov    %eax,-0x18(%rbp)
mov    -0xc(%rbp),%eax
cmp    -0x10(%rbp),%eax
jle    114a <max_func+0x4a>
mov    -0xc(%rbp),%eax
mov    %eax,-0x1c(%rbp)
jmp    1150 <max_func+0x50>
mov    -0x10(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x18(%rbp),%eax
mov    -0x1c(%rbp),%ecx
cmp    %ecx,%eax
jle    1186 <max_func+0x86>
mov    -0x4(%rbp),%eax
cmp    -0x8(%rbp),%eax
jle    1175 <max_func+0x75>
mov    -0x4(%rbp),%eax
mov    %eax,-0x20(%rbp)
jmp    117b <max_func+0x7b>
mov    -0x8(%rbp),%eax
mov    %eax,-0x20(%rbp)
mov    -0x20(%rbp),%eax
mov    %eax,-0x24(%rbp)
jmp    11a9 <max_func+0xa9>
mov    -0xc(%rbp),%eax
cmp    -0x10(%rbp),%eax
jle    119d <max_func+0x9d>
mov    -0xc(%rbp),%eax
mov    %eax,-0x28(%rbp)
jmp    11a3 <max_func+0xa3>
mov    -0x10(%rbp),%eax
mov    %eax,-0x28(%rbp)
mov    -0x28(%rbp),%eax
mov    %eax,-0x24(%rbp)
mov    -0x24(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<max_func>:
cmp    %esi,%edi
cmovg  %edi,%esi
mov    %ecx,%eax
cmp    %ecx,%edx
cmovg  %edx,%eax
cmp    %eax,%esi
cmovg  %esi,%eax
ret

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

LLVM IR (-O2):
define i32 @max_func(i32 %0, i32 %1, i32 %2, i32 %3) {
%5 = icmp sgt i32 %0, %1
%6 = select i1 %5, i32 %0, i32 %1
%7 = icmp sgt i32 %2, %3
%8 = select i1 %7, i32 %2, i32 %3
%9 = icmp sgt i32 %6, %8
%10 = select i1 %9, i32 %6, i32 %8
ret i32 %10
}