; LLVM IR from reworks-org/galaxy :: deps/sfml_deps/vorbis-src/vq/bookutil.ll (best)

; Unoptimized IR (clang -disable-llvm-passes):
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

%struct.codebook = type { i64, i64, i64, ptr, ptr, ptr, ptr, ptr, ptr, i32, i32, i32, i32, i32 }
%struct.static_codebook = type { i64, i64, ptr, i32, i64, i64, i32, i32, ptr, i32 }

; Function Attrs: nounwind uwtable
define dso_local i32 @_best(ptr noundef %0, ptr noundef %1, i32 noundef %2) #0 {
  %4 = alloca ptr, align 8
  %5 = alloca ptr, align 8
  %6 = alloca i32, align 4
  %7 = alloca i32, align 4
  %8 = alloca i32, align 4
  %9 = alloca i32, align 4
  %10 = alloca i32, align 4
  %11 = alloca i32, align 4
  %12 = alloca i32, align 4
  %13 = alloca i32, align 4
  %14 = alloca i32, align 4
  %15 = alloca i32, align 4
  %16 = alloca i32, align 4
  %17 = alloca i32, align 4
  %18 = alloca i32, align 4
  %19 = alloca i32, align 4
  %20 = alloca ptr, align 8
  %21 = alloca i32, align 4
  %22 = alloca [8 x i32], align 16
  %23 = alloca i32, align 4
  %24 = alloca float, align 4
  %25 = alloca float, align 4
  store ptr %0, ptr %4, align 8, !tbaa !5
  store ptr %1, ptr %5, align 8, !tbaa !5
  store i32 %2, ptr %6, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %7) #4
  %26 = load ptr, ptr %4, align 8, !tbaa !5
  %27 = getelementptr inbounds %struct.codebook, ptr %26, i32 0, i32 0
  %28 = load i64, ptr %27, align 8, !tbaa !11
  %29 = trunc i64 %28 to i32
  store i32 %29, ptr %7, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %8) #4
  call void @llvm.lifetime.start.p0(i64 4, ptr %9) #4
  call void @llvm.lifetime.start.p0(i64 4, ptr %10) #4
  call void @llvm.lifetime.start.p0(i64 4, ptr %11) #4
  %30 = load ptr, ptr %4, align 8, !tbaa !5
  %31 = getelementptr inbounds %struct.codebook, ptr %30, i32 0, i32 12
  %32 = load i32, ptr %31, align 4, !tbaa !14
  store i32 %32, ptr %11, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %12) #4
  %33 = load ptr, ptr %4, align 8, !tbaa !5
  %34 = getelementptr inbounds %struct.codebook, ptr %33, i32 0, i32 13
  %35 = load i32, ptr %34, align 8, !tbaa !15
  store i32 %35, ptr %12, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %13) #4
  %36 = load ptr, ptr %4, align 8, !tbaa !5
  %37 = getelementptr inbounds %struct.codebook, ptr %36, i32 0, i32 11
  %38 = load i32, ptr %37, align 8, !tbaa !16
  store i32 %38, ptr %13, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %14) #4
  %39 = load i32, ptr %13, align 4, !tbaa !9
  %40 = ashr i32 %39, 1
  store i32 %40, ptr %14, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %15) #4
  store i32 0, ptr %15, align 4, !tbaa !9
  %41 = load i32, ptr %12, align 4, !tbaa !9
  %42 = icmp ne i32 %41, 1
  br i1 %42, label %43, label %111

43:                                               ; preds = %3
  store i32 0, ptr %8, align 4, !tbaa !9
  %44 = load i32, ptr %6, align 4, !tbaa !9
  %45 = load i32, ptr %7, align 4, !tbaa !9
  %46 = sub nsw i32 %45, 1
  %47 = mul nsw i32 %44, %46
  store i32 %47, ptr %10, align 4, !tbaa !9
  br label %48

48:                                               ; preds = %104, %43
  %49 = load i32, ptr %8, align 4, !tbaa !9
  %50 = load i32, ptr %7, align 4, !tbaa !9
  %51 = icmp slt i32 %49, %50
  br i1 %51, label %52, label %110

52:                                               ; preds = %48
  call void @llvm.lifetime.start.p0(i64 4, ptr %16) #4
  %53 = load ptr, ptr %5, align 8, !tbaa !5
  %54 = load i32, ptr %10, align 4, !tbaa !9
  %55 = sext i32 %54 to i64
  %56 = getelementptr inbounds float, ptr %53, i64 %55
  %57 = load float, ptr %56, align 4, !tbaa !17
  %58 = fpext float %57 to double
  %59 = call double @llvm.rint.f64(double %58)
  %60 = fptosi double %59 to i32
  %61 = load i32, ptr %11, align 4, !tbaa !9
  %62 = sub nsw i32 %60, %61
  %63 = load i32, ptr %12, align 4, !tbaa !9
  %64 = ashr i32 %63, 1
  %65 = add nsw i32 %62, %64
  %66 = load i32, ptr %12, align 4, !tbaa !9
  %67 = sdiv i32 %65, %66
  store i32 %67, ptr %16, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %17) #4
  %68 = load i32, ptr %16, align 4, !tbaa !9
  %69 = load i32, ptr %14, align 4, !tbaa !9
  %70 = icmp slt i32 %68, %69
  br i1 %70, label %71, label %77

71:                                               ; preds = %52
  %72 = load i32, ptr %14, align 4, !tbaa !9
  %73 = load i32, ptr %16, align 4, !tbaa !9
  %74 = sub nsw i32 %72, %73
  %75 = shl i32 %74, 1
  %76 = sub nsw i32 %75, 1
  br label %82

