; LLVM IR from lesialin/ImageSignalProcessing_C :: src/isp_gac.ll (Z7isp_gacPtPhtS0_)

; 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.isp_config_t = type <{ i32, i32, i16, [6 x i8], %"class.std::__cxx11::basic_string", %struct.blc_cfg_t, i16, [6 x i8], %"class.std::__cxx11::basic_string", %struct.awb_gain_t, [12 x float], %"class.std::__cxx11::basic_string", float, [12 x float], %struct.nlm_cfg_t, i8, %struct.bnf_cfg_t, [15 x i16], %struct.eeh_cfg_t, %struct.fcs_cfg_t, %struct.hsc_cfg_t, %struct.bcc_cfg_t, [4 x i8] }>
%struct.blc_cfg_t = type { i16, i16, i16, i16, float, float }
%struct.awb_gain_t = type { float, float, float, float }
%"class.std::__cxx11::basic_string" = type { %"struct.std::__cxx11::basic_string<char>::_Alloc_hider", i64, %union.anon }
%"struct.std::__cxx11::basic_string<char>::_Alloc_hider" = type { ptr }
%union.anon = type { i64, [8 x i8] }
%struct.nlm_cfg_t = type { i8, i8, i8 }
%struct.bnf_cfg_t = type { [25 x i16], [4 x i16], [3 x i16] }
%struct.eeh_cfg_t = type { i16, i16, i16, i16, i16, i16 }
%struct.fcs_cfg_t = type { i8, i8 }
%struct.hsc_cfg_t = type { i8, float }
%struct.bcc_cfg_t = type { i8, float }

@g_isp_config = external global %struct.isp_config_t, align 8
@g_table_size = external global i16, align 2

; Function Attrs: mustprogress nounwind uwtable
define dso_local void @_Z7isp_gacPtPhtS0_(ptr noundef %0, ptr noundef %1, i16 noundef zeroext %2, ptr noundef %3) #0 {
  %5 = alloca ptr, align 8
  %6 = alloca ptr, align 8
  %7 = alloca i16, align 2
  %8 = alloca ptr, align 8
  %9 = alloca i16, align 2
  %10 = alloca i16, align 2
  %11 = alloca i32, align 4
  %12 = alloca i16, align 2
  %13 = alloca i16, align 2
  %14 = alloca i16, align 2
  %15 = alloca i8, align 1
  %16 = alloca i8, align 1
  %17 = alloca i16, align 2
  %18 = alloca i16, align 2
  %19 = alloca i8, align 1
  %20 = alloca i8, align 1
  %21 = alloca i32, align 4
  %22 = alloca i32, align 4
  %23 = alloca i32, align 4
  store ptr %0, ptr %5, align 8, !tbaa !5
  store ptr %1, ptr %6, align 8, !tbaa !5
  store i16 %2, ptr %7, align 2, !tbaa !9
  store ptr %3, ptr %8, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 2, ptr %9) #2
  call void @llvm.lifetime.start.p0(i64 2, ptr %10) #2
  call void @llvm.lifetime.start.p0(i64 4, ptr %11) #2
  call void @llvm.lifetime.start.p0(i64 2, ptr %12) #2
  call void @llvm.lifetime.start.p0(i64 2, ptr %13) #2
  call void @llvm.lifetime.start.p0(i64 2, ptr %14) #2
  call void @llvm.lifetime.start.p0(i64 1, ptr %15) #2
  call void @llvm.lifetime.start.p0(i64 1, ptr %16) #2
  call void @llvm.lifetime.start.p0(i64 2, ptr %17) #2
  call void @llvm.lifetime.start.p0(i64 2, ptr %18) #2
  call void @llvm.lifetime.start.p0(i64 1, ptr %19) #2
  call void @llvm.lifetime.start.p0(i64 1, ptr %20) #2
  %24 = load i32, ptr @g_isp_config, align 8, !tbaa !11
  %25 = trunc i32 %24 to i16
  store i16 %25, ptr %9, align 2, !tbaa !9
  %26 = load i32, ptr getelementptr inbounds (%struct.isp_config_t, ptr @g_isp_config, i32 0, i32 1), align 4, !tbaa !26
  %27 = trunc i32 %26 to i16
  store i16 %27, ptr %10, align 2, !tbaa !9
  %28 = load i16, ptr getelementptr inbounds (%struct.isp_config_t, ptr @g_isp_config, i32 0, i32 2), align 8, !tbaa !27
  %29 = zext i16 %28 to i32
  %30 = shl i32 1, %29
  %31 = sub nsw i32 %30, 1
  %32 = trunc i32 %31 to i16
  store i16 %32, ptr %12, align 2, !tbaa !9
  store i16 255, ptr %13, align 2, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %21) #2
  store i32 0, ptr %21, align 4, !tbaa !28
  br label %33

