; LLVM IR from ARM-software/Arm-2D :: examples/common/controls (histogram)

; 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.arm_2d_margin_t = type { i8, i8, i8, i8 }
%struct.arm_2d_tile_t = type { %union.anon.4, %union.anon.11, %union.anon.12 }
%union.anon.4 = type { %struct.anon }
%struct.anon = type { i8, %union.arm_2d_color_info_t, %union.anon }
%union.arm_2d_color_info_t = type { %struct.anon.0 }
%struct.anon.0 = type { i8 }
%union.anon = type { i16 }
%union.anon.11 = type { %struct.arm_2d_region_t }
%struct.arm_2d_region_t = type { %union.anon.9, %union.anon.10 }
%union.anon.9 = type { %struct.arm_2d_location_t }
%struct.arm_2d_location_t = type { i16, i16 }
%union.anon.10 = type { %struct.arm_2d_size_t }
%struct.arm_2d_size_t = type { i16, i16 }
%union.anon.12 = type { ptr }
%union.arm_2d_color_rgb565_t = type { i16 }
%struct.histogram_t = type { %struct.anon.15 }
%struct.anon.15 = type { %struct.histogram_cfg_t, %struct.arm_2d_size_t, %struct.anon.16, i8, i8, i32 }
%struct.histogram_cfg_t = type { %struct.anon.13, %struct.anon.14, ptr, %struct.histogram_on_get_bin_value_evt_t }
%struct.anon.13 = type { %struct.arm_2d_size_t, ptr, i16, i8, i8, i32, ptr }
%struct.anon.14 = type { i32, i32 }
%struct.histogram_on_get_bin_value_evt_t = type { ptr, ptr }
%struct.anon.16 = type { %struct.arm_2d_region_list_item_t, i16 }
%struct.arm_2d_region_list_item_t = type { ptr, [8 x i8], %struct.arm_2d_region_t, [4 x i8] }
%struct.histogram_bin_item_t = type { %struct.anon.17 }
%struct.anon.17 = type { i16, i16, i16 }

@.str.1 = external hidden unnamed_addr constant [90 x i8], align 1
@.str.6 = external hidden unnamed_addr constant [14 x i8], align 1
@__PRETTY_FUNCTION__.histogram_show = external hidden unnamed_addr constant [92 x i8], align 1

; Function Attrs: noreturn nounwind
declare void @__assert_fail(ptr noundef, ptr noundef, i32 noundef, ptr noundef) #0

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

; Function Attrs: nocallback nofree nounwind willreturn memory(argmem: readwrite)
declare void @llvm.memcpy.p0.p0.i64(ptr noalias nocapture writeonly, ptr noalias nocapture readonly, i64, i1 immarg) #2

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

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

; Function Attrs: nounwind uwtable
define dso_local void @histogram_show(ptr noundef nonnull %0, ptr noundef %1, ptr noundef %2, i8 noundef zeroext %3) #4 {
  %5 = alloca ptr, align 8
  %6 = alloca ptr, align 8
  %7 = alloca ptr, align 8
  %8 = alloca i8, align 1
  %9 = alloca %struct.arm_2d_margin_t, align 1
  %10 = alloca ptr, align 8
  %11 = alloca %struct.arm_2d_margin_t, align 1
  %12 = alloca i32, align 4
  %13 = alloca %struct.arm_2d_tile_t, align 8
  %14 = alloca ptr, align 8
  %15 = alloca %struct.arm_2d_region_t, align 2
  %16 = alloca ptr, align 8
  %17 = alloca ptr, align 8
  %18 = alloca %struct.arm_2d_region_t, align 2
  %19 = alloca ptr, align 8
  %20 = alloca ptr, align 8
  %21 = alloca ptr, align 8
  %22 = alloca %struct.arm_2d_region_t, align 2
  %23 = alloca %struct.arm_2d_margin_t, align 1
  %24 = alloca ptr, align 8
  %25 = alloca %struct.arm_2d_margin_t, align 1
  %26 = alloca %struct.arm_2d_tile_t, align 8
  %27 = alloca ptr, align 8
  %28 = alloca %struct.arm_2d_region_t, align 2
  %29 = alloca ptr, align 8
  %30 = alloca ptr, align 8
  %31 = alloca %struct.arm_2d_region_t, align 2
  %32 = alloca ptr, align 8
  %33 = alloca ptr, align 8
  %34 = alloca ptr, align 8
  %35 = alloca %struct.arm_2d_location_t, align 2
  %36 = alloca i16, align 2
  %37 = alloca ptr, align 8
  %38 = alloca ptr, align 8
  %39 = alloca ptr, align 8
  %40 = alloca i64, align 8
  %41 = alloca i16, align 2
  %42 = alloca %struct.arm_2d_region_t, align 2
  %43 = alloca %struct.arm_2d_margin_t, align 1
  %44 = alloca ptr, align 8
  %45 = alloca %struct.arm_2d_margin_t, align 1
  %46 = alloca %struct.arm_2d_tile_t, align 8
  %47 = alloca ptr, align 8
  %48 = alloca %struct.arm_2d_region_t, align 2
  %49 = alloca ptr, align 8
  %50 = alloca ptr, align 8
  %51 = alloca %struct.arm_2d_region_t, align 2
  %52 = alloca ptr, align 8
  %53 = alloca ptr, align 8
  %54 = alloca ptr, align 8
  %55 = alloca i16, align 2
  %56 = alloca %struct.arm_2d_region_t, align 2
  %57 = alloca %union.arm_2d_color_rgb565_t, align 2
  %58 = alloca %union.arm_2d_color_rgb565_t, align 2
  %59 = alloca i8, align 1
  %60 = alloca %union.arm_2d_color_rgb565_t, align 2
  %61 = alloca %union.arm_2d_color_rgb565_t, align 2
  %62 = alloca %struct.arm_2d_location_t, align 2
  %63 = alloca %union.arm_2d_color_rgb565_t, align 2
  %64 = alloca i8, align 1
  %65 = alloca i8, align 1
  %66 = alloca %struct.arm_2d_region_t, align 2
  %67 = alloca i8, align 1
  %68 = alloca ptr, align 8
  %69 = alloca i16, align 2
  %70 = alloca %struct.arm_2d_location_t, align 2
  %71 = alloca %struct.arm_2d_region_t, align 2
  %72 = alloca %struct.arm_2d_region_t, align 2
  %73 = alloca %struct.arm_2d_region_t, align 2
  %74 = alloca i8, align 1
  %75 = alloca i8, align 1
  %76 = alloca i8, align 1
  store ptr %0, ptr %5, align 8, !tbaa !5
  store ptr %1, ptr %6, align 8, !tbaa !5
  store ptr %2, ptr %7, align 8, !tbaa !5
  store i8 %3, ptr %8, align 1, !tbaa !9
  %77 = load ptr, ptr %5, align 8, !tbaa !5
  %78 = icmp ne ptr null, %77
  br i1 %78, label %79, label %80

79:                                               ; preds = %4
  br label %81

80:                                               ; preds = %4
  call void @__assert_fail(ptr noundef @.str.6, ptr noundef @.str.1, i32 noundef 258, ptr noundef @__PRETTY_FUNCTION__.histogram_show) #6
  unreachable

81:                                               ; preds = %79
  call void @llvm.lifetime.start.p0(i64 4, ptr %9) #7
  call void @llvm.lifetime.start.p0(i64 8, ptr %10) #7
  store ptr null, ptr %10, align 8, !tbaa !5
  br label %82

82:                                               ; preds = %927, %81
  %83 = load ptr, ptr %10, align 8, !tbaa !5
  %84 = getelementptr inbounds %struct.arm_2d_margin_t, ptr %83, i32 1
  store ptr %84, ptr %10, align 8, !tbaa !5
  %85 = icmp eq ptr %83, null
  br i1 %85, label %86, label %91

86:                                               ; preds = %82
  %87 = getelementptr inbounds %struct.arm_2d_margin_t, ptr %11, i32 0, i32 0
  store i8 0, ptr %87, align 1, !tbaa !10
  %88 = getelementptr inbounds %struct.arm_2d_margin_t, ptr %11, i32 0, i32 1
  store i8 0, ptr %88, align 1, !tbaa !12
  %89 = getelementptr inbounds %struct.arm_2d_margin_t, ptr %11, i32 0, i32 2
  store i8 0, ptr %89, align 1, !tbaa !13
  %90 = getelementptr inbounds %struct.arm_2d_margin_t, ptr %11, i32 0, i32 3
  store i8 0, ptr %90, align 1, !tbaa !14
  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %9, ptr align 1 %11, i64 4, i1 false), !tbaa.struct !15
  br label %92

91:                                               ; preds = %82
  br label %92

92:                                               ; preds = %91, %86
  %93 = phi i32 [ 1, %86 ], [ 0, %91 ]
  %94 = icmp ne i32 %93, 0
  br i1 %94, label %96, label %95

95:                                               ; preds = %92
  store i32 2, ptr %12, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %10) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %9) #7
  br label %928

96:                                               ; preds = %92
  call void @llvm.lifetime.start.p0(i64 24, ptr %13) #7
  call void @llvm.memset.p0.i64(ptr align 8 %13, i8 0, i64 24, i1 false)
  call void @llvm.lifetime.start.p0(i64 8, ptr %14) #7
  store ptr null, ptr %14, align 8, !tbaa !5
  br label %97

97:                                               ; preds = %925, %96
  %98 = load ptr, ptr %14, align 8, !tbaa !5
  %99 = getelementptr inbounds %struct.arm_2d_tile_t, ptr %98, i32 1
  store ptr %99, ptr %14, align 8, !tbaa !5
  %100 = icmp eq ptr %98, null
  br i1 %100, label %101, label %172

101:                                              ; preds = %97
  call void @llvm.lifetime.start.p0(i64 8, ptr %15) #7
  call void @llvm.memset.p0.i64(ptr align 2 %15, i8 0, i64 8, i1 false)
  call void @llvm.lifetime.start.p0(i64 8, ptr %16) #7
  %102 = load ptr, ptr %6, align 8, !tbaa !5
  store ptr %102, ptr %16, align 8, !tbaa !5
  %103 = load ptr, ptr %16, align 8, !tbaa !5
  %104 = icmp eq ptr null, %103
  br i1 %104, label %105, label %111

105:                                              ; preds = %101
  %106 = call ptr @arm_2d_get_default_frame_buffer()
  store ptr %106, ptr %16, align 8, !tbaa !5
  %107 = load ptr, ptr %16, align 8, !tbaa !5
  %108 = icmp eq ptr null, %107
  br i1 %108, label %109, label %110

109:                                              ; preds = %105
  store i32 4, ptr %12, align 4
  br label %168

110:                                              ; preds = %105
  br label %111

111:                                              ; preds = %110, %101
  %112 = load ptr, ptr %7, align 8, !tbaa !5
  %113 = icmp eq ptr null, %112
  br i1 %113, label %114, label %119

114:                                              ; preds = %111
  %115 = getelementptr inbounds %struct.arm_2d_region_t, ptr %15, i32 0, i32 1
  %116 = load ptr, ptr %16, align 8, !tbaa !5
  %117 = getelementptr inbounds %struct.arm_2d_tile_t, ptr %116, i32 0, i32 1
  %118 = getelementptr inbounds %struct.arm_2d_region_t, ptr %117, i32 0, i32 1
  call void @llvm.memcpy.p0.p0.i64(ptr align 2 %115, ptr align 4 %118, i64 4, i1 false), !tbaa.struct !16
  br label %121

119:                                              ; preds = %111
  %120 = load ptr, ptr %7, align 8, !tbaa !5
  call void @llvm.memcpy.p0.p0.i64(ptr align 2 %15, ptr align 2 %120, i64 8, i1 false), !tbaa.struct !19
  br label %121

121:                                              ; preds = %119, %114
  %122 = getelementptr inbounds %struct.arm_2d_margin_t, ptr %9, i32 0, i32 0
  %123 = load i8, ptr %122, align 1, !tbaa !10
  %124 = zext i8 %123 to i32
  %125 = getelementptr inbounds %struct.arm_2d_region_t, ptr %15, i32 0, i32 0
  %126 = getelementptr inbounds %struct.arm_2d_location_t, ptr %125, i32 0, i32 0
  %127 = load i16, ptr %126, align 2, !tbaa !9
  %128 = sext i16 %127 to i32
  %129 = add nsw i32 %128, %124
  %130 = trunc i32 %129 to i16
  store i16 %130, ptr %126, align 2, !tbaa !9
  %131 = getelementptr inbounds %struct.arm_2d_margin_t, ptr %9, i32 0, i32 2
  %132 = load i8, ptr %131, align 1, !tbaa !13
  %133 = zext i8 %132 to i32
  %134 = getelementptr inbounds %struct.arm_2d_region_t, ptr %15, i32 0, i32 0
  %135 = getelementptr inbounds %struct.arm_2d_location_t, ptr %134, i32 0, i32 1
  %136 = load i16, ptr %135, align 2, !tbaa !9
  %137 = sext i16 %136 to i32
  %138 = add nsw i32 %137, %133
  %139 = trunc i32 %138 to i16
  store i16 %139, ptr %135, align 2, !tbaa !9
  %140 = getelementptr inbounds %struct.arm_2d_margin_t, ptr %9, i32 0, i32 0
  %141 = load i8, ptr %140, align 1, !tbaa !10
  %142 = zext i8 %141 to i32
  %143 = getelementptr inbounds %struct.arm_2d_margin_t, ptr %9, i32 0, i32 1
  %144 = load i8, ptr %143, align 1, !tbaa !12
  %145 = zext i8 %144 to i32
  %146 = add nsw i32 %142, %145
  %147 = getelementptr inbounds %struct.arm_2d_region_t, ptr %15, i32 0, i32 1
  %148 = getelementptr inbounds %struct.arm_2d_size_t, ptr %147, i32 0, i32 0
  %149 = load i16, ptr %148, align 2, !tbaa !9
  %150 = sext i16 %149 to i32
  %151 = sub nsw i32 %150, %146
  %152 = trunc i32 %151 to i16
  store i16 %152, ptr %148, align 2, !tbaa !9
  %153 = getelementptr inbounds %struct.arm_2d_margin_t, ptr %9, i32 0, i32 2
  %154 = load i8, ptr %153, align 1, !tbaa !13
  %155 = zext i8 %154 to i32
  %156 = getelementptr inbounds %struct.arm_2d_margin_t, ptr %9, i32 0, i32 3
  %157 = load i8, ptr %156, align 1, !tbaa !14
  %158 = zext i8 %157 to i32
  %159 = add nsw i32 %155, %158
  %160 = getelementptr inbounds %struct.arm_2d_region_t, ptr %15, i32 0, i32 1
  %161 = getelementptr inbounds %struct.arm_2d_size_t, ptr %160, i32 0, i32 1
  %162 = load i16, ptr %161, align 2, !tbaa !9
  %163 = sext i16 %162 to i32
  %164 = sub nsw i32 %163, %159
  %165 = trunc i32 %164 to i16
  store i16 %165, ptr %161, align 2, !tbaa !9
  %166 = load ptr, ptr %16, align 8, !tbaa !5
  %167 = call ptr @arm_2d_tile_generate_child(ptr noundef %166, ptr noundef %15, ptr noundef %13, i1 noundef zeroext false)
  store ptr %167, ptr %17, align 8, !tbaa !5
  store i32 0, ptr %12, align 4
  br label %168

