void tml_sr_vThresh1(float *vec, int n, float thresh, int relOP) {
  int i;
  if (relOP == 0) {
    for (i = 0; i < n; i++) {
      if (vec[i] < thresh)
        vec[i] = thresh;
    }
  } else if (relOP == 1) {
    for (i = 0; i < n; i++)
      if (vec[i] > thresh)
        vec[i] = thresh;
  }
}


x86 assembly (clang, -O0):
<tml_sr_vThresh1>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
movss  %xmm0,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
cmpl   $0x0,-0x14(%rbp)
jne    1175 <tml_sr_vThresh1+0x75>
movl   $0x0,-0x18(%rbp)
mov    -0x18(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    1170 <tml_sr_vThresh1+0x70>
mov    -0x8(%rbp),%rax
movslq -0x18(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm1
movss  -0x10(%rbp),%xmm0
ucomiss %xmm1,%xmm0
jbe    115d <tml_sr_vThresh1+0x5d>
movss  -0x10(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movslq -0x18(%rbp),%rcx
movss  %xmm0,(%rax,%rcx,4)
jmp    1162 <tml_sr_vThresh1+0x62>
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
jmp    1124 <tml_sr_vThresh1+0x24>
jmp    11d8 <tml_sr_vThresh1+0xd8>
cmpl   $0x1,-0x14(%rbp)
jne    11d3 <tml_sr_vThresh1+0xd3>
movl   $0x0,-0x18(%rbp)
mov    -0x18(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    11ce <tml_sr_vThresh1+0xce>
mov    -0x8(%rbp),%rax
movslq -0x18(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
ucomiss -0x10(%rbp),%xmm0
jbe    11bb <tml_sr_vThresh1+0xbb>
movss  -0x10(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movslq -0x18(%rbp),%rcx
movss  %xmm0,(%rax,%rcx,4)
jmp    11c0 <tml_sr_vThresh1+0xc0>
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
jmp    1186 <tml_sr_vThresh1+0x86>
jmp    11d3 <tml_sr_vThresh1+0xd3>
jmp    11d8 <tml_sr_vThresh1+0xd8>
pop    %rbp
ret

x86 assembly (clang, -O2):
<tml_sr_vThresh1>:
test   %edx,%edx
je     1123 <tml_sr_vThresh1+0x23>
cmp    $0x1,%edx
jne    12ef <tml_sr_vThresh1+0x1ef>
test   %esi,%esi
jle    12ef <tml_sr_vThresh1+0x1ef>
mov    %esi,%eax
cmp    $0x8,%esi
jae    113d <tml_sr_vThresh1+0x3d>
xor    %ecx,%ecx
jmp    12d9 <tml_sr_vThresh1+0x1d9>
test   %esi,%esi
jle    12ef <tml_sr_vThresh1+0x1ef>
mov    %esi,%eax
cmp    $0x8,%esi
jae    1202 <tml_sr_vThresh1+0x102>
xor    %ecx,%ecx
jmp    12f9 <tml_sr_vThresh1+0x1f9>
mov    %eax,%ecx
and    $0xfffffff8,%ecx
movaps %xmm0,%xmm1
shufps $0x0,%xmm0,%xmm1
lea    0x0(,%rax,4),%r8
and    $0xffffffffffffffe0,%r8
xor    %esi,%esi
jmp    116d <tml_sr_vThresh1+0x6d>
nopl   0x0(%rax)
add    $0x20,%rsi
cmp    %rsi,%r8
je     12bc <tml_sr_vThresh1+0x1bc>
movups (%rdi,%rsi,1),%xmm3
ucomiss %xmm1,%xmm3
jbe    117b <tml_sr_vThresh1+0x7b>
movss  %xmm0,(%rdi,%rsi,1)
movaps %xmm1,%xmm2
cmpltps %xmm3,%xmm2
pextrw $0x2,%xmm2,%edx
test   $0x1,%dl
je     1192 <tml_sr_vThresh1+0x92>
movss  %xmm0,0x4(%rdi,%rsi,1)
pextrw $0x4,%xmm2,%edx
test   $0x1,%dl
je     11a2 <tml_sr_vThresh1+0xa2>
movss  %xmm0,0x8(%rdi,%rsi,1)
pextrw $0x6,%xmm2,%edx
test   $0x1,%dl
je     11b2 <tml_sr_vThresh1+0xb2>
movss  %xmm0,0xc(%rdi,%rsi,1)
movups 0x10(%rdi,%rsi,1),%xmm3
ucomiss %xmm1,%xmm3
jbe    11c2 <tml_sr_vThresh1+0xc2>
movss  %xmm0,0x10(%rdi,%rsi,1)
movaps %xmm1,%xmm2
cmpltps %xmm3,%xmm2
pextrw $0x2,%xmm2,%edx
test   $0x1,%dl
je     11d9 <tml_sr_vThresh1+0xd9>
movss  %xmm0,0x14(%rdi,%rsi,1)
pextrw $0x4,%xmm2,%edx
test   $0x1,%dl
je     11e9 <tml_sr_vThresh1+0xe9>
movss  %xmm0,0x18(%rdi,%rsi,1)
pextrw $0x6,%xmm2,%edx
test   $0x1,%dl
je     1160 <tml_sr_vThresh1+0x60>
movss  %xmm0,0x1c(%rdi,%rsi,1)
jmp    1160 <tml_sr_vThresh1+0x60>
mov    %eax,%ecx
and    $0xfffffff8,%ecx
movaps %xmm0,%xmm1
shufps $0x0,%xmm0,%xmm1
lea    0x0(,%rax,4),%r8
and    $0xffffffffffffffe0,%r8
xor    %esi,%esi
jmp    122d <tml_sr_vThresh1+0x12d>
xchg   %ax,%ax
add    $0x20,%rsi
cmp    %rsi,%r8
je     12ea <tml_sr_vThresh1+0x1ea>
movups (%rdi,%rsi,1),%xmm2
ucomiss %xmm2,%xmm1
jbe    123b <tml_sr_vThresh1+0x13b>
movss  %xmm0,(%rdi,%rsi,1)
cmpltps %xmm1,%xmm2
pextrw $0x2,%xmm2,%edx
test   $0x1,%dl
je     124f <tml_sr_vThresh1+0x14f>
movss  %xmm0,0x4(%rdi,%rsi,1)
pextrw $0x4,%xmm2,%edx
test   $0x1,%dl
je     125f <tml_sr_vThresh1+0x15f>
movss  %xmm0,0x8(%rdi,%rsi,1)
pextrw $0x6,%xmm2,%edx
test   $0x1,%dl
je     126f <tml_sr_vThresh1+0x16f>
movss  %xmm0,0xc(%rdi,%rsi,1)
movups 0x10(%rdi,%rsi,1),%xmm2
ucomiss %xmm2,%xmm1
jbe    127f <tml_sr_vThresh1+0x17f>
movss  %xmm0,0x10(%rdi,%rsi,1)
cmpltps %xmm1,%xmm2
pextrw $0x2,%xmm2,%edx
test   $0x1,%dl
je     1293 <tml_sr_vThresh1+0x193>
movss  %xmm0,0x14(%rdi,%rsi,1)
pextrw $0x4,%xmm2,%edx
test   $0x1,%dl
je     12a3 <tml_sr_vThresh1+0x1a3>
movss  %xmm0,0x18(%rdi,%rsi,1)
pextrw $0x6,%xmm2,%edx
test   $0x1,%dl
je     1220 <tml_sr_vThresh1+0x120>
movss  %xmm0,0x1c(%rdi,%rsi,1)
jmp    1220 <tml_sr_vThresh1+0x120>
cmp    %rax,%rcx
jne    12d9 <tml_sr_vThresh1+0x1d9>
jmp    12ef <tml_sr_vThresh1+0x1ef>
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
add    $0x1,%rcx
cmp    %rcx,%rax
je     12ef <tml_sr_vThresh1+0x1ef>
movss  (%rdi,%rcx,4),%xmm1
ucomiss %xmm0,%xmm1
jbe    12d0 <tml_sr_vThresh1+0x1d0>
movss  %xmm0,(%rdi,%rcx,4)
jmp    12d0 <tml_sr_vThresh1+0x1d0>
cmp    %rax,%rcx
jne    12f9 <tml_sr_vThresh1+0x1f9>
ret
add    $0x1,%rcx
cmp    %rcx,%rax
je     12ef <tml_sr_vThresh1+0x1ef>
ucomiss (%rdi,%rcx,4),%xmm0
jbe    12f0 <tml_sr_vThresh1+0x1f0>
movss  %xmm0,(%rdi,%rcx,4)
jmp    12f0 <tml_sr_vThresh1+0x1f0>

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

LLVM IR (-O2):
define void @tml_sr_vThresh1(float* nocapture %0, i32 %1, float %2, i32 %3) {
switch i32 %3, label %155 [
i32 0, label %71
i32 1, label %5
]
5: ; preds = %4
%6 = icmp sgt i32 %1, 0
br i1 %6, label %7, label %155
7: ; preds = %5
%8 = zext i32 %1 to i64
%9 = icmp ult i32 %1, 8
br i1 %9, label %69, label %10
10: ; preds = %7
%11 = and i64 %8, 4294967288
%12 = insertelement <4 x float> poison, float %2, i64 0
%13 = shufflevector <4 x float> %12, <4 x float> poison, <4 x i32> zeroinitializer
%14 = insertelement <4 x float> poison, float %2, i64 0
%15 = shufflevector <4 x float> %14, <4 x float> poison, <4 x i32> zeroinitializer
br label %16
16: ; preds = %64, %10
%17 = phi i64 [ 0, %10 ], [ %65, %64 ]
%18 = or i64 %17, 4
%19 = getelementptr inbounds float, float* %0, i64 %17
%20 = bitcast float* %19 to <4 x float>*
%21 = load <4 x float>, <4 x float>* %20
%22 = getelementptr inbounds float, float* %19, i64 4
%23 = bitcast float* %22 to <4 x float>*
%24 = load <4 x float>, <4 x float>* %23
%25 = fcmp ogt <4 x float> %21, %13
%26 = fcmp ogt <4 x float> %24, %15
%27 = extractelement <4 x i1> %25, i64 0
br i1 %27, label %28, label %30
28: ; preds = %16
%29 = getelementptr inbounds float, float* %0, i64 %17
store float %2, float* %29
br label %30
30: ; preds = %28, %16
%31 = extractelement <4 x i1> %25, i64 1
br i1 %31, label %32, label %35
32: ; preds = %30
%33 = or i64 %17, 1
%34 = getelementptr inbounds float, float* %0, i64 %33
store float %2, float* %34
br label %35
35: ; preds = %32, %30
%36 = extractelement <4 x i1> %25, i64 2
br i1 %36, label %37, label %40
37: ; preds = %35
%38 = or i64 %17, 2
%39 = getelementptr inbounds float, float* %0, i64 %38
store float %2, float* %39
br label %40
40: ; preds = %37, %35
%41 = extractelement <4 x i1> %25, i64 3
br i1 %41, label %42, label %45
42: ; preds = %40
%43 = or i64 %17, 3
%44 = getelementptr inbounds float, float* %0, i64 %43
store float %2, float* %44
br label %45
45: ; preds = %42, %40
%46 = extractelement <4 x i1> %26, i64 0
br i1 %46, label %47, label %49
47: ; preds = %45
%48 = getelementptr inbounds float, float* %0, i64 %18
store float %2, float* %48
br label %49
49: ; preds = %47, %45
%50 = extractelement <4 x i1> %26, i64 1
br i1 %50, label %51, label %54
51: ; preds = %49
%52 = or i64 %17, 5
%53 = getelementptr inbounds float, float* %0, i64 %52
store float %2, float* %53
br label %54
54: ; preds = %51, %49
%55 = extractelement <4 x i1> %26, i64 2
br i1 %55, label %56, label %59
56: ; preds = %54
%57 = or i64 %17, 6
%58 = getelementptr inbounds float, float* %0, i64 %57
store float %2, float* %58
br label %59
59: ; preds = %56, %54
%60 = extractelement <4 x i1> %26, i64 3
br i1 %60, label %61, label %64
61: ; preds = %59
%62 = or i64 %17, 7
%63 = getelementptr inbounds float, float* %0, i64 %62
store float %2, float* %63
br label %64
64: ; preds = %61, %59
%65 = add nuw i64 %17, 8
%66 = icmp eq i64 %65, %11
br i1 %66, label %67, label %16
67: ; preds = %64
%68 = icmp eq i64 %11, %8
br i1 %68, label %155, label %69
69: ; preds = %7, %67
%70 = phi i64 [ 0, %7 ], [ %11, %67 ]
br label %146
71: ; preds = %4
%72 = icmp sgt i32 %1, 0
br i1 %72, label %73, label %155
73: ; preds = %71
%74 = zext i32 %1 to i64
%75 = icmp ult i32 %1, 8
br i1 %75, label %135, label %76
76: ; preds = %73
%77 = and i64 %74, 4294967288
%78 = insertelement <4 x float> poison, float %2, i64 0
%79 = shufflevector <4 x float> %78, <4 x float> poison, <4 x i32> zeroinitializer
%80 = insertelement <4 x float> poison, float %2, i64 0
%81 = shufflevector <4 x float> %80, <4 x float> poison, <4 x i32> zeroinitializer
br label %82
82: ; preds = %130, %76
%83 = phi i64 [ 0, %76 ], [ %131, %130 ]
%84 = or i64 %83, 4
%85 = getelementptr inbounds float, float* %0, i64 %83
%86 = bitcast float* %85 to <4 x float>*
%87 = load <4 x float>, <4 x float>* %86
%88 = getelementptr inbounds float, float* %85, i64 4
%89 = bitcast float* %88 to <4 x float>*
%90 = load <4 x float>, <4 x float>* %89
%91 = fcmp olt <4 x float> %87, %79
%92 = fcmp olt <4 x float> %90, %81
%93 = extractelement <4 x i1> %91, i64 0
br i1 %93, label %94, label %96
94: ; preds = %82
%95 = getelementptr inbounds float, float* %0, i64 %83
store float %2, float* %95
br label %96
96: ; preds = %94, %82
%97 = extractelement <4 x i1> %91, i64 1
br i1 %97, label %98, label %101
98: ; preds = %96
%99 = or i64 %83, 1
%100 = getelementptr inbounds float, float* %0, i64 %99
store float %2, float* %100
br label %101
101: ; preds = %98, %96
%102 = extractelement <4 x i1> %91, i64 2
br i1 %102, label %103, label %106
103: ; preds = %101
%104 = or i64 %83, 2
%105 = getelementptr inbounds float, float* %0, i64 %104
store float %2, float* %105
br label %106
106: ; preds = %103, %101
%107 = extractelement <4 x i1> %91, i64 3
br i1 %107, label %108, label %111
108: ; preds = %106
%109 = or i64 %83, 3
%110 = getelementptr inbounds float, float* %0, i64 %109
store float %2, float* %110
br label %111
111: ; preds = %108, %106
%112 = extractelement <4 x i1> %92, i64 0
br i1 %112, label %113, label %115
113: ; preds = %111
%114 = getelementptr inbounds float, float* %0, i64 %84
store float %2, float* %114
br label %115
115: ; preds = %113, %111
%116 = extractelement <4 x i1> %92, i64 1
br i1 %116, label %117, label %120
117: ; preds = %115
%118 = or i64 %83, 5
%119 = getelementptr inbounds float, float* %0, i64 %118
store float %2, float* %119
br label %120
120: ; preds = %117, %115
%121 = extractelement <4 x i1> %92, i64 2
br i1 %121, label %122, label %125
122: ; preds = %120
%123 = or i64 %83, 6
%124 = getelementptr inbounds float, float* %0, i64 %123
store float %2, float* %124
br label %125
125: ; preds = %122, %120
%126 = extractelement <4 x i1> %92, i64 3
br i1 %126, label %127, label %130
127: ; preds = %125
%128 = or i64 %83, 7
%129 = getelementptr inbounds float, float* %0, i64 %128
store float %2, float* %129
br label %130
130: ; preds = %127, %125
%131 = add nuw i64 %83, 8
%132 = icmp eq i64 %131, %77
br i1 %132, label %133, label %82
133: ; preds = %130
%134 = icmp eq i64 %77, %74
br i1 %134, label %155, label %135
135: ; preds = %73, %133
%136 = phi i64 [ 0, %73 ], [ %77, %133 ]
br label %137
137: ; preds = %135, %143
%138 = phi i64 [ %144, %143 ], [ %136, %135 ]
%139 = getelementptr inbounds float, float* %0, i64 %138
%140 = load float, float* %139
%141 = fcmp olt float %140, %2
br i1 %141, label %142, label %143
142: ; preds = %137
store float %2, float* %139
br label %143
143: ; preds = %137, %142
%144 = add nuw nsw i64 %138, 1
%145 = icmp eq i64 %144, %74
br i1 %145, label %155, label %137
146: ; preds = %69, %152
%147 = phi i64 [ %153, %152 ], [ %70, %69 ]
%148 = getelementptr inbounds float, float* %0, i64 %147
%149 = load float, float* %148
%150 = fcmp ogt float %149, %2
br i1 %150, label %151, label %152
151: ; preds = %146
store float %2, float* %148
br label %152
152: ; preds = %146, %151
%153 = add nuw nsw i64 %147, 1
%154 = icmp eq i64 %153, %8
br i1 %154, label %155, label %146
155: ; preds = %152, %143, %67, %133, %5, %71, %4
ret void
}