33:                                               ; preds = %281, %4
  %34 = load i32, ptr %21, align 4, !tbaa !28
  %35 = load i16, ptr %10, align 2, !tbaa !9
  %36 = zext i16 %35 to i32
  %37 = icmp slt i32 %34, %36
  br i1 %37, label %39, label %38

38:                                               ; preds = %33
  store i32 2, ptr %22, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %21) #2
  br label %284

39:                                               ; preds = %33
  call void @llvm.lifetime.start.p0(i64 4, ptr %23) #2
  store i32 0, ptr %23, align 4, !tbaa !28
  br label %40

40:                                               ; preds = %277, %39
  %41 = load i32, ptr %23, align 4, !tbaa !28
  %42 = load i16, ptr %9, align 2, !tbaa !9
  %43 = zext i16 %42 to i32
  %44 = icmp slt i32 %41, %43
  br i1 %44, label %46, label %45

45:                                               ; preds = %40
  store i32 5, ptr %22, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %23) #2
  br label %280

46:                                               ; preds = %40
  %47 = load i32, ptr %21, align 4, !tbaa !28
  %48 = load i16, ptr %9, align 2, !tbaa !9
  %49 = zext i16 %48 to i32
  %50 = mul nsw i32 %47, %49
  %51 = load i32, ptr %23, align 4, !tbaa !28
  %52 = add nsw i32 %50, %51
  %53 = mul nsw i32 3, %52
  store i32 %53, ptr %11, align 4, !tbaa !28
  %54 = load ptr, ptr %5, align 8, !tbaa !5
  %55 = load i32, ptr %11, align 4, !tbaa !28
  %56 = zext i32 %55 to i64
  %57 = getelementptr inbounds i16, ptr %54, i64 %56
  %58 = load i16, ptr %57, align 2, !tbaa !9
  store i16 %58, ptr %14, align 2, !tbaa !9
  %59 = load i16, ptr %14, align 2, !tbaa !9
  %60 = zext i16 %59 to i32
  %61 = ashr i32 %60, 2
  %62 = trunc i32 %61 to i16
  store i16 %62, ptr %17, align 2, !tbaa !9
  %63 = load i16, ptr %17, align 2, !tbaa !9
  %64 = zext i16 %63 to i32
  %65 = add nsw i32 %64, 1
  %66 = trunc i32 %65 to i16
  store i16 %66, ptr %18, align 2, !tbaa !9
  %67 = load i16, ptr %18, align 2, !tbaa !9
  %68 = zext i16 %67 to i32
  %69 = load i16, ptr @g_table_size, align 2, !tbaa !9
  %70 = zext i16 %69 to i32
  %71 = icmp slt i32 %68, %70
  br i1 %71, label %72, label %110

72:                                               ; preds = %46
  %73 = load ptr, ptr %6, align 8, !tbaa !5
  %74 = load i16, ptr %17, align 2, !tbaa !9
  %75 = zext i16 %74 to i64
  %76 = getelementptr inbounds i8, ptr %73, i64 %75
  %77 = load i8, ptr %76, align 1, !tbaa !29
  store i8 %77, ptr %15, align 1, !tbaa !29
  %78 = load ptr, ptr %6, align 8, !tbaa !5
  %79 = load i16, ptr %18, align 2, !tbaa !9
  %80 = zext i16 %79 to i64
  %81 = getelementptr inbounds i8, ptr %78, i64 %80
  %82 = load i8, ptr %81, align 1, !tbaa !29
  store i8 %82, ptr %16, align 1, !tbaa !29
  %83 = load i16, ptr %14, align 2, !tbaa !9
  %84 = zext i16 %83 to i32
  %85 = load i16, ptr %17, align 2, !tbaa !9
  %86 = zext i16 %85 to i32
  %87 = shl i32 %86, 2
  %88 = sub nsw i32 %84, %87
  %89 = trunc i32 %88 to i8
  store i8 %89, ptr %20, align 1, !tbaa !29
  %90 = load i16, ptr %18, align 2, !tbaa !9
  %91 = zext i16 %90 to i32
  %92 = shl i32 %91, 2
  %93 = load i16, ptr %14, align 2, !tbaa !9
  %94 = zext i16 %93 to i32
  %95 = sub nsw i32 %92, %94
  %96 = trunc i32 %95 to i8
  store i8 %96, ptr %19, align 1, !tbaa !29
  %97 = load i8, ptr %15, align 1, !tbaa !29
  %98 = zext i8 %97 to i32
  %99 = load i8, ptr %19, align 1, !tbaa !29
  %100 = zext i8 %99 to i32
  %101 = mul nsw i32 %98, %100
  %102 = load i8, ptr %16, align 1, !tbaa !29
  %103 = zext i8 %102 to i32
  %104 = load i8, ptr %20, align 1, !tbaa !29
  %105 = zext i8 %104 to i32
  %106 = mul nsw i32 %103, %105
  %107 = add nsw i32 %101, %106
  %108 = ashr i32 %107, 2
  %109 = trunc i32 %108 to i16
  store i16 %109, ptr %14, align 2, !tbaa !9
  br label %112