168:                                              ; preds = %121, %109
  call void @llvm.lifetime.end.p0(i64 8, ptr %16) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %15) #7
  %169 = load i32, ptr %12, align 4
  switch i32 %169, label %926 [
    i32 0, label %170
  ]

170:                                              ; preds = %168
  %171 = load ptr, ptr %17, align 8, !tbaa !5
  br label %173

172:                                              ; preds = %97
  br label %173

173:                                              ; preds = %172, %170
  %174 = phi i32 [ 1, %170 ], [ 0, %172 ]
  %175 = icmp ne i32 %174, 0
  br i1 %175, label %177, label %176

176:                                              ; preds = %173
  store i32 4, ptr %12, align 4
  br label %926

177:                                              ; preds = %173
  call void @llvm.lifetime.start.p0(i64 8, ptr %18) #7
  call void @llvm.memset.p0.i64(ptr align 2 %18, i8 0, i64 8, i1 false)
  call void @llvm.lifetime.start.p0(i64 8, ptr %19) #7
  store ptr null, ptr %19, align 8, !tbaa !5
  br label %178

178:                                              ; preds = %919, %177
  %179 = load ptr, ptr %19, align 8, !tbaa !5
  %180 = getelementptr inbounds %struct.arm_2d_region_t, ptr %179, i32 1
  store ptr %180, ptr %19, align 8, !tbaa !5
  %181 = icmp eq ptr %179, null
  br i1 %181, label %182, label %186

182:                                              ; preds = %178
  %183 = getelementptr inbounds %struct.arm_2d_region_t, ptr %18, i32 0, i32 1
  %184 = getelementptr inbounds %struct.arm_2d_tile_t, ptr %13, i32 0, i32 1
  %185 = getelementptr inbounds %struct.arm_2d_region_t, ptr %184, i32 0, i32 1
  call void @llvm.memcpy.p0.p0.i64(ptr align 2 %183, ptr align 4 %185, i64 4, i1 false), !tbaa.struct !16
  br label %187

186:                                              ; preds = %178
  br label %187

187:                                              ; preds = %186, %182
  %188 = phi i32 [ 1, %182 ], [ 0, %186 ]
  %189 = icmp ne i32 %188, 0
  br i1 %189, label %191, label %190

190:                                              ; preds = %187
  store i32 7, ptr %12, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %19) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %18) #7
  br label %924

191:                                              ; preds = %187
  call void @llvm.lifetime.start.p0(i64 8, ptr %20) #7
  store ptr %13, ptr %20, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %21) #7
  store ptr null, ptr %21, align 8, !tbaa !5
  br label %192

192:                                              ; preds = %916, %191
  %193 = load ptr, ptr %21, align 8, !tbaa !5
  %194 = getelementptr inbounds %struct.arm_2d_tile_t, ptr %193, i32 1
  store ptr %194, ptr %21, align 8, !tbaa !5
  %195 = icmp eq ptr %193, null
  br i1 %195, label %197, label %196

196:                                              ; preds = %192
  store i32 10, ptr %12, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %21) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %20) #7
  br label %918

197:                                              ; preds = %192
  call void @llvm.lifetime.start.p0(i64 8, ptr %22) #7
  %198 = getelementptr inbounds %struct.arm_2d_region_t, ptr %22, i32 0, i32 0
  call void @llvm.memset.p0.i64(ptr align 2 %198, i8 0, i64 4, i1 false)
  %199 = getelementptr inbounds %struct.arm_2d_region_t, ptr %22, i32 0, i32 1
  %200 = load ptr, ptr %5, align 8, !tbaa !5
  %201 = getelementptr inbounds %struct.histogram_t, ptr %200, i32 0, i32 0
  %202 = getelementptr inbounds %struct.anon.15, ptr %201, i32 0, i32 1
  call void @llvm.memcpy.p0.p0.i64(ptr align 2 %199, ptr align 8 %202, i64 4, i1 false), !tbaa.struct !16
  call void @llvm.lifetime.start.p0(i64 4, ptr %23) #7
  call void @llvm.lifetime.start.p0(i64 8, ptr %24) #7
  store ptr null, ptr %24, align 8, !tbaa !5
  br label %203

203:                                              ; preds = %914, %197
  %204 = load ptr, ptr %24, align 8, !tbaa !5
  %205 = getelementptr inbounds %struct.arm_2d_margin_t, ptr %204, i32 1
  store ptr %205, ptr %24, align 8, !tbaa !5
  %206 = icmp eq ptr %204, null
  br i1 %206, label %207, label %212

207:                                              ; preds = %203
  %208 = getelementptr inbounds %struct.arm_2d_margin_t, ptr %25, i32 0, i32 0
  store i8 0, ptr %208, align 1, !tbaa !10
  %209 = getelementptr inbounds %struct.arm_2d_margin_t, ptr %25, i32 0, i32 1
  store i8 0, ptr %209, align 1, !tbaa !12
  %210 = getelementptr inbounds %struct.arm_2d_margin_t, ptr %25, i32 0, i32 2
  store i8 0, ptr %210, align 1, !tbaa !13
  %211 = getelementptr inbounds %struct.arm_2d_margin_t, ptr %25, i32 0, i32 3
  store i8 0, ptr %211, align 1, !tbaa !14
  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %23, ptr align 1 %25, i64 4, i1 false), !tbaa.struct !15
  br label %213

212:                                              ; preds = %203
  br label %213

213:                                              ; preds = %212, %207
  %214 = phi i32 [ 1, %207 ], [ 0, %212 ]
  %215 = icmp ne i32 %214, 0
  br i1 %215, label %217, label %216

216:                                              ; preds = %213
  store i32 13, ptr %12, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %24) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %23) #7
  br label %915

217:                                              ; preds = %213
  call void @llvm.lifetime.start.p0(i64 24, ptr %26) #7
  call void @llvm.memset.p0.i64(ptr align 8 %26, i8 0, i64 24, i1 false)
  call void @llvm.lifetime.start.p0(i64 8, ptr %27) #7
  store ptr null, ptr %27, align 8, !tbaa !5
  br label %218

218:                                              ; preds = %912, %217
  %219 = load ptr, ptr %27, align 8, !tbaa !5
  %220 = getelementptr inbounds %struct.arm_2d_tile_t, ptr %219, i32 1
  store ptr %220, ptr %27, align 8, !tbaa !5
  %221 = icmp eq ptr %219, null
  br i1 %221, label %222, label %282

222:                                              ; preds = %218
  call void @llvm.lifetime.start.p0(i64 8, ptr %28) #7
  call void @llvm.memset.p0.i64(ptr align 2 %28, i8 0, i64 8, i1 false)
  call void @llvm.lifetime.start.p0(i64 8, ptr %29) #7
  store ptr %13, ptr %29, align 8, !tbaa !5
  %223 = load ptr, ptr %29, align 8, !tbaa !5
  %224 = icmp eq ptr null, %223
  br i1 %224, label %225, label %231

225:                                              ; preds = %222
  %226 = call ptr @arm_2d_get_default_frame_buffer()
  store ptr %226, ptr %29, align 8, !tbaa !5
  %227 = load ptr, ptr %29, align 8, !tbaa !5
  %228 = icmp eq ptr null, %227
  br i1 %228, label %229, label %230

229:                                              ; preds = %225
  store i32 15, ptr %12, align 4
  br label %278

230:                                              ; preds = %225
  br label %231

231:                                              ; preds = %230, %222
  call void @llvm.memcpy.p0.p0.i64(ptr align 2 %28, ptr align 2 %22, i64 8, i1 false), !tbaa.struct !19
  %232 = getelementptr inbounds %struct.arm_2d_margin_t, ptr %23, i32 0, i32 0
  %233 = load i8, ptr %232, align 1, !tbaa !10
  %234 = zext i8 %233 to i32
  %235 = getelementptr inbounds %struct.arm_2d_region_t, ptr %28, i32 0, i32 0
  %236 = getelementptr inbounds %struct.arm_2d_location_t, ptr %235, i32 0, i32 0
  %237 = load i16, ptr %236, align 2, !tbaa !9
  %238 = sext i16 %237 to i32
  %239 = add nsw i32 %238, %234
  %240 = trunc i32 %239 to i16
  store i16 %240, ptr %236, align 2, !tbaa !9
  %241 = getelementptr inbounds %struct.arm_2d_margin_t, ptr %23, i32 0, i32 2
  %242 = load i8, ptr %241, align 1, !tbaa !13
  %243 = zext i8 %242 to i32
  %244 = getelementptr inbounds %struct.arm_2d_region_t, ptr %28, i32 0, i32 0
  %245 = getelementptr inbounds %struct.arm_2d_location_t, ptr %244, i32 0, i32 1
  %246 = load i16, ptr %245, align 2, !tbaa !9
  %247 = sext i16 %246 to i32
  %248 = add nsw i32 %247, %243
  %249 = trunc i32 %248 to i16
  store i16 %249, ptr %245, align 2, !tbaa !9
  %250 = getelementptr inbounds %struct.arm_2d_margin_t, ptr %23, i32 0, i32 0
  %251 = load i8, ptr %250, align 1, !tbaa !10
  %252 = zext i8 %251 to i32
  %253 = getelementptr inbounds %struct.arm_2d_margin_t, ptr %23, i32 0, i32 1
  %254 = load i8, ptr %253, align 1, !tbaa !12
  %255 = zext i8 %254 to i32
  %256 = add nsw i32 %252, %255
  %257 = getelementptr inbounds %struct.arm_2d_region_t, ptr %28, i32 0, i32 1
  %258 = getelementptr inbounds %struct.arm_2d_size_t, ptr %257, i32 0, i32 0
  %259 = load i16, ptr %258, align 2, !tbaa !9
  %260 = sext i16 %259 to i32
  %261 = sub nsw i32 %260, %256
  %262 = trunc i32 %261 to i16
  store i16 %262, ptr %258, align 2, !tbaa !9
  %263 = getelementptr inbounds %struct.arm_2d_margin_t, ptr %23, i32 0, i32 2
  %264 = load i8, ptr %263, align 1, !tbaa !13
  %265 = zext i8 %264 to i32
  %266 = getelementptr inbounds %struct.arm_2d_margin_t, ptr %23, i32 0, i32 3
  %267 = load i8, ptr %266, align 1, !tbaa !14
  %268 = zext i8 %267 to i32
  %269 = add nsw i32 %265, %268
  %270 = getelementptr inbounds %struct.arm_2d_region_t, ptr %28, i32 0, i32 1
  %271 = getelementptr inbounds %struct.arm_2d_size_t, ptr %270, i32 0, i32 1
  %272 = load i16, ptr %271, align 2, !tbaa !9
  %273 = sext i16 %272 to i32
  %274 = sub nsw i32 %273, %269
  %275 = trunc i32 %274 to i16
  store i16 %275, ptr %271, align 2, !tbaa !9
  %276 = load ptr, ptr %29, align 8, !tbaa !5
  %277 = call ptr @arm_2d_tile_generate_child(ptr noundef %276, ptr noundef %28, ptr noundef %26, i1 noundef zeroext false)
  store ptr %277, ptr %30, align 8, !tbaa !5
  store i32 0, ptr %12, align 4
  br label %278

278:                                              ; preds = %231, %229
  call void @llvm.lifetime.end.p0(i64 8, ptr %29) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %28) #7
  %279 = load i32, ptr %12, align 4
  switch i32 %279, label %913 [
    i32 0, label %280
  ]

280:                                              ; preds = %278
  %281 = load ptr, ptr %30, align 8, !tbaa !5
  br label %283

282:                                              ; preds = %218
  br label %283

283:                                              ; preds = %282, %280
  %284 = phi i32 [ 1, %280 ], [ 0, %282 ]
  %285 = icmp ne i32 %284, 0
  br i1 %285, label %287, label %286

286:                                              ; preds = %283
  store i32 15, ptr %12, align 4
  br label %913

287:                                              ; preds = %283
  call void @llvm.lifetime.start.p0(i64 8, ptr %31) #7
  call void @llvm.memset.p0.i64(ptr align 2 %31, i8 0, i64 8, i1 false)
  call void @llvm.lifetime.start.p0(i64 8, ptr %32) #7
  store ptr null, ptr %32, align 8, !tbaa !5
  br label %288

288:                                              ; preds = %906, %287
  %289 = load ptr, ptr %32, align 8, !tbaa !5
  %290 = getelementptr inbounds %struct.arm_2d_region_t, ptr %289, i32 1
  store ptr %290, ptr %32, align 8, !tbaa !5
  %291 = icmp eq ptr %289, null
  br i1 %291, label %292, label %296

292:                                              ; preds = %288
  %293 = getelementptr inbounds %struct.arm_2d_region_t, ptr %31, i32 0, i32 1
  %294 = getelementptr inbounds %struct.arm_2d_tile_t, ptr %26, i32 0, i32 1
  %295 = getelementptr inbounds %struct.arm_2d_region_t, ptr %294, i32 0, i32 1
  call void @llvm.memcpy.p0.p0.i64(ptr align 2 %293, ptr align 4 %295, i64 4, i1 false), !tbaa.struct !16
  br label %297

296:                                              ; preds = %288
  br label %297

297:                                              ; preds = %296, %292
  %298 = phi i32 [ 1, %292 ], [ 0, %296 ]
  %299 = icmp ne i32 %298, 0
  br i1 %299, label %301, label %300

300:                                              ; preds = %297
  store i32 18, ptr %12, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %32) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %31) #7
  br label %911