77:                                               ; preds = %52
  %78 = load i32, ptr %16, align 4, !tbaa !9
  %79 = load i32, ptr %14, align 4, !tbaa !9
  %80 = sub nsw i32 %78, %79
  %81 = shl i32 %80, 1
  br label %82

82:                                               ; preds = %77, %71
  %83 = phi i32 [ %76, %71 ], [ %81, %77 ]
  store i32 %83, ptr %17, align 4, !tbaa !9
  %84 = load i32, ptr %15, align 4, !tbaa !9
  %85 = load i32, ptr %13, align 4, !tbaa !9
  %86 = mul nsw i32 %84, %85
  %87 = load i32, ptr %17, align 4, !tbaa !9
  %88 = icmp slt i32 %87, 0
  br i1 %88, label %89, label %90

89:                                               ; preds = %82
  br label %101

90:                                               ; preds = %82
  %91 = load i32, ptr %17, align 4, !tbaa !9
  %92 = load i32, ptr %13, align 4, !tbaa !9
  %93 = icmp sge i32 %91, %92
  br i1 %93, label %94, label %97

94:                                               ; preds = %90
  %95 = load i32, ptr %13, align 4, !tbaa !9
  %96 = sub nsw i32 %95, 1
  br label %99

97:                                               ; preds = %90
  %98 = load i32, ptr %17, align 4, !tbaa !9
  br label %99

99:                                               ; preds = %97, %94
  %100 = phi i32 [ %96, %94 ], [ %98, %97 ]
  br label %101

101:                                              ; preds = %99, %89
  %102 = phi i32 [ 0, %89 ], [ %100, %99 ]
  %103 = add nsw i32 %86, %102
  store i32 %103, ptr %15, align 4, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 4, ptr %17) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %16) #4
  br label %104

104:                                              ; preds = %101
  %105 = load i32, ptr %8, align 4, !tbaa !9
  %106 = add nsw i32 %105, 1
  store i32 %106, ptr %8, align 4, !tbaa !9
  %107 = load i32, ptr %6, align 4, !tbaa !9
  %108 = load i32, ptr %10, align 4, !tbaa !9
  %109 = sub nsw i32 %108, %107
  store i32 %109, ptr %10, align 4, !tbaa !9
  br label %48, !llvm.loop !19

110:                                              ; preds = %48
  br label %174

111:                                              ; preds = %3
  store i32 0, ptr %8, align 4, !tbaa !9
  %112 = load i32, ptr %6, align 4, !tbaa !9
  %113 = load i32, ptr %7, align 4, !tbaa !9
  %114 = sub nsw i32 %113, 1
  %115 = mul nsw i32 %112, %114
  store i32 %115, ptr %10, align 4, !tbaa !9
  br label %116

116:                                              ; preds = %167, %111
  %117 = load i32, ptr %8, align 4, !tbaa !9
  %118 = load i32, ptr %7, align 4, !tbaa !9
  %119 = icmp slt i32 %117, %118
  br i1 %119, label %120, label %173

120:                                              ; preds = %116
  call void @llvm.lifetime.start.p0(i64 4, ptr %18) #4
  %121 = load ptr, ptr %5, align 8, !tbaa !5
  %122 = load i32, ptr %10, align 4, !tbaa !9
  %123 = sext i32 %122 to i64
  %124 = getelementptr inbounds float, ptr %121, i64 %123
  %125 = load float, ptr %124, align 4, !tbaa !17
  %126 = fpext float %125 to double
  %127 = call double @llvm.rint.f64(double %126)
  %128 = fptosi double %127 to i32
  %129 = load i32, ptr %11, align 4, !tbaa !9
  %130 = sub nsw i32 %128, %129
  store i32 %130, ptr %18, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %19) #4
  %131 = load i32, ptr %18, align 4, !tbaa !9
  %132 = load i32, ptr %14, align 4, !tbaa !9
  %133 = icmp slt i32 %131, %132
  br i1 %133, label %134, label %140

134:                                              ; preds = %120
  %135 = load i32, ptr %14, align 4, !tbaa !9
  %136 = load i32, ptr %18, align 4, !tbaa !9
  %137 = sub nsw i32 %135, %136
  %138 = shl i32 %137, 1
  %139 = sub nsw i32 %138, 1
  br label %145

140:                                              ; preds = %120
  %141 = load i32, ptr %18, align 4, !tbaa !9
  %142 = load i32, ptr %14, align 4, !tbaa !9
  %143 = sub nsw i32 %141, %142
  %144 = shl i32 %143, 1
  br label %145

145:                                              ; preds = %140, %134
  %146 = phi i32 [ %139, %134 ], [ %144, %140 ]
  store i32 %146, ptr %19, align 4, !tbaa !9
  %147 = load i32, ptr %15, align 4, !tbaa !9
  %148 = load i32, ptr %13, align 4, !tbaa !9
  %149 = mul nsw i32 %147, %148
  %150 = load i32, ptr %19, align 4, !tbaa !9
  %151 = icmp slt i32 %150, 0
  br i1 %151, label %152, label %153

152:                                              ; preds = %145
  br label %164

153:                                              ; preds = %145
  %154 = load i32, ptr %19, align 4, !tbaa !9
  %155 = load i32, ptr %13, align 4, !tbaa !9
  %156 = icmp sge i32 %154, %155
  br i1 %156, label %157, label %160

157:                                              ; preds = %153
  %158 = load i32, ptr %13, align 4, !tbaa !9
  %159 = sub nsw i32 %158, 1
  br label %162

160:                                              ; preds = %153
  %161 = load i32, ptr %19, align 4, !tbaa !9
  br label %162

162:                                              ; preds = %160, %157
  %163 = phi i32 [ %159, %157 ], [ %161, %160 ]
  br label %164