110:                                              ; preds = %46
  %111 = load i16, ptr %12, align 2, !tbaa !9
  store i16 %111, ptr %14, align 2, !tbaa !9
  br label %112

112:                                              ; preds = %110, %72
  %113 = load i16, ptr %14, align 2, !tbaa !9
  %114 = zext i16 %113 to i32
  %115 = icmp sgt i32 %114, 255
  br i1 %115, label %116, label %117

116:                                              ; preds = %112
  br label %120

117:                                              ; preds = %112
  %118 = load i16, ptr %14, align 2, !tbaa !9
  %119 = zext i16 %118 to i32
  br label %120

120:                                              ; preds = %117, %116
  %121 = phi i32 [ 255, %116 ], [ %119, %117 ]
  %122 = trunc i32 %121 to i8
  %123 = load ptr, ptr %8, align 8, !tbaa !5
  %124 = load i32, ptr %11, align 4, !tbaa !28
  %125 = zext i32 %124 to i64
  %126 = getelementptr inbounds i8, ptr %123, i64 %125
  store i8 %122, ptr %126, align 1, !tbaa !29
  %127 = load ptr, ptr %5, align 8, !tbaa !5
  %128 = load i32, ptr %11, align 4, !tbaa !28
  %129 = add i32 %128, 1
  %130 = zext i32 %129 to i64
  %131 = getelementptr inbounds i16, ptr %127, i64 %130
  %132 = load i16, ptr %131, align 2, !tbaa !9
  store i16 %132, ptr %14, align 2, !tbaa !9
  %133 = load i16, ptr %14, align 2, !tbaa !9
  %134 = zext i16 %133 to i32
  %135 = ashr i32 %134, 2
  %136 = trunc i32 %135 to i16
  store i16 %136, ptr %17, align 2, !tbaa !9
  %137 = load i16, ptr %17, align 2, !tbaa !9
  %138 = zext i16 %137 to i32
  %139 = add nsw i32 %138, 1
  %140 = trunc i32 %139 to i16
  store i16 %140, ptr %18, align 2, !tbaa !9
  %141 = load i16, ptr %18, align 2, !tbaa !9
  %142 = zext i16 %141 to i32
  %143 = load i16, ptr @g_table_size, align 2, !tbaa !9
  %144 = zext i16 %143 to i32
  %145 = icmp slt i32 %142, %144
  br i1 %145, label %146, label %184

146:                                              ; preds = %120
  %147 = load ptr, ptr %6, align 8, !tbaa !5
  %148 = load i16, ptr %17, align 2, !tbaa !9
  %149 = zext i16 %148 to i64
  %150 = getelementptr inbounds i8, ptr %147, i64 %149
  %151 = load i8, ptr %150, align 1, !tbaa !29
  store i8 %151, ptr %15, align 1, !tbaa !29
  %152 = load ptr, ptr %6, align 8, !tbaa !5
  %153 = load i16, ptr %18, align 2, !tbaa !9
  %154 = zext i16 %153 to i64
  %155 = getelementptr inbounds i8, ptr %152, i64 %154
  %156 = load i8, ptr %155, align 1, !tbaa !29
  store i8 %156, ptr %16, align 1, !tbaa !29
  %157 = load i16, ptr %14, align 2, !tbaa !9
  %158 = zext i16 %157 to i32
  %159 = load i16, ptr %17, align 2, !tbaa !9
  %160 = zext i16 %159 to i32
  %161 = shl i32 %160, 2
  %162 = sub nsw i32 %158, %161
  %163 = trunc i32 %162 to i8
  store i8 %163, ptr %20, align 1, !tbaa !29
  %164 = load i16, ptr %18, align 2, !tbaa !9
  %165 = zext i16 %164 to i32
  %166 = shl i32 %165, 2
  %167 = load i16, ptr %14, align 2, !tbaa !9
  %168 = zext i16 %167 to i32
  %169 = sub nsw i32 %166, %168
  %170 = trunc i32 %169 to i8
  store i8 %170, ptr %19, align 1, !tbaa !29
  %171 = load i8, ptr %15, align 1, !tbaa !29
  %172 = zext i8 %171 to i32
  %173 = load i8, ptr %19, align 1, !tbaa !29
  %174 = zext i8 %173 to i32
  %175 = mul nsw i32 %172, %174
  %176 = load i8, ptr %16, align 1, !tbaa !29
  %177 = zext i8 %176 to i32
  %178 = load i8, ptr %20, align 1, !tbaa !29
  %179 = zext i8 %178 to i32
  %180 = mul nsw i32 %177, %179
  %181 = add nsw i32 %175, %180
  %182 = ashr i32 %181, 2
  %183 = trunc i32 %182 to i16
  store i16 %183, ptr %14, align 2, !tbaa !9
  br label %186