301:                                              ; preds = %297
  call void @llvm.lifetime.start.p0(i64 8, ptr %33) #7
  store ptr %26, ptr %33, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %34) #7
  store ptr null, ptr %34, align 8, !tbaa !5
  br label %302

302:                                              ; preds = %903, %301
  %303 = load ptr, ptr %34, align 8, !tbaa !5
  %304 = getelementptr inbounds %struct.arm_2d_tile_t, ptr %303, i32 1
  store ptr %304, ptr %34, align 8, !tbaa !5
  %305 = icmp eq ptr %303, null
  br i1 %305, label %307, label %306

306:                                              ; preds = %302
  store i32 21, ptr %12, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %34) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %33) #7
  br label %905

307:                                              ; preds = %302
  call void @llvm.lifetime.start.p0(i64 4, ptr %35) #7
  call void @llvm.memset.p0.i64(ptr align 2 %35, i8 0, i64 4, i1 false)
  call void @llvm.lifetime.start.p0(i64 2, ptr %36) #7
  %308 = load ptr, ptr %5, align 8, !tbaa !5
  %309 = getelementptr inbounds %struct.histogram_t, ptr %308, i32 0, i32 0
  %310 = getelementptr inbounds %struct.anon.15, ptr %309, i32 0, i32 0
  %311 = getelementptr inbounds %struct.histogram_cfg_t, ptr %310, i32 0, i32 0
  %312 = getelementptr inbounds %struct.anon.13, ptr %311, i32 0, i32 0
  %313 = getelementptr inbounds %struct.arm_2d_size_t, ptr %312, i32 0, i32 0
  %314 = load i16, ptr %313, align 8, !tbaa !20
  store i16 %314, ptr %36, align 2, !tbaa !17
  %315 = load ptr, ptr %5, align 8, !tbaa !5
  %316 = getelementptr inbounds %struct.histogram_t, ptr %315, i32 0, i32 0
  %317 = getelementptr inbounds %struct.anon.15, ptr %316, i32 0, i32 1
  %318 = getelementptr inbounds %struct.arm_2d_size_t, ptr %317, i32 0, i32 1
  %319 = load i16, ptr %318, align 2, !tbaa !32
  %320 = sext i16 %319 to i32
  %321 = load ptr, ptr %5, align 8, !tbaa !5
  %322 = getelementptr inbounds %struct.histogram_t, ptr %321, i32 0, i32 0
  %323 = getelementptr inbounds %struct.anon.15, ptr %322, i32 0, i32 0
  %324 = getelementptr inbounds %struct.histogram_cfg_t, ptr %323, i32 0, i32 0
  %325 = getelementptr inbounds %struct.anon.13, ptr %324, i32 0, i32 4
  %326 = load i8, ptr %325, align 1
  %327 = lshr i8 %326, 1
  %328 = and i8 %327, 1
  %329 = icmp ne i8 %328, 0
  %330 = xor i1 %329, true
  %331 = xor i1 %330, true
  %332 = zext i1 %331 to i32
  %333 = ashr i32 %320, %332
  %334 = trunc i32 %333 to i16
  %335 = getelementptr inbounds %struct.arm_2d_location_t, ptr %35, i32 0, i32 1
  store i16 %334, ptr %335, align 2, !tbaa !33
  call void @llvm.lifetime.start.p0(i64 8, ptr %37) #7
  %336 = load ptr, ptr %5, align 8, !tbaa !5
  %337 = getelementptr inbounds %struct.histogram_t, ptr %336, i32 0, i32 0
  %338 = getelementptr inbounds %struct.anon.15, ptr %337, i32 0, i32 0
  %339 = getelementptr inbounds %struct.histogram_cfg_t, ptr %338, i32 0, i32 0
  %340 = getelementptr inbounds %struct.anon.13, ptr %339, i32 0, i32 1
  %341 = load ptr, ptr %340, align 8, !tbaa !35
  store ptr %341, ptr %37, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %38) #7
  %342 = load ptr, ptr %37, align 8, !tbaa !5
  store ptr %342, ptr %38, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %39) #7
  store ptr null, ptr %39, align 8, !tbaa !5
  br label %343

343:                                              ; preds = %669, %307
  %344 = load ptr, ptr %39, align 8, !tbaa !5
  %345 = getelementptr inbounds %struct.histogram_bin_item_t, ptr %344, i32 1
  store ptr %345, ptr %39, align 8, !tbaa !5
  %346 = icmp eq ptr %344, null
  br i1 %346, label %347, label %349

347:                                              ; preds = %343
  %348 = load ptr, ptr %37, align 8, !tbaa !5
  br label %350

349:                                              ; preds = %343
  br label %350

350:                                              ; preds = %349, %347
  %351 = phi i32 [ 1, %347 ], [ 0, %349 ]
  %352 = icmp ne i32 %351, 0
  br i1 %352, label %354, label %353

353:                                              ; preds = %350
  store i32 24, ptr %12, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %39) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %38) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %37) #7
  br label %670

354:                                              ; preds = %350
  call void @llvm.lifetime.start.p0(i64 8, ptr %40) #7
  %355 = load ptr, ptr %5, align 8, !tbaa !5
  %356 = getelementptr inbounds %struct.histogram_t, ptr %355, i32 0, i32 0
  %357 = getelementptr inbounds %struct.anon.15, ptr %356, i32 0, i32 0
  %358 = getelementptr inbounds %struct.histogram_cfg_t, ptr %357, i32 0, i32 0
  %359 = getelementptr inbounds %struct.anon.13, ptr %358, i32 0, i32 2
  %360 = load i16, ptr %359, align 8, !tbaa !36
  %361 = zext i16 %360 to i64
  store i64 %361, ptr %40, align 8, !tbaa !37
  br label %362

362:                                              ; preds = %662, %354
  %363 = load i64, ptr %40, align 8, !tbaa !37
  %364 = icmp ugt i64 %363, 0
  br i1 %364, label %366, label %365

365:                                              ; preds = %362
  store i32 27, ptr %12, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %40) #7
  br label %668

366:                                              ; preds = %362
  call void @llvm.lifetime.start.p0(i64 2, ptr %41) #7
  %367 = load ptr, ptr %38, align 8, !tbaa !5
  %368 = getelementptr inbounds %struct.histogram_bin_item_t, ptr %367, i32 0, i32 0
  %369 = getelementptr inbounds %struct.anon.17, ptr %368, i32 0, i32 0
  %370 = load i16, ptr %369, align 2, !tbaa !39
  store i16 %370, ptr %41, align 2, !tbaa !17
  call void @llvm.lifetime.start.p0(i64 8, ptr %42) #7
  %371 = getelementptr inbounds %struct.arm_2d_region_t, ptr %42, i32 0, i32 0
  %372 = getelementptr inbounds %struct.arm_2d_location_t, ptr %371, i32 0, i32 0
  %373 = getelementptr inbounds %struct.arm_2d_location_t, ptr %35, i32 0, i32 0
  %374 = load i16, ptr %373, align 2, !tbaa !42
  store i16 %374, ptr %372, align 2, !tbaa !42
  %375 = getelementptr inbounds %struct.arm_2d_location_t, ptr %371, i32 0, i32 1
  %376 = getelementptr inbounds %struct.arm_2d_location_t, ptr %35, i32 0, i32 1
  %377 = load i16, ptr %376, align 2, !tbaa !33
  %378 = sext i16 %377 to i32
  %379 = load i16, ptr %41, align 2, !tbaa !17
  %380 = sext i16 %379 to i32
  %381 = load i16, ptr %41, align 2, !tbaa !17
  %382 = sext i16 %381 to i32
  %383 = icmp sgt i32 %382, 0
  %384 = zext i1 %383 to i32
  %385 = mul nsw i32 %380, %384
  %386 = sub nsw i32 %378, %385
  %387 = trunc i32 %386 to i16
  store i16 %387, ptr %375, align 2, !tbaa !33
  %388 = getelementptr inbounds %struct.arm_2d_region_t, ptr %42, i32 0, i32 1
  %389 = getelementptr inbounds %struct.arm_2d_size_t, ptr %388, i32 0, i32 0
  %390 = load i16, ptr %36, align 2, !tbaa !17
  store i16 %390, ptr %389, align 2, !tbaa !43
  %391 = getelementptr inbounds %struct.arm_2d_size_t, ptr %388, i32 0, i32 1
  %392 = load i16, ptr %41, align 2, !tbaa !17
  %393 = sext i16 %392 to i32
  %394 = icmp sgt i32 %393, 0
  br i1 %394, label %395, label %398

395:                                              ; preds = %366
  %396 = load i16, ptr %41, align 2, !tbaa !17
  %397 = sext i16 %396 to i32
  br label %402

398:                                              ; preds = %366
  %399 = load i16, ptr %41, align 2, !tbaa !17
  %400 = sext i16 %399 to i32
  %401 = sub nsw i32 0, %400
  br label %402

402:                                              ; preds = %398, %395
  %403 = phi i32 [ %397, %395 ], [ %401, %398 ]
  %404 = trunc i32 %403 to i16
  store i16 %404, ptr %391, align 2, !tbaa !44
  %405 = load ptr, ptr %5, align 8, !tbaa !5
  %406 = getelementptr inbounds %struct.histogram_t, ptr %405, i32 0, i32 0
  %407 = getelementptr inbounds %struct.anon.15, ptr %406, i32 0, i32 0
  %408 = getelementptr inbounds %struct.histogram_cfg_t, ptr %407, i32 0, i32 0
  %409 = getelementptr inbounds %struct.anon.13, ptr %408, i32 0, i32 4
  %410 = load i8, ptr %409, align 1
  %411 = and i8 %410, 1
  %412 = icmp ne i8 %411, 0
  br i1 %412, label %413, label %601

413:                                              ; preds = %402
  %414 = load i16, ptr %41, align 2, !tbaa !17
  %415 = sext i16 %414 to i32
  %416 = icmp sgt i32 %415, 0
  br i1 %416, label %417, label %584

417:                                              ; preds = %413
  call void @llvm.lifetime.start.p0(i64 4, ptr %43) #7
  call void @llvm.lifetime.start.p0(i64 8, ptr %44) #7
  store ptr null, ptr %44, align 8, !tbaa !5
  br label %418

418:                                              ; preds = %582, %417
  %419 = load ptr, ptr %44, align 8, !tbaa !5
  %420 = getelementptr inbounds %struct.arm_2d_margin_t, ptr %419, i32 1
  store ptr %420, ptr %44, align 8, !tbaa !5
  %421 = icmp eq ptr %419, null
  br i1 %421, label %422, label %427

422:                                              ; preds = %418
  %423 = getelementptr inbounds %struct.arm_2d_margin_t, ptr %45, i32 0, i32 0
  store i8 0, ptr %423, align 1, !tbaa !10
  %424 = getelementptr inbounds %struct.arm_2d_margin_t, ptr %45, i32 0, i32 1
  store i8 0, ptr %424, align 1, !tbaa !12
  %425 = getelementptr inbounds %struct.arm_2d_margin_t, ptr %45, i32 0, i32 2
  store i8 0, ptr %425, align 1, !tbaa !13
  %426 = getelementptr inbounds %struct.arm_2d_margin_t, ptr %45, i32 0, i32 3
  store i8 0, ptr %426, align 1, !tbaa !14
  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %43, ptr align 1 %45, i64 4, i1 false), !tbaa.struct !15
  br label %428

427:                                              ; preds = %418
  br label %428

428:                                              ; preds = %427, %422
  %429 = phi i32 [ 1, %422 ], [ 0, %427 ]
  %430 = icmp ne i32 %429, 0
  br i1 %430, label %432, label %431

431:                                              ; preds = %428
  store i32 30, ptr %12, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %44) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %43) #7
  br label %583

432:                                              ; preds = %428
  call void @llvm.lifetime.start.p0(i64 24, ptr %46) #7
  call void @llvm.memset.p0.i64(ptr align 8 %46, i8 0, i64 24, i1 false)
  call void @llvm.lifetime.start.p0(i64 8, ptr %47) #7
  store ptr null, ptr %47, align 8, !tbaa !5
  br label %433

433:                                              ; preds = %580, %432
  %434 = load ptr, ptr %47, align 8, !tbaa !5
  %435 = getelementptr inbounds %struct.arm_2d_tile_t, ptr %434, i32 1
  store ptr %435, ptr %47, align 8, !tbaa !5
  %436 = icmp eq ptr %434, null
  br i1 %436, label %437, label %497

437:                                              ; preds = %433
  call void @llvm.lifetime.start.p0(i64 8, ptr %48) #7
  call void @llvm.memset.p0.i64(ptr align 2 %48, i8 0, i64 8, i1 false)
  call void @llvm.lifetime.start.p0(i64 8, ptr %49) #7
  store ptr %26, ptr %49, align 8, !tbaa !5
  %438 = load ptr, ptr %49, align 8, !tbaa !5
  %439 = icmp eq ptr null, %438
  br i1 %439, label %440, label %446

440:                                              ; preds = %437
  %441 = call ptr @arm_2d_get_default_frame_buffer()
  store ptr %441, ptr %49, align 8, !tbaa !5
  %442 = load ptr, ptr %49, align 8, !tbaa !5
  %443 = icmp eq ptr null, %442
  br i1 %443, label %444, label %445

444:                                              ; preds = %440
  store i32 32, ptr %12, align 4
  br label %493

445:                                              ; preds = %440
  br label %446

