float condition_reduction(float *a, float min_v) {
  float last = 0;
  for (int i = 0; i < 32; i++)
    if (a[i] < min_v)
      last = a[i];
  return last;
}


x86 assembly (clang, -O0):
<condition_reduction>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
movss  %xmm0,-0xc(%rbp)
xorps  %xmm0,%xmm0
movss  %xmm0,-0x10(%rbp)
movl   $0x0,-0x14(%rbp)
cmpl   $0x20,-0x14(%rbp)
jge    1166 <condition_reduction+0x66>
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm1
movss  -0xc(%rbp),%xmm0
ucomiss %xmm1,%xmm0
jbe    1153 <condition_reduction+0x53>
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
movss  %xmm0,-0x10(%rbp)
jmp    1158 <condition_reduction+0x58>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    111c <condition_reduction+0x1c>
movss  -0x10(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<condition_reduction>:
movss  (%rdi),%xmm1
movss  0x4(%rdi),%xmm2
movaps %xmm1,%xmm3
cmpltss %xmm0,%xmm3
andps  %xmm1,%xmm3
movaps %xmm2,%xmm1
cmpltss %xmm0,%xmm1
movaps %xmm1,%xmm4
andnps %xmm3,%xmm4
andps  %xmm2,%xmm1
orps   %xmm4,%xmm1
movss  0x8(%rdi),%xmm2
movaps %xmm2,%xmm3
cmpltss %xmm0,%xmm3
movaps %xmm3,%xmm4
andnps %xmm1,%xmm4
andps  %xmm2,%xmm3
orps   %xmm4,%xmm3
movss  0xc(%rdi),%xmm1
movaps %xmm1,%xmm2
cmpltss %xmm0,%xmm2
movaps %xmm2,%xmm4
andnps %xmm3,%xmm4
andps  %xmm1,%xmm2
orps   %xmm4,%xmm2
movss  0x10(%rdi),%xmm1
movaps %xmm1,%xmm3
cmpltss %xmm0,%xmm3
movaps %xmm3,%xmm4
andnps %xmm2,%xmm4
andps  %xmm1,%xmm3
orps   %xmm4,%xmm3
movss  0x14(%rdi),%xmm1
movaps %xmm1,%xmm2
cmpltss %xmm0,%xmm2
movaps %xmm2,%xmm4
andnps %xmm3,%xmm4
andps  %xmm1,%xmm2
orps   %xmm4,%xmm2
movss  0x18(%rdi),%xmm1
movaps %xmm1,%xmm3
cmpltss %xmm0,%xmm3
movaps %xmm3,%xmm4
andnps %xmm2,%xmm4
andps  %xmm1,%xmm3
orps   %xmm4,%xmm3
movss  0x1c(%rdi),%xmm1
movaps %xmm1,%xmm2
cmpltss %xmm0,%xmm2
movaps %xmm2,%xmm4
andnps %xmm3,%xmm4
andps  %xmm1,%xmm2
orps   %xmm4,%xmm2
movss  0x20(%rdi),%xmm1
movaps %xmm1,%xmm3
cmpltss %xmm0,%xmm3
movaps %xmm3,%xmm4
andnps %xmm2,%xmm4
andps  %xmm1,%xmm3
orps   %xmm4,%xmm3
movss  0x24(%rdi),%xmm1
movaps %xmm1,%xmm2
cmpltss %xmm0,%xmm2
movaps %xmm2,%xmm4
andnps %xmm3,%xmm4
andps  %xmm1,%xmm2
orps   %xmm4,%xmm2
movss  0x28(%rdi),%xmm1
movaps %xmm1,%xmm3
cmpltss %xmm0,%xmm3
movaps %xmm3,%xmm4
andnps %xmm2,%xmm4
andps  %xmm1,%xmm3
orps   %xmm4,%xmm3
movss  0x2c(%rdi),%xmm1
movaps %xmm1,%xmm2
cmpltss %xmm0,%xmm2
movaps %xmm2,%xmm4
andnps %xmm3,%xmm4
andps  %xmm1,%xmm2
orps   %xmm4,%xmm2
movss  0x30(%rdi),%xmm1
movaps %xmm1,%xmm3
cmpltss %xmm0,%xmm3
movaps %xmm3,%xmm4
andnps %xmm2,%xmm4
andps  %xmm1,%xmm3
orps   %xmm4,%xmm3
movss  0x34(%rdi),%xmm1
movaps %xmm1,%xmm2
cmpltss %xmm0,%xmm2
movaps %xmm2,%xmm4
andnps %xmm3,%xmm4
andps  %xmm1,%xmm2
orps   %xmm4,%xmm2
movss  0x38(%rdi),%xmm1
movaps %xmm1,%xmm3
cmpltss %xmm0,%xmm3
movaps %xmm3,%xmm4
andnps %xmm2,%xmm4
andps  %xmm1,%xmm3
orps   %xmm4,%xmm3
movss  0x3c(%rdi),%xmm1
movaps %xmm1,%xmm2
cmpltss %xmm0,%xmm2
movaps %xmm2,%xmm4
andnps %xmm3,%xmm4
andps  %xmm1,%xmm2
orps   %xmm4,%xmm2
movss  0x40(%rdi),%xmm1
movaps %xmm1,%xmm3
cmpltss %xmm0,%xmm3
movaps %xmm3,%xmm4
andnps %xmm2,%xmm4
andps  %xmm1,%xmm3
orps   %xmm4,%xmm3
movss  0x44(%rdi),%xmm1
movaps %xmm1,%xmm2
cmpltss %xmm0,%xmm2
movaps %xmm2,%xmm4
andnps %xmm3,%xmm4
andps  %xmm1,%xmm2
orps   %xmm4,%xmm2
movss  0x48(%rdi),%xmm1
movaps %xmm1,%xmm3
cmpltss %xmm0,%xmm3
movaps %xmm3,%xmm4
andnps %xmm2,%xmm4
andps  %xmm1,%xmm3
orps   %xmm4,%xmm3
movss  0x4c(%rdi),%xmm1
movaps %xmm1,%xmm2
cmpltss %xmm0,%xmm2
movaps %xmm2,%xmm4
andnps %xmm3,%xmm4
andps  %xmm1,%xmm2
orps   %xmm4,%xmm2
movss  0x50(%rdi),%xmm1
movaps %xmm1,%xmm3
cmpltss %xmm0,%xmm3
movaps %xmm3,%xmm4
andnps %xmm2,%xmm4
andps  %xmm1,%xmm3
orps   %xmm4,%xmm3
movss  0x54(%rdi),%xmm1
movaps %xmm1,%xmm2
cmpltss %xmm0,%xmm2
movaps %xmm2,%xmm4
andnps %xmm3,%xmm4
andps  %xmm1,%xmm2
orps   %xmm4,%xmm2
movss  0x58(%rdi),%xmm1
movaps %xmm1,%xmm3
cmpltss %xmm0,%xmm3
movaps %xmm3,%xmm4
andnps %xmm2,%xmm4
andps  %xmm1,%xmm3
orps   %xmm4,%xmm3
movss  0x5c(%rdi),%xmm1
movaps %xmm1,%xmm2
cmpltss %xmm0,%xmm2
movaps %xmm2,%xmm4
andnps %xmm3,%xmm4
andps  %xmm1,%xmm2
orps   %xmm4,%xmm2
movss  0x60(%rdi),%xmm1
movaps %xmm1,%xmm3
cmpltss %xmm0,%xmm3
movaps %xmm3,%xmm4
andnps %xmm2,%xmm4
andps  %xmm1,%xmm3
orps   %xmm4,%xmm3
movss  0x64(%rdi),%xmm1
movaps %xmm1,%xmm2
cmpltss %xmm0,%xmm2
movaps %xmm2,%xmm4
andnps %xmm3,%xmm4
andps  %xmm1,%xmm2
orps   %xmm4,%xmm2
movss  0x68(%rdi),%xmm1
movaps %xmm1,%xmm3
cmpltss %xmm0,%xmm3
movaps %xmm3,%xmm4
andnps %xmm2,%xmm4
andps  %xmm1,%xmm3
orps   %xmm4,%xmm3
movss  0x6c(%rdi),%xmm1
movaps %xmm1,%xmm2
cmpltss %xmm0,%xmm2
movaps %xmm2,%xmm4
andnps %xmm3,%xmm4
andps  %xmm1,%xmm2
orps   %xmm4,%xmm2
movss  0x70(%rdi),%xmm1
movaps %xmm1,%xmm3
cmpltss %xmm0,%xmm3
movaps %xmm3,%xmm4
andnps %xmm2,%xmm4
andps  %xmm1,%xmm3
orps   %xmm4,%xmm3
movss  0x74(%rdi),%xmm1
movaps %xmm1,%xmm2
cmpltss %xmm0,%xmm2
movaps %xmm2,%xmm4
andnps %xmm3,%xmm4
andps  %xmm1,%xmm2
orps   %xmm4,%xmm2
movss  0x78(%rdi),%xmm1
movaps %xmm1,%xmm3
cmpltss %xmm0,%xmm3
movaps %xmm3,%xmm4
andnps %xmm2,%xmm4
andps  %xmm1,%xmm3
orps   %xmm4,%xmm3
movss  0x7c(%rdi),%xmm2
movaps %xmm2,%xmm1
cmpltss %xmm0,%xmm1
movaps %xmm1,%xmm0
andnps %xmm3,%xmm0
andps  %xmm2,%xmm1
orps   %xmm0,%xmm1
movaps %xmm1,%xmm0
ret

LLVM IR (-O0):
define float @condition_reduction(float* %0, float %1) {
%3 = alloca float*
%4 = alloca float
%5 = alloca float
%6 = alloca i32
store float* %0, float** %3
store float %1, float* %4
store float 0.000000e+00, float* %5
store i32 0, i32* %6
br label %7
7: ; preds = %25, %2
%8 = load i32, i32* %6
%9 = icmp slt i32 %8, 32
br i1 %9, label %10, label %28
10: ; preds = %7
%11 = load float*, float** %3
%12 = load i32, i32* %6
%13 = sext i32 %12 to i64
%14 = getelementptr inbounds float, float* %11, i64 %13
%15 = load float, float* %14
%16 = load float, float* %4
%17 = fcmp olt float %15, %16
br i1 %17, label %18, label %24
18: ; preds = %10
%19 = load float*, float** %3
%20 = load i32, i32* %6
%21 = sext i32 %20 to i64
%22 = getelementptr inbounds float, float* %19, i64 %21
%23 = load float, float* %22
store float %23, float* %5
br label %24
24: ; preds = %18, %10
br label %25
25: ; preds = %24
%26 = load i32, i32* %6
%27 = add nsw i32 %26, 1
store i32 %27, i32* %6
br label %7
28: ; preds = %7
%29 = load float, float* %5
ret float %29
}

LLVM IR (-O2):
define float @condition_reduction(float* nocapture %0, float %1) {
%3 = load float, float* %0
%4 = fcmp olt float %3, %1
%5 = select i1 %4, float %3, float 0.000000e+00
%6 = getelementptr inbounds float, float* %0, i64 1
%7 = load float, float* %6
%8 = fcmp olt float %7, %1
%9 = select i1 %8, float %7, float %5
%10 = getelementptr inbounds float, float* %0, i64 2
%11 = load float, float* %10
%12 = fcmp olt float %11, %1
%13 = select i1 %12, float %11, float %9
%14 = getelementptr inbounds float, float* %0, i64 3
%15 = load float, float* %14
%16 = fcmp olt float %15, %1
%17 = select i1 %16, float %15, float %13
%18 = getelementptr inbounds float, float* %0, i64 4
%19 = load float, float* %18
%20 = fcmp olt float %19, %1
%21 = select i1 %20, float %19, float %17
%22 = getelementptr inbounds float, float* %0, i64 5
%23 = load float, float* %22
%24 = fcmp olt float %23, %1
%25 = select i1 %24, float %23, float %21
%26 = getelementptr inbounds float, float* %0, i64 6
%27 = load float, float* %26
%28 = fcmp olt float %27, %1
%29 = select i1 %28, float %27, float %25
%30 = getelementptr inbounds float, float* %0, i64 7
%31 = load float, float* %30
%32 = fcmp olt float %31, %1
%33 = select i1 %32, float %31, float %29
%34 = getelementptr inbounds float, float* %0, i64 8
%35 = load float, float* %34
%36 = fcmp olt float %35, %1
%37 = select i1 %36, float %35, float %33
%38 = getelementptr inbounds float, float* %0, i64 9
%39 = load float, float* %38
%40 = fcmp olt float %39, %1
%41 = select i1 %40, float %39, float %37
%42 = getelementptr inbounds float, float* %0, i64 10
%43 = load float, float* %42
%44 = fcmp olt float %43, %1
%45 = select i1 %44, float %43, float %41
%46 = getelementptr inbounds float, float* %0, i64 11
%47 = load float, float* %46
%48 = fcmp olt float %47, %1
%49 = select i1 %48, float %47, float %45
%50 = getelementptr inbounds float, float* %0, i64 12
%51 = load float, float* %50
%52 = fcmp olt float %51, %1
%53 = select i1 %52, float %51, float %49
%54 = getelementptr inbounds float, float* %0, i64 13
%55 = load float, float* %54
%56 = fcmp olt float %55, %1
%57 = select i1 %56, float %55, float %53
%58 = getelementptr inbounds float, float* %0, i64 14
%59 = load float, float* %58
%60 = fcmp olt float %59, %1
%61 = select i1 %60, float %59, float %57
%62 = getelementptr inbounds float, float* %0, i64 15
%63 = load float, float* %62
%64 = fcmp olt float %63, %1
%65 = select i1 %64, float %63, float %61
%66 = getelementptr inbounds float, float* %0, i64 16
%67 = load float, float* %66
%68 = fcmp olt float %67, %1
%69 = select i1 %68, float %67, float %65
%70 = getelementptr inbounds float, float* %0, i64 17
%71 = load float, float* %70
%72 = fcmp olt float %71, %1
%73 = select i1 %72, float %71, float %69
%74 = getelementptr inbounds float, float* %0, i64 18
%75 = load float, float* %74
%76 = fcmp olt float %75, %1
%77 = select i1 %76, float %75, float %73
%78 = getelementptr inbounds float, float* %0, i64 19
%79 = load float, float* %78
%80 = fcmp olt float %79, %1
%81 = select i1 %80, float %79, float %77
%82 = getelementptr inbounds float, float* %0, i64 20
%83 = load float, float* %82
%84 = fcmp olt float %83, %1
%85 = select i1 %84, float %83, float %81
%86 = getelementptr inbounds float, float* %0, i64 21
%87 = load float, float* %86
%88 = fcmp olt float %87, %1
%89 = select i1 %88, float %87, float %85
%90 = getelementptr inbounds float, float* %0, i64 22
%91 = load float, float* %90
%92 = fcmp olt float %91, %1
%93 = select i1 %92, float %91, float %89
%94 = getelementptr inbounds float, float* %0, i64 23
%95 = load float, float* %94
%96 = fcmp olt float %95, %1
%97 = select i1 %96, float %95, float %93
%98 = getelementptr inbounds float, float* %0, i64 24
%99 = load float, float* %98
%100 = fcmp olt float %99, %1
%101 = select i1 %100, float %99, float %97
%102 = getelementptr inbounds float, float* %0, i64 25
%103 = load float, float* %102
%104 = fcmp olt float %103, %1
%105 = select i1 %104, float %103, float %101
%106 = getelementptr inbounds float, float* %0, i64 26
%107 = load float, float* %106
%108 = fcmp olt float %107, %1
%109 = select i1 %108, float %107, float %105
%110 = getelementptr inbounds float, float* %0, i64 27
%111 = load float, float* %110
%112 = fcmp olt float %111, %1
%113 = select i1 %112, float %111, float %109
%114 = getelementptr inbounds float, float* %0, i64 28
%115 = load float, float* %114
%116 = fcmp olt float %115, %1
%117 = select i1 %116, float %115, float %113
%118 = getelementptr inbounds float, float* %0, i64 29
%119 = load float, float* %118
%120 = fcmp olt float %119, %1
%121 = select i1 %120, float %119, float %117
%122 = getelementptr inbounds float, float* %0, i64 30
%123 = load float, float* %122
%124 = fcmp olt float %123, %1
%125 = select i1 %124, float %123, float %121
%126 = getelementptr inbounds float, float* %0, i64 31
%127 = load float, float* %126
%128 = fcmp olt float %127, %1
%129 = select i1 %128, float %127, float %125
ret float %129
}