184:                                              ; preds = %120
  %185 = load i16, ptr %12, align 2, !tbaa !9
  store i16 %185, ptr %14, align 2, !tbaa !9
  br label %186

186:                                              ; preds = %184, %146
  %187 = load i16, ptr %14, align 2, !tbaa !9
  %188 = zext i16 %187 to i32
  %189 = icmp sgt i32 %188, 255
  br i1 %189, label %190, label %191

190:                                              ; preds = %186
  br label %194

191:                                              ; preds = %186
  %192 = load i16, ptr %14, align 2, !tbaa !9
  %193 = zext i16 %192 to i32
  br label %194

194:                                              ; preds = %191, %190
  %195 = phi i32 [ 255, %190 ], [ %193, %191 ]
  %196 = trunc i32 %195 to i8
  %197 = load ptr, ptr %8, align 8, !tbaa !5
  %198 = load i32, ptr %11, align 4, !tbaa !28
  %199 = add i32 %198, 1
  %200 = zext i32 %199 to i64
  %201 = getelementptr inbounds i8, ptr %197, i64 %200
  store i8 %196, ptr %201, align 1, !tbaa !29
  %202 = load ptr, ptr %5, align 8, !tbaa !5
  %203 = load i32, ptr %11, align 4, !tbaa !28
  %204 = add i32 %203, 2
  %205 = zext i32 %204 to i64
  %206 = getelementptr inbounds i16, ptr %202, i64 %205
  %207 = load i16, ptr %206, align 2, !tbaa !9
  store i16 %207, ptr %14, align 2, !tbaa !9
  %208 = load i16, ptr %14, align 2, !tbaa !9
  %209 = zext i16 %208 to i32
  %210 = ashr i32 %209, 2
  %211 = trunc i32 %210 to i16
  store i16 %211, ptr %17, align 2, !tbaa !9
  %212 = load i16, ptr %17, align 2, !tbaa !9
  %213 = zext i16 %212 to i32
  %214 = add nsw i32 %213, 1
  %215 = trunc i32 %214 to i16
  store i16 %215, ptr %18, align 2, !tbaa !9
  %216 = load i16, ptr %18, align 2, !tbaa !9
  %217 = zext i16 %216 to i32
  %218 = load i16, ptr @g_table_size, align 2, !tbaa !9
  %219 = zext i16 %218 to i32
  %220 = icmp slt i32 %217, %219
  br i1 %220, label %221, label %259

221:                                              ; preds = %194
  %222 = load ptr, ptr %6, align 8, !tbaa !5
  %223 = load i16, ptr %17, align 2, !tbaa !9
  %224 = zext i16 %223 to i64
  %225 = getelementptr inbounds i8, ptr %222, i64 %224
  %226 = load i8, ptr %225, align 1, !tbaa !29
  store i8 %226, ptr %15, align 1, !tbaa !29
  %227 = load ptr, ptr %6, align 8, !tbaa !5
  %228 = load i16, ptr %18, align 2, !tbaa !9
  %229 = zext i16 %228 to i64
  %230 = getelementptr inbounds i8, ptr %227, i64 %229
  %231 = load i8, ptr %230, align 1, !tbaa !29
  store i8 %231, ptr %16, align 1, !tbaa !29
  %232 = load i16, ptr %14, align 2, !tbaa !9
  %233 = zext i16 %232 to i32
  %234 = load i16, ptr %17, align 2, !tbaa !9
  %235 = zext i16 %234 to i32
  %236 = shl i32 %235, 2
  %237 = sub nsw i32 %233, %236
  %238 = trunc i32 %237 to i8
  store i8 %238, ptr %20, align 1, !tbaa !29
  %239 = load i16, ptr %18, align 2, !tbaa !9
  %240 = zext i16 %239 to i32
  %241 = shl i32 %240, 2
  %242 = load i16, ptr %14, align 2, !tbaa !9
  %243 = zext i16 %242 to i32
  %244 = sub nsw i32 %241, %243
  %245 = trunc i32 %244 to i8
  store i8 %245, ptr %19, align 1, !tbaa !29
  %246 = load i8, ptr %15, align 1, !tbaa !29
  %247 = zext i8 %246 to i32
  %248 = load i8, ptr %19, align 1, !tbaa !29
  %249 = zext i8 %248 to i32
  %250 = mul nsw i32 %247, %249
  %251 = load i8, ptr %16, align 1, !tbaa !29
  %252 = zext i8 %251 to i32
  %253 = load i8, ptr %20, align 1, !tbaa !29
  %254 = zext i8 %253 to i32
  %255 = mul nsw i32 %252, %254
  %256 = add nsw i32 %250, %255
  %257 = ashr i32 %256, 2
  %258 = trunc i32 %257 to i16
  store i16 %258, ptr %14, align 2, !tbaa !9
  br label %261