446:                                              ; preds = %445, %437
  call void @llvm.memcpy.p0.p0.i64(ptr align 2 %48, ptr align 2 %42, i64 8, i1 false), !tbaa.struct !19
  %447 = getelementptr inbounds %struct.arm_2d_margin_t, ptr %43, i32 0, i32 0
  %448 = load i8, ptr %447, align 1, !tbaa !10
  %449 = zext i8 %448 to i32
  %450 = getelementptr inbounds %struct.arm_2d_region_t, ptr %48, i32 0, i32 0
  %451 = getelementptr inbounds %struct.arm_2d_location_t, ptr %450, i32 0, i32 0
  %452 = load i16, ptr %451, align 2, !tbaa !9
  %453 = sext i16 %452 to i32
  %454 = add nsw i32 %453, %449
  %455 = trunc i32 %454 to i16
  store i16 %455, ptr %451, align 2, !tbaa !9
  %456 = getelementptr inbounds %struct.arm_2d_margin_t, ptr %43, i32 0, i32 2
  %457 = load i8, ptr %456, align 1, !tbaa !13
  %458 = zext i8 %457 to i32
  %459 = getelementptr inbounds %struct.arm_2d_region_t, ptr %48, i32 0, i32 0
  %460 = getelementptr inbounds %struct.arm_2d_location_t, ptr %459, i32 0, i32 1
  %461 = load i16, ptr %460, align 2, !tbaa !9
  %462 = sext i16 %461 to i32
  %463 = add nsw i32 %462, %458
  %464 = trunc i32 %463 to i16
  store i16 %464, ptr %460, align 2, !tbaa !9
  %465 = getelementptr inbounds %struct.arm_2d_margin_t, ptr %43, i32 0, i32 0
  %466 = load i8, ptr %465, align 1, !tbaa !10
  %467 = zext i8 %466 to i32
  %468 = getelementptr inbounds %struct.arm_2d_margin_t, ptr %43, i32 0, i32 1
  %469 = load i8, ptr %468, align 1, !tbaa !12
  %470 = zext i8 %469 to i32
  %471 = add nsw i32 %467, %470
  %472 = getelementptr inbounds %struct.arm_2d_region_t, ptr %48, i32 0, i32 1
  %473 = getelementptr inbounds %struct.arm_2d_size_t, ptr %472, i32 0, i32 0
  %474 = load i16, ptr %473, align 2, !tbaa !9
  %475 = sext i16 %474 to i32
  %476 = sub nsw i32 %475, %471
  %477 = trunc i32 %476 to i16
  store i16 %477, ptr %473, align 2, !tbaa !9
  %478 = getelementptr inbounds %struct.arm_2d_margin_t, ptr %43, i32 0, i32 2
  %479 = load i8, ptr %478, align 1, !tbaa !13
  %480 = zext i8 %479 to i32
  %481 = getelementptr inbounds %struct.arm_2d_margin_t, ptr %43, i32 0, i32 3
  %482 = load i8, ptr %481, align 1, !tbaa !14
  %483 = zext i8 %482 to i32
  %484 = add nsw i32 %480, %483
  %485 = getelementptr inbounds %struct.arm_2d_region_t, ptr %48, i32 0, i32 1
  %486 = getelementptr inbounds %struct.arm_2d_size_t, ptr %485, i32 0, i32 1
  %487 = load i16, ptr %486, align 2, !tbaa !9
  %488 = sext i16 %487 to i32
  %489 = sub nsw i32 %488, %484
  %490 = trunc i32 %489 to i16
  store i16 %490, ptr %486, align 2, !tbaa !9
  %491 = load ptr, ptr %49, align 8, !tbaa !5
  %492 = call ptr @arm_2d_tile_generate_child(ptr noundef %491, ptr noundef %48, ptr noundef %46, i1 noundef zeroext false)
  store ptr %492, ptr %50, align 8, !tbaa !5
  store i32 0, ptr %12, align 4
  br label %493

493:                                              ; preds = %446, %444
  call void @llvm.lifetime.end.p0(i64 8, ptr %49) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %48) #7
  %494 = load i32, ptr %12, align 4
  switch i32 %494, label %581 [
    i32 0, label %495
  ]

495:                                              ; preds = %493
  %496 = load ptr, ptr %50, align 8, !tbaa !5
  br label %498

497:                                              ; preds = %433
  br label %498

498:                                              ; preds = %497, %495
  %499 = phi i32 [ 1, %495 ], [ 0, %497 ]
  %500 = icmp ne i32 %499, 0
  br i1 %500, label %502, label %501

501:                                              ; preds = %498
  store i32 32, ptr %12, align 4
  br label %581

502:                                              ; preds = %498
  call void @llvm.lifetime.start.p0(i64 8, ptr %51) #7
  call void @llvm.memset.p0.i64(ptr align 2 %51, i8 0, i64 8, i1 false)
  call void @llvm.lifetime.start.p0(i64 8, ptr %52) #7
  store ptr null, ptr %52, align 8, !tbaa !5
  br label %503

503:                                              ; preds = %574, %502
  %504 = load ptr, ptr %52, align 8, !tbaa !5
  %505 = getelementptr inbounds %struct.arm_2d_region_t, ptr %504, i32 1
  store ptr %505, ptr %52, align 8, !tbaa !5
  %506 = icmp eq ptr %504, null
  br i1 %506, label %507, label %511

507:                                              ; preds = %503
  %508 = getelementptr inbounds %struct.arm_2d_region_t, ptr %51, i32 0, i32 1
  %509 = getelementptr inbounds %struct.arm_2d_tile_t, ptr %46, i32 0, i32 1
  %510 = getelementptr inbounds %struct.arm_2d_region_t, ptr %509, i32 0, i32 1
  call void @llvm.memcpy.p0.p0.i64(ptr align 2 %508, ptr align 4 %510, i64 4, i1 false), !tbaa.struct !16
  br label %512

511:                                              ; preds = %503
  br label %512

512:                                              ; preds = %511, %507
  %513 = phi i32 [ 1, %507 ], [ 0, %511 ]
  %514 = icmp ne i32 %513, 0
  br i1 %514, label %516, label %515

515:                                              ; preds = %512
  store i32 35, ptr %12, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %52) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %51) #7
  br label %579

516:                                              ; preds = %512
  call void @llvm.lifetime.start.p0(i64 8, ptr %53) #7
  store ptr %46, ptr %53, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %54) #7
  store ptr null, ptr %54, align 8, !tbaa !5
  br label %517

517:                                              ; preds = %571, %516
  %518 = load ptr, ptr %54, align 8, !tbaa !5
  %519 = getelementptr inbounds %struct.arm_2d_tile_t, ptr %518, i32 1
  store ptr %519, ptr %54, align 8, !tbaa !5
  %520 = icmp eq ptr %518, null
  br i1 %520, label %522, label %521

521:                                              ; preds = %517
  store i32 38, ptr %12, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %54) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %53) #7
  br label %573

522:                                              ; preds = %517
  call void @llvm.lifetime.start.p0(i64 2, ptr %55) #7
  %523 = load ptr, ptr %5, align 8, !tbaa !5
  %524 = getelementptr inbounds %struct.histogram_t, ptr %523, i32 0, i32 0
  %525 = getelementptr inbounds %struct.anon.15, ptr %524, i32 0, i32 1
  %526 = getelementptr inbounds %struct.arm_2d_size_t, ptr %525, i32 0, i32 1
  %527 = load i16, ptr %526, align 2, !tbaa !32
  %528 = sext i16 %527 to i32
  %529 = load i16, ptr %41, align 2, !tbaa !17
  %530 = sext i16 %529 to i32
  %531 = sub nsw i32 %528, %530
  %532 = trunc i32 %531 to i16
  store i16 %532, ptr %55, align 2, !tbaa !17
  call void @llvm.lifetime.start.p0(i64 8, ptr %56) #7
  call void @llvm.memcpy.p0.p0.i64(ptr align 2 %56, ptr align 2 %51, i64 8, i1 false), !tbaa.struct !19
  %533 = load ptr, ptr %5, align 8, !tbaa !5
  %534 = getelementptr inbounds %struct.histogram_t, ptr %533, i32 0, i32 0
  %535 = getelementptr inbounds %struct.anon.15, ptr %534, i32 0, i32 1
  %536 = getelementptr inbounds %struct.arm_2d_size_t, ptr %535, i32 0, i32 1
  %537 = load i16, ptr %536, align 2, !tbaa !32
  %538 = sext i16 %537 to i32
  %539 = load i16, ptr %41, align 2, !tbaa !17
  %540 = sext i16 %539 to i32
  %541 = sub nsw i32 %538, %540
  %542 = getelementptr inbounds %struct.arm_2d_region_t, ptr %56, i32 0, i32 0
  %543 = getelementptr inbounds %struct.arm_2d_location_t, ptr %542, i32 0, i32 1
  %544 = load i16, ptr %543, align 2, !tbaa !9
  %545 = sext i16 %544 to i32
  %546 = sub nsw i32 %545, %541
  %547 = trunc i32 %546 to i16
  store i16 %547, ptr %543, align 2, !tbaa !9
  %548 = load i16, ptr %55, align 2, !tbaa !17
  %549 = sext i16 %548 to i32
  %550 = getelementptr inbounds %struct.arm_2d_region_t, ptr %56, i32 0, i32 1
  %551 = getelementptr inbounds %struct.arm_2d_size_t, ptr %550, i32 0, i32 1
  %552 = load i16, ptr %551, align 2, !tbaa !9
  %553 = sext i16 %552 to i32
  %554 = add nsw i32 %553, %549
  %555 = trunc i32 %554 to i16
  store i16 %555, ptr %551, align 2, !tbaa !9
  %556 = load ptr, ptr %5, align 8, !tbaa !5
  %557 = getelementptr inbounds %struct.histogram_t, ptr %556, i32 0, i32 0
  %558 = getelementptr inbounds %struct.anon.15, ptr %557, i32 0, i32 0
  %559 = getelementptr inbounds %struct.histogram_cfg_t, ptr %558, i32 0, i32 0
  %560 = getelementptr inbounds %struct.anon.13, ptr %559, i32 0, i32 6
  %561 = load ptr, ptr %560, align 8, !tbaa !45
  %562 = load ptr, ptr %38, align 8, !tbaa !5
  %563 = getelementptr inbounds %struct.histogram_bin_item_t, ptr %562, i32 0, i32 0
  %564 = getelementptr inbounds %struct.anon.17, ptr %563, i32 0, i32 2
  %565 = load i16, ptr %564, align 2, !tbaa !46
  store i16 %565, ptr %58, align 2, !tbaa !9
  %566 = load i16, ptr %58, align 2, !tbaa !9
  store i16 %566, ptr %57, align 2, !tbaa !9
  %567 = load i8, ptr %8, align 1, !tbaa !9
  %568 = getelementptr inbounds %union.arm_2d_color_rgb565_t, ptr %57, i32 0, i32 0
  %569 = load i16, ptr %568, align 2
  %570 = call i32 @arm_2dp_rgb565_fill_colour_with_vertical_line_mask_and_opacity(ptr noundef null, ptr noundef %46, ptr noundef %56, ptr noundef %561, i16 %569, i8 noundef zeroext %567)
  call void @llvm.lifetime.end.p0(i64 8, ptr %56) #7
  call void @llvm.lifetime.end.p0(i64 2, ptr %55) #7
  br label %571

571:                                              ; preds = %522
  %572 = load ptr, ptr %53, align 8, !tbaa !5
  br label %517, !llvm.loop !47

573:                                              ; preds = %521
  br label %574

574:                                              ; preds = %573
  %575 = call zeroext i1 @arm_2d_op_wait_async(ptr noundef null)
  %576 = zext i1 %575 to i8
  store i8 %576, ptr %59, align 1, !tbaa !49
  %577 = load i8, ptr %59, align 1, !tbaa !49, !range !51, !noundef !52
  %578 = trunc i8 %577 to i1
  br label %503, !llvm.loop !53

579:                                              ; preds = %515
  br label %580

580:                                              ; preds = %579
  br label %433, !llvm.loop !54

581:                                              ; preds = %501, %493
  call void @llvm.lifetime.end.p0(i64 8, ptr %47) #7
  call void @llvm.lifetime.end.p0(i64 24, ptr %46) #7
  br label %582

582:                                              ; preds = %581
  br label %418, !llvm.loop !55

583:                                              ; preds = %431
  br label %600

584:                                              ; preds = %413
  %585 = load ptr, ptr %5, align 8, !tbaa !5
  %586 = getelementptr inbounds %struct.histogram_t, ptr %585, i32 0, i32 0
  %587 = getelementptr inbounds %struct.anon.15, ptr %586, i32 0, i32 0
  %588 = getelementptr inbounds %struct.histogram_cfg_t, ptr %587, i32 0, i32 0
  %589 = getelementptr inbounds %struct.anon.13, ptr %588, i32 0, i32 6
  %590 = load ptr, ptr %589, align 8, !tbaa !45
  %591 = load ptr, ptr %38, align 8, !tbaa !5
  %592 = getelementptr inbounds %struct.histogram_bin_item_t, ptr %591, i32 0, i32 0
  %593 = getelementptr inbounds %struct.anon.17, ptr %592, i32 0, i32 2
  %594 = load i16, ptr %593, align 2, !tbaa !46
  store i16 %594, ptr %61, align 2, !tbaa !9
  %595 = load i16, ptr %61, align 2, !tbaa !9
  store i16 %595, ptr %60, align 2, !tbaa !9
  %596 = load i8, ptr %8, align 1, !tbaa !9
  %597 = getelementptr inbounds %union.arm_2d_color_rgb565_t, ptr %60, i32 0, i32 0
  %598 = load i16, ptr %597, align 2
  %599 = call i32 @arm_2dp_rgb565_fill_colour_with_vertical_line_mask_and_opacity(ptr noundef null, ptr noundef %26, ptr noundef %42, ptr noundef %590, i16 %598, i8 noundef zeroext %596)
  br label %600

600:                                              ; preds = %584, %583
  br label %643

601:                                              ; preds = %402
  %602 = load ptr, ptr %5, align 8, !tbaa !5
  %603 = getelementptr inbounds %struct.histogram_t, ptr %602, i32 0, i32 0
  %604 = getelementptr inbounds %struct.anon.15, ptr %603, i32 0, i32 0
  %605 = getelementptr inbounds %struct.histogram_cfg_t, ptr %604, i32 0, i32 0
  %606 = getelementptr inbounds %struct.anon.13, ptr %605, i32 0, i32 4
  %607 = load i8, ptr %606, align 1
  %608 = lshr i8 %607, 2
  %609 = and i8 %608, 1
  %610 = icmp ne i8 %609, 0
  br i1 %610, label %611, label %633

611:                                              ; preds = %601
  call void @llvm.lifetime.start.p0(i64 4, ptr %62) #7
  %612 = getelementptr inbounds %struct.arm_2d_region_t, ptr %42, i32 0, i32 0
  call void @llvm.memcpy.p0.p0.i64(ptr align 2 %62, ptr align 2 %612, i64 4, i1 false), !tbaa.struct !16
  %613 = load i16, ptr %41, align 2, !tbaa !17
  %614 = sext i16 %613 to i32
  %615 = icmp slt i32 %614, 0
  br i1 %615, label %616, label %624