164:                                              ; preds = %162, %152
  %165 = phi i32 [ 0, %152 ], [ %163, %162 ]
  %166 = add nsw i32 %149, %165
  store i32 %166, ptr %15, align 4, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 4, ptr %19) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %18) #4
  br label %167

167:                                              ; preds = %164
  %168 = load i32, ptr %8, align 4, !tbaa !9
  %169 = add nsw i32 %168, 1
  store i32 %169, ptr %8, align 4, !tbaa !9
  %170 = load i32, ptr %6, align 4, !tbaa !9
  %171 = load i32, ptr %10, align 4, !tbaa !9
  %172 = sub nsw i32 %171, %170
  store i32 %172, ptr %10, align 4, !tbaa !9
  br label %116, !llvm.loop !21

173:                                              ; preds = %116
  br label %174

174:                                              ; preds = %173, %110
  %175 = load ptr, ptr %4, align 8, !tbaa !5
  %176 = getelementptr inbounds %struct.codebook, ptr %175, i32 0, i32 3
  %177 = load ptr, ptr %176, align 8, !tbaa !22
  %178 = getelementptr inbounds %struct.static_codebook, ptr %177, i32 0, i32 2
  %179 = load ptr, ptr %178, align 8, !tbaa !23
  %180 = load i32, ptr %15, align 4, !tbaa !9
  %181 = sext i32 %180 to i64
  %182 = getelementptr inbounds i64, ptr %179, i64 %181
  %183 = load i64, ptr %182, align 8, !tbaa !25
  %184 = icmp sle i64 %183, 0
  br i1 %184, label %185, label %297

185:                                              ; preds = %174
  call void @llvm.lifetime.start.p0(i64 8, ptr %20) #4
  %186 = load ptr, ptr %4, align 8, !tbaa !5
  %187 = getelementptr inbounds %struct.codebook, ptr %186, i32 0, i32 3
  %188 = load ptr, ptr %187, align 8, !tbaa !22
  store ptr %188, ptr %20, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %21) #4
  store i32 -1, ptr %21, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 32, ptr %22) #4
  call void @llvm.memset.p0.i64(ptr align 16 %22, i8 0, i64 32, i1 false)
  call void @llvm.lifetime.start.p0(i64 4, ptr %23) #4
  %189 = load ptr, ptr %4, align 8, !tbaa !5
  %190 = getelementptr inbounds %struct.codebook, ptr %189, i32 0, i32 12
  %191 = load i32, ptr %190, align 4, !tbaa !14
  %192 = load ptr, ptr %4, align 8, !tbaa !5
  %193 = getelementptr inbounds %struct.codebook, ptr %192, i32 0, i32 13
  %194 = load i32, ptr %193, align 8, !tbaa !15
  %195 = load ptr, ptr %4, align 8, !tbaa !5
  %196 = getelementptr inbounds %struct.codebook, ptr %195, i32 0, i32 11
  %197 = load i32, ptr %196, align 8, !tbaa !16
  %198 = sub nsw i32 %197, 1
  %199 = mul nsw i32 %194, %198
  %200 = add nsw i32 %191, %199
  store i32 %200, ptr %23, align 4, !tbaa !9
  store i32 0, ptr %8, align 4, !tbaa !9
  br label %201

201:                                              ; preds = %293, %185
  %202 = load i32, ptr %8, align 4, !tbaa !9
  %203 = sext i32 %202 to i64
  %204 = load ptr, ptr %4, align 8, !tbaa !5
  %205 = getelementptr inbounds %struct.codebook, ptr %204, i32 0, i32 1
  %206 = load i64, ptr %205, align 8, !tbaa !26
  %207 = icmp slt i64 %203, %206
  br i1 %207, label %208, label %296

208:                                              ; preds = %201
  %209 = load ptr, ptr %20, align 8, !tbaa !5
  %210 = getelementptr inbounds %struct.static_codebook, ptr %209, i32 0, i32 2
  %211 = load ptr, ptr %210, align 8, !tbaa !23
  %212 = load i32, ptr %8, align 4, !tbaa !9
  %213 = sext i32 %212 to i64
  %214 = getelementptr inbounds i64, ptr %211, i64 %213
  %215 = load i64, ptr %214, align 8, !tbaa !25
  %216 = icmp sgt i64 %215, 0
  br i1 %216, label %217, label %256

217:                                              ; preds = %208
  call void @llvm.lifetime.start.p0(i64 4, ptr %24) #4
  store float 0.000000e+00, ptr %24, align 4, !tbaa !17
  store i32 0, ptr %9, align 4, !tbaa !9
  br label %218

218:                                              ; preds = %240, %217
  %219 = load i32, ptr %9, align 4, !tbaa !9
  %220 = load i32, ptr %7, align 4, !tbaa !9
  %221 = icmp slt i32 %219, %220
  br i1 %221, label %222, label %243

222:                                              ; preds = %218
  call void @llvm.lifetime.start.p0(i64 4, ptr %25) #4
  %223 = load i32, ptr %9, align 4, !tbaa !9
  %224 = sext i32 %223 to i64
  %225 = getelementptr inbounds [8 x i32], ptr %22, i64 0, i64 %224
  %226 = load i32, ptr %225, align 4, !tbaa !9
  %227 = sitofp i32 %226 to float
  %228 = load ptr, ptr %5, align 8, !tbaa !5
  %229 = load i32, ptr %9, align 4, !tbaa !9
  %230 = load i32, ptr %6, align 4, !tbaa !9
  %231 = mul nsw i32 %229, %230
  %232 = sext i32 %231 to i64
  %233 = getelementptr inbounds float, ptr %228, i64 %232
  %234 = load float, ptr %233, align 4, !tbaa !17
  %235 = fsub float %227, %234
  store float %235, ptr %25, align 4, !tbaa !17
  %236 = load float, ptr %25, align 4, !tbaa !17
  %237 = load float, ptr %25, align 4, !tbaa !17
  %238 = load float, ptr %24, align 4, !tbaa !17
  %239 = call float @llvm.fmuladd.f32(float %236, float %237, float %238)
  store float %239, ptr %24, align 4, !tbaa !17
  call void @llvm.lifetime.end.p0(i64 4, ptr %25) #4
  br label %240