259:                                              ; preds = %194
  %260 = load i16, ptr %12, align 2, !tbaa !9
  store i16 %260, ptr %14, align 2, !tbaa !9
  br label %261

261:                                              ; preds = %259, %221
  %262 = load i16, ptr %14, align 2, !tbaa !9
  %263 = zext i16 %262 to i32
  %264 = icmp sgt i32 %263, 255
  br i1 %264, label %265, label %266

265:                                              ; preds = %261
  br label %269

266:                                              ; preds = %261
  %267 = load i16, ptr %14, align 2, !tbaa !9
  %268 = zext i16 %267 to i32
  br label %269

269:                                              ; preds = %266, %265
  %270 = phi i32 [ 255, %265 ], [ %268, %266 ]
  %271 = trunc i32 %270 to i8
  %272 = load ptr, ptr %8, align 8, !tbaa !5
  %273 = load i32, ptr %11, align 4, !tbaa !28
  %274 = add i32 %273, 2
  %275 = zext i32 %274 to i64
  %276 = getelementptr inbounds i8, ptr %272, i64 %275
  store i8 %271, ptr %276, align 1, !tbaa !29
  br label %277

277:                                              ; preds = %269
  %278 = load i32, ptr %23, align 4, !tbaa !28
  %279 = add nsw i32 %278, 1
  store i32 %279, ptr %23, align 4, !tbaa !28
  br label %40, !llvm.loop !30

280:                                              ; preds = %45
  br label %281

281:                                              ; preds = %280
  %282 = load i32, ptr %21, align 4, !tbaa !28
  %283 = add nsw i32 %282, 1
  store i32 %283, ptr %21, align 4, !tbaa !28
  br label %33, !llvm.loop !32

284:                                              ; preds = %38
  call void @llvm.lifetime.end.p0(i64 1, ptr %20) #2
  call void @llvm.lifetime.end.p0(i64 1, ptr %19) #2
  call void @llvm.lifetime.end.p0(i64 2, ptr %18) #2
  call void @llvm.lifetime.end.p0(i64 2, ptr %17) #2
  call void @llvm.lifetime.end.p0(i64 1, ptr %16) #2
  call void @llvm.lifetime.end.p0(i64 1, ptr %15) #2
  call void @llvm.lifetime.end.p0(i64 2, ptr %14) #2
  call void @llvm.lifetime.end.p0(i64 2, ptr %13) #2
  call void @llvm.lifetime.end.p0(i64 2, ptr %12) #2
  call void @llvm.lifetime.end.p0(i64 4, ptr %11) #2
  call void @llvm.lifetime.end.p0(i64 2, ptr %10) #2
  call void @llvm.lifetime.end.p0(i64 2, ptr %9) #2
  ret void
}

; 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 willreturn memory(argmem: readwrite)
declare void @llvm.lifetime.end.p0(i64 immarg, ptr nocapture) #1