616:                                              ; preds = %611
  %617 = load i16, ptr %41, align 2, !tbaa !17
  %618 = sext i16 %617 to i32
  %619 = getelementptr inbounds %struct.arm_2d_location_t, ptr %62, i32 0, i32 1
  %620 = load i16, ptr %619, align 2, !tbaa !33
  %621 = sext i16 %620 to i32
  %622 = sub nsw i32 %621, %618
  %623 = trunc i32 %622 to i16
  store i16 %623, ptr %619, align 2, !tbaa !33
  br label %624

624:                                              ; preds = %616, %611
  %625 = load ptr, ptr %38, align 8, !tbaa !5
  %626 = getelementptr inbounds %struct.histogram_bin_item_t, ptr %625, i32 0, i32 0
  %627 = getelementptr inbounds %struct.anon.17, ptr %626, i32 0, i32 2
  %628 = load i16, ptr %627, align 2, !tbaa !46
  %629 = zext i16 %628 to i64
  %630 = load i8, ptr %8, align 1, !tbaa !9
  %631 = load i32, ptr %62, align 2
  %632 = call i32 @arm_2dp_rgb565_draw_point(ptr noundef null, ptr noundef %26, i32 %631, i64 noundef %629, i8 noundef zeroext %630)
  call void @llvm.lifetime.end.p0(i64 4, ptr %62) #7
  br label %642

633:                                              ; preds = %601
  %634 = load ptr, ptr %38, align 8, !tbaa !5
  %635 = getelementptr inbounds %struct.histogram_bin_item_t, ptr %634, i32 0, i32 0
  %636 = getelementptr inbounds %struct.anon.17, ptr %635, i32 0, i32 2
  %637 = load i16, ptr %636, align 2, !tbaa !46
  store i16 %637, ptr %63, align 2, !tbaa !9
  %638 = load i8, ptr %8, align 1, !tbaa !9
  %639 = getelementptr inbounds %union.arm_2d_color_rgb565_t, ptr %63, i32 0, i32 0
  %640 = load i16, ptr %639, align 2
  %641 = call i32 @arm_2dp_rgb565_fill_colour_with_opacity(ptr noundef null, ptr noundef %26, ptr noundef %42, i16 %640, i8 noundef zeroext %638)
  br label %642

642:                                              ; preds = %633, %624
  br label %643

643:                                              ; preds = %642, %600
  %644 = call zeroext i1 @arm_2d_op_wait_async(ptr noundef null)
  %645 = load i16, ptr %36, align 2, !tbaa !17
  %646 = sext i16 %645 to i32
  %647 = load ptr, ptr %5, align 8, !tbaa !5
  %648 = getelementptr inbounds %struct.histogram_t, ptr %647, i32 0, i32 0
  %649 = getelementptr inbounds %struct.anon.15, ptr %648, i32 0, i32 0
  %650 = getelementptr inbounds %struct.histogram_cfg_t, ptr %649, i32 0, i32 0
  %651 = getelementptr inbounds %struct.anon.13, ptr %650, i32 0, i32 3
  %652 = load i8, ptr %651, align 2, !tbaa !56
  %653 = sext i8 %652 to i32
  %654 = add nsw i32 %646, %653
  %655 = getelementptr inbounds %struct.arm_2d_location_t, ptr %35, i32 0, i32 0
  %656 = load i16, ptr %655, align 2, !tbaa !42
  %657 = sext i16 %656 to i32
  %658 = add nsw i32 %657, %654
  %659 = trunc i32 %658 to i16
  store i16 %659, ptr %655, align 2, !tbaa !42
  %660 = load ptr, ptr %38, align 8, !tbaa !5
  %661 = getelementptr inbounds %struct.histogram_bin_item_t, ptr %660, i32 1
  store ptr %661, ptr %38, align 8, !tbaa !5
  call void @llvm.lifetime.end.p0(i64 8, ptr %42) #7
  call void @llvm.lifetime.end.p0(i64 2, ptr %41) #7
  br label %662

662:                                              ; preds = %643
  %663 = load ptr, ptr %37, align 8, !tbaa !5
  %664 = getelementptr inbounds %struct.histogram_bin_item_t, ptr %663, i32 1
  store ptr %664, ptr %37, align 8, !tbaa !5
  %665 = load ptr, ptr %37, align 8, !tbaa !5
  store ptr %665, ptr %38, align 8, !tbaa !5
  %666 = load i64, ptr %40, align 8, !tbaa !37
  %667 = add i64 %666, -1
  store i64 %667, ptr %40, align 8, !tbaa !37
  br label %362, !llvm.loop !57

668:                                              ; preds = %365
  br label %669

669:                                              ; preds = %668
  br label %343, !llvm.loop !58

670:                                              ; preds = %353
  %671 = load ptr, ptr %5, align 8, !tbaa !5
  %672 = getelementptr inbounds %struct.histogram_t, ptr %671, i32 0, i32 0
  %673 = getelementptr inbounds %struct.anon.15, ptr %672, i32 0, i32 2
  %674 = getelementptr inbounds %struct.anon.16, ptr %673, i32 0, i32 0
  %675 = call zeroext i8 @arm_2d_dynamic_dirty_region_wait_next(ptr noundef %674)
  %676 = zext i8 %675 to i32
  switch i32 %676, label %901 [
    i32 0, label %677
    i32 1, label %705
    i32 2, label %902
  ]

677:                                              ; preds = %670
  %678 = load ptr, ptr %5, align 8, !tbaa !5
  %679 = getelementptr inbounds %struct.histogram_t, ptr %678, i32 0, i32 0
  %680 = getelementptr inbounds %struct.anon.15, ptr %679, i32 0, i32 0
  %681 = getelementptr inbounds %struct.histogram_cfg_t, ptr %680, i32 0, i32 0
  %682 = getelementptr inbounds %struct.anon.13, ptr %681, i32 0, i32 2
  %683 = load i16, ptr %682, align 8, !tbaa !36
  %684 = zext i16 %683 to i32
  %685 = icmp sgt i32 %684, 0
  br i1 %685, label %686, label %699

686:                                              ; preds = %677
  %687 = load ptr, ptr %5, align 8, !tbaa !5
  %688 = getelementptr inbounds %struct.histogram_t, ptr %687, i32 0, i32 0
  %689 = getelementptr inbounds %struct.anon.15, ptr %688, i32 0, i32 0
  %690 = getelementptr inbounds %struct.histogram_cfg_t, ptr %689, i32 0, i32 0
  %691 = getelementptr inbounds %struct.anon.13, ptr %690, i32 0, i32 1
  %692 = load ptr, ptr %691, align 8, !tbaa !35
  %693 = icmp ne ptr null, %692
  br i1 %693, label %694, label %699

694:                                              ; preds = %686
  %695 = load ptr, ptr %5, align 8, !tbaa !5
  %696 = getelementptr inbounds %struct.histogram_t, ptr %695, i32 0, i32 0
  %697 = getelementptr inbounds %struct.anon.15, ptr %696, i32 0, i32 2
  %698 = getelementptr inbounds %struct.anon.16, ptr %697, i32 0, i32 1
  store i16 0, ptr %698, align 8, !tbaa !59
  br label %704

699:                                              ; preds = %686, %677
  %700 = load ptr, ptr %5, align 8, !tbaa !5
  %701 = getelementptr inbounds %struct.histogram_t, ptr %700, i32 0, i32 0
  %702 = getelementptr inbounds %struct.anon.15, ptr %701, i32 0, i32 2
  %703 = getelementptr inbounds %struct.anon.16, ptr %702, i32 0, i32 0
  call void @arm_2d_dynamic_dirty_region_change_user_region_index_only(ptr noundef %703, i8 noundef zeroext 2)
  br label %902

704:                                              ; preds = %694
  br label %705

705:                                              ; preds = %704, %670
  call void @llvm.lifetime.start.p0(i64 1, ptr %64) #7
  store i8 0, ptr %64, align 1, !tbaa !49
  call void @llvm.lifetime.start.p0(i64 1, ptr %65) #7
  %706 = load ptr, ptr %5, align 8, !tbaa !5
  %707 = getelementptr inbounds %struct.histogram_t, ptr %706, i32 0, i32 0
  %708 = getelementptr inbounds %struct.anon.15, ptr %707, i32 0, i32 3
  %709 = load i8, ptr %708, align 8
  %710 = lshr i8 %709, 3
  %711 = zext i8 %710 to i32
  %712 = add nsw i32 %711, 1
  %713 = trunc i32 %712 to i8
  store i8 %713, ptr %65, align 1, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %66) #7
  call void @llvm.memset.p0.i64(ptr align 2 %66, i8 0, i64 8, i1 false)
  call void @llvm.lifetime.start.p0(i64 1, ptr %67) #7
  store i8 1, ptr %67, align 1, !tbaa !49
  br label %714

714:                                              ; preds = %899, %705
  call void @llvm.lifetime.start.p0(i64 8, ptr %68) #7
  %715 = load ptr, ptr %5, align 8, !tbaa !5
  %716 = getelementptr inbounds %struct.histogram_t, ptr %715, i32 0, i32 0
  %717 = getelementptr inbounds %struct.anon.15, ptr %716, i32 0, i32 0
  %718 = getelementptr inbounds %struct.histogram_cfg_t, ptr %717, i32 0, i32 0
  %719 = getelementptr inbounds %struct.anon.13, ptr %718, i32 0, i32 1
  %720 = load ptr, ptr %719, align 8, !tbaa !35
  %721 = load ptr, ptr %5, align 8, !tbaa !5
  %722 = getelementptr inbounds %struct.histogram_t, ptr %721, i32 0, i32 0
  %723 = getelementptr inbounds %struct.anon.15, ptr %722, i32 0, i32 2
  %724 = getelementptr inbounds %struct.anon.16, ptr %723, i32 0, i32 1
  %725 = load i16, ptr %724, align 8, !tbaa !59
  %726 = add i16 %725, 1
  store i16 %726, ptr %724, align 8, !tbaa !59
  %727 = zext i16 %725 to i64
  %728 = getelementptr inbounds %struct.histogram_bin_item_t, ptr %720, i64 %727
  store ptr %728, ptr %68, align 8, !tbaa !5
  %729 = load ptr, ptr %68, align 8, !tbaa !5
  %730 = getelementptr inbounds %struct.histogram_bin_item_t, ptr %729, i32 0, i32 0
  %731 = getelementptr inbounds %struct.anon.17, ptr %730, i32 0, i32 0
  %732 = load i16, ptr %731, align 2, !tbaa !39
  %733 = sext i16 %732 to i32
  %734 = load ptr, ptr %68, align 8, !tbaa !5
  %735 = getelementptr inbounds %struct.histogram_bin_item_t, ptr %734, i32 0, i32 0
  %736 = getelementptr inbounds %struct.anon.17, ptr %735, i32 0, i32 1
  %737 = load i16, ptr %736, align 2, !tbaa !60
  %738 = sext i16 %737 to i32
  %739 = icmp ne i32 %733, %738
  br i1 %739, label %740, label %837