240:                                              ; preds = %222
  %241 = load i32, ptr %9, align 4, !tbaa !9
  %242 = add nsw i32 %241, 1
  store i32 %242, ptr %9, align 4, !tbaa !9
  br label %218, !llvm.loop !27

243:                                              ; preds = %218
  %244 = load i32, ptr %21, align 4, !tbaa !9
  %245 = icmp eq i32 %244, -1
  br i1 %245, label %251, label %246

246:                                              ; preds = %243
  %247 = load float, ptr %24, align 4, !tbaa !17
  %248 = load i32, ptr %21, align 4, !tbaa !9
  %249 = sitofp i32 %248 to float
  %250 = fcmp olt float %247, %249
  br i1 %250, label %251, label %255

251:                                              ; preds = %246, %243
  %252 = load float, ptr %24, align 4, !tbaa !17
  %253 = fptosi float %252 to i32
  store i32 %253, ptr %21, align 4, !tbaa !9
  %254 = load i32, ptr %8, align 4, !tbaa !9
  store i32 %254, ptr %15, align 4, !tbaa !9
  br label %255

255:                                              ; preds = %251, %246
  call void @llvm.lifetime.end.p0(i64 4, ptr %24) #4
  br label %256

256:                                              ; preds = %255, %208
  store i32 0, ptr %9, align 4, !tbaa !9
  br label %257

257:                                              ; preds = %264, %256
  %258 = load i32, ptr %9, align 4, !tbaa !9
  %259 = sext i32 %258 to i64
  %260 = getelementptr inbounds [8 x i32], ptr %22, i64 0, i64 %259
  %261 = load i32, ptr %260, align 4, !tbaa !9
  %262 = load i32, ptr %23, align 4, !tbaa !9
  %263 = icmp sge i32 %261, %262
  br i1 %263, label %264, label %269

264:                                              ; preds = %257
  %265 = load i32, ptr %9, align 4, !tbaa !9
  %266 = add nsw i32 %265, 1
  store i32 %266, ptr %9, align 4, !tbaa !9
  %267 = sext i32 %265 to i64
  %268 = getelementptr inbounds [8 x i32], ptr %22, i64 0, i64 %267
  store i32 0, ptr %268, align 4, !tbaa !9
  br label %257, !llvm.loop !28

269:                                              ; preds = %257
  %270 = load i32, ptr %9, align 4, !tbaa !9
  %271 = sext i32 %270 to i64
  %272 = getelementptr inbounds [8 x i32], ptr %22, i64 0, i64 %271
  %273 = load i32, ptr %272, align 4, !tbaa !9
  %274 = icmp sge i32 %273, 0
  br i1 %274, label %275, label %284

275:                                              ; preds = %269
  %276 = load ptr, ptr %4, align 8, !tbaa !5
  %277 = getelementptr inbounds %struct.codebook, ptr %276, i32 0, i32 13
  %278 = load i32, ptr %277, align 8, !tbaa !15
  %279 = load i32, ptr %9, align 4, !tbaa !9
  %280 = sext i32 %279 to i64
  %281 = getelementptr inbounds [8 x i32], ptr %22, i64 0, i64 %280
  %282 = load i32, ptr %281, align 4, !tbaa !9
  %283 = add nsw i32 %282, %278
  store i32 %283, ptr %281, align 4, !tbaa !9
  br label %284

284:                                              ; preds = %275, %269
  %285 = load i32, ptr %9, align 4, !tbaa !9
  %286 = sext i32 %285 to i64
  %287 = getelementptr inbounds [8 x i32], ptr %22, i64 0, i64 %286
  %288 = load i32, ptr %287, align 4, !tbaa !9
  %289 = sub nsw i32 0, %288
  %290 = load i32, ptr %9, align 4, !tbaa !9
  %291 = sext i32 %290 to i64
  %292 = getelementptr inbounds [8 x i32], ptr %22, i64 0, i64 %291
  store i32 %289, ptr %292, align 4, !tbaa !9
  br label %293

293:                                              ; preds = %284
  %294 = load i32, ptr %8, align 4, !tbaa !9
  %295 = add nsw i32 %294, 1
  store i32 %295, ptr %8, align 4, !tbaa !9
  br label %201, !llvm.loop !29

296:                                              ; preds = %201
  call void @llvm.lifetime.end.p0(i64 4, ptr %23) #4
  call void @llvm.lifetime.end.p0(i64 32, ptr %22) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %21) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %20) #4
  br label %297

297:                                              ; preds = %296, %174
  %298 = load i32, ptr %15, align 4, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 4, ptr %15) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %14) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %13) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %12) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %11) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %10) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %9) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %8) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %7) #4
  ret i32 %298
}

; Function Attrs: nocallback nofree nosync nounwind willreturn memory(argmem: readwrite)
declare void @llvm.lifetime.start.p0(i64 immarg, ptr nocapture) #1

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare double @llvm.rint.f64(double) #2

; Function Attrs: nocallback nofree nosync nounwind willreturn memory(argmem: readwrite)
declare void @llvm.lifetime.end.p0(i64 immarg, ptr nocapture) #1

; Function Attrs: nocallback nofree nounwind willreturn memory(argmem: write)
declare void @llvm.memset.p0.i64(ptr nocapture writeonly, i8, i64, i1 immarg) #3

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare float @llvm.fmuladd.f32(float, float, float) #2