attributes #0 = { mustprogress 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 = { 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++ TBAA"}
!9 = !{!10, !10, i64 0}
!10 = !{!"short", !7, i64 0}
!11 = !{!12, !13, i64 0}
!12 = !{!"_ZTS12isp_config_t", !13, i64 0, !13, i64 4, !10, i64 8, !14, i64 16, !17, i64 48, !10, i64 64, !14, i64 72, !19, i64 104, !7, i64 120, !14, i64 168, !18, i64 200, !7, i64 204, !20, i64 252, !21, i64 256, !7, i64 320, !22, i64 350, !23, i64 362, !24, i64 364, !25, i64 372}
!13 = !{!"int", !7, i64 0}
!14 = !{!"_ZTSNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", !15, i64 0, !16, i64 8, !7, i64 16}
!15 = !{!"_ZTSNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_Alloc_hiderE", !6, i64 0}
!16 = !{!"long", !7, i64 0}
!17 = !{!"_ZTS9blc_cfg_t", !10, i64 0, !10, i64 2, !10, i64 4, !10, i64 6, !18, i64 8, !18, i64 12}
!18 = !{!"float", !7, i64 0}
!19 = !{!"_ZTS10awb_gain_t", !18, i64 0, !18, i64 4, !18, i64 8, !18, i64 12}
!20 = !{!"_ZTS9nlm_cfg_t", !7, i64 0, !7, i64 1, !7, i64 2}
!21 = !{!"_ZTS9bnf_cfg_t", !7, i64 0, !7, i64 50, !7, i64 58}
!22 = !{!"_ZTS9eeh_cfg_t", !10, i64 0, !10, i64 2, !10, i64 4, !10, i64 6, !10, i64 8, !10, i64 10}
!23 = !{!"_ZTS9fcs_cfg_t", !7, i64 0, !7, i64 1}
!24 = !{!"_ZTS9hsc_cfg_t", !7, i64 0, !18, i64 4}
!25 = !{!"_ZTS9bcc_cfg_t", !7, i64 0, !18, i64 4}
!26 = !{!12, !13, i64 4}
!27 = !{!12, !10, i64 8}
!28 = !{!13, !13, i64 0}
!29 = !{!7, !7, i64 0}
!30 = distinct !{!30, !31}
!31 = !{!"llvm.loop.mustprogress"}
!32 = distinct !{!32, !31}


; 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"

%struct.isp_config_t = type <{ i32, i32, i16, [6 x i8], %"class.std::__cxx11::basic_string", %struct.blc_cfg_t, i16, [6 x i8], %"class.std::__cxx11::basic_string", %struct.awb_gain_t, [12 x float], %"class.std::__cxx11::basic_string", float, [12 x float], %struct.nlm_cfg_t, i8, %struct.bnf_cfg_t, [15 x i16], %struct.eeh_cfg_t, %struct.fcs_cfg_t, %struct.hsc_cfg_t, %struct.bcc_cfg_t, [4 x i8] }>
%struct.blc_cfg_t = type { i16, i16, i16, i16, float, float }
%struct.awb_gain_t = type { float, float, float, float }
%"class.std::__cxx11::basic_string" = type { %"struct.std::__cxx11::basic_string<char>::_Alloc_hider", i64, %union.anon }
%"struct.std::__cxx11::basic_string<char>::_Alloc_hider" = type { ptr }
%union.anon = type { i64, [8 x i8] }
%struct.nlm_cfg_t = type { i8, i8, i8 }
%struct.bnf_cfg_t = type { [25 x i16], [4 x i16], [3 x i16] }
%struct.eeh_cfg_t = type { i16, i16, i16, i16, i16, i16 }
%struct.fcs_cfg_t = type { i8, i8 }
%struct.hsc_cfg_t = type { i8, float }
%struct.bcc_cfg_t = type { i8, float }

@g_isp_config = external local_unnamed_addr global %struct.isp_config_t, align 8
@g_table_size = external local_unnamed_addr global i16, align 2

; Function Attrs: mustprogress nofree norecurse nosync nounwind memory(read, argmem: readwrite, inaccessiblemem: none) uwtable
define dso_local void @_Z7isp_gacPtPhtS0_(ptr nocapture noundef readonly %0, ptr nocapture noundef readonly %1, i16 noundef zeroext %2, ptr nocapture noundef writeonly %3) local_unnamed_addr #0 {
  %5 = load i32, ptr getelementptr inbounds (i8, ptr @g_isp_config, i64 4), align 4, !tbaa !5
  %6 = load i16, ptr getelementptr inbounds (i8, ptr @g_isp_config, i64 8), align 8, !tbaa !24
  %7 = zext nneg i16 %6 to i32
  %notmask = shl nsw i32 -1, %7
  %8 = trunc i32 %notmask to i16
  %9 = xor i16 %8, -1
  %10 = and i32 %5, 65535
  %.not = icmp eq i32 %10, 0
  br i1 %.not, label %._crit_edge82, label %.preheader.lr.ph

.preheader.lr.ph:                                 ; preds = %4
  %11 = load i32, ptr @g_isp_config, align 8, !tbaa !25
  %12 = and i32 %11, 65535
  %.not83 = icmp eq i32 %12, 0
  br i1 %.not83, label %._crit_edge82, label %.preheader.us.preheader

.preheader.us.preheader:                          ; preds = %.preheader.lr.ph
  %13 = zext nneg i32 %12 to i64
  %wide.trip.count89 = zext nneg i32 %10 to i64
  br label %.preheader.us

.preheader.us:                                    ; preds = %.preheader.us.preheader, %._crit_edge.us
  %indvars.iv86 = phi i64 [ 0, %.preheader.us.preheader ], [ %indvars.iv.next87, %._crit_edge.us ]
  %14 = mul nuw nsw i64 %indvars.iv86, %13
  br label %15