740:                                              ; preds = %714
  call void @llvm.lifetime.start.p0(i64 2, ptr %69) #7
  %741 = load ptr, ptr %5, align 8, !tbaa !5
  %742 = getelementptr inbounds %struct.histogram_t, ptr %741, i32 0, i32 0
  %743 = getelementptr inbounds %struct.anon.15, ptr %742, i32 0, i32 0
  %744 = getelementptr inbounds %struct.histogram_cfg_t, ptr %743, i32 0, i32 0
  %745 = getelementptr inbounds %struct.anon.13, ptr %744, i32 0, i32 0
  %746 = getelementptr inbounds %struct.arm_2d_size_t, ptr %745, i32 0, i32 0
  %747 = load i16, ptr %746, align 8, !tbaa !20
  store i16 %747, ptr %69, align 2, !tbaa !17
  call void @llvm.lifetime.start.p0(i64 4, ptr %70) #7
  %748 = getelementptr inbounds %struct.arm_2d_location_t, ptr %70, i32 0, i32 0
  %749 = load i16, ptr %69, align 2, !tbaa !17
  %750 = sext i16 %749 to i32
  %751 = load ptr, ptr %5, align 8, !tbaa !5
  %752 = getelementptr inbounds %struct.histogram_t, ptr %751, i32 0, i32 0
  %753 = getelementptr inbounds %struct.anon.15, ptr %752, i32 0, i32 0
  %754 = getelementptr inbounds %struct.histogram_cfg_t, ptr %753, i32 0, i32 0
  %755 = getelementptr inbounds %struct.anon.13, ptr %754, i32 0, i32 3
  %756 = load i8, ptr %755, align 2, !tbaa !56
  %757 = sext i8 %756 to i32
  %758 = add nsw i32 %750, %757
  %759 = load ptr, ptr %5, align 8, !tbaa !5
  %760 = getelementptr inbounds %struct.histogram_t, ptr %759, i32 0, i32 0
  %761 = getelementptr inbounds %struct.anon.15, ptr %760, i32 0, i32 2
  %762 = getelementptr inbounds %struct.anon.16, ptr %761, i32 0, i32 1
  %763 = load i16, ptr %762, align 8, !tbaa !59
  %764 = zext i16 %763 to i32
  %765 = sub nsw i32 %764, 1
  %766 = mul nsw i32 %758, %765
  %767 = trunc i32 %766 to i16
  store i16 %767, ptr %748, align 2, !tbaa !42
  %768 = getelementptr inbounds %struct.arm_2d_location_t, ptr %70, i32 0, i32 1
  %769 = load ptr, ptr %5, align 8, !tbaa !5
  %770 = getelementptr inbounds %struct.histogram_t, ptr %769, i32 0, i32 0
  %771 = getelementptr inbounds %struct.anon.15, ptr %770, i32 0, i32 1
  %772 = getelementptr inbounds %struct.arm_2d_size_t, ptr %771, i32 0, i32 1
  %773 = load i16, ptr %772, align 2, !tbaa !32
  %774 = sext i16 %773 to i32
  %775 = load ptr, ptr %5, align 8, !tbaa !5
  %776 = getelementptr inbounds %struct.histogram_t, ptr %775, i32 0, i32 0
  %777 = getelementptr inbounds %struct.anon.15, ptr %776, i32 0, i32 0
  %778 = getelementptr inbounds %struct.histogram_cfg_t, ptr %777, i32 0, i32 0
  %779 = getelementptr inbounds %struct.anon.13, ptr %778, i32 0, i32 4
  %780 = load i8, ptr %779, align 1
  %781 = lshr i8 %780, 1
  %782 = and i8 %781, 1
  %783 = icmp ne i8 %782, 0
  %784 = xor i1 %783, true
  %785 = xor i1 %784, true
  %786 = zext i1 %785 to i32
  %787 = ashr i32 %774, %786
  %788 = trunc i32 %787 to i16
  store i16 %788, ptr %768, align 2, !tbaa !33
  call void @llvm.lifetime.start.p0(i64 8, ptr %71) #7
  %789 = getelementptr inbounds %struct.arm_2d_region_t, ptr %71, i32 0, i32 0
  %790 = getelementptr inbounds %struct.arm_2d_location_t, ptr %789, i32 0, i32 0
  %791 = getelementptr inbounds %struct.arm_2d_location_t, ptr %70, i32 0, i32 0
  %792 = load i16, ptr %791, align 2, !tbaa !42
  store i16 %792, ptr %790, align 2, !tbaa !42
  %793 = getelementptr inbounds %struct.arm_2d_location_t, ptr %789, i32 0, i32 1
  %794 = getelementptr inbounds %struct.arm_2d_location_t, ptr %70, i32 0, i32 1
  %795 = load i16, ptr %794, align 2, !tbaa !33
  %796 = sext i16 %795 to i32
  %797 = load ptr, ptr %68, align 8, !tbaa !5
  %798 = getelementptr inbounds %struct.histogram_bin_item_t, ptr %797, i32 0, i32 0
  %799 = getelementptr inbounds %struct.anon.17, ptr %798, i32 0, i32 0
  %800 = load i16, ptr %799, align 2, !tbaa !39
  %801 = sext i16 %800 to i32
  %802 = sub nsw i32 %796, %801
  %803 = trunc i32 %802 to i16
  store i16 %803, ptr %793, align 2, !tbaa !33
  %804 = getelementptr inbounds %struct.arm_2d_region_t, ptr %71, i32 0, i32 1
  %805 = getelementptr inbounds %struct.arm_2d_size_t, ptr %804, i32 0, i32 0
  %806 = load i16, ptr %69, align 2, !tbaa !17
  store i16 %806, ptr %805, align 2, !tbaa !43
  %807 = getelementptr inbounds %struct.arm_2d_size_t, ptr %804, i32 0, i32 1
  store i16 1, ptr %807, align 2, !tbaa !44
  call void @llvm.lifetime.start.p0(i64 8, ptr %72) #7
  %808 = getelementptr inbounds %struct.arm_2d_region_t, ptr %72, i32 0, i32 0
  %809 = getelementptr inbounds %struct.arm_2d_location_t, ptr %808, i32 0, i32 0
  %810 = getelementptr inbounds %struct.arm_2d_location_t, ptr %70, i32 0, i32 0
  %811 = load i16, ptr %810, align 2, !tbaa !42
  store i16 %811, ptr %809, align 2, !tbaa !42
  %812 = getelementptr inbounds %struct.arm_2d_location_t, ptr %808, i32 0, i32 1
  %813 = getelementptr inbounds %struct.arm_2d_location_t, ptr %70, i32 0, i32 1
  %814 = load i16, ptr %813, align 2, !tbaa !33
  %815 = sext i16 %814 to i32
  %816 = load ptr, ptr %68, align 8, !tbaa !5
  %817 = getelementptr inbounds %struct.histogram_bin_item_t, ptr %816, i32 0, i32 0
  %818 = getelementptr inbounds %struct.anon.17, ptr %817, i32 0, i32 1
  %819 = load i16, ptr %818, align 2, !tbaa !60
  %820 = sext i16 %819 to i32
  %821 = sub nsw i32 %815, %820
  %822 = trunc i32 %821 to i16
  store i16 %822, ptr %812, align 2, !tbaa !33
  %823 = getelementptr inbounds %struct.arm_2d_region_t, ptr %72, i32 0, i32 1
  %824 = getelementptr inbounds %struct.arm_2d_size_t, ptr %823, i32 0, i32 0
  %825 = load i16, ptr %69, align 2, !tbaa !17
  store i16 %825, ptr %824, align 2, !tbaa !43
  %826 = getelementptr inbounds %struct.arm_2d_size_t, ptr %823, i32 0, i32 1
  store i16 1, ptr %826, align 2, !tbaa !44
  call void @llvm.lifetime.start.p0(i64 8, ptr %73) #7
  %827 = call ptr @arm_2d_region_get_minimal_enclosure(ptr noundef %72, ptr noundef %71, ptr noundef %73)
  %828 = call zeroext i1 @arm_2d_region_intersect(ptr noundef %73, ptr noundef %31, ptr noundef %73)
  br i1 %828, label %829, label %836

829:                                              ; preds = %740
  store i8 1, ptr %64, align 1, !tbaa !49
  %830 = load i8, ptr %67, align 1, !tbaa !49, !range !51, !noundef !52
  %831 = trunc i8 %830 to i1
  br i1 %831, label %832, label %833

832:                                              ; preds = %829
  store i8 0, ptr %67, align 1, !tbaa !49
  call void @llvm.memcpy.p0.p0.i64(ptr align 2 %66, ptr align 2 %73, i64 8, i1 false), !tbaa.struct !19
  br label %835

833:                                              ; preds = %829
  %834 = call ptr @arm_2d_region_get_minimal_enclosure(ptr noundef %73, ptr noundef %66, ptr noundef %66)
  br label %835

835:                                              ; preds = %833, %832
  br label %836

836:                                              ; preds = %835, %740
  call void @llvm.lifetime.end.p0(i64 8, ptr %73) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %72) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %71) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %70) #7
  call void @llvm.lifetime.end.p0(i64 2, ptr %69) #7
  br label %837

837:                                              ; preds = %836, %714
  call void @llvm.lifetime.start.p0(i64 1, ptr %74) #7
  %838 = load ptr, ptr %5, align 8, !tbaa !5
  %839 = getelementptr inbounds %struct.histogram_t, ptr %838, i32 0, i32 0
  %840 = getelementptr inbounds %struct.anon.15, ptr %839, i32 0, i32 2
  %841 = getelementptr inbounds %struct.anon.16, ptr %840, i32 0, i32 1
  %842 = load i16, ptr %841, align 8, !tbaa !59
  %843 = zext i16 %842 to i32
  %844 = load ptr, ptr %5, align 8, !tbaa !5
  %845 = getelementptr inbounds %struct.histogram_t, ptr %844, i32 0, i32 0
  %846 = getelementptr inbounds %struct.anon.15, ptr %845, i32 0, i32 0
  %847 = getelementptr inbounds %struct.histogram_cfg_t, ptr %846, i32 0, i32 0
  %848 = getelementptr inbounds %struct.anon.13, ptr %847, i32 0, i32 2
  %849 = load i16, ptr %848, align 8, !tbaa !36
  %850 = zext i16 %849 to i32
  %851 = icmp sge i32 %843, %850
  %852 = zext i1 %851 to i8
  store i8 %852, ptr %74, align 1, !tbaa !49
  %853 = load i8, ptr %65, align 1, !tbaa !9
  %854 = add i8 %853, -1
  store i8 %854, ptr %65, align 1, !tbaa !9
  %855 = zext i8 %854 to i32
  %856 = icmp ne i32 %855, 0
  br i1 %856, label %857, label %861

857:                                              ; preds = %837
  %858 = load i8, ptr %74, align 1, !tbaa !49, !range !51, !noundef !52
  %859 = trunc i8 %858 to i1
  br i1 %859, label %861, label %860

860:                                              ; preds = %857
  store i32 43, ptr %12, align 4
  br label %897

861:                                              ; preds = %857, %837
  %862 = load i8, ptr %74, align 1, !tbaa !49, !range !51, !noundef !52
  %863 = trunc i8 %862 to i1
  br i1 %863, label %864, label %878

864:                                              ; preds = %861
  %865 = load i8, ptr %64, align 1, !tbaa !49, !range !51, !noundef !52
  %866 = trunc i8 %865 to i1
  br i1 %866, label %867, label %872

867:                                              ; preds = %864
  %868 = load ptr, ptr %5, align 8, !tbaa !5
  %869 = getelementptr inbounds %struct.histogram_t, ptr %868, i32 0, i32 0
  %870 = getelementptr inbounds %struct.anon.15, ptr %869, i32 0, i32 2
  %871 = getelementptr inbounds %struct.anon.16, ptr %870, i32 0, i32 0
  call void @arm_2d_dynamic_dirty_region_update(ptr noundef %871, ptr noundef %26, ptr noundef %66, i8 noundef zeroext 2)
  br label %877

872:                                              ; preds = %864
  %873 = load ptr, ptr %5, align 8, !tbaa !5
  %874 = getelementptr inbounds %struct.histogram_t, ptr %873, i32 0, i32 0
  %875 = getelementptr inbounds %struct.anon.15, ptr %874, i32 0, i32 2
  %876 = getelementptr inbounds %struct.anon.16, ptr %875, i32 0, i32 0
  call void @arm_2d_dynamic_dirty_region_change_user_region_index_only(ptr noundef %876, i8 noundef zeroext 2)
  br label %877

877:                                              ; preds = %872, %867
  store i32 42, ptr %12, align 4
  br label %897

878:                                              ; preds = %861
  %879 = load i8, ptr %64, align 1, !tbaa !49, !range !51, !noundef !52
  %880 = trunc i8 %879 to i1
  br i1 %880, label %890, label %881

881:                                              ; preds = %878
  %882 = load ptr, ptr %5, align 8, !tbaa !5
  %883 = getelementptr inbounds %struct.histogram_t, ptr %882, i32 0, i32 0
  %884 = getelementptr inbounds %struct.anon.15, ptr %883, i32 0, i32 3
  %885 = load i8, ptr %884, align 8
  %886 = lshr i8 %885, 3
  %887 = zext i8 %886 to i32
  %888 = add nsw i32 %887, 1
  %889 = trunc i32 %888 to i8
  store i8 %889, ptr %65, align 1, !tbaa !9
  store i32 43, ptr %12, align 4
  br label %897

890:                                              ; preds = %878
  br label %891

891:                                              ; preds = %890
  br label %892

892:                                              ; preds = %891
  %893 = load ptr, ptr %5, align 8, !tbaa !5
  %894 = getelementptr inbounds %struct.histogram_t, ptr %893, i32 0, i32 0
  %895 = getelementptr inbounds %struct.anon.15, ptr %894, i32 0, i32 2
  %896 = getelementptr inbounds %struct.anon.16, ptr %895, i32 0, i32 0
  call void @arm_2d_dynamic_dirty_region_update(ptr noundef %896, ptr noundef %26, ptr noundef %66, i8 noundef zeroext 1)
  store i32 42, ptr %12, align 4
  br label %897

897:                                              ; preds = %892, %881, %877, %860
  call void @llvm.lifetime.end.p0(i64 1, ptr %74) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %68) #7
  %898 = load i32, ptr %12, align 4
  switch i32 %898, label %930 [
    i32 43, label %899
    i32 42, label %900
  ]

899:                                              ; preds = %897
  br i1 true, label %714, label %900

900:                                              ; preds = %899, %897
  store i32 41, ptr %12, align 4
  call void @llvm.lifetime.end.p0(i64 1, ptr %67) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %66) #7
  call void @llvm.lifetime.end.p0(i64 1, ptr %65) #7
  call void @llvm.lifetime.end.p0(i64 1, ptr %64) #7
  br label %902

901:                                              ; preds = %670
  br label %902

902:                                              ; preds = %901, %900, %699, %670
  call void @llvm.lifetime.end.p0(i64 2, ptr %36) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %35) #7
  br label %903

903:                                              ; preds = %902
  %904 = load ptr, ptr %33, align 8, !tbaa !5
  br label %302, !llvm.loop !61

905:                                              ; preds = %306
  br label %906

906:                                              ; preds = %905
  %907 = call zeroext i1 @arm_2d_op_wait_async(ptr noundef null)
  %908 = zext i1 %907 to i8
  store i8 %908, ptr %75, align 1, !tbaa !49
  %909 = load i8, ptr %75, align 1, !tbaa !49, !range !51, !noundef !52
  %910 = trunc i8 %909 to i1
  br label %288, !llvm.loop !62

911:                                              ; preds = %300
  br label %912

912:                                              ; preds = %911
  br label %218, !llvm.loop !63

913:                                              ; preds = %286, %278
  call void @llvm.lifetime.end.p0(i64 8, ptr %27) #7
  call void @llvm.lifetime.end.p0(i64 24, ptr %26) #7
  br label %914

914:                                              ; preds = %913
  br label %203, !llvm.loop !64

915:                                              ; preds = %216
  call void @llvm.lifetime.end.p0(i64 8, ptr %22) #7
  br label %916

916:                                              ; preds = %915
  %917 = load ptr, ptr %20, align 8, !tbaa !5
  br label %192, !llvm.loop !65

918:                                              ; preds = %196
  br label %919

919:                                              ; preds = %918
  %920 = call zeroext i1 @arm_2d_op_wait_async(ptr noundef null)
  %921 = zext i1 %920 to i8
  store i8 %921, ptr %76, align 1, !tbaa !49
  %922 = load i8, ptr %76, align 1, !tbaa !49, !range !51, !noundef !52
  %923 = trunc i8 %922 to i1
  br label %178, !llvm.loop !66

924:                                              ; preds = %190
  br label %925

925:                                              ; preds = %924
  br label %97, !llvm.loop !67

926:                                              ; preds = %176, %168
  call void @llvm.lifetime.end.p0(i64 8, ptr %14) #7
  call void @llvm.lifetime.end.p0(i64 24, ptr %13) #7
  br label %927

927:                                              ; preds = %926
  br label %82, !llvm.loop !68

928:                                              ; preds = %95
  %929 = call zeroext i1 @arm_2d_op_wait_async(ptr noundef null)
  ret void

930:                                              ; preds = %897
  unreachable
}

declare ptr @arm_2d_get_default_frame_buffer() #5

declare ptr @arm_2d_tile_generate_child(ptr noundef, ptr noundef, ptr noundef, i1 noundef zeroext) #5

declare i32 @arm_2dp_rgb565_fill_colour_with_vertical_line_mask_and_opacity(ptr noundef, ptr noundef, ptr noundef, ptr noundef, i16, i8 noundef zeroext) #5

declare zeroext i1 @arm_2d_op_wait_async(ptr noundef) #5

declare i32 @arm_2dp_rgb565_draw_point(ptr noundef, ptr noundef, i32, i64 noundef, i8 noundef zeroext) #5

declare i32 @arm_2dp_rgb565_fill_colour_with_opacity(ptr noundef, ptr noundef, ptr noundef, i16, i8 noundef zeroext) #5