attributes #0 = { nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #1 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #2 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #3 = { nocallback nofree nounwind willreturn memory(argmem: write) }
attributes #4 = { nounwind }

!llvm.module.flags = !{!0, !1, !2, !3}
!llvm.ident = !{!4}

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"any pointer", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!10, !10, i64 0}
!10 = !{!"int", !7, i64 0}
!11 = !{!12, !13, i64 0}
!12 = !{!"codebook", !13, i64 0, !13, i64 8, !13, i64 16, !6, i64 24, !6, i64 32, !6, i64 40, !6, i64 48, !6, i64 56, !6, i64 64, !10, i64 72, !10, i64 76, !10, i64 80, !10, i64 84, !10, i64 88}
!13 = !{!"long", !7, i64 0}
!14 = !{!12, !10, i64 84}
!15 = !{!12, !10, i64 88}
!16 = !{!12, !10, i64 80}
!17 = !{!18, !18, i64 0}
!18 = !{!"float", !7, i64 0}
!19 = distinct !{!19, !20}
!20 = !{!"llvm.loop.mustprogress"}
!21 = distinct !{!21, !20}
!22 = !{!12, !6, i64 24}
!23 = !{!24, !6, i64 16}
!24 = !{!"static_codebook", !13, i64 0, !13, i64 8, !6, i64 16, !10, i64 24, !13, i64 32, !13, i64 40, !10, i64 48, !10, i64 52, !6, i64 56, !10, i64 64}
!25 = !{!13, !13, i64 0}
!26 = !{!12, !13, i64 8}
!27 = distinct !{!27, !20}
!28 = distinct !{!28, !20}
!29 = distinct !{!29, !20}


; Optimized IR (opt -passes='default<O3>'):
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

; Function Attrs: nofree norecurse nosync nounwind memory(read, inaccessiblemem: none) uwtable
define dso_local i32 @_best(ptr nocapture noundef readonly %0, ptr nocapture noundef readonly %1, i32 noundef %2) local_unnamed_addr #0 {
  %4 = alloca [8 x i32], align 16
  %5 = load i64, ptr %0, align 8, !tbaa !5
  %.fr = freeze i64 %5
  %6 = trunc i64 %.fr to i32
  %7 = getelementptr inbounds i8, ptr %0, i64 84
  %8 = load i32, ptr %7, align 4, !tbaa !12
  %9 = getelementptr inbounds i8, ptr %0, i64 88
  %10 = load i32, ptr %9, align 8, !tbaa !13
  %11 = getelementptr inbounds i8, ptr %0, i64 80
  %12 = load i32, ptr %11, align 8, !tbaa !14
  %13 = ashr i32 %12, 1
  %.not = icmp eq i32 %10, 1
  %14 = icmp sgt i32 %6, 0
  br i1 %.not, label %46, label %15

15:                                               ; preds = %3
  br i1 %14, label %.lr.ph, label %.loopexit

.lr.ph:                                           ; preds = %15
  %16 = add nsw i32 %6, -1
  %17 = mul nsw i32 %16, %2
  %18 = ashr i32 %10, 1
  %19 = sub i32 %18, %8
  %20 = add nsw i32 %12, -1
  br label %21

21:                                               ; preds = %.lr.ph, %37
  %.0120 = phi i32 [ 0, %.lr.ph ], [ %44, %37 ]
  %.094119 = phi i32 [ %17, %.lr.ph ], [ %45, %37 ]
  %.096118 = phi i32 [ 0, %.lr.ph ], [ %43, %37 ]
  %22 = sext i32 %.094119 to i64
  %23 = getelementptr inbounds float, ptr %1, i64 %22
  %24 = load float, ptr %23, align 4, !tbaa !15
  %25 = tail call float @llvm.rint.f32(float %24)
  %26 = fptosi float %25 to i32
  %27 = add i32 %19, %26
  %28 = sdiv i32 %27, %10
  %29 = icmp slt i32 %28, %13
  br i1 %29, label %30, label %34

30:                                               ; preds = %21
  %31 = sub nsw i32 %13, %28
  %32 = shl i32 %31, 1
  %33 = add nsw i32 %32, -1
  br label %37

34:                                               ; preds = %21
  %35 = sub nsw i32 %28, %13
  %36 = shl i32 %35, 1
  br label %37

37:                                               ; preds = %34, %30
  %38 = phi i32 [ %33, %30 ], [ %36, %34 ]
  %39 = mul nsw i32 %.096118, %12
  %40 = icmp slt i32 %38, 0
  %.not114 = icmp slt i32 %38, %12
  %41 = select i1 %.not114, i32 %38, i32 %20
  %42 = select i1 %40, i32 0, i32 %41
  %43 = add nsw i32 %42, %39
  %44 = add nuw nsw i32 %.0120, 1
  %45 = sub nsw i32 %.094119, %2
  %exitcond.not = icmp eq i32 %44, %6
  br i1 %exitcond.not, label %.loopexit, label %21, !llvm.loop !17

46:                                               ; preds = %3
  br i1 %14, label %.lr.ph124, label %.loopexit

.lr.ph124:                                        ; preds = %46
  %47 = add nsw i32 %6, -1
  %48 = mul nsw i32 %47, %2
  %49 = add nsw i32 %12, -1
  br label %50

50:                                               ; preds = %.lr.ph124, %65
  %.1123 = phi i32 [ 0, %.lr.ph124 ], [ %72, %65 ]
  %.195122 = phi i32 [ %48, %.lr.ph124 ], [ %73, %65 ]
  %.197121 = phi i32 [ 0, %.lr.ph124 ], [ %71, %65 ]
  %51 = sext i32 %.195122 to i64
  %52 = getelementptr inbounds float, ptr %1, i64 %51
  %53 = load float, ptr %52, align 4, !tbaa !15
  %54 = tail call float @llvm.rint.f32(float %53)
  %55 = fptosi float %54 to i32
  %56 = sub nsw i32 %55, %8
  %57 = icmp slt i32 %56, %13
  br i1 %57, label %58, label %62