15:                                               ; preds = %.preheader.us, %109
  %indvars.iv = phi i64 [ 0, %.preheader.us ], [ %indvars.iv.next, %109 ]
  %16 = add nuw nsw i64 %indvars.iv, %14
  %17 = mul nuw nsw i64 %16, 3
  %18 = getelementptr inbounds i16, ptr %0, i64 %17
  %19 = load i16, ptr %18, align 2, !tbaa !26
  %20 = lshr i16 %19, 2
  %21 = add nuw nsw i16 %20, 1
  %22 = load i16, ptr @g_table_size, align 2, !tbaa !26
  %23 = icmp ult i16 %21, %22
  br i1 %23, label %24, label %45

24:                                               ; preds = %15
  %25 = zext nneg i16 %21 to i32
  %26 = zext i16 %19 to i32
  %27 = zext nneg i16 %20 to i64
  %28 = getelementptr inbounds i8, ptr %1, i64 %27
  %29 = load i8, ptr %28, align 1, !tbaa !27
  %30 = zext nneg i16 %21 to i64
  %31 = getelementptr inbounds i8, ptr %1, i64 %30
  %32 = load i8, ptr %31, align 1, !tbaa !27
  %33 = and i16 %19, 3
  %34 = zext nneg i16 %33 to i32
  %35 = shl nuw nsw i32 %25, 2
  %36 = sub nsw i32 %35, %26
  %37 = zext i8 %29 to i32
  %38 = and i32 %36, 255
  %39 = mul nuw nsw i32 %38, %37
  %40 = zext i8 %32 to i32
  %41 = mul nuw nsw i32 %40, %34
  %42 = add nuw nsw i32 %41, %39
  %43 = lshr i32 %42, 2
  %44 = trunc nuw nsw i32 %43 to i16
  br label %45

45:                                               ; preds = %24, %15
  %.075.us = phi i16 [ %44, %24 ], [ %9, %15 ]
  %46 = tail call i16 @llvm.umin.i16(i16 %.075.us, i16 255)
  %47 = trunc nuw i16 %46 to i8
  %48 = getelementptr inbounds i8, ptr %3, i64 %17
  store i8 %47, ptr %48, align 1, !tbaa !27
  %49 = add nuw nsw i64 %17, 1
  %50 = getelementptr inbounds i16, ptr %0, i64 %49
  %51 = load i16, ptr %50, align 2, !tbaa !26
  %52 = lshr i16 %51, 2
  %53 = add nuw nsw i16 %52, 1
  %54 = load i16, ptr @g_table_size, align 2, !tbaa !26
  %55 = icmp ult i16 %53, %54
  br i1 %55, label %56, label %77

56:                                               ; preds = %45
  %57 = zext nneg i16 %53 to i32
  %58 = zext i16 %51 to i32
  %59 = zext nneg i16 %52 to i64
  %60 = getelementptr inbounds i8, ptr %1, i64 %59
  %61 = load i8, ptr %60, align 1, !tbaa !27
  %62 = zext nneg i16 %53 to i64
  %63 = getelementptr inbounds i8, ptr %1, i64 %62
  %64 = load i8, ptr %63, align 1, !tbaa !27
  %65 = and i16 %51, 3
  %66 = zext nneg i16 %65 to i32
  %67 = shl nuw nsw i32 %57, 2
  %68 = sub nsw i32 %67, %58
  %69 = zext i8 %61 to i32
  %70 = and i32 %68, 255
  %71 = mul nuw nsw i32 %70, %69
  %72 = zext i8 %64 to i32
  %73 = mul nuw nsw i32 %72, %66
  %74 = add nuw nsw i32 %73, %71
  %75 = lshr i32 %74, 2
  %76 = trunc nuw nsw i32 %75 to i16
  br label %77

77:                                               ; preds = %56, %45
  %.1.us = phi i16 [ %76, %56 ], [ %9, %45 ]
  %78 = tail call i16 @llvm.umin.i16(i16 %.1.us, i16 255)
  %79 = trunc nuw i16 %78 to i8
  %80 = getelementptr inbounds i8, ptr %3, i64 %49
  store i8 %79, ptr %80, align 1, !tbaa !27
  %81 = add nuw nsw i64 %17, 2
  %82 = getelementptr inbounds i16, ptr %0, i64 %81
  %83 = load i16, ptr %82, align 2, !tbaa !26
  %84 = lshr i16 %83, 2
  %85 = add nuw nsw i16 %84, 1
  %86 = load i16, ptr @g_table_size, align 2, !tbaa !26
  %87 = icmp ult i16 %85, %86
  br i1 %87, label %88, label %109