declare zeroext i8 @arm_2d_dynamic_dirty_region_wait_next(ptr noundef) #5

declare void @arm_2d_dynamic_dirty_region_change_user_region_index_only(ptr noundef, i8 noundef zeroext) #5

declare ptr @arm_2d_region_get_minimal_enclosure(ptr noundef, ptr noundef, ptr noundef) #5

declare zeroext i1 @arm_2d_region_intersect(ptr noundef, ptr noundef, ptr noundef) #5

declare void @arm_2d_dynamic_dirty_region_update(ptr noundef, ptr noundef, ptr noundef, i8 noundef zeroext) #5

attributes #0 = { noreturn nounwind "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 nounwind willreturn memory(argmem: write) }
attributes #2 = { nocallback nofree nounwind willreturn memory(argmem: readwrite) }
attributes #3 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #4 = { 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 #5 = { "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 #6 = { noreturn nounwind }
attributes #7 = { 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 = !{!7, !7, i64 0}
!10 = !{!11, !7, i64 0}
!11 = !{!"arm_2d_margin_t", !7, i64 0, !7, i64 1, !7, i64 2, !7, i64 3}
!12 = !{!11, !7, i64 1}
!13 = !{!11, !7, i64 2}
!14 = !{!11, !7, i64 3}
!15 = !{i64 0, i64 1, !9, i64 1, i64 1, !9, i64 2, i64 1, !9, i64 3, i64 1, !9}
!16 = !{i64 0, i64 2, !17, i64 2, i64 2, !17}
!17 = !{!18, !18, i64 0}
!18 = !{!"short", !7, i64 0}
!19 = !{i64 0, i64 4, !9, i64 4, i64 4, !9}
!20 = !{!21, !18, i64 0}
!21 = !{!"histogram_t", !22, i64 0}
!22 = !{!"", !23, i64 0, !25, i64 64, !29, i64 72, !7, i64 112, !7, i64 112, !7, i64 113, !26, i64 116}
!23 = !{!"histogram_cfg_t", !24, i64 0, !27, i64 32, !6, i64 40, !28, i64 48}
!24 = !{!"", !25, i64 0, !6, i64 8, !18, i64 16, !7, i64 18, !7, i64 19, !7, i64 19, !7, i64 19, !26, i64 20, !6, i64 24}
!25 = !{!"arm_2d_size_t", !18, i64 0, !18, i64 2}
!26 = !{!"int", !7, i64 0}
!27 = !{!"", !26, i64 0, !26, i64 4}
!28 = !{!"histogram_on_get_bin_value_evt_t", !6, i64 0, !6, i64 8}
!29 = !{!"", !30, i64 0, !18, i64 32}
!30 = !{!"arm_2d_region_list_item_t", !6, i64 0, !7, i64 8, !31, i64 16, !7, i64 24}
!31 = !{!"arm_2d_region_t", !7, i64 0, !7, i64 4}
!32 = !{!21, !18, i64 66}
!33 = !{!34, !18, i64 2}
!34 = !{!"arm_2d_location_t", !18, i64 0, !18, i64 2}
!35 = !{!21, !6, i64 8}
!36 = !{!21, !18, i64 16}
!37 = !{!38, !38, i64 0}
!38 = !{!"long", !7, i64 0}
!39 = !{!40, !18, i64 0}
!40 = !{!"histogram_bin_item_t", !41, i64 0}
!41 = !{!"", !18, i64 0, !18, i64 2, !18, i64 4}
!42 = !{!34, !18, i64 0}
!43 = !{!25, !18, i64 0}
!44 = !{!25, !18, i64 2}
!45 = !{!21, !6, i64 24}
!46 = !{!40, !18, i64 4}
!47 = distinct !{!47, !48}
!48 = !{!"llvm.loop.mustprogress"}
!49 = !{!50, !50, i64 0}
!50 = !{!"_Bool", !7, i64 0}
!51 = !{i8 0, i8 2}
!52 = !{}
!53 = distinct !{!53, !48}
!54 = distinct !{!54, !48}
!55 = distinct !{!55, !48}
!56 = !{!21, !7, i64 18}
!57 = distinct !{!57, !48}
!58 = distinct !{!58, !48}
!59 = !{!21, !18, i64 104}
!60 = !{!40, !18, i64 2}
!61 = distinct !{!61, !48}
!62 = distinct !{!62, !48}
!63 = distinct !{!63, !48}
!64 = distinct !{!64, !48}
!65 = distinct !{!65, !48}
!66 = distinct !{!66, !48}
!67 = distinct !{!67, !48}
!68 = distinct !{!68, !48}


; 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.arm_2d_tile_t = type { %union.anon.4, %union.anon.11, %union.anon.12 }
%union.anon.4 = type { %struct.anon }
%struct.anon = type { i8, %union.arm_2d_color_info_t, %union.anon }
%union.arm_2d_color_info_t = type { %struct.anon.0 }
%struct.anon.0 = type { i8 }
%union.anon = type { i16 }
%union.anon.11 = type { %struct.arm_2d_region_t }
%struct.arm_2d_region_t = type { %union.anon.9, %union.anon.10 }
%union.anon.9 = type { %struct.arm_2d_location_t }
%struct.arm_2d_location_t = type { i16, i16 }
%union.anon.10 = type { %struct.arm_2d_size_t }
%struct.arm_2d_size_t = type { i16, i16 }
%union.anon.12 = type { ptr }
%struct.histogram_bin_item_t = type { %struct.anon.17 }
%struct.anon.17 = type { i16, i16, i16 }

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

; 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: nounwind uwtable
define dso_local void @histogram_show(ptr noundef nonnull %0, ptr noundef %1, ptr noundef readonly %2, i8 noundef zeroext %3) local_unnamed_addr #2 {
  %5 = alloca %struct.arm_2d_tile_t, align 8
  %6 = alloca %struct.arm_2d_region_t, align 8
  %7 = alloca %struct.arm_2d_tile_t, align 8
  %8 = alloca %struct.arm_2d_region_t, align 8
  %9 = alloca %struct.arm_2d_region_t, align 8
  %10 = alloca %struct.arm_2d_region_t, align 8
  %11 = alloca %struct.arm_2d_tile_t, align 8
  %12 = alloca %struct.arm_2d_region_t, align 8
  %13 = alloca %struct.arm_2d_region_t, align 8
  %14 = alloca %struct.arm_2d_region_t, align 8
  %15 = alloca %struct.arm_2d_region_t, align 2
  %16 = alloca %struct.arm_2d_region_t, align 2
  %17 = alloca %struct.arm_2d_region_t, align 8
  %18 = icmp eq ptr %1, null
  %19 = icmp eq ptr %2, null
  %20 = getelementptr inbounds i8, ptr %6, i64 4
  %21 = getelementptr inbounds i8, ptr %0, i64 64
  %22 = getelementptr inbounds i8, ptr %9, i64 4
  %23 = getelementptr inbounds i8, ptr %7, i64 8
  %24 = getelementptr inbounds i8, ptr %0, i64 66
  %25 = getelementptr inbounds i8, ptr %0, i64 19
  %26 = getelementptr inbounds i8, ptr %0, i64 8
  %27 = getelementptr inbounds i8, ptr %0, i64 16
  %28 = getelementptr inbounds i8, ptr %10, i64 2
  %29 = getelementptr inbounds i8, ptr %10, i64 4
  %30 = getelementptr inbounds i8, ptr %10, i64 6
  %31 = getelementptr inbounds i8, ptr %0, i64 24
  %32 = getelementptr inbounds i8, ptr %11, i64 8
  %33 = getelementptr inbounds i8, ptr %13, i64 2
  %34 = getelementptr inbounds i8, ptr %13, i64 6
  %35 = getelementptr inbounds i8, ptr %0, i64 18
  %36 = getelementptr inbounds i8, ptr %0, i64 72
  %37 = getelementptr inbounds i8, ptr %0, i64 104
  %38 = getelementptr inbounds i8, ptr %0, i64 112
  %39 = getelementptr inbounds i8, ptr %15, i64 2
  %40 = getelementptr inbounds i8, ptr %15, i64 4
  %41 = getelementptr inbounds i8, ptr %15, i64 6
  %42 = getelementptr inbounds i8, ptr %16, i64 2
  %43 = getelementptr inbounds i8, ptr %16, i64 4
  %44 = getelementptr inbounds i8, ptr %16, i64 6
  call void @llvm.lifetime.start.p0(i64 24, ptr nonnull %5) #5
  call void @llvm.memset.p0.i64(ptr noundef nonnull align 8 dereferenceable(24) %5, i8 0, i64 24, i1 false)
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %6) #5
  store i64 0, ptr %6, align 8
  br i1 %18, label %45, label %48

45:                                               ; preds = %4
  %46 = tail call ptr @arm_2d_get_default_frame_buffer() #5
  %47 = icmp eq ptr %46, null
  br i1 %47, label %54, label %48

48:                                               ; preds = %45, %4
  %.0161 = phi ptr [ %46, %45 ], [ %1, %4 ]
  br i1 %19, label %49, label %52

49:                                               ; preds = %48
  %50 = getelementptr inbounds i8, ptr %.0161, i64 8
  %51 = load i32, ptr %50, align 4
  store i32 %51, ptr %20, align 4
  br label %.preheader258

52:                                               ; preds = %48
  %53 = load i64, ptr %2, align 2
  store i64 %53, ptr %6, align 8
  br label %.preheader258

54:                                               ; preds = %45
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %6) #5
  br label %.thread241

.preheader258:                                    ; preds = %49, %52
  %55 = call ptr @arm_2d_tile_generate_child(ptr noundef nonnull %.0161, ptr noundef nonnull %6, ptr noundef nonnull %5, i1 noundef zeroext false) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %6) #5
  %56 = load i32, ptr %21, align 8
  %.sroa.4238.0.insert.ext = zext i32 %56 to i64
  %.sroa.4238.0.insert.shift = shl nuw i64 %.sroa.4238.0.insert.ext, 32
  call void @llvm.lifetime.start.p0(i64 24, ptr nonnull %7) #5
  call void @llvm.memset.p0.i64(ptr noundef nonnull align 8 dereferenceable(24) %7, i8 0, i64 24, i1 false)
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %8) #5
  store i64 %.sroa.4238.0.insert.shift, ptr %8, align 8
  %57 = call ptr @arm_2d_tile_generate_child(ptr noundef nonnull %5, ptr noundef nonnull %8, ptr noundef nonnull %7, i1 noundef zeroext false) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %8) #5
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %9) #5
  store i64 0, ptr %9, align 8
  %58 = load i32, ptr %23, align 8
  store i32 %58, ptr %22, align 4
  %59 = load i16, ptr %0, align 8, !tbaa !5
  %60 = load i16, ptr %24, align 2, !tbaa !21
  %61 = load i8, ptr %25, align 1
  %62 = lshr i8 %61, 1
  %.lobit = and i8 %62, 1
  %63 = zext nneg i8 %.lobit to i16
  %64 = ashr i16 %60, %63
  %65 = load i16, ptr %27, align 8, !tbaa !22
  %.not222270 = icmp eq i16 %65, 0
  br i1 %.not222270, label %.loopexit256, label %.lr.ph.preheader

.lr.ph.preheader:                                 ; preds = %.preheader258
  %66 = zext i16 %65 to i64
  %67 = load ptr, ptr %26, align 8, !tbaa !23
  br label %.lr.ph

.loopexit256:                                     ; preds = %107, %.preheader258
  %68 = call zeroext i8 @arm_2d_dynamic_dirty_region_wait_next(ptr noundef nonnull %36) #5
  switch i8 %68, label %.critedge [
    i8 0, label %115
    i8 1, label %.loopexit256._crit_edge
  ]

.loopexit256._crit_edge:                          ; preds = %.loopexit256
  %.pre.pre = load i16, ptr %37, align 8, !tbaa !24
  br label %120

.lr.ph:                                           ; preds = %.lr.ph.preheader, %107
  %.sroa.065.9274 = phi i16 [ %112, %107 ], [ 0, %.lr.ph.preheader ]
  %.1193273 = phi ptr [ %113, %107 ], [ %67, %.lr.ph.preheader ]
  %.0196271 = phi i64 [ %114, %107 ], [ %66, %.lr.ph.preheader ]
  %69 = load i16, ptr %.1193273, align 2, !tbaa !25
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %10) #5
  store i16 %.sroa.065.9274, ptr %10, align 8, !tbaa !28
  %70 = call i16 @llvm.smax.i16(i16 %69, i16 0)
  %71 = sub i16 %64, %70
  store i16 %71, ptr %28, align 2, !tbaa !30
  store i16 %59, ptr %29, align 4, !tbaa !31
  %72 = call i16 @llvm.abs.i16(i16 %69, i1 false)
  store i16 %72, ptr %30, align 2, !tbaa !32
  %73 = load i8, ptr %25, align 1
  %74 = and i8 %73, 1
  %.not223 = icmp eq i8 %74, 0
  br i1 %.not223, label %95, label %75

75:                                               ; preds = %.lr.ph
  %76 = icmp sgt i16 %69, 0
  br i1 %76, label %.preheader, label %90

.preheader:                                       ; preds = %75
  %77 = getelementptr inbounds i8, ptr %.1193273, i64 4
  call void @llvm.lifetime.start.p0(i64 24, ptr nonnull %11) #5
  call void @llvm.memset.p0.i64(ptr noundef nonnull align 8 dereferenceable(24) %11, i8 0, i64 24, i1 false)
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %12) #5
  %78 = load i64, ptr %10, align 8
  store i64 %78, ptr %12, align 8
  %79 = call ptr @arm_2d_tile_generate_child(ptr noundef nonnull %7, ptr noundef nonnull %12, ptr noundef nonnull %11, i1 noundef zeroext false) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %12) #5
  %80 = load i32, ptr %32, align 8
  %.sroa.4.0.insert.ext233 = zext i32 %80 to i64
  %.sroa.4.0.insert.shift234 = shl nuw i64 %.sroa.4.0.insert.ext233, 32
  %81 = load i16, ptr %24, align 2, !tbaa !21
  %82 = sub i16 %81, %69
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %13) #5
  store i64 %.sroa.4.0.insert.shift234, ptr %13, align 8
  %.neg = sub i16 %69, %81
  store i16 %.neg, ptr %33, align 2, !tbaa !33
  %83 = lshr i32 %80, 16
  %84 = trunc nuw i32 %83 to i16
  %85 = add i16 %82, %84
  store i16 %85, ptr %34, align 2, !tbaa !33
  %86 = load ptr, ptr %31, align 8, !tbaa !34
  %87 = load i16, ptr %77, align 2, !tbaa !35
  %88 = call i32 @arm_2dp_rgb565_fill_colour_with_vertical_line_mask_and_opacity(ptr noundef null, ptr noundef nonnull %11, ptr noundef nonnull %13, ptr noundef %86, i16 %87, i8 noundef zeroext %3) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %13) #5
  %89 = call zeroext i1 @arm_2d_op_wait_async(ptr noundef null) #5
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %11) #5
  br label %107

