float *vec2_clamp(float *result, float *a, float *lower, float *higher) {
  result[0] = a[0];
  result[1] = a[1];
  if (result[0] < lower[0]) {
    result[0] = lower[0];
  }
  if (result[0] > higher[0]) {
    result[0] = higher[0];
  }
  if (result[1] < lower[1]) {
    result[1] = lower[1];
  }
  if (result[1] > higher[1]) {
    result[1] = higher[1];
  }
  return result;
}


x86 assembly (clang, -O0):
<vec2_clamp>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
mov    -0x10(%rbp),%rax
movss  (%rax),%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,(%rax)
mov    -0x10(%rbp),%rax
movss  0x4(%rax),%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,0x4(%rax)
mov    -0x8(%rbp),%rax
movss  (%rax),%xmm1
mov    -0x18(%rbp),%rax
movss  (%rax),%xmm0
ucomiss %xmm1,%xmm0
jbe    115f <vec2_clamp+0x5f>
mov    -0x18(%rbp),%rax
movss  (%rax),%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,(%rax)
mov    -0x8(%rbp),%rax
movss  (%rax),%xmm0
mov    -0x20(%rbp),%rax
ucomiss (%rax),%xmm0
jbe    1184 <vec2_clamp+0x84>
mov    -0x20(%rbp),%rax
movss  (%rax),%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,(%rax)
mov    -0x8(%rbp),%rax
movss  0x4(%rax),%xmm1
mov    -0x18(%rbp),%rax
movss  0x4(%rax),%xmm0
ucomiss %xmm1,%xmm0
jbe    11b1 <vec2_clamp+0xb1>
mov    -0x18(%rbp),%rax
movss  0x4(%rax),%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,0x4(%rax)
mov    -0x8(%rbp),%rax
movss  0x4(%rax),%xmm0
mov    -0x20(%rbp),%rax
ucomiss 0x4(%rax),%xmm0
jbe    11da <vec2_clamp+0xda>
mov    -0x20(%rbp),%rax
movss  0x4(%rax),%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,0x4(%rax)
mov    -0x8(%rbp),%rax
pop    %rbp
ret

x86 assembly (clang, -O2):
<vec2_clamp>:
mov    %rdi,%rax
movss  (%rsi),%xmm1
movss  %xmm1,(%rdi)
movss  0x4(%rsi),%xmm0
movss  %xmm0,0x4(%rdi)
movss  (%rdx),%xmm2
ucomiss %xmm1,%xmm2
jbe    1125 <vec2_clamp+0x25>
movss  %xmm2,(%rax)
movaps %xmm2,%xmm1
movss  (%rcx),%xmm2
ucomiss %xmm2,%xmm1
jbe    1132 <vec2_clamp+0x32>
movss  %xmm2,(%rax)
movss  0x4(%rdx),%xmm1
ucomiss %xmm0,%xmm1
jbe    1144 <vec2_clamp+0x44>
movss  %xmm1,0x4(%rax)
movaps %xmm1,%xmm0
movss  0x4(%rcx),%xmm1
ucomiss %xmm1,%xmm0
jbe    1153 <vec2_clamp+0x53>
movss  %xmm1,0x4(%rax)
ret

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

LLVM IR (-O2):
define float* @vec2_clamp(float* returned %0, float* nocapture %1, float* nocapture %2, float* nocapture %3) {
%5 = load float, float* %1
store float %5, float* %0
%6 = getelementptr inbounds float, float* %1, i64 1
%7 = load float, float* %6
%8 = getelementptr inbounds float, float* %0, i64 1
store float %7, float* %8
%9 = load float, float* %2
%10 = fcmp olt float %5, %9
br i1 %10, label %11, label %12
11: ; preds = %4
store float %9, float* %0
br label %12
12: ; preds = %11, %4
%13 = phi float [ %9, %11 ], [ %5, %4 ]
%14 = load float, float* %3
%15 = fcmp ogt float %13, %14
br i1 %15, label %16, label %17
16: ; preds = %12
store float %14, float* %0
br label %17
17: ; preds = %16, %12
%18 = getelementptr inbounds float, float* %2, i64 1
%19 = load float, float* %18
%20 = fcmp olt float %7, %19
br i1 %20, label %21, label %22
21: ; preds = %17
store float %19, float* %8
br label %22
22: ; preds = %21, %17
%23 = phi float [ %19, %21 ], [ %7, %17 ]
%24 = getelementptr inbounds float, float* %3, i64 1
%25 = load float, float* %24
%26 = fcmp ogt float %23, %25
br i1 %26, label %27, label %28
27: ; preds = %22
store float %25, float* %8
br label %28
28: ; preds = %27, %22
ret float* %0
}