58:                                               ; preds = %50
  %59 = sub nsw i32 %13, %56
  %60 = shl i32 %59, 1
  %61 = add nsw i32 %60, -1
  br label %65

62:                                               ; preds = %50
  %63 = sub nsw i32 %56, %13
  %64 = shl i32 %63, 1
  br label %65

65:                                               ; preds = %62, %58
  %66 = phi i32 [ %61, %58 ], [ %64, %62 ]
  %67 = mul nsw i32 %.197121, %12
  %68 = icmp slt i32 %66, 0
  %.not112 = icmp slt i32 %66, %12
  %69 = select i1 %.not112, i32 %66, i32 %49
  %70 = select i1 %68, i32 0, i32 %69
  %71 = add nsw i32 %70, %67
  %72 = add nuw nsw i32 %.1123, 1
  %73 = sub nsw i32 %.195122, %2
  %exitcond154.not = icmp eq i32 %72, %6
  br i1 %exitcond154.not, label %.loopexit, label %50, !llvm.loop !19

.loopexit:                                        ; preds = %37, %65, %15, %46
  %.298 = phi i32 [ 0, %46 ], [ 0, %15 ], [ %71, %65 ], [ %43, %37 ]
  %74 = getelementptr inbounds i8, ptr %0, i64 24
  %75 = load ptr, ptr %74, align 8, !tbaa !20
  %76 = getelementptr inbounds i8, ptr %75, i64 16
  %77 = load ptr, ptr %76, align 8, !tbaa !21
  %78 = sext i32 %.298 to i64
  %79 = getelementptr inbounds i64, ptr %77, i64 %78
  %80 = load i64, ptr %79, align 8, !tbaa !23
  %81 = icmp slt i64 %80, 1
  br i1 %81, label %82, label %146

82:                                               ; preds = %.loopexit
  call void @llvm.lifetime.start.p0(i64 32, ptr nonnull %4) #5
  call void @llvm.memset.p0.i64(ptr noundef nonnull align 16 dereferenceable(32) %4, i8 0, i64 32, i1 false)
  %83 = add nsw i32 %12, -1
  %84 = mul nsw i32 %83, %10
  %85 = add nsw i32 %84, %8
  %86 = getelementptr inbounds i8, ptr %0, i64 8
  %87 = load i64, ptr %86, align 8, !tbaa !24
  %88 = icmp sgt i64 %87, 0
  br i1 %88, label %.lr.ph141, label %._crit_edge142

.lr.ph141:                                        ; preds = %82
  %89 = icmp sgt i32 %6, 0
  br i1 %89, label %.lr.ph141.split.us.preheader, label %.lr.ph141.split

.lr.ph141.split.us.preheader:                     ; preds = %.lr.ph141
  %90 = sext i32 %2 to i64
  %wide.trip.count = and i64 %.fr, 2147483647
  %xtraiter = and i64 %.fr, 1
  %91 = icmp eq i64 %wide.trip.count, 1
  %unroll_iter = sub nsw i64 %wide.trip.count, %xtraiter
  %lcmp.mod.not = icmp eq i64 %xtraiter, 0
  br label %.lr.ph141.split.us

.lr.ph141.split.us:                               ; preds = %.lr.ph141.split.us.preheader, %._crit_edge134.us
  %indvars.iv167 = phi i64 [ 0, %.lr.ph141.split.us.preheader ], [ %indvars.iv.next168, %._crit_edge134.us ]
  %.091138.us = phi i32 [ -1, %.lr.ph141.split.us.preheader ], [ %.293.us, %._crit_edge134.us ]
  %.3137.us = phi i32 [ %.298, %.lr.ph141.split.us.preheader ], [ %.5.us, %._crit_edge134.us ]
  %92 = getelementptr inbounds i64, ptr %77, i64 %indvars.iv167
  %93 = load i64, ptr %92, align 8, !tbaa !23
  %94 = icmp sgt i64 %93, 0
  br i1 %94, label %.preheader.us.preheader, label %95

.preheader.us.preheader:                          ; preds = %.lr.ph141.split.us
  br i1 %91, label %._crit_edge.us.unr-lcssa, label %.preheader.us

95:                                               ; preds = %._crit_edge.us, %.lr.ph141.split.us
  %.5.us = phi i32 [ %.4.us, %._crit_edge.us ], [ %.3137.us, %.lr.ph141.split.us ]
  %.293.us = phi i32 [ %.192.us, %._crit_edge.us ], [ %.091138.us, %.lr.ph141.split.us ]
  %96 = load i32, ptr %4, align 16, !tbaa !25
  %.not113130.us = icmp slt i32 %96, %85
  br i1 %.not113130.us, label %._crit_edge134.us, label %.lr.ph133.us

.lr.ph133.us:                                     ; preds = %95, %.lr.ph133.us
  %indvars.iv164 = phi i64 [ %indvars.iv.next165, %.lr.ph133.us ], [ 0, %95 ]
  %97 = phi ptr [ %98, %.lr.ph133.us ], [ %4, %95 ]
  %indvars.iv.next165 = add nuw nsw i64 %indvars.iv164, 1
  store i32 0, ptr %97, align 4, !tbaa !25
  %98 = getelementptr inbounds [8 x i32], ptr %4, i64 0, i64 %indvars.iv.next165
  %99 = load i32, ptr %98, align 4, !tbaa !25
  %.not113.us = icmp slt i32 %99, %85
  br i1 %.not113.us, label %._crit_edge134.us, label %.lr.ph133.us, !llvm.loop !26