90:                                               ; preds = %75
  %91 = load ptr, ptr %31, align 8, !tbaa !34
  %92 = getelementptr inbounds i8, ptr %.1193273, i64 4
  %93 = load i16, ptr %92, align 2, !tbaa !35
  %94 = call i32 @arm_2dp_rgb565_fill_colour_with_vertical_line_mask_and_opacity(ptr noundef null, ptr noundef nonnull %7, ptr noundef nonnull %10, ptr noundef %91, i16 %93, i8 noundef zeroext %3) #5
  br label %107

95:                                               ; preds = %.lr.ph
  %96 = and i8 %73, 4
  %.not224 = icmp eq i8 %96, 0
  br i1 %.not224, label %103, label %97

97:                                               ; preds = %95
  %98 = call i16 @llvm.smin.i16(i16 %69, i16 0)
  %spec.select = sub i16 %71, %98
  %99 = getelementptr inbounds i8, ptr %.1193273, i64 4
  %100 = load i16, ptr %99, align 2, !tbaa !35
  %101 = zext i16 %100 to i64
  %.sroa.4.0.insert.ext = zext i16 %spec.select to i32
  %.sroa.4.0.insert.shift = shl nuw i32 %.sroa.4.0.insert.ext, 16
  %.sroa.019.0.insert.ext = zext i16 %.sroa.065.9274 to i32
  %.sroa.019.0.insert.insert = or disjoint i32 %.sroa.4.0.insert.shift, %.sroa.019.0.insert.ext
  %102 = call i32 @arm_2dp_rgb565_draw_point(ptr noundef null, ptr noundef nonnull %7, i32 %.sroa.019.0.insert.insert, i64 noundef %101, i8 noundef zeroext %3) #5
  br label %107

103:                                              ; preds = %95
  %104 = getelementptr inbounds i8, ptr %.1193273, i64 4
  %105 = load i16, ptr %104, align 2, !tbaa !35
  %106 = call i32 @arm_2dp_rgb565_fill_colour_with_opacity(ptr noundef null, ptr noundef nonnull %7, ptr noundef nonnull %10, i16 %105, i8 noundef zeroext %3) #5
  br label %107

107:                                              ; preds = %.preheader, %97, %103, %90
  %108 = call zeroext i1 @arm_2d_op_wait_async(ptr noundef null) #5
  %109 = load i8, ptr %35, align 2, !tbaa !36
  %110 = sext i8 %109 to i16
  %111 = add i16 %.sroa.065.9274, %59
  %112 = add i16 %111, %110
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %10) #5
  %113 = getelementptr inbounds i8, ptr %.1193273, i64 6
  %114 = add nsw i64 %.0196271, -1
  %.not222 = icmp eq i64 %114, 0
  br i1 %.not222, label %.loopexit256, label %.lr.ph, !llvm.loop !37

115:                                              ; preds = %.loopexit256
  %116 = load i16, ptr %27, align 8, !tbaa !22
  %.not215 = icmp eq i16 %116, 0
  br i1 %.not215, label %119, label %117

117:                                              ; preds = %115
  %118 = load ptr, ptr %26, align 8, !tbaa !23
  %.not216 = icmp eq ptr %118, null
  br i1 %.not216, label %119, label %120

119:                                              ; preds = %117, %115
  call void @arm_2d_dynamic_dirty_region_change_user_region_index_only(ptr noundef nonnull %36, i8 noundef zeroext 2) #5
  br label %.critedge

120:                                              ; preds = %117, %.loopexit256._crit_edge
  %.pre = phi i16 [ %.pre.pre, %.loopexit256._crit_edge ], [ 0, %117 ]
  %121 = load i8, ptr %38, align 8
  %122 = lshr i8 %121, 3
  %narrow = add nuw nsw i8 %122, 1
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %14) #5
  store i64 0, ptr %14, align 8
  br label %123

123:                                              ; preds = %.backedge, %120
  %124 = phi i16 [ %.pre, %120 ], [ %154, %.backedge ]
  %.0158 = phi i8 [ 0, %120 ], [ %.2160, %.backedge ]
  %.0156 = phi i8 [ %narrow, %120 ], [ %.0156.be, %.backedge ]
  %.0153 = phi i1 [ true, %120 ], [ %.2155, %.backedge ]
  %125 = load ptr, ptr %26, align 8, !tbaa !23
  %126 = add i16 %124, 1
  store i16 %126, ptr %37, align 8, !tbaa !24
  %127 = zext i16 %124 to i64
  %128 = getelementptr inbounds %struct.histogram_bin_item_t, ptr %125, i64 %127
  %129 = load i16, ptr %128, align 2, !tbaa !25
  %130 = getelementptr inbounds i8, ptr %128, i64 2
  %131 = load i16, ptr %130, align 2, !tbaa !39
  %.not217 = icmp eq i16 %129, %131
  br i1 %.not217, label %153, label %132

132:                                              ; preds = %123
  %133 = load i16, ptr %0, align 8, !tbaa !5
  %134 = load i8, ptr %35, align 2, !tbaa !36
  %135 = sext i8 %134 to i16
  %136 = add i16 %133, %135
  %137 = mul i16 %136, %124
  %138 = load i16, ptr %24, align 2, !tbaa !21
  %139 = load i8, ptr %25, align 1
  %140 = lshr i8 %139, 1
  %.lobit218 = and i8 %140, 1
  %141 = zext nneg i8 %.lobit218 to i16
  %142 = ashr i16 %138, %141
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %15) #5
  store i16 %137, ptr %15, align 2, !tbaa !28
  %143 = sub i16 %142, %129
  store i16 %143, ptr %39, align 2, !tbaa !30
  store i16 %133, ptr %40, align 2, !tbaa !31
  store i16 1, ptr %41, align 2, !tbaa !32
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %16) #5
  store i16 %137, ptr %16, align 2, !tbaa !28
  %144 = sub i16 %142, %131
  store i16 %144, ptr %42, align 2, !tbaa !30
  store i16 %133, ptr %43, align 2, !tbaa !31
  store i16 1, ptr %44, align 2, !tbaa !32
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %17) #5
  %145 = call ptr @arm_2d_region_get_minimal_enclosure(ptr noundef nonnull %16, ptr noundef nonnull %15, ptr noundef nonnull %17) #5
  %146 = call zeroext i1 @arm_2d_region_intersect(ptr noundef nonnull %17, ptr noundef nonnull %9, ptr noundef nonnull %17) #5
  br i1 %146, label %147, label %152

147:                                              ; preds = %132
  br i1 %.0153, label %148, label %150

148:                                              ; preds = %147
  %149 = load i64, ptr %17, align 8
  store i64 %149, ptr %14, align 8
  br label %152

150:                                              ; preds = %147
  %151 = call ptr @arm_2d_region_get_minimal_enclosure(ptr noundef nonnull %17, ptr noundef nonnull %14, ptr noundef nonnull %14) #5
  br label %152

152:                                              ; preds = %148, %150, %132
  %.1159 = phi i8 [ 1, %148 ], [ 1, %150 ], [ %.0158, %132 ]
  %.1154 = phi i1 [ false, %148 ], [ false, %150 ], [ %.0153, %132 ]
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %17) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %16) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %15) #5
  %.pre298 = load i16, ptr %37, align 8, !tbaa !24
  br label %153

153:                                              ; preds = %152, %123
  %154 = phi i16 [ %.pre298, %152 ], [ %126, %123 ]
  %.2160 = phi i8 [ %.1159, %152 ], [ %.0158, %123 ]
  %.2155 = phi i1 [ %.1154, %152 ], [ %.0153, %123 ]
  %155 = load i16, ptr %27, align 8, !tbaa !22
  %.not219 = icmp uge i16 %154, %155
  %156 = add i8 %.0156, -1
  %.not220 = icmp eq i8 %156, 0
  %brmerge = select i1 %.not220, i1 true, i1 %.not219
  br i1 %brmerge, label %157, label %.backedge

.backedge:                                        ; preds = %153, %163
  %.0156.be = phi i8 [ %156, %153 ], [ %narrow221, %163 ]
  br label %123

157:                                              ; preds = %153
  %158 = trunc nuw i8 %.2160 to i1
  br i1 %.not219, label %159, label %162

159:                                              ; preds = %157
  br i1 %158, label %160, label %161

160:                                              ; preds = %159
  call void @arm_2d_dynamic_dirty_region_update(ptr noundef nonnull %36, ptr noundef nonnull %7, ptr noundef nonnull %14, i8 noundef zeroext 2) #5
  br label %167

161:                                              ; preds = %159
  call void @arm_2d_dynamic_dirty_region_change_user_region_index_only(ptr noundef nonnull %36, i8 noundef zeroext 2) #5
  br label %167

162:                                              ; preds = %157
  br i1 %158, label %166, label %163

163:                                              ; preds = %162
  %164 = load i8, ptr %38, align 8
  %165 = lshr i8 %164, 3
  %narrow221 = add nuw nsw i8 %165, 1
  br label %.backedge

166:                                              ; preds = %162
  call void @arm_2d_dynamic_dirty_region_update(ptr noundef nonnull %36, ptr noundef nonnull %7, ptr noundef nonnull %14, i8 noundef zeroext 1) #5
  br label %167

167:                                              ; preds = %166, %161, %160
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %14) #5
  br label %.critedge

.critedge:                                        ; preds = %.loopexit256, %167, %119
  %168 = call zeroext i1 @arm_2d_op_wait_async(ptr noundef null) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %9) #5
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %7) #5
  %169 = call zeroext i1 @arm_2d_op_wait_async(ptr noundef null) #5
  br label %.thread241

.thread241:                                       ; preds = %.critedge, %54
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %5) #5
  %170 = call zeroext i1 @arm_2d_op_wait_async(ptr noundef null) #5
  ret void
}

declare ptr @arm_2d_get_default_frame_buffer() local_unnamed_addr #3

declare ptr @arm_2d_tile_generate_child(ptr noundef, ptr noundef, ptr noundef, i1 noundef zeroext) local_unnamed_addr #3

declare i32 @arm_2dp_rgb565_fill_colour_with_vertical_line_mask_and_opacity(ptr noundef, ptr noundef, ptr noundef, ptr noundef, i16, i8 noundef zeroext) local_unnamed_addr #3

declare zeroext i1 @arm_2d_op_wait_async(ptr noundef) local_unnamed_addr #3

declare i32 @arm_2dp_rgb565_draw_point(ptr noundef, ptr noundef, i32, i64 noundef, i8 noundef zeroext) local_unnamed_addr #3

declare i32 @arm_2dp_rgb565_fill_colour_with_opacity(ptr noundef, ptr noundef, ptr noundef, i16, i8 noundef zeroext) local_unnamed_addr #3

declare zeroext i8 @arm_2d_dynamic_dirty_region_wait_next(ptr noundef) local_unnamed_addr #3

declare void @arm_2d_dynamic_dirty_region_change_user_region_index_only(ptr noundef, i8 noundef zeroext) local_unnamed_addr #3

declare ptr @arm_2d_region_get_minimal_enclosure(ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #3

declare zeroext i1 @arm_2d_region_intersect(ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #3

declare void @arm_2d_dynamic_dirty_region_update(ptr noundef, ptr noundef, ptr noundef, i8 noundef zeroext) local_unnamed_addr #3

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

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare i16 @llvm.abs.i16(i16, i1 immarg) #4

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

attributes #0 = { mustprogress nocallback nofree nounwind willreturn memory(argmem: write) }
attributes #1 = { mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #2 = { 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 #3 = { "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 #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, !11, i64 0}
!6 = !{!"histogram_t", !7, i64 0}
!7 = !{!"", !8, i64 0, !10, i64 64, !18, i64 72, !12, i64 112, !12, i64 112, !12, i64 113, !15, i64 116}
!8 = !{!"histogram_cfg_t", !9, i64 0, !16, i64 32, !14, i64 40, !17, i64 48}
!9 = !{!"", !10, i64 0, !14, i64 8, !11, i64 16, !12, i64 18, !12, i64 19, !12, i64 19, !12, i64 19, !15, i64 20, !14, i64 24}
!10 = !{!"arm_2d_size_t", !11, i64 0, !11, i64 2}
!11 = !{!"short", !12, i64 0}
!12 = !{!"omnipotent char", !13, i64 0}
!13 = !{!"Simple C/C++ TBAA"}
!14 = !{!"any pointer", !12, i64 0}
!15 = !{!"int", !12, i64 0}
!16 = !{!"", !15, i64 0, !15, i64 4}
!17 = !{!"histogram_on_get_bin_value_evt_t", !14, i64 0, !14, i64 8}
!18 = !{!"", !19, i64 0, !11, i64 32}
!19 = !{!"arm_2d_region_list_item_t", !14, i64 0, !12, i64 8, !20, i64 16, !12, i64 24}
!20 = !{!"arm_2d_region_t", !12, i64 0, !12, i64 4}
!21 = !{!6, !11, i64 66}
!22 = !{!6, !11, i64 16}
!23 = !{!6, !14, i64 8}
!24 = !{!6, !11, i64 104}
!25 = !{!26, !11, i64 0}
!26 = !{!"histogram_bin_item_t", !27, i64 0}
!27 = !{!"", !11, i64 0, !11, i64 2, !11, i64 4}
!28 = !{!29, !11, i64 0}
!29 = !{!"arm_2d_location_t", !11, i64 0, !11, i64 2}
!30 = !{!29, !11, i64 2}
!31 = !{!10, !11, i64 0}
!32 = !{!10, !11, i64 2}
!33 = !{!12, !12, i64 0}
!34 = !{!6, !14, i64 24}
!35 = !{!26, !11, i64 4}
!36 = !{!6, !12, i64 18}
!37 = distinct !{!37, !38}
!38 = !{!"llvm.loop.mustprogress"}
!39 = !{!26, !11, i64 2}


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