88:                                               ; preds = %77
  %89 = zext nneg i16 %85 to i32
  %90 = zext i16 %83 to i32
  %91 = zext nneg i16 %84 to i64
  %92 = getelementptr inbounds i8, ptr %1, i64 %91
  %93 = load i8, ptr %92, align 1, !tbaa !27
  %94 = zext nneg i16 %85 to i64
  %95 = getelementptr inbounds i8, ptr %1, i64 %94
  %96 = load i8, ptr %95, align 1, !tbaa !27
  %97 = and i16 %83, 3
  %98 = zext nneg i16 %97 to i32
  %99 = shl nuw nsw i32 %89, 2
  %100 = sub nsw i32 %99, %90
  %101 = zext i8 %93 to i32
  %102 = and i32 %100, 255
  %103 = mul nuw nsw i32 %102, %101
  %104 = zext i8 %96 to i32
  %105 = mul nuw nsw i32 %104, %98
  %106 = add nuw nsw i32 %105, %103
  %107 = lshr i32 %106, 2
  %108 = trunc nuw nsw i32 %107 to i16
  br label %109

109:                                              ; preds = %88, %77
  %.2.us = phi i16 [ %108, %88 ], [ %9, %77 ]
  %110 = tail call i16 @llvm.umin.i16(i16 %.2.us, i16 255)
  %111 = trunc nuw i16 %110 to i8
  %112 = getelementptr inbounds i8, ptr %3, i64 %81
  store i8 %111, ptr %112, align 1, !tbaa !27
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
  %exitcond.not = icmp eq i64 %indvars.iv.next, %13
  br i1 %exitcond.not, label %._crit_edge.us, label %15, !llvm.loop !28

._crit_edge.us:                                   ; preds = %109
  %indvars.iv.next87 = add nuw nsw i64 %indvars.iv86, 1
  %exitcond90.not = icmp eq i64 %indvars.iv.next87, %wide.trip.count89
  br i1 %exitcond90.not, label %._crit_edge82, label %.preheader.us, !llvm.loop !30

._crit_edge82:                                    ; preds = %._crit_edge.us, %.preheader.lr.ph, %4
  ret void
}

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare i16 @llvm.umin.i16(i16, i16) #1

attributes #0 = { mustprogress nofree norecurse nosync nounwind memory(read, argmem: readwrite, 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 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }

!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 4}
!6 = !{!"_ZTS12isp_config_t", !7, i64 0, !7, i64 4, !10, i64 8, !11, i64 16, !15, i64 48, !10, i64 64, !11, i64 72, !17, i64 104, !8, i64 120, !11, i64 168, !16, i64 200, !8, i64 204, !18, i64 252, !19, i64 256, !8, i64 320, !20, i64 350, !21, i64 362, !22, i64 364, !23, i64 372}
!7 = !{!"int", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C++ TBAA"}
!10 = !{!"short", !8, i64 0}
!11 = !{!"_ZTSNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", !12, i64 0, !14, i64 8, !8, i64 16}
!12 = !{!"_ZTSNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_Alloc_hiderE", !13, i64 0}
!13 = !{!"any pointer", !8, i64 0}
!14 = !{!"long", !8, i64 0}
!15 = !{!"_ZTS9blc_cfg_t", !10, i64 0, !10, i64 2, !10, i64 4, !10, i64 6, !16, i64 8, !16, i64 12}
!16 = !{!"float", !8, i64 0}
!17 = !{!"_ZTS10awb_gain_t", !16, i64 0, !16, i64 4, !16, i64 8, !16, i64 12}
!18 = !{!"_ZTS9nlm_cfg_t", !8, i64 0, !8, i64 1, !8, i64 2}
!19 = !{!"_ZTS9bnf_cfg_t", !8, i64 0, !8, i64 50, !8, i64 58}
!20 = !{!"_ZTS9eeh_cfg_t", !10, i64 0, !10, i64 2, !10, i64 4, !10, i64 6, !10, i64 8, !10, i64 10}
!21 = !{!"_ZTS9fcs_cfg_t", !8, i64 0, !8, i64 1}
!22 = !{!"_ZTS9hsc_cfg_t", !8, i64 0, !16, i64 4}
!23 = !{!"_ZTS9bcc_cfg_t", !8, i64 0, !16, i64 4}
!24 = !{!6, !10, i64 8}
!25 = !{!6, !7, i64 0}
!26 = !{!10, !10, i64 0}
!27 = !{!8, !8, i64 0}
!28 = distinct !{!28, !29}
!29 = !{!"llvm.loop.mustprogress"}
!30 = distinct !{!30, !29}


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