._crit_edge134.us:                                ; preds = %.lr.ph133.us, %95
  %.lcssa117.us = phi ptr [ %4, %95 ], [ %98, %.lr.ph133.us ]
  %.lcssa.us = phi i32 [ %96, %95 ], [ %99, %.lr.ph133.us ]
  %100 = icmp slt i32 %.lcssa.us, 0
  %101 = select i1 %100, i32 0, i32 %10
  %spec.select = add nsw i32 %.lcssa.us, %101
  %102 = sub nsw i32 0, %spec.select
  store i32 %102, ptr %.lcssa117.us, align 4, !tbaa !25
  %indvars.iv.next168 = add nuw nsw i64 %indvars.iv167, 1
  %exitcond170.not = icmp eq i64 %indvars.iv.next168, %87
  br i1 %exitcond170.not, label %._crit_edge142, label %.lr.ph141.split.us, !llvm.loop !27

.preheader.us:                                    ; preds = %.preheader.us.preheader, %.preheader.us
  %indvars.iv160 = phi i64 [ %indvars.iv.next161.1, %.preheader.us ], [ 0, %.preheader.us.preheader ]
  %.088127.us = phi float [ %118, %.preheader.us ], [ 0.000000e+00, %.preheader.us.preheader ]
  %niter = phi i64 [ %niter.next.1, %.preheader.us ], [ 0, %.preheader.us.preheader ]
  %103 = getelementptr inbounds [8 x i32], ptr %4, i64 0, i64 %indvars.iv160
  %104 = load i32, ptr %103, align 8, !tbaa !25
  %105 = sitofp i32 %104 to float
  %106 = mul nsw i64 %indvars.iv160, %90
  %107 = getelementptr inbounds float, ptr %1, i64 %106
  %108 = load float, ptr %107, align 4, !tbaa !15
  %109 = fsub float %105, %108
  %110 = tail call float @llvm.fmuladd.f32(float %109, float %109, float %.088127.us)
  %indvars.iv.next161 = or disjoint i64 %indvars.iv160, 1
  %111 = getelementptr inbounds [8 x i32], ptr %4, i64 0, i64 %indvars.iv.next161
  %112 = load i32, ptr %111, align 4, !tbaa !25
  %113 = sitofp i32 %112 to float
  %114 = mul nsw i64 %indvars.iv.next161, %90
  %115 = getelementptr inbounds float, ptr %1, i64 %114
  %116 = load float, ptr %115, align 4, !tbaa !15
  %117 = fsub float %113, %116
  %118 = tail call float @llvm.fmuladd.f32(float %117, float %117, float %110)
  %indvars.iv.next161.1 = add nuw nsw i64 %indvars.iv160, 2
  %niter.next.1 = add i64 %niter, 2
  %niter.ncmp.1 = icmp eq i64 %niter.next.1, %unroll_iter
  br i1 %niter.ncmp.1, label %._crit_edge.us.unr-lcssa, label %.preheader.us, !llvm.loop !28

._crit_edge.us.unr-lcssa:                         ; preds = %.preheader.us, %.preheader.us.preheader
  %.lcssa190.ph = phi float [ poison, %.preheader.us.preheader ], [ %118, %.preheader.us ]
  %indvars.iv160.unr = phi i64 [ 0, %.preheader.us.preheader ], [ %indvars.iv.next161.1, %.preheader.us ]
  %.088127.us.unr = phi float [ 0.000000e+00, %.preheader.us.preheader ], [ %118, %.preheader.us ]
  br i1 %lcmp.mod.not, label %._crit_edge.us, label %.preheader.us.epil

.preheader.us.epil:                               ; preds = %._crit_edge.us.unr-lcssa
  %119 = getelementptr inbounds [8 x i32], ptr %4, i64 0, i64 %indvars.iv160.unr
  %120 = load i32, ptr %119, align 4, !tbaa !25
  %121 = sitofp i32 %120 to float
  %122 = mul nsw i64 %indvars.iv160.unr, %90
  %123 = getelementptr inbounds float, ptr %1, i64 %122
  %124 = load float, ptr %123, align 4, !tbaa !15
  %125 = fsub float %121, %124
  %126 = tail call float @llvm.fmuladd.f32(float %125, float %125, float %.088127.us.unr)
  br label %._crit_edge.us

._crit_edge.us:                                   ; preds = %._crit_edge.us.unr-lcssa, %.preheader.us.epil
  %.lcssa190 = phi float [ %.lcssa190.ph, %._crit_edge.us.unr-lcssa ], [ %126, %.preheader.us.epil ]
  %127 = icmp eq i32 %.091138.us, -1
  %128 = sitofp i32 %.091138.us to float
  %129 = fcmp olt float %.lcssa190, %128
  %or.cond.us = select i1 %127, i1 true, i1 %129
  %130 = fptosi float %.lcssa190 to i32
  %131 = trunc nuw nsw i64 %indvars.iv167 to i32
  %.4.us = select i1 %or.cond.us, i32 %131, i32 %.3137.us
  %.192.us = select i1 %or.cond.us, i32 %130, i32 %.091138.us
  br label %95

.lr.ph141.split:                                  ; preds = %.lr.ph141, %._crit_edge134
  %indvars.iv156 = phi i64 [ %indvars.iv.next157, %._crit_edge134 ], [ 0, %.lr.ph141 ]
  %.091138 = phi i32 [ %.293, %._crit_edge134 ], [ -1, %.lr.ph141 ]
  %.3137 = phi i32 [ %.5, %._crit_edge134 ], [ %.298, %.lr.ph141 ]
  %132 = getelementptr inbounds i64, ptr %77, i64 %indvars.iv156
  %133 = load i64, ptr %132, align 8, !tbaa !23
  %134 = icmp sgt i64 %133, 0
  %135 = icmp eq i32 %.091138, -1
  %136 = trunc nuw nsw i64 %indvars.iv156 to i32
  %137 = select i1 %134, i1 %135, i1 false
  %.5 = select i1 %137, i32 %136, i32 %.3137
  %138 = select i1 %134, i1 %135, i1 false
  %.293 = select i1 %138, i32 0, i32 %.091138
  %139 = load i32, ptr %4, align 16, !tbaa !25
  %.not113130 = icmp slt i32 %139, %85
  br i1 %.not113130, label %._crit_edge134, label %.lr.ph133

.lr.ph133:                                        ; preds = %.lr.ph141.split, %.lr.ph133
  %indvars.iv = phi i64 [ %indvars.iv.next, %.lr.ph133 ], [ 0, %.lr.ph141.split ]
  %140 = phi ptr [ %141, %.lr.ph133 ], [ %4, %.lr.ph141.split ]
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
  store i32 0, ptr %140, align 4, !tbaa !25
  %141 = getelementptr inbounds [8 x i32], ptr %4, i64 0, i64 %indvars.iv.next
  %142 = load i32, ptr %141, align 4, !tbaa !25
  %.not113 = icmp slt i32 %142, %85
  br i1 %.not113, label %._crit_edge134, label %.lr.ph133, !llvm.loop !26

._crit_edge134:                                   ; preds = %.lr.ph133, %.lr.ph141.split
  %.lcssa117 = phi ptr [ %4, %.lr.ph141.split ], [ %141, %.lr.ph133 ]
  %.lcssa = phi i32 [ %139, %.lr.ph141.split ], [ %142, %.lr.ph133 ]
  %143 = icmp slt i32 %.lcssa, 0
  %144 = select i1 %143, i32 0, i32 %10
  %spec.select180 = add nsw i32 %.lcssa, %144
  %145 = sub nsw i32 0, %spec.select180
  store i32 %145, ptr %.lcssa117, align 4, !tbaa !25
  %indvars.iv.next157 = add nuw nsw i64 %indvars.iv156, 1
  %exitcond159.not = icmp eq i64 %indvars.iv.next157, %87
  br i1 %exitcond159.not, label %._crit_edge142, label %.lr.ph141.split, !llvm.loop !27

._crit_edge142:                                   ; preds = %._crit_edge134, %._crit_edge134.us, %82
  %.3.lcssa = phi i32 [ %.298, %82 ], [ %.5.us, %._crit_edge134.us ], [ %.5, %._crit_edge134 ]
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %4) #5
  br label %146

146:                                              ; preds = %._crit_edge142, %.loopexit
  %.6 = phi i32 [ %.3.lcssa, %._crit_edge142 ], [ %.298, %.loopexit ]
  ret i32 %.6
}

; Function Attrs: mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite)
declare void @llvm.lifetime.start.p0(i64 immarg, ptr nocapture) #1

; Function Attrs: mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite)
declare void @llvm.lifetime.end.p0(i64 immarg, ptr nocapture) #1

; Function Attrs: mustprogress nocallback nofree nounwind willreturn memory(argmem: write)
declare void @llvm.memset.p0.i64(ptr nocapture writeonly, i8, i64, i1 immarg) #2

; Function Attrs: mustprogress nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare float @llvm.fmuladd.f32(float, float, float) #3

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare float @llvm.rint.f32(float) #4

attributes #0 = { nofree norecurse nosync nounwind memory(read, inaccessiblemem: none) uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #1 = { mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #2 = { mustprogress nocallback nofree nounwind willreturn memory(argmem: write) }
attributes #3 = { mustprogress nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #4 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #5 = { nounwind }

!llvm.module.flags = !{!0, !1, !2, !3}
!llvm.ident = !{!4}

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !7, i64 0}
!6 = !{!"codebook", !7, i64 0, !7, i64 8, !7, i64 16, !10, i64 24, !10, i64 32, !10, i64 40, !10, i64 48, !10, i64 56, !10, i64 64, !11, i64 72, !11, i64 76, !11, i64 80, !11, i64 84, !11, i64 88}
!7 = !{!"long", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C/C++ TBAA"}
!10 = !{!"any pointer", !8, i64 0}
!11 = !{!"int", !8, i64 0}
!12 = !{!6, !11, i64 84}
!13 = !{!6, !11, i64 88}
!14 = !{!6, !11, i64 80}
!15 = !{!16, !16, i64 0}
!16 = !{!"float", !8, i64 0}
!17 = distinct !{!17, !18}
!18 = !{!"llvm.loop.mustprogress"}
!19 = distinct !{!19, !18}
!20 = !{!6, !10, i64 24}
!21 = !{!22, !10, i64 16}
!22 = !{!"static_codebook", !7, i64 0, !7, i64 8, !10, i64 16, !11, i64 24, !7, i64 32, !7, i64 40, !11, i64 48, !11, i64 52, !10, i64 56, !11, i64 64}
!23 = !{!7, !7, i64 0}
!24 = !{!6, !7, i64 8}
!25 = !{!11, !11, i64 0}
!26 = distinct !{!26, !18}
!27 = distinct !{!27, !18}
!28 = distinct !{!28, !18}


; Effective O3 passes: DSEPass,EarlyCSEPass,GVNPass,GlobalOptPass,IndVarSimplifyPass,InferAlignmentPass,InferFunctionAttrsPass,InstCombinePass,InstSimplifyPass,JumpThreadingPass,LCSSAPass,LICMPass,LoopInstSimplifyPass,LoopRotatePass,LoopSimplifyCFGPass,LoopSimplifyPass,LoopUnrollPass,PostOrderFunctionAttrsPass,ReassociatePass,SCCPPass,SROAPass,SimplifyCFGPass,TailCallElimPass