; LLVM IR from ARM-software/Arm-2D :: Helper/Source/arm_2d_helper_shape.ll_ (draw_round_corner_border)

; 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_border_opacity_t = type { i8, i8, i8, i8 }
%struct.arm_2d_corner_opacity_t = type { i8, i8, i8, i8 }
%struct.arm_2d_margin_t = type { i8, i8, i8, i8 }
%struct.arm_2d_tile_t = type { %union.anon, %union.anon.9, %union.anon.12 }
%union.anon = type { %struct.anon }
%struct.anon = type { i8, %union.arm_2d_color_info_t, %union.anon.2 }
%union.arm_2d_color_info_t = type { %struct.anon.0 }
%struct.anon.0 = type { i8 }
%union.anon.2 = type { i16 }
%union.anon.9 = type { %struct.arm_2d_region_t }
%struct.arm_2d_region_t = type { %union.anon.10, %union.anon.11 }
%union.anon.10 = type { %struct.arm_2d_location_t }
%struct.arm_2d_location_t = type { i16, i16 }
%union.anon.11 = 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 }

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

; 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) #1

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

declare ptr @arm_2d_get_default_frame_buffer() #3

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

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

declare zeroext i1 @arm_2d_helper_pfb_is_region_being_drawing(ptr noundef, ptr noundef, ptr noundef) #3

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

declare zeroext i1 @arm_2d_op_wait_async(ptr noundef) #3

; Function Attrs: nounwind uwtable
define dso_local void @__draw_round_corner_border(ptr noundef nonnull %0, ptr noundef %1, i16 noundef zeroext %2, i32 %3, i32 %4, ptr noundef %5) #4 {
  %7 = alloca %struct.arm_2d_border_opacity_t, align 1
  %8 = alloca %struct.arm_2d_corner_opacity_t, align 1
  %9 = alloca ptr, align 8
  %10 = alloca ptr, align 8
  %11 = alloca i16, align 2
  %12 = alloca ptr, align 8
  %13 = alloca %struct.arm_2d_margin_t, align 1
  %14 = alloca ptr, align 8
  %15 = alloca %struct.arm_2d_margin_t, align 1
  %16 = alloca i32, align 4
  %17 = alloca %struct.arm_2d_tile_t, align 8
  %18 = alloca ptr, align 8
  %19 = alloca %struct.arm_2d_region_t, align 2
  %20 = alloca ptr, align 8
  %21 = alloca ptr, align 8
  %22 = alloca %struct.arm_2d_region_t, align 2
  %23 = alloca ptr, align 8
  %24 = alloca ptr, align 8
  %25 = alloca ptr, align 8
  %26 = alloca i16, align 2
  %27 = alloca i16, align 2
  %28 = alloca %struct.arm_2d_tile_t, align 8
  %29 = alloca %struct.arm_2d_tile_t, align 8
  %30 = alloca %struct.arm_2d_tile_t, align 8
  %31 = alloca %struct.arm_2d_tile_t, align 8
  %32 = alloca %struct.arm_2d_tile_t, align 8
  %33 = alloca %struct.arm_2d_region_t, align 2
  %34 = alloca ptr, align 8
  %35 = alloca %struct.arm_2d_region_t, align 2
  %36 = alloca ptr, align 8
  %37 = alloca %union.arm_2d_color_rgb565_t, align 2
  %38 = alloca i8, align 1
  %39 = alloca %struct.arm_2d_region_t, align 2
  %40 = alloca ptr, align 8
  %41 = alloca %struct.arm_2d_region_t, align 2
  %42 = alloca ptr, align 8
  %43 = alloca i16, align 2
  %44 = alloca %union.arm_2d_color_rgb565_t, align 2
  %45 = alloca i8, align 1
  %46 = alloca %struct.arm_2d_region_t, align 2
  %47 = alloca ptr, align 8
  %48 = alloca %struct.arm_2d_region_t, align 2
  %49 = alloca ptr, align 8
  %50 = alloca i16, align 2
  %51 = alloca %union.arm_2d_color_rgb565_t, align 2
  %52 = alloca i8, align 1
  %53 = alloca %struct.arm_2d_region_t, align 2
  %54 = alloca ptr, align 8
  %55 = alloca %struct.arm_2d_region_t, align 2
  %56 = alloca ptr, align 8
  %57 = alloca i16, align 2
  %58 = alloca %union.arm_2d_color_rgb565_t, align 2
  %59 = alloca i8, align 1
  %60 = alloca %struct.arm_2d_region_t, align 2
  %61 = alloca ptr, align 8
  %62 = alloca %struct.arm_2d_region_t, align 2
  %63 = alloca ptr, align 8
  %64 = alloca i16, align 2
  %65 = alloca %struct.arm_2d_region_t, align 2
  %66 = alloca ptr, align 8
  %67 = alloca %struct.arm_2d_region_t, align 2
  %68 = alloca ptr, align 8
  %69 = alloca i16, align 2
  %70 = alloca %union.arm_2d_color_rgb565_t, align 2
  %71 = alloca %union.arm_2d_color_rgb565_t, align 2
  %72 = alloca i8, align 1
  %73 = alloca %struct.arm_2d_region_t, align 2
  %74 = alloca ptr, align 8
  %75 = alloca %struct.arm_2d_region_t, align 2
  %76 = alloca ptr, align 8
  %77 = alloca i16, align 2
  %78 = alloca %union.arm_2d_color_rgb565_t, align 2
  %79 = alloca %union.arm_2d_color_rgb565_t, align 2
  %80 = alloca i8, align 1
  %81 = alloca i8, align 1
  %82 = alloca %struct.arm_2d_region_t, align 2
  %83 = alloca ptr, align 8
  %84 = alloca %struct.arm_2d_region_t, align 2
  %85 = alloca ptr, align 8
  %86 = alloca i16, align 2
  %87 = alloca %struct.arm_2d_region_t, align 2
  %88 = alloca ptr, align 8
  %89 = alloca %struct.arm_2d_region_t, align 2
  %90 = alloca ptr, align 8
  %91 = alloca i16, align 2
  %92 = alloca %union.arm_2d_color_rgb565_t, align 2
  %93 = alloca %union.arm_2d_color_rgb565_t, align 2
  %94 = alloca i8, align 1
  %95 = alloca %struct.arm_2d_region_t, align 2
  %96 = alloca ptr, align 8
  %97 = alloca %struct.arm_2d_region_t, align 2
  %98 = alloca ptr, align 8
  %99 = alloca i16, align 2
  %100 = alloca %union.arm_2d_color_rgb565_t, align 2
  %101 = alloca %union.arm_2d_color_rgb565_t, align 2
  %102 = alloca i8, align 1
  %103 = alloca i8, align 1
  %104 = alloca i8, align 1
  store i32 %3, ptr %7, align 1
  store i32 %4, ptr %8, align 1
  store ptr %0, ptr %9, align 8, !tbaa !5
  store ptr %1, ptr %10, align 8, !tbaa !5
  store i16 %2, ptr %11, align 2, !tbaa !9
  store ptr %5, ptr %12, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %13) #5
  call void @llvm.lifetime.start.p0(i64 8, ptr %14) #5
  store ptr null, ptr %14, align 8, !tbaa !5
  br label %105

105:                                              ; preds = %973, %6
  %106 = load ptr, ptr %14, align 8, !tbaa !5
  %107 = getelementptr inbounds %struct.arm_2d_margin_t, ptr %106, i32 1
  store ptr %107, ptr %14, align 8, !tbaa !5
  %108 = icmp eq ptr %106, null
  br i1 %108, label %109, label %114

109:                                              ; preds = %105
  %110 = getelementptr inbounds %struct.arm_2d_margin_t, ptr %15, i32 0, i32 0
  store i8 0, ptr %110, align 1, !tbaa !11
  %111 = getelementptr inbounds %struct.arm_2d_margin_t, ptr %15, i32 0, i32 1
  store i8 0, ptr %111, align 1, !tbaa !13
  %112 = getelementptr inbounds %struct.arm_2d_margin_t, ptr %15, i32 0, i32 2
  store i8 0, ptr %112, align 1, !tbaa !14
  %113 = getelementptr inbounds %struct.arm_2d_margin_t, ptr %15, i32 0, i32 3
  store i8 0, ptr %113, align 1, !tbaa !15
  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %13, ptr align 1 %15, i64 4, i1 false), !tbaa.struct !16
  br label %115

114:                                              ; preds = %105
  br label %115

115:                                              ; preds = %114, %109
  %116 = phi i32 [ 1, %109 ], [ 0, %114 ]
  %117 = icmp ne i32 %116, 0
  br i1 %117, label %119, label %118

118:                                              ; preds = %115
  store i32 2, ptr %16, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %14) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %13) #5
  br label %974

119:                                              ; preds = %115
  call void @llvm.lifetime.start.p0(i64 24, ptr %17) #5
  call void @llvm.memset.p0.i64(ptr align 8 %17, i8 0, i64 24, i1 false)
  call void @llvm.lifetime.start.p0(i64 8, ptr %18) #5
  store ptr null, ptr %18, align 8, !tbaa !5
  br label %120

120:                                              ; preds = %971, %119
  %121 = load ptr, ptr %18, align 8, !tbaa !5
  %122 = getelementptr inbounds %struct.arm_2d_tile_t, ptr %121, i32 1
  store ptr %122, ptr %18, align 8, !tbaa !5
  %123 = icmp eq ptr %121, null
  br i1 %123, label %124, label %195

124:                                              ; preds = %120
  call void @llvm.lifetime.start.p0(i64 8, ptr %19) #5
  call void @llvm.memset.p0.i64(ptr align 2 %19, i8 0, i64 8, i1 false)
  call void @llvm.lifetime.start.p0(i64 8, ptr %20) #5
  %125 = load ptr, ptr %9, align 8, !tbaa !5
  store ptr %125, ptr %20, align 8, !tbaa !5
  %126 = load ptr, ptr %20, align 8, !tbaa !5
  %127 = icmp eq ptr null, %126
  br i1 %127, label %128, label %134

128:                                              ; preds = %124
  %129 = call ptr @arm_2d_get_default_frame_buffer()
  store ptr %129, ptr %20, align 8, !tbaa !5
  %130 = load ptr, ptr %20, align 8, !tbaa !5
  %131 = icmp eq ptr null, %130
  br i1 %131, label %132, label %133

132:                                              ; preds = %128
  store i32 4, ptr %16, align 4
  br label %191

133:                                              ; preds = %128
  br label %134

134:                                              ; preds = %133, %124
  %135 = load ptr, ptr %10, align 8, !tbaa !5
  %136 = icmp eq ptr null, %135
  br i1 %136, label %137, label %142

137:                                              ; preds = %134
  %138 = getelementptr inbounds %struct.arm_2d_region_t, ptr %19, i32 0, i32 1
  %139 = load ptr, ptr %20, align 8, !tbaa !5
  %140 = getelementptr inbounds %struct.arm_2d_tile_t, ptr %139, i32 0, i32 1
  %141 = getelementptr inbounds %struct.arm_2d_region_t, ptr %140, i32 0, i32 1
  call void @llvm.memcpy.p0.p0.i64(ptr align 2 %138, ptr align 4 %141, i64 4, i1 false), !tbaa.struct !18
  br label %144

142:                                              ; preds = %134
  %143 = load ptr, ptr %10, align 8, !tbaa !5
  call void @llvm.memcpy.p0.p0.i64(ptr align 2 %19, ptr align 2 %143, i64 8, i1 false), !tbaa.struct !19
  br label %144

144:                                              ; preds = %142, %137
  %145 = getelementptr inbounds %struct.arm_2d_margin_t, ptr %13, i32 0, i32 0
  %146 = load i8, ptr %145, align 1, !tbaa !11
  %147 = zext i8 %146 to i32
  %148 = getelementptr inbounds %struct.arm_2d_region_t, ptr %19, i32 0, i32 0
  %149 = getelementptr inbounds %struct.arm_2d_location_t, ptr %148, i32 0, i32 0
  %150 = load i16, ptr %149, align 2, !tbaa !17
  %151 = sext i16 %150 to i32
  %152 = add nsw i32 %151, %147
  %153 = trunc i32 %152 to i16
  store i16 %153, ptr %149, align 2, !tbaa !17
  %154 = getelementptr inbounds %struct.arm_2d_margin_t, ptr %13, i32 0, i32 2
  %155 = load i8, ptr %154, align 1, !tbaa !14
  %156 = zext i8 %155 to i32
  %157 = getelementptr inbounds %struct.arm_2d_region_t, ptr %19, i32 0, i32 0
  %158 = getelementptr inbounds %struct.arm_2d_location_t, ptr %157, i32 0, i32 1
  %159 = load i16, ptr %158, align 2, !tbaa !17
  %160 = sext i16 %159 to i32
  %161 = add nsw i32 %160, %156
  %162 = trunc i32 %161 to i16
  store i16 %162, ptr %158, align 2, !tbaa !17
  %163 = getelementptr inbounds %struct.arm_2d_margin_t, ptr %13, i32 0, i32 0
  %164 = load i8, ptr %163, align 1, !tbaa !11
  %165 = zext i8 %164 to i32
  %166 = getelementptr inbounds %struct.arm_2d_margin_t, ptr %13, i32 0, i32 1
  %167 = load i8, ptr %166, align 1, !tbaa !13
  %168 = zext i8 %167 to i32
  %169 = add nsw i32 %165, %168
  %170 = getelementptr inbounds %struct.arm_2d_region_t, ptr %19, i32 0, i32 1
  %171 = getelementptr inbounds %struct.arm_2d_size_t, ptr %170, i32 0, i32 0
  %172 = load i16, ptr %171, align 2, !tbaa !17
  %173 = sext i16 %172 to i32
  %174 = sub nsw i32 %173, %169
  %175 = trunc i32 %174 to i16
  store i16 %175, ptr %171, align 2, !tbaa !17
  %176 = getelementptr inbounds %struct.arm_2d_margin_t, ptr %13, i32 0, i32 2
  %177 = load i8, ptr %176, align 1, !tbaa !14
  %178 = zext i8 %177 to i32
  %179 = getelementptr inbounds %struct.arm_2d_margin_t, ptr %13, i32 0, i32 3
  %180 = load i8, ptr %179, align 1, !tbaa !15
  %181 = zext i8 %180 to i32
  %182 = add nsw i32 %178, %181
  %183 = getelementptr inbounds %struct.arm_2d_region_t, ptr %19, i32 0, i32 1
  %184 = getelementptr inbounds %struct.arm_2d_size_t, ptr %183, i32 0, i32 1
  %185 = load i16, ptr %184, align 2, !tbaa !17
  %186 = sext i16 %185 to i32
  %187 = sub nsw i32 %186, %182
  %188 = trunc i32 %187 to i16
  store i16 %188, ptr %184, align 2, !tbaa !17
  %189 = load ptr, ptr %20, align 8, !tbaa !5
  %190 = call ptr @arm_2d_tile_generate_child(ptr noundef %189, ptr noundef %19, ptr noundef %17, i1 noundef zeroext false)
  store ptr %190, ptr %21, align 8, !tbaa !5
  store i32 0, ptr %16, align 4
  br label %191

191:                                              ; preds = %144, %132
  call void @llvm.lifetime.end.p0(i64 8, ptr %20) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %19) #5
  %192 = load i32, ptr %16, align 4
  switch i32 %192, label %972 [
    i32 0, label %193
  ]

193:                                              ; preds = %191
  %194 = load ptr, ptr %21, align 8, !tbaa !5
  br label %196

195:                                              ; preds = %120
  br label %196

196:                                              ; preds = %195, %193
  %197 = phi i32 [ 1, %193 ], [ 0, %195 ]
  %198 = icmp ne i32 %197, 0
  br i1 %198, label %200, label %199

199:                                              ; preds = %196
  store i32 4, ptr %16, align 4
  br label %972

200:                                              ; preds = %196
  call void @llvm.lifetime.start.p0(i64 8, ptr %22) #5
  call void @llvm.memset.p0.i64(ptr align 2 %22, i8 0, i64 8, i1 false)
  call void @llvm.lifetime.start.p0(i64 8, ptr %23) #5
  store ptr null, ptr %23, align 8, !tbaa !5
  br label %201

201:                                              ; preds = %965, %200
  %202 = load ptr, ptr %23, align 8, !tbaa !5
  %203 = getelementptr inbounds %struct.arm_2d_region_t, ptr %202, i32 1
  store ptr %203, ptr %23, align 8, !tbaa !5
  %204 = icmp eq ptr %202, null
  br i1 %204, label %205, label %209

205:                                              ; preds = %201
  %206 = getelementptr inbounds %struct.arm_2d_region_t, ptr %22, i32 0, i32 1
  %207 = getelementptr inbounds %struct.arm_2d_tile_t, ptr %17, i32 0, i32 1
  %208 = getelementptr inbounds %struct.arm_2d_region_t, ptr %207, i32 0, i32 1
  call void @llvm.memcpy.p0.p0.i64(ptr align 2 %206, ptr align 4 %208, i64 4, i1 false), !tbaa.struct !18
  br label %210

209:                                              ; preds = %201
  br label %210

210:                                              ; preds = %209, %205
  %211 = phi i32 [ 1, %205 ], [ 0, %209 ]
  %212 = icmp ne i32 %211, 0
  br i1 %212, label %214, label %213

213:                                              ; preds = %210
  store i32 7, ptr %16, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %23) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %22) #5
  br label %970

214:                                              ; preds = %210
  call void @llvm.lifetime.start.p0(i64 8, ptr %24) #5
  store ptr %17, ptr %24, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %25) #5
  store ptr null, ptr %25, align 8, !tbaa !5
  br label %215

215:                                              ; preds = %961, %214
  %216 = load ptr, ptr %25, align 8, !tbaa !5
  %217 = getelementptr inbounds %struct.arm_2d_tile_t, ptr %216, i32 1
  store ptr %217, ptr %25, align 8, !tbaa !5
  %218 = icmp eq ptr %216, null
  br i1 %218, label %220, label %219

219:                                              ; preds = %215
  store i32 10, ptr %16, align 4
  br label %963

220:                                              ; preds = %215
  %221 = call zeroext i1 @arm_2d_helper_pfb_is_region_being_drawing(ptr noundef %17, ptr noundef null, ptr noundef null)
  br i1 %221, label %223, label %222

222:                                              ; preds = %220
  store i32 10, ptr %16, align 4
  br label %963

223:                                              ; preds = %220
  call void @llvm.lifetime.start.p0(i64 2, ptr %26) #5
  %224 = load ptr, ptr %12, align 8, !tbaa !5
  %225 = getelementptr inbounds %struct.arm_2d_tile_t, ptr %224, i32 0, i32 1
  %226 = getelementptr inbounds %struct.arm_2d_region_t, ptr %225, i32 0, i32 1
  %227 = getelementptr inbounds %struct.arm_2d_size_t, ptr %226, i32 0, i32 0
  %228 = load i16, ptr %227, align 4, !tbaa !17
  %229 = sext i16 %228 to i32
  %230 = sdiv i32 %229, 2
  %231 = trunc i32 %230 to i16
  store i16 %231, ptr %26, align 2, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 2, ptr %27) #5
  %232 = load ptr, ptr %12, align 8, !tbaa !5
  %233 = getelementptr inbounds %struct.arm_2d_tile_t, ptr %232, i32 0, i32 1
  %234 = getelementptr inbounds %struct.arm_2d_region_t, ptr %233, i32 0, i32 1
  %235 = getelementptr inbounds %struct.arm_2d_size_t, ptr %234, i32 0, i32 0
  %236 = load i16, ptr %235, align 4, !tbaa !17
  %237 = sext i16 %236 to i32
  %238 = sdiv i32 %237, 2
  %239 = trunc i32 %238 to i16
  store i16 %239, ptr %27, align 2, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 24, ptr %28) #5
  %240 = getelementptr inbounds %struct.arm_2d_tile_t, ptr %28, i32 0, i32 0
  %241 = load i8, ptr %240, align 8
  %242 = and i8 %241, -2
  %243 = or i8 %242, 0
  store i8 %243, ptr %240, align 8
  %244 = load i8, ptr %240, align 8
  %245 = and i8 %244, -3
  %246 = or i8 %245, 0
  store i8 %246, ptr %240, align 8
  %247 = load i8, ptr %240, align 8
  %248 = and i8 %247, -5
  %249 = or i8 %248, 4
  store i8 %249, ptr %240, align 8
  %250 = load i8, ptr %240, align 8
  %251 = and i8 %250, -9
  %252 = or i8 %251, 0
  store i8 %252, ptr %240, align 8
  %253 = load i8, ptr %240, align 8
  %254 = and i8 %253, -17
  %255 = or i8 %254, 0
  store i8 %255, ptr %240, align 8
  %256 = load i8, ptr %240, align 8
  %257 = and i8 %256, 31
  %258 = or i8 %257, 0
  store i8 %258, ptr %240, align 8
  %259 = getelementptr inbounds %struct.anon, ptr %240, i32 0, i32 1
  call void @llvm.memset.p0.i64(ptr align 1 %259, i8 0, i64 1, i1 false)
  %260 = getelementptr inbounds %struct.anon, ptr %240, i32 0, i32 2
  call void @llvm.memset.p0.i64(ptr align 2 %260, i8 0, i64 2, i1 false)
  %261 = getelementptr inbounds %struct.arm_2d_tile_t, ptr %28, i32 0, i32 1
  %262 = getelementptr inbounds %struct.arm_2d_region_t, ptr %261, i32 0, i32 0
  %263 = getelementptr inbounds %struct.arm_2d_location_t, ptr %262, i32 0, i32 0
  store i16 0, ptr %263, align 4, !tbaa !20
  %264 = getelementptr inbounds %struct.arm_2d_location_t, ptr %262, i32 0, i32 1
  store i16 0, ptr %264, align 2, !tbaa !22
  %265 = getelementptr inbounds %struct.arm_2d_region_t, ptr %261, i32 0, i32 1
  %266 = getelementptr inbounds %struct.arm_2d_size_t, ptr %265, i32 0, i32 0
  %267 = load i16, ptr %26, align 2, !tbaa !9
  store i16 %267, ptr %266, align 4, !tbaa !23
  %268 = getelementptr inbounds %struct.arm_2d_size_t, ptr %265, i32 0, i32 1
  %269 = load i16, ptr %27, align 2, !tbaa !9
  store i16 %269, ptr %268, align 2, !tbaa !25
  %270 = getelementptr inbounds %struct.arm_2d_tile_t, ptr %28, i32 0, i32 2
  %271 = load ptr, ptr %12, align 8, !tbaa !5
  store ptr %271, ptr %270, align 8, !tbaa !17
  call void @llvm.lifetime.start.p0(i64 24, ptr %29) #5
  %272 = getelementptr inbounds %struct.arm_2d_tile_t, ptr %29, i32 0, i32 0
  %273 = load i8, ptr %272, align 8
  %274 = and i8 %273, -2
  %275 = or i8 %274, 0
  store i8 %275, ptr %272, align 8
  %276 = load i8, ptr %272, align 8
  %277 = and i8 %276, -3
  %278 = or i8 %277, 0
  store i8 %278, ptr %272, align 8
  %279 = load i8, ptr %272, align 8
  %280 = and i8 %279, -5
  %281 = or i8 %280, 4
  store i8 %281, ptr %272, align 8
  %282 = load i8, ptr %272, align 8
  %283 = and i8 %282, -9
  %284 = or i8 %283, 0
  store i8 %284, ptr %272, align 8
  %285 = load i8, ptr %272, align 8
  %286 = and i8 %285, -17
  %287 = or i8 %286, 0
  store i8 %287, ptr %272, align 8
  %288 = load i8, ptr %272, align 8
  %289 = and i8 %288, 31
  %290 = or i8 %289, 0
  store i8 %290, ptr %272, align 8
  %291 = getelementptr inbounds %struct.anon, ptr %272, i32 0, i32 1
  call void @llvm.memset.p0.i64(ptr align 1 %291, i8 0, i64 1, i1 false)
  %292 = getelementptr inbounds %struct.anon, ptr %272, i32 0, i32 2
  call void @llvm.memset.p0.i64(ptr align 2 %292, i8 0, i64 2, i1 false)
  %293 = getelementptr inbounds %struct.arm_2d_tile_t, ptr %29, i32 0, i32 1
  %294 = getelementptr inbounds %struct.arm_2d_region_t, ptr %293, i32 0, i32 0
  %295 = getelementptr inbounds %struct.arm_2d_location_t, ptr %294, i32 0, i32 0
  store i16 0, ptr %295, align 4, !tbaa !20
  %296 = getelementptr inbounds %struct.arm_2d_location_t, ptr %294, i32 0, i32 1
  %297 = load i16, ptr %27, align 2, !tbaa !9
  store i16 %297, ptr %296, align 2, !tbaa !22
  %298 = getelementptr inbounds %struct.arm_2d_region_t, ptr %293, i32 0, i32 1
  %299 = getelementptr inbounds %struct.arm_2d_size_t, ptr %298, i32 0, i32 0
  %300 = load i16, ptr %26, align 2, !tbaa !9
  store i16 %300, ptr %299, align 4, !tbaa !23
  %301 = getelementptr inbounds %struct.arm_2d_size_t, ptr %298, i32 0, i32 1
  store i16 1, ptr %301, align 2, !tbaa !25
  %302 = getelementptr inbounds %struct.arm_2d_tile_t, ptr %29, i32 0, i32 2
  %303 = load ptr, ptr %12, align 8, !tbaa !5
  store ptr %303, ptr %302, align 8, !tbaa !17
  call void @llvm.lifetime.start.p0(i64 24, ptr %30) #5
  %304 = getelementptr inbounds %struct.arm_2d_tile_t, ptr %30, i32 0, i32 0
  %305 = load i8, ptr %304, align 8
  %306 = and i8 %305, -2
  %307 = or i8 %306, 0
  store i8 %307, ptr %304, align 8
  %308 = load i8, ptr %304, align 8
  %309 = and i8 %308, -3
  %310 = or i8 %309, 0
  store i8 %310, ptr %304, align 8
  %311 = load i8, ptr %304, align 8
  %312 = and i8 %311, -5
  %313 = or i8 %312, 4
  store i8 %313, ptr %304, align 8
  %314 = load i8, ptr %304, align 8
  %315 = and i8 %314, -9
  %316 = or i8 %315, 0
  store i8 %316, ptr %304, align 8
  %317 = load i8, ptr %304, align 8
  %318 = and i8 %317, -17
  %319 = or i8 %318, 0
  store i8 %319, ptr %304, align 8
  %320 = load i8, ptr %304, align 8
  %321 = and i8 %320, 31
  %322 = or i8 %321, 0
  store i8 %322, ptr %304, align 8
  %323 = getelementptr inbounds %struct.anon, ptr %304, i32 0, i32 1
  call void @llvm.memset.p0.i64(ptr align 1 %323, i8 0, i64 1, i1 false)
  %324 = getelementptr inbounds %struct.anon, ptr %304, i32 0, i32 2
  call void @llvm.memset.p0.i64(ptr align 2 %324, i8 0, i64 2, i1 false)
  %325 = getelementptr inbounds %struct.arm_2d_tile_t, ptr %30, i32 0, i32 1
  %326 = getelementptr inbounds %struct.arm_2d_region_t, ptr %325, i32 0, i32 0
  %327 = getelementptr inbounds %struct.arm_2d_location_t, ptr %326, i32 0, i32 0
  %328 = load i16, ptr %26, align 2, !tbaa !9
  store i16 %328, ptr %327, align 4, !tbaa !20
  %329 = getelementptr inbounds %struct.arm_2d_location_t, ptr %326, i32 0, i32 1
  %330 = load i16, ptr %27, align 2, !tbaa !9
  store i16 %330, ptr %329, align 2, !tbaa !22
  %331 = getelementptr inbounds %struct.arm_2d_region_t, ptr %325, i32 0, i32 1
  %332 = getelementptr inbounds %struct.arm_2d_size_t, ptr %331, i32 0, i32 0
  %333 = load i16, ptr %26, align 2, !tbaa !9
  store i16 %333, ptr %332, align 4, !tbaa !23
  %334 = getelementptr inbounds %struct.arm_2d_size_t, ptr %331, i32 0, i32 1
  store i16 1, ptr %334, align 2, !tbaa !25
  %335 = getelementptr inbounds %struct.arm_2d_tile_t, ptr %30, i32 0, i32 2
  %336 = load ptr, ptr %12, align 8, !tbaa !5
  store ptr %336, ptr %335, align 8, !tbaa !17
  call void @llvm.lifetime.start.p0(i64 24, ptr %31) #5
  %337 = getelementptr inbounds %struct.arm_2d_tile_t, ptr %31, i32 0, i32 0
  %338 = load i8, ptr %337, align 8
  %339 = and i8 %338, -2
  %340 = or i8 %339, 0
  store i8 %340, ptr %337, align 8
  %341 = load i8, ptr %337, align 8
  %342 = and i8 %341, -3
  %343 = or i8 %342, 0
  store i8 %343, ptr %337, align 8
  %344 = load i8, ptr %337, align 8
  %345 = and i8 %344, -5
  %346 = or i8 %345, 4
  store i8 %346, ptr %337, align 8
  %347 = load i8, ptr %337, align 8
  %348 = and i8 %347, -9
  %349 = or i8 %348, 0
  store i8 %349, ptr %337, align 8
  %350 = load i8, ptr %337, align 8
  %351 = and i8 %350, -17
  %352 = or i8 %351, 0
  store i8 %352, ptr %337, align 8
  %353 = load i8, ptr %337, align 8
  %354 = and i8 %353, 31
  %355 = or i8 %354, 0
  store i8 %355, ptr %337, align 8
  %356 = getelementptr inbounds %struct.anon, ptr %337, i32 0, i32 1
  call void @llvm.memset.p0.i64(ptr align 1 %356, i8 0, i64 1, i1 false)
  %357 = getelementptr inbounds %struct.anon, ptr %337, i32 0, i32 2
  call void @llvm.memset.p0.i64(ptr align 2 %357, i8 0, i64 2, i1 false)
  %358 = getelementptr inbounds %struct.arm_2d_tile_t, ptr %31, i32 0, i32 1
  %359 = getelementptr inbounds %struct.arm_2d_region_t, ptr %358, i32 0, i32 0
  %360 = getelementptr inbounds %struct.arm_2d_location_t, ptr %359, i32 0, i32 0
  %361 = load i16, ptr %26, align 2, !tbaa !9
  store i16 %361, ptr %360, align 4, !tbaa !20
  %362 = getelementptr inbounds %struct.arm_2d_location_t, ptr %359, i32 0, i32 1
  store i16 0, ptr %362, align 2, !tbaa !22
  %363 = getelementptr inbounds %struct.arm_2d_region_t, ptr %358, i32 0, i32 1
  %364 = getelementptr inbounds %struct.arm_2d_size_t, ptr %363, i32 0, i32 0
  store i16 1, ptr %364, align 4, !tbaa !23
  %365 = getelementptr inbounds %struct.arm_2d_size_t, ptr %363, i32 0, i32 1
  %366 = load i16, ptr %27, align 2, !tbaa !9
  store i16 %366, ptr %365, align 2, !tbaa !25
  %367 = getelementptr inbounds %struct.arm_2d_tile_t, ptr %31, i32 0, i32 2
  %368 = load ptr, ptr %12, align 8, !tbaa !5
  store ptr %368, ptr %367, align 8, !tbaa !17
  call void @llvm.lifetime.start.p0(i64 24, ptr %32) #5
  %369 = getelementptr inbounds %struct.arm_2d_tile_t, ptr %32, i32 0, i32 0
  %370 = load i8, ptr %369, align 8
  %371 = and i8 %370, -2
  %372 = or i8 %371, 0
  store i8 %372, ptr %369, align 8
  %373 = load i8, ptr %369, align 8
  %374 = and i8 %373, -3
  %375 = or i8 %374, 0
  store i8 %375, ptr %369, align 8
  %376 = load i8, ptr %369, align 8
  %377 = and i8 %376, -5
  %378 = or i8 %377, 4
  store i8 %378, ptr %369, align 8
  %379 = load i8, ptr %369, align 8
  %380 = and i8 %379, -9
  %381 = or i8 %380, 0
  store i8 %381, ptr %369, align 8
  %382 = load i8, ptr %369, align 8
  %383 = and i8 %382, -17
  %384 = or i8 %383, 0
  store i8 %384, ptr %369, align 8
  %385 = load i8, ptr %369, align 8
  %386 = and i8 %385, 31
  %387 = or i8 %386, 0
  store i8 %387, ptr %369, align 8
  %388 = getelementptr inbounds %struct.anon, ptr %369, i32 0, i32 1
  call void @llvm.memset.p0.i64(ptr align 1 %388, i8 0, i64 1, i1 false)
  %389 = getelementptr inbounds %struct.anon, ptr %369, i32 0, i32 2
  call void @llvm.memset.p0.i64(ptr align 2 %389, i8 0, i64 2, i1 false)
  %390 = getelementptr inbounds %struct.arm_2d_tile_t, ptr %32, i32 0, i32 1
  %391 = getelementptr inbounds %struct.arm_2d_region_t, ptr %390, i32 0, i32 0
  %392 = getelementptr inbounds %struct.arm_2d_location_t, ptr %391, i32 0, i32 0
  %393 = load i16, ptr %26, align 2, !tbaa !9
  store i16 %393, ptr %392, align 4, !tbaa !20
  %394 = getelementptr inbounds %struct.arm_2d_location_t, ptr %391, i32 0, i32 1
  %395 = load i16, ptr %27, align 2, !tbaa !9
  store i16 %395, ptr %394, align 2, !tbaa !22
  %396 = getelementptr inbounds %struct.arm_2d_region_t, ptr %390, i32 0, i32 1
  %397 = getelementptr inbounds %struct.arm_2d_size_t, ptr %396, i32 0, i32 0
  store i16 1, ptr %397, align 4, !tbaa !23
  %398 = getelementptr inbounds %struct.arm_2d_size_t, ptr %396, i32 0, i32 1
  %399 = load i16, ptr %27, align 2, !tbaa !9
  store i16 %399, ptr %398, align 2, !tbaa !25
  %400 = getelementptr inbounds %struct.arm_2d_tile_t, ptr %32, i32 0, i32 2
  %401 = load ptr, ptr %12, align 8, !tbaa !5
  store ptr %401, ptr %400, align 8, !tbaa !17
  call void @llvm.lifetime.start.p0(i64 8, ptr %33) #5
  call void @llvm.memcpy.p0.p0.i64(ptr align 2 %33, ptr align 2 %22, i64 8, i1 false), !tbaa.struct !19
  call void @llvm.lifetime.start.p0(i64 8, ptr %34) #5
  store ptr null, ptr %34, align 8, !tbaa !5
  br label %402

402:                                              ; preds = %445, %223
  %403 = load ptr, ptr %34, align 8, !tbaa !5
  %404 = getelementptr inbounds %struct.arm_2d_region_t, ptr %403, i32 1
  store ptr %404, ptr %34, align 8, !tbaa !5
  %405 = icmp eq ptr %403, null
  br i1 %405, label %407, label %406

406:                                              ; preds = %402
  store i32 13, ptr %16, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %34) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %33) #5
  br label %446

407:                                              ; preds = %402
  call void @llvm.lifetime.start.p0(i64 8, ptr %35) #5
  call void @llvm.lifetime.start.p0(i64 8, ptr %36) #5
  store ptr null, ptr %36, align 8, !tbaa !5
  br label %408

408:                                              ; preds = %440, %407
  %409 = load ptr, ptr %36, align 8, !tbaa !5
  %410 = getelementptr inbounds %struct.arm_2d_region_t, ptr %409, i32 1
  store ptr %410, ptr %36, align 8, !tbaa !5
  %411 = icmp eq ptr %409, null
  br i1 %411, label %412, label %427

412:                                              ; preds = %408
  %413 = getelementptr inbounds %struct.arm_2d_tile_t, ptr %28, i32 0, i32 1
  %414 = getelementptr inbounds %struct.arm_2d_region_t, ptr %413, i32 0, i32 1
  %415 = getelementptr inbounds %struct.arm_2d_size_t, ptr %414, i32 0, i32 0
  %416 = load i16, ptr %415, align 4, !tbaa !17
  %417 = getelementptr inbounds %struct.arm_2d_region_t, ptr %35, i32 0, i32 1
  %418 = getelementptr inbounds %struct.arm_2d_size_t, ptr %417, i32 0, i32 0
  store i16 %416, ptr %418, align 2, !tbaa !17
  %419 = getelementptr inbounds %struct.arm_2d_tile_t, ptr %28, i32 0, i32 1
  %420 = getelementptr inbounds %struct.arm_2d_region_t, ptr %419, i32 0, i32 1
  %421 = getelementptr inbounds %struct.arm_2d_size_t, ptr %420, i32 0, i32 1
  %422 = load i16, ptr %421, align 2, !tbaa !17
  %423 = getelementptr inbounds %struct.arm_2d_region_t, ptr %35, i32 0, i32 1
  %424 = getelementptr inbounds %struct.arm_2d_size_t, ptr %423, i32 0, i32 1
  store i16 %422, ptr %424, align 2, !tbaa !17
  %425 = getelementptr inbounds %struct.arm_2d_region_t, ptr %35, i32 0, i32 0
  %426 = getelementptr inbounds %struct.arm_2d_region_t, ptr %33, i32 0, i32 0
  call void @llvm.memcpy.p0.p0.i64(ptr align 2 %425, ptr align 2 %426, i64 4, i1 false), !tbaa.struct !18
  br label %428

427:                                              ; preds = %408
  br label %428

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

431:                                              ; preds = %428
  store i32 15, ptr %16, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %36) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %35) #5
  br label %445

432:                                              ; preds = %428
  %433 = load i16, ptr %11, align 2, !tbaa !9
  store i16 %433, ptr %37, align 2, !tbaa !17
  %434 = getelementptr inbounds %struct.arm_2d_corner_opacity_t, ptr %8, i32 0, i32 0
  %435 = load i8, ptr %434, align 1, !tbaa !26
  %436 = getelementptr inbounds %union.arm_2d_color_rgb565_t, ptr %37, i32 0, i32 0
  %437 = load i16, ptr %436, align 2
  %438 = call i32 @arm_2dp_rgb565_fill_colour_with_mask_and_opacity(ptr noundef null, ptr noundef %17, ptr noundef %35, ptr noundef %28, i16 %437, i8 noundef zeroext %435)
  %439 = call zeroext i1 @arm_2d_op_wait_async(ptr noundef null)
  br label %440

440:                                              ; preds = %432
  %441 = call zeroext i1 @arm_2d_op_wait_async(ptr noundef null)
  %442 = zext i1 %441 to i8
  store i8 %442, ptr %38, align 1, !tbaa !28
  %443 = load i8, ptr %38, align 1, !tbaa !28, !range !30, !noundef !31
  %444 = trunc i8 %443 to i1
  br label %408, !llvm.loop !32

445:                                              ; preds = %431
  br label %402, !llvm.loop !34

446:                                              ; preds = %406
  call void @llvm.lifetime.start.p0(i64 8, ptr %39) #5
  call void @llvm.memcpy.p0.p0.i64(ptr align 2 %39, ptr align 2 %22, i64 8, i1 false), !tbaa.struct !19
  call void @llvm.lifetime.start.p0(i64 8, ptr %40) #5
  store ptr null, ptr %40, align 8, !tbaa !5
  br label %447

447:                                              ; preds = %507, %446
  %448 = load ptr, ptr %40, align 8, !tbaa !5
  %449 = getelementptr inbounds %struct.arm_2d_region_t, ptr %448, i32 1
  store ptr %449, ptr %40, align 8, !tbaa !5
  %450 = icmp eq ptr %448, null
  br i1 %450, label %452, label %451

451:                                              ; preds = %447
  store i32 18, ptr %16, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %40) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %39) #5
  br label %508

452:                                              ; preds = %447
  call void @llvm.lifetime.start.p0(i64 8, ptr %41) #5
  call void @llvm.lifetime.start.p0(i64 8, ptr %42) #5
  store ptr null, ptr %42, align 8, !tbaa !5
  br label %453

453:                                              ; preds = %502, %452
  %454 = load ptr, ptr %42, align 8, !tbaa !5
  %455 = getelementptr inbounds %struct.arm_2d_region_t, ptr %454, i32 1
  store ptr %455, ptr %42, align 8, !tbaa !5
  %456 = icmp eq ptr %454, null
  br i1 %456, label %457, label %489

457:                                              ; preds = %453
  %458 = getelementptr inbounds %struct.arm_2d_tile_t, ptr %28, i32 0, i32 1
  %459 = getelementptr inbounds %struct.arm_2d_region_t, ptr %458, i32 0, i32 1
  %460 = getelementptr inbounds %struct.arm_2d_size_t, ptr %459, i32 0, i32 0
  %461 = load i16, ptr %460, align 4, !tbaa !17
  %462 = getelementptr inbounds %struct.arm_2d_region_t, ptr %41, i32 0, i32 1
  %463 = getelementptr inbounds %struct.arm_2d_size_t, ptr %462, i32 0, i32 0
  store i16 %461, ptr %463, align 2, !tbaa !17
  %464 = getelementptr inbounds %struct.arm_2d_tile_t, ptr %28, i32 0, i32 1
  %465 = getelementptr inbounds %struct.arm_2d_region_t, ptr %464, i32 0, i32 1
  %466 = getelementptr inbounds %struct.arm_2d_size_t, ptr %465, i32 0, i32 1
  %467 = load i16, ptr %466, align 2, !tbaa !17
  %468 = getelementptr inbounds %struct.arm_2d_region_t, ptr %41, i32 0, i32 1
  %469 = getelementptr inbounds %struct.arm_2d_size_t, ptr %468, i32 0, i32 1
  store i16 %467, ptr %469, align 2, !tbaa !17
  %470 = getelementptr inbounds %struct.arm_2d_region_t, ptr %41, i32 0, i32 0
  %471 = getelementptr inbounds %struct.arm_2d_region_t, ptr %39, i32 0, i32 0
  call void @llvm.memcpy.p0.p0.i64(ptr align 2 %470, ptr align 2 %471, i64 4, i1 false), !tbaa.struct !18
  %472 = getelementptr inbounds %struct.arm_2d_region_t, ptr %39, 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 !17
  %475 = sext i16 %474 to i32
  %476 = getelementptr inbounds %struct.arm_2d_tile_t, ptr %28, i32 0, i32 1
  %477 = getelementptr inbounds %struct.arm_2d_region_t, ptr %476, i32 0, i32 1
  %478 = getelementptr inbounds %struct.arm_2d_size_t, ptr %477, i32 0, i32 0
  %479 = load i16, ptr %478, align 4, !tbaa !17
  %480 = sext i16 %479 to i32
  %481 = sub nsw i32 %475, %480
  %482 = getelementptr inbounds %struct.arm_2d_region_t, ptr %41, i32 0, i32 0
  %483 = getelementptr inbounds %struct.arm_2d_location_t, ptr %482, i32 0, i32 0
  %484 = load i16, ptr %483, align 2, !tbaa !17
  %485 = sext i16 %484 to i32
  %486 = add nsw i32 %485, %481
  %487 = trunc i32 %486 to i16
  store i16 %487, ptr %483, align 2, !tbaa !17
  store i16 %487, ptr %43, align 2, !tbaa !9
  %488 = load i16, ptr %43, align 2, !tbaa !9
  br label %490

489:                                              ; preds = %453
  br label %490

490:                                              ; preds = %489, %457
  %491 = phi i32 [ 1, %457 ], [ 0, %489 ]
  %492 = icmp ne i32 %491, 0
  br i1 %492, label %494, label %493

493:                                              ; preds = %490
  store i32 20, ptr %16, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %42) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %41) #5
  br label %507

494:                                              ; preds = %490
  %495 = load i16, ptr %11, align 2, !tbaa !9
  store i16 %495, ptr %44, align 2, !tbaa !17
  %496 = getelementptr inbounds %struct.arm_2d_corner_opacity_t, ptr %8, i32 0, i32 1
  %497 = load i8, ptr %496, align 1, !tbaa !35
  %498 = getelementptr inbounds %union.arm_2d_color_rgb565_t, ptr %44, i32 0, i32 0
  %499 = load i16, ptr %498, align 2
  %500 = call i32 @arm_2dp_rgb565_fill_colour_with_mask_x_mirror_and_opacity(ptr noundef null, ptr noundef %17, ptr noundef %41, ptr noundef %28, i16 %499, i8 noundef zeroext %497)
  %501 = call zeroext i1 @arm_2d_op_wait_async(ptr noundef null)
  br label %502

502:                                              ; preds = %494
  %503 = call zeroext i1 @arm_2d_op_wait_async(ptr noundef null)
  %504 = zext i1 %503 to i8
  store i8 %504, ptr %45, align 1, !tbaa !28
  %505 = load i8, ptr %45, align 1, !tbaa !28, !range !30, !noundef !31
  %506 = trunc i8 %505 to i1
  br label %453, !llvm.loop !36

507:                                              ; preds = %493
  br label %447, !llvm.loop !37

508:                                              ; preds = %451
  call void @llvm.lifetime.start.p0(i64 8, ptr %46) #5
  call void @llvm.memcpy.p0.p0.i64(ptr align 2 %46, ptr align 2 %22, i64 8, i1 false), !tbaa.struct !19
  call void @llvm.lifetime.start.p0(i64 8, ptr %47) #5
  store ptr null, ptr %47, align 8, !tbaa !5
  br label %509

509:                                              ; preds = %569, %508
  %510 = load ptr, ptr %47, align 8, !tbaa !5
  %511 = getelementptr inbounds %struct.arm_2d_region_t, ptr %510, i32 1
  store ptr %511, ptr %47, align 8, !tbaa !5
  %512 = icmp eq ptr %510, null
  br i1 %512, label %514, label %513

513:                                              ; preds = %509
  store i32 23, ptr %16, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %47) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %46) #5
  br label %570

514:                                              ; preds = %509
  call void @llvm.lifetime.start.p0(i64 8, ptr %48) #5
  call void @llvm.lifetime.start.p0(i64 8, ptr %49) #5
  store ptr null, ptr %49, align 8, !tbaa !5
  br label %515

515:                                              ; preds = %564, %514
  %516 = load ptr, ptr %49, align 8, !tbaa !5
  %517 = getelementptr inbounds %struct.arm_2d_region_t, ptr %516, i32 1
  store ptr %517, ptr %49, align 8, !tbaa !5
  %518 = icmp eq ptr %516, null
  br i1 %518, label %519, label %551

519:                                              ; preds = %515
  %520 = getelementptr inbounds %struct.arm_2d_tile_t, ptr %28, i32 0, i32 1
  %521 = getelementptr inbounds %struct.arm_2d_region_t, ptr %520, i32 0, i32 1
  %522 = getelementptr inbounds %struct.arm_2d_size_t, ptr %521, i32 0, i32 0
  %523 = load i16, ptr %522, align 4, !tbaa !17
  %524 = getelementptr inbounds %struct.arm_2d_region_t, ptr %48, i32 0, i32 1
  %525 = getelementptr inbounds %struct.arm_2d_size_t, ptr %524, i32 0, i32 0
  store i16 %523, ptr %525, align 2, !tbaa !17
  %526 = getelementptr inbounds %struct.arm_2d_tile_t, ptr %28, i32 0, i32 1
  %527 = getelementptr inbounds %struct.arm_2d_region_t, ptr %526, i32 0, i32 1
  %528 = getelementptr inbounds %struct.arm_2d_size_t, ptr %527, i32 0, i32 1
  %529 = load i16, ptr %528, align 2, !tbaa !17
  %530 = getelementptr inbounds %struct.arm_2d_region_t, ptr %48, i32 0, i32 1
  %531 = getelementptr inbounds %struct.arm_2d_size_t, ptr %530, i32 0, i32 1
  store i16 %529, ptr %531, align 2, !tbaa !17
  %532 = getelementptr inbounds %struct.arm_2d_region_t, ptr %48, i32 0, i32 0
  %533 = getelementptr inbounds %struct.arm_2d_region_t, ptr %46, i32 0, i32 0
  call void @llvm.memcpy.p0.p0.i64(ptr align 2 %532, ptr align 2 %533, i64 4, i1 false), !tbaa.struct !18
  %534 = getelementptr inbounds %struct.arm_2d_region_t, ptr %46, i32 0, i32 1
  %535 = getelementptr inbounds %struct.arm_2d_size_t, ptr %534, i32 0, i32 1
  %536 = load i16, ptr %535, align 2, !tbaa !17
  %537 = sext i16 %536 to i32
  %538 = getelementptr inbounds %struct.arm_2d_tile_t, ptr %28, i32 0, i32 1
  %539 = getelementptr inbounds %struct.arm_2d_region_t, ptr %538, i32 0, i32 1
  %540 = getelementptr inbounds %struct.arm_2d_size_t, ptr %539, i32 0, i32 1
  %541 = load i16, ptr %540, align 2, !tbaa !17
  %542 = sext i16 %541 to i32
  %543 = sub nsw i32 %537, %542
  %544 = getelementptr inbounds %struct.arm_2d_region_t, ptr %48, i32 0, i32 0
  %545 = getelementptr inbounds %struct.arm_2d_location_t, ptr %544, i32 0, i32 1
  %546 = load i16, ptr %545, align 2, !tbaa !17
  %547 = sext i16 %546 to i32
  %548 = add nsw i32 %547, %543
  %549 = trunc i32 %548 to i16
  store i16 %549, ptr %545, align 2, !tbaa !17
  store i16 %549, ptr %50, align 2, !tbaa !9
  %550 = load i16, ptr %50, align 2, !tbaa !9
  br label %552

551:                                              ; preds = %515
  br label %552

552:                                              ; preds = %551, %519
  %553 = phi i32 [ 1, %519 ], [ 0, %551 ]
  %554 = icmp ne i32 %553, 0
  br i1 %554, label %556, label %555

555:                                              ; preds = %552
  store i32 25, ptr %16, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %49) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %48) #5
  br label %569

556:                                              ; preds = %552
  %557 = load i16, ptr %11, align 2, !tbaa !9
  store i16 %557, ptr %51, align 2, !tbaa !17
  %558 = getelementptr inbounds %struct.arm_2d_corner_opacity_t, ptr %8, i32 0, i32 2
  %559 = load i8, ptr %558, align 1, !tbaa !38
  %560 = getelementptr inbounds %union.arm_2d_color_rgb565_t, ptr %51, i32 0, i32 0
  %561 = load i16, ptr %560, align 2
  %562 = call i32 @arm_2dp_rgb565_fill_colour_with_mask_y_mirror_and_opacity(ptr noundef null, ptr noundef %17, ptr noundef %48, ptr noundef %28, i16 %561, i8 noundef zeroext %559)
  %563 = call zeroext i1 @arm_2d_op_wait_async(ptr noundef null)
  br label %564

564:                                              ; preds = %556
  %565 = call zeroext i1 @arm_2d_op_wait_async(ptr noundef null)
  %566 = zext i1 %565 to i8
  store i8 %566, ptr %52, align 1, !tbaa !28
  %567 = load i8, ptr %52, align 1, !tbaa !28, !range !30, !noundef !31
  %568 = trunc i8 %567 to i1
  br label %515, !llvm.loop !39

569:                                              ; preds = %555
  br label %509, !llvm.loop !40

570:                                              ; preds = %513
  call void @llvm.lifetime.start.p0(i64 8, ptr %53) #5
  call void @llvm.memcpy.p0.p0.i64(ptr align 2 %53, ptr align 2 %22, i64 8, i1 false), !tbaa.struct !19
  call void @llvm.lifetime.start.p0(i64 8, ptr %54) #5
  store ptr null, ptr %54, align 8, !tbaa !5
  br label %571

571:                                              ; preds = %647, %570
  %572 = load ptr, ptr %54, align 8, !tbaa !5
  %573 = getelementptr inbounds %struct.arm_2d_region_t, ptr %572, i32 1
  store ptr %573, ptr %54, align 8, !tbaa !5
  %574 = icmp eq ptr %572, null
  br i1 %574, label %576, label %575

575:                                              ; preds = %571
  store i32 28, ptr %16, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %54) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %53) #5
  br label %648

576:                                              ; preds = %571
  call void @llvm.lifetime.start.p0(i64 8, ptr %55) #5
  call void @llvm.lifetime.start.p0(i64 8, ptr %56) #5
  store ptr null, ptr %56, align 8, !tbaa !5
  br label %577

577:                                              ; preds = %642, %576
  %578 = load ptr, ptr %56, align 8, !tbaa !5
  %579 = getelementptr inbounds %struct.arm_2d_region_t, ptr %578, i32 1
  store ptr %579, ptr %56, align 8, !tbaa !5
  %580 = icmp eq ptr %578, null
  br i1 %580, label %581, label %629

581:                                              ; preds = %577
  %582 = getelementptr inbounds %struct.arm_2d_tile_t, ptr %28, i32 0, i32 1
  %583 = getelementptr inbounds %struct.arm_2d_region_t, ptr %582, i32 0, i32 1
  %584 = getelementptr inbounds %struct.arm_2d_size_t, ptr %583, i32 0, i32 0
  %585 = load i16, ptr %584, align 4, !tbaa !17
  %586 = getelementptr inbounds %struct.arm_2d_region_t, ptr %55, i32 0, i32 1
  %587 = getelementptr inbounds %struct.arm_2d_size_t, ptr %586, i32 0, i32 0
  store i16 %585, ptr %587, align 2, !tbaa !17
  %588 = getelementptr inbounds %struct.arm_2d_tile_t, ptr %28, i32 0, i32 1
  %589 = getelementptr inbounds %struct.arm_2d_region_t, ptr %588, i32 0, i32 1
  %590 = getelementptr inbounds %struct.arm_2d_size_t, ptr %589, i32 0, i32 1
  %591 = load i16, ptr %590, align 2, !tbaa !17
  %592 = getelementptr inbounds %struct.arm_2d_region_t, ptr %55, i32 0, i32 1
  %593 = getelementptr inbounds %struct.arm_2d_size_t, ptr %592, i32 0, i32 1
  store i16 %591, ptr %593, align 2, !tbaa !17
  %594 = getelementptr inbounds %struct.arm_2d_region_t, ptr %55, i32 0, i32 0
  %595 = getelementptr inbounds %struct.arm_2d_region_t, ptr %53, i32 0, i32 0
  call void @llvm.memcpy.p0.p0.i64(ptr align 2 %594, ptr align 2 %595, i64 4, i1 false), !tbaa.struct !18
  %596 = getelementptr inbounds %struct.arm_2d_region_t, ptr %53, i32 0, i32 1
  %597 = getelementptr inbounds %struct.arm_2d_size_t, ptr %596, i32 0, i32 0
  %598 = load i16, ptr %597, align 2, !tbaa !17
  %599 = sext i16 %598 to i32
  %600 = getelementptr inbounds %struct.arm_2d_tile_t, ptr %28, i32 0, i32 1
  %601 = getelementptr inbounds %struct.arm_2d_region_t, ptr %600, i32 0, i32 1
  %602 = getelementptr inbounds %struct.arm_2d_size_t, ptr %601, i32 0, i32 0
  %603 = load i16, ptr %602, align 4, !tbaa !17
  %604 = sext i16 %603 to i32
  %605 = sub nsw i32 %599, %604
  %606 = getelementptr inbounds %struct.arm_2d_region_t, ptr %55, i32 0, i32 0
  %607 = getelementptr inbounds %struct.arm_2d_location_t, ptr %606, i32 0, i32 0
  %608 = load i16, ptr %607, align 2, !tbaa !17
  %609 = sext i16 %608 to i32
  %610 = add nsw i32 %609, %605
  %611 = trunc i32 %610 to i16
  store i16 %611, ptr %607, align 2, !tbaa !17
  %612 = getelementptr inbounds %struct.arm_2d_region_t, ptr %53, i32 0, i32 1
  %613 = getelementptr inbounds %struct.arm_2d_size_t, ptr %612, i32 0, i32 1
  %614 = load i16, ptr %613, align 2, !tbaa !17
  %615 = sext i16 %614 to i32
  %616 = getelementptr inbounds %struct.arm_2d_tile_t, ptr %28, i32 0, i32 1
  %617 = getelementptr inbounds %struct.arm_2d_region_t, ptr %616, i32 0, i32 1
  %618 = getelementptr inbounds %struct.arm_2d_size_t, ptr %617, i32 0, i32 1
  %619 = load i16, ptr %618, align 2, !tbaa !17
  %620 = sext i16 %619 to i32
  %621 = sub nsw i32 %615, %620
  %622 = getelementptr inbounds %struct.arm_2d_region_t, ptr %55, i32 0, i32 0
  %623 = getelementptr inbounds %struct.arm_2d_location_t, ptr %622, i32 0, i32 1
  %624 = load i16, ptr %623, align 2, !tbaa !17
  %625 = sext i16 %624 to i32
  %626 = add nsw i32 %625, %621
  %627 = trunc i32 %626 to i16
  store i16 %627, ptr %623, align 2, !tbaa !17
  store i16 %627, ptr %57, align 2, !tbaa !9
  %628 = load i16, ptr %57, align 2, !tbaa !9
  br label %630

629:                                              ; preds = %577
  br label %630

630:                                              ; preds = %629, %581
  %631 = phi i32 [ 1, %581 ], [ 0, %629 ]
  %632 = icmp ne i32 %631, 0
  br i1 %632, label %634, label %633

633:                                              ; preds = %630
  store i32 30, ptr %16, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %56) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %55) #5
  br label %647

634:                                              ; preds = %630
  %635 = load i16, ptr %11, align 2, !tbaa !9
  store i16 %635, ptr %58, align 2, !tbaa !17
  %636 = getelementptr inbounds %struct.arm_2d_corner_opacity_t, ptr %8, i32 0, i32 3
  %637 = load i8, ptr %636, align 1, !tbaa !41
  %638 = getelementptr inbounds %union.arm_2d_color_rgb565_t, ptr %58, i32 0, i32 0
  %639 = load i16, ptr %638, align 2
  %640 = call i32 @arm_2dp_rgb565_fill_colour_with_mask_xy_mirror_and_opacity(ptr noundef null, ptr noundef %17, ptr noundef %55, ptr noundef %28, i16 %639, i8 noundef zeroext %637)
  %641 = call zeroext i1 @arm_2d_op_wait_async(ptr noundef null)
  br label %642

642:                                              ; preds = %634
  %643 = call zeroext i1 @arm_2d_op_wait_async(ptr noundef null)
  %644 = zext i1 %643 to i8
  store i8 %644, ptr %59, align 1, !tbaa !28
  %645 = load i8, ptr %59, align 1, !tbaa !28, !range !30, !noundef !31
  %646 = trunc i8 %645 to i1
  br label %577, !llvm.loop !42

647:                                              ; preds = %633
  br label %571, !llvm.loop !43

648:                                              ; preds = %575
  call void @llvm.lifetime.start.p0(i64 8, ptr %60) #5
  call void @llvm.memcpy.p0.p0.i64(ptr align 2 %60, ptr align 2 %22, i64 8, i1 false), !tbaa.struct !19
  call void @llvm.lifetime.start.p0(i64 8, ptr %61) #5
  store ptr null, ptr %61, align 8, !tbaa !5
  br label %649

649:                                              ; preds = %803, %648
  %650 = load ptr, ptr %61, align 8, !tbaa !5
  %651 = getelementptr inbounds %struct.arm_2d_region_t, ptr %650, i32 1
  store ptr %651, ptr %61, align 8, !tbaa !5
  %652 = icmp eq ptr %650, null
  br i1 %652, label %654, label %653

653:                                              ; preds = %649
  store i32 33, ptr %16, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %61) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %60) #5
  br label %804

654:                                              ; preds = %649
  call void @llvm.lifetime.start.p0(i64 8, ptr %62) #5
  call void @llvm.memcpy.p0.p0.i64(ptr align 2 %62, ptr align 2 %60, i64 8, i1 false), !tbaa.struct !19
  call void @llvm.lifetime.start.p0(i64 8, ptr %63) #5
  store ptr null, ptr %63, align 8, !tbaa !5
  br label %655

655:                                              ; preds = %798, %654
  %656 = load ptr, ptr %63, align 8, !tbaa !5
  %657 = getelementptr inbounds %struct.arm_2d_region_t, ptr %656, i32 1
  store ptr %657, ptr %63, align 8, !tbaa !5
  %658 = icmp eq ptr %656, null
  br i1 %658, label %659, label %698

659:                                              ; preds = %655
  %660 = getelementptr inbounds %struct.arm_2d_region_t, ptr %22, i32 0, i32 1
  %661 = getelementptr inbounds %struct.arm_2d_size_t, ptr %660, i32 0, i32 1
  %662 = load i16, ptr %661, align 2, !tbaa !17
  %663 = sext i16 %662 to i32
  %664 = getelementptr inbounds %struct.arm_2d_tile_t, ptr %28, i32 0, i32 1
  %665 = getelementptr inbounds %struct.arm_2d_region_t, ptr %664, i32 0, i32 1
  %666 = getelementptr inbounds %struct.arm_2d_size_t, ptr %665, i32 0, i32 1
  %667 = load i16, ptr %666, align 2, !tbaa !17
  %668 = sext i16 %667 to i32
  %669 = mul nsw i32 %668, 2
  %670 = sub nsw i32 %663, %669
  %671 = trunc i32 %670 to i16
  %672 = getelementptr inbounds %struct.arm_2d_region_t, ptr %62, i32 0, i32 1
  %673 = getelementptr inbounds %struct.arm_2d_size_t, ptr %672, i32 0, i32 1
  store i16 %671, ptr %673, align 2, !tbaa !17
  %674 = getelementptr inbounds %struct.arm_2d_region_t, ptr %60, i32 0, i32 1
  %675 = getelementptr inbounds %struct.arm_2d_size_t, ptr %674, i32 0, i32 1
  %676 = load i16, ptr %675, align 2, !tbaa !17
  %677 = sext i16 %676 to i32
  %678 = getelementptr inbounds %struct.arm_2d_region_t, ptr %22, i32 0, i32 1
  %679 = getelementptr inbounds %struct.arm_2d_size_t, ptr %678, i32 0, i32 1
  %680 = load i16, ptr %679, align 2, !tbaa !17
  %681 = sext i16 %680 to i32
  %682 = getelementptr inbounds %struct.arm_2d_tile_t, ptr %28, i32 0, i32 1
  %683 = getelementptr inbounds %struct.arm_2d_region_t, ptr %682, i32 0, i32 1
  %684 = getelementptr inbounds %struct.arm_2d_size_t, ptr %683, i32 0, i32 1
  %685 = load i16, ptr %684, align 2, !tbaa !17
  %686 = sext i16 %685 to i32
  %687 = mul nsw i32 %686, 2
  %688 = sub nsw i32 %681, %687
  %689 = sub nsw i32 %677, %688
  %690 = ashr i32 %689, 1
  %691 = getelementptr inbounds %struct.arm_2d_region_t, ptr %62, i32 0, i32 0
  %692 = getelementptr inbounds %struct.arm_2d_location_t, ptr %691, i32 0, i32 1
  %693 = load i16, ptr %692, align 2, !tbaa !17
  %694 = sext i16 %693 to i32
  %695 = add nsw i32 %694, %690
  %696 = trunc i32 %695 to i16
  store i16 %696, ptr %692, align 2, !tbaa !17
  store i16 %696, ptr %64, align 2, !tbaa !9
  %697 = load i16, ptr %64, align 2, !tbaa !9
  br label %699

698:                                              ; preds = %655
  br label %699

699:                                              ; preds = %698, %659
  %700 = phi i32 [ 1, %659 ], [ 0, %698 ]
  %701 = icmp ne i32 %700, 0
  br i1 %701, label %703, label %702

702:                                              ; preds = %699
  store i32 35, ptr %16, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %63) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %62) #5
  br label %803

703:                                              ; preds = %699
  call void @llvm.lifetime.start.p0(i64 8, ptr %65) #5
  call void @llvm.memcpy.p0.p0.i64(ptr align 2 %65, ptr align 2 %62, i64 8, i1 false), !tbaa.struct !19
  call void @llvm.lifetime.start.p0(i64 8, ptr %66) #5
  store ptr null, ptr %66, align 8, !tbaa !5
  br label %704

704:                                              ; preds = %741, %703
  %705 = load ptr, ptr %66, align 8, !tbaa !5
  %706 = getelementptr inbounds %struct.arm_2d_region_t, ptr %705, i32 1
  store ptr %706, ptr %66, align 8, !tbaa !5
  %707 = icmp eq ptr %705, null
  br i1 %707, label %709, label %708

708:                                              ; preds = %704
  store i32 38, ptr %16, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %66) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %65) #5
  br label %742

709:                                              ; preds = %704
  call void @llvm.lifetime.start.p0(i64 8, ptr %67) #5
  call void @llvm.memcpy.p0.p0.i64(ptr align 2 %67, ptr align 2 %65, i64 8, i1 false), !tbaa.struct !19
  call void @llvm.lifetime.start.p0(i64 8, ptr %68) #5
  store ptr null, ptr %68, align 8, !tbaa !5
  br label %710

710:                                              ; preds = %736, %709
  %711 = load ptr, ptr %68, align 8, !tbaa !5
  %712 = getelementptr inbounds %struct.arm_2d_region_t, ptr %711, i32 1
  store ptr %712, ptr %68, align 8, !tbaa !5
  %713 = icmp eq ptr %711, null
  br i1 %713, label %714, label %722

714:                                              ; preds = %710
  %715 = getelementptr inbounds %struct.arm_2d_tile_t, ptr %29, i32 0, i32 1
  %716 = getelementptr inbounds %struct.arm_2d_region_t, ptr %715, i32 0, i32 1
  %717 = getelementptr inbounds %struct.arm_2d_size_t, ptr %716, i32 0, i32 0
  %718 = load i16, ptr %717, align 4, !tbaa !17
  %719 = getelementptr inbounds %struct.arm_2d_region_t, ptr %67, i32 0, i32 1
  %720 = getelementptr inbounds %struct.arm_2d_size_t, ptr %719, i32 0, i32 0
  store i16 %718, ptr %720, align 2, !tbaa !17
  store i16 %718, ptr %69, align 2, !tbaa !9
  %721 = load i16, ptr %69, align 2, !tbaa !9
  br label %723

722:                                              ; preds = %710
  br label %723

723:                                              ; preds = %722, %714
  %724 = phi i32 [ 1, %714 ], [ 0, %722 ]
  %725 = icmp ne i32 %724, 0
  br i1 %725, label %727, label %726

726:                                              ; preds = %723
  store i32 40, ptr %16, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %68) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %67) #5
  br label %741

727:                                              ; preds = %723
  %728 = load i16, ptr %11, align 2, !tbaa !9
  store i16 %728, ptr %71, align 2, !tbaa !17
  %729 = load i16, ptr %71, align 2, !tbaa !17
  store i16 %729, ptr %70, align 2, !tbaa !17
  %730 = getelementptr inbounds %struct.arm_2d_border_opacity_t, ptr %7, i32 0, i32 0
  %731 = load i8, ptr %730, align 1, !tbaa !26
  %732 = getelementptr inbounds %union.arm_2d_color_rgb565_t, ptr %70, i32 0, i32 0
  %733 = load i16, ptr %732, align 2
  %734 = call i32 @arm_2dp_rgb565_fill_colour_with_horizontal_line_mask_and_opacity(ptr noundef null, ptr noundef %17, ptr noundef %67, ptr noundef %29, i16 %733, i8 noundef zeroext %731)
  %735 = call zeroext i1 @arm_2d_op_wait_async(ptr noundef null)
  br label %736

736:                                              ; preds = %727
  %737 = call zeroext i1 @arm_2d_op_wait_async(ptr noundef null)
  %738 = zext i1 %737 to i8
  store i8 %738, ptr %72, align 1, !tbaa !28
  %739 = load i8, ptr %72, align 1, !tbaa !28, !range !30, !noundef !31
  %740 = trunc i8 %739 to i1
  br label %710, !llvm.loop !44

741:                                              ; preds = %726
  br label %704, !llvm.loop !45

742:                                              ; preds = %708
  call void @llvm.lifetime.start.p0(i64 8, ptr %73) #5
  call void @llvm.memcpy.p0.p0.i64(ptr align 2 %73, ptr align 2 %62, i64 8, i1 false), !tbaa.struct !19
  call void @llvm.lifetime.start.p0(i64 8, ptr %74) #5
  store ptr null, ptr %74, align 8, !tbaa !5
  br label %743

743:                                              ; preds = %796, %742
  %744 = load ptr, ptr %74, align 8, !tbaa !5
  %745 = getelementptr inbounds %struct.arm_2d_region_t, ptr %744, i32 1
  store ptr %745, ptr %74, align 8, !tbaa !5
  %746 = icmp eq ptr %744, null
  br i1 %746, label %748, label %747

747:                                              ; preds = %743
  store i32 43, ptr %16, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %74) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %73) #5
  br label %797

748:                                              ; preds = %743
  call void @llvm.lifetime.start.p0(i64 8, ptr %75) #5
  call void @llvm.memcpy.p0.p0.i64(ptr align 2 %75, ptr align 2 %73, i64 8, i1 false), !tbaa.struct !19
  call void @llvm.lifetime.start.p0(i64 8, ptr %76) #5
  store ptr null, ptr %76, align 8, !tbaa !5
  br label %749

749:                                              ; preds = %791, %748
  %750 = load ptr, ptr %76, align 8, !tbaa !5
  %751 = getelementptr inbounds %struct.arm_2d_region_t, ptr %750, i32 1
  store ptr %751, ptr %76, align 8, !tbaa !5
  %752 = icmp eq ptr %750, null
  br i1 %752, label %753, label %777

753:                                              ; preds = %749
  %754 = getelementptr inbounds %struct.arm_2d_tile_t, ptr %30, i32 0, i32 1
  %755 = getelementptr inbounds %struct.arm_2d_region_t, ptr %754, i32 0, i32 1
  %756 = getelementptr inbounds %struct.arm_2d_size_t, ptr %755, i32 0, i32 0
  %757 = load i16, ptr %756, align 4, !tbaa !17
  %758 = getelementptr inbounds %struct.arm_2d_region_t, ptr %75, i32 0, i32 1
  %759 = getelementptr inbounds %struct.arm_2d_size_t, ptr %758, i32 0, i32 0
  store i16 %757, ptr %759, align 2, !tbaa !17
  %760 = getelementptr inbounds %struct.arm_2d_region_t, ptr %73, i32 0, i32 1
  %761 = getelementptr inbounds %struct.arm_2d_size_t, ptr %760, i32 0, i32 0
  %762 = load i16, ptr %761, align 2, !tbaa !17
  %763 = sext i16 %762 to i32
  %764 = getelementptr inbounds %struct.arm_2d_tile_t, ptr %30, i32 0, i32 1
  %765 = getelementptr inbounds %struct.arm_2d_region_t, ptr %764, i32 0, i32 1
  %766 = getelementptr inbounds %struct.arm_2d_size_t, ptr %765, i32 0, i32 0
  %767 = load i16, ptr %766, align 4, !tbaa !17
  %768 = sext i16 %767 to i32
  %769 = sub nsw i32 %763, %768
  %770 = getelementptr inbounds %struct.arm_2d_region_t, ptr %75, i32 0, i32 0
  %771 = getelementptr inbounds %struct.arm_2d_location_t, ptr %770, i32 0, i32 0
  %772 = load i16, ptr %771, align 2, !tbaa !17
  %773 = sext i16 %772 to i32
  %774 = add nsw i32 %773, %769
  %775 = trunc i32 %774 to i16
  store i16 %775, ptr %771, align 2, !tbaa !17
  store i16 %775, ptr %77, align 2, !tbaa !9
  %776 = load i16, ptr %77, align 2, !tbaa !9
  br label %778

777:                                              ; preds = %749
  br label %778

778:                                              ; preds = %777, %753
  %779 = phi i32 [ 1, %753 ], [ 0, %777 ]
  %780 = icmp ne i32 %779, 0
  br i1 %780, label %782, label %781

781:                                              ; preds = %778
  store i32 45, ptr %16, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %76) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %75) #5
  br label %796

782:                                              ; preds = %778
  %783 = load i16, ptr %11, align 2, !tbaa !9
  store i16 %783, ptr %79, align 2, !tbaa !17
  %784 = load i16, ptr %79, align 2, !tbaa !17
  store i16 %784, ptr %78, align 2, !tbaa !17
  %785 = getelementptr inbounds %struct.arm_2d_border_opacity_t, ptr %7, i32 0, i32 2
  %786 = load i8, ptr %785, align 1, !tbaa !38
  %787 = getelementptr inbounds %union.arm_2d_color_rgb565_t, ptr %78, i32 0, i32 0
  %788 = load i16, ptr %787, align 2
  %789 = call i32 @arm_2dp_rgb565_fill_colour_with_horizontal_line_mask_and_opacity(ptr noundef null, ptr noundef %17, ptr noundef %75, ptr noundef %30, i16 %788, i8 noundef zeroext %786)
  %790 = call zeroext i1 @arm_2d_op_wait_async(ptr noundef null)
  br label %791

791:                                              ; preds = %782
  %792 = call zeroext i1 @arm_2d_op_wait_async(ptr noundef null)
  %793 = zext i1 %792 to i8
  store i8 %793, ptr %80, align 1, !tbaa !28
  %794 = load i8, ptr %80, align 1, !tbaa !28, !range !30, !noundef !31
  %795 = trunc i8 %794 to i1
  br label %749, !llvm.loop !46

796:                                              ; preds = %781
  br label %743, !llvm.loop !47

797:                                              ; preds = %747
  br label %798

798:                                              ; preds = %797
  %799 = call zeroext i1 @arm_2d_op_wait_async(ptr noundef null)
  %800 = zext i1 %799 to i8
  store i8 %800, ptr %81, align 1, !tbaa !28
  %801 = load i8, ptr %81, align 1, !tbaa !28, !range !30, !noundef !31
  %802 = trunc i8 %801 to i1
  br label %655, !llvm.loop !48

803:                                              ; preds = %702
  br label %649, !llvm.loop !49

804:                                              ; preds = %653
  call void @llvm.lifetime.start.p0(i64 8, ptr %82) #5
  call void @llvm.memcpy.p0.p0.i64(ptr align 2 %82, ptr align 2 %22, i64 8, i1 false), !tbaa.struct !19
  call void @llvm.lifetime.start.p0(i64 8, ptr %83) #5
  store ptr null, ptr %83, align 8, !tbaa !5
  br label %805

805:                                              ; preds = %959, %804
  %806 = load ptr, ptr %83, align 8, !tbaa !5
  %807 = getelementptr inbounds %struct.arm_2d_region_t, ptr %806, i32 1
  store ptr %807, ptr %83, align 8, !tbaa !5
  %808 = icmp eq ptr %806, null
  br i1 %808, label %810, label %809

809:                                              ; preds = %805
  store i32 48, ptr %16, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %83) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %82) #5
  br label %960

810:                                              ; preds = %805
  call void @llvm.lifetime.start.p0(i64 8, ptr %84) #5
  call void @llvm.memcpy.p0.p0.i64(ptr align 2 %84, ptr align 2 %82, i64 8, i1 false), !tbaa.struct !19
  call void @llvm.lifetime.start.p0(i64 8, ptr %85) #5
  store ptr null, ptr %85, align 8, !tbaa !5
  br label %811

811:                                              ; preds = %954, %810
  %812 = load ptr, ptr %85, align 8, !tbaa !5
  %813 = getelementptr inbounds %struct.arm_2d_region_t, ptr %812, i32 1
  store ptr %813, ptr %85, align 8, !tbaa !5
  %814 = icmp eq ptr %812, null
  br i1 %814, label %815, label %854

815:                                              ; preds = %811
  %816 = getelementptr inbounds %struct.arm_2d_region_t, ptr %22, i32 0, i32 1
  %817 = getelementptr inbounds %struct.arm_2d_size_t, ptr %816, i32 0, i32 0
  %818 = load i16, ptr %817, align 2, !tbaa !17
  %819 = sext i16 %818 to i32
  %820 = getelementptr inbounds %struct.arm_2d_tile_t, ptr %28, i32 0, i32 1
  %821 = getelementptr inbounds %struct.arm_2d_region_t, ptr %820, i32 0, i32 1
  %822 = getelementptr inbounds %struct.arm_2d_size_t, ptr %821, i32 0, i32 0
  %823 = load i16, ptr %822, align 4, !tbaa !17
  %824 = sext i16 %823 to i32
  %825 = mul nsw i32 %824, 2
  %826 = sub nsw i32 %819, %825
  %827 = trunc i32 %826 to i16
  %828 = getelementptr inbounds %struct.arm_2d_region_t, ptr %84, i32 0, i32 1
  %829 = getelementptr inbounds %struct.arm_2d_size_t, ptr %828, i32 0, i32 0
  store i16 %827, ptr %829, align 2, !tbaa !17
  %830 = getelementptr inbounds %struct.arm_2d_region_t, ptr %82, i32 0, i32 1
  %831 = getelementptr inbounds %struct.arm_2d_size_t, ptr %830, i32 0, i32 0
  %832 = load i16, ptr %831, align 2, !tbaa !17
  %833 = sext i16 %832 to i32
  %834 = getelementptr inbounds %struct.arm_2d_region_t, ptr %22, i32 0, i32 1
  %835 = getelementptr inbounds %struct.arm_2d_size_t, ptr %834, i32 0, i32 0
  %836 = load i16, ptr %835, align 2, !tbaa !17
  %837 = sext i16 %836 to i32
  %838 = getelementptr inbounds %struct.arm_2d_tile_t, ptr %28, i32 0, i32 1
  %839 = getelementptr inbounds %struct.arm_2d_region_t, ptr %838, i32 0, i32 1
  %840 = getelementptr inbounds %struct.arm_2d_size_t, ptr %839, i32 0, i32 0
  %841 = load i16, ptr %840, align 4, !tbaa !17
  %842 = sext i16 %841 to i32
  %843 = mul nsw i32 %842, 2
  %844 = sub nsw i32 %837, %843
  %845 = sub nsw i32 %833, %844
  %846 = ashr i32 %845, 1
  %847 = getelementptr inbounds %struct.arm_2d_region_t, ptr %84, i32 0, i32 0
  %848 = getelementptr inbounds %struct.arm_2d_location_t, ptr %847, i32 0, i32 0
  %849 = load i16, ptr %848, align 2, !tbaa !17
  %850 = sext i16 %849 to i32
  %851 = add nsw i32 %850, %846
  %852 = trunc i32 %851 to i16
  store i16 %852, ptr %848, align 2, !tbaa !17
  store i16 %852, ptr %86, align 2, !tbaa !9
  %853 = load i16, ptr %86, align 2, !tbaa !9
  br label %855

854:                                              ; preds = %811
  br label %855

855:                                              ; preds = %854, %815
  %856 = phi i32 [ 1, %815 ], [ 0, %854 ]
  %857 = icmp ne i32 %856, 0
  br i1 %857, label %859, label %858

858:                                              ; preds = %855
  store i32 50, ptr %16, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %85) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %84) #5
  br label %959

859:                                              ; preds = %855
  call void @llvm.lifetime.start.p0(i64 8, ptr %87) #5
  call void @llvm.memcpy.p0.p0.i64(ptr align 2 %87, ptr align 2 %84, i64 8, i1 false), !tbaa.struct !19
  call void @llvm.lifetime.start.p0(i64 8, ptr %88) #5
  store ptr null, ptr %88, align 8, !tbaa !5
  br label %860

860:                                              ; preds = %897, %859
  %861 = load ptr, ptr %88, align 8, !tbaa !5
  %862 = getelementptr inbounds %struct.arm_2d_region_t, ptr %861, i32 1
  store ptr %862, ptr %88, align 8, !tbaa !5
  %863 = icmp eq ptr %861, null
  br i1 %863, label %865, label %864

864:                                              ; preds = %860
  store i32 53, ptr %16, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %88) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %87) #5
  br label %898

865:                                              ; preds = %860
  call void @llvm.lifetime.start.p0(i64 8, ptr %89) #5
  call void @llvm.memcpy.p0.p0.i64(ptr align 2 %89, ptr align 2 %87, i64 8, i1 false), !tbaa.struct !19
  call void @llvm.lifetime.start.p0(i64 8, ptr %90) #5
  store ptr null, ptr %90, align 8, !tbaa !5
  br label %866

866:                                              ; preds = %892, %865
  %867 = load ptr, ptr %90, align 8, !tbaa !5
  %868 = getelementptr inbounds %struct.arm_2d_region_t, ptr %867, i32 1
  store ptr %868, ptr %90, align 8, !tbaa !5
  %869 = icmp eq ptr %867, null
  br i1 %869, label %870, label %878

870:                                              ; preds = %866
  %871 = getelementptr inbounds %struct.arm_2d_tile_t, ptr %31, i32 0, i32 1
  %872 = getelementptr inbounds %struct.arm_2d_region_t, ptr %871, i32 0, i32 1
  %873 = getelementptr inbounds %struct.arm_2d_size_t, ptr %872, i32 0, i32 1
  %874 = load i16, ptr %873, align 2, !tbaa !17
  %875 = getelementptr inbounds %struct.arm_2d_region_t, ptr %89, i32 0, i32 1
  %876 = getelementptr inbounds %struct.arm_2d_size_t, ptr %875, i32 0, i32 1
  store i16 %874, ptr %876, align 2, !tbaa !17
  store i16 %874, ptr %91, align 2, !tbaa !9
  %877 = load i16, ptr %91, align 2, !tbaa !9
  br label %879

878:                                              ; preds = %866
  br label %879

879:                                              ; preds = %878, %870
  %880 = phi i32 [ 1, %870 ], [ 0, %878 ]
  %881 = icmp ne i32 %880, 0
  br i1 %881, label %883, label %882

882:                                              ; preds = %879
  store i32 55, ptr %16, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %90) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %89) #5
  br label %897

883:                                              ; preds = %879
  %884 = load i16, ptr %11, align 2, !tbaa !9
  store i16 %884, ptr %93, align 2, !tbaa !17
  %885 = load i16, ptr %93, align 2, !tbaa !17
  store i16 %885, ptr %92, align 2, !tbaa !17
  %886 = getelementptr inbounds %struct.arm_2d_border_opacity_t, ptr %7, i32 0, i32 1
  %887 = load i8, ptr %886, align 1, !tbaa !35
  %888 = getelementptr inbounds %union.arm_2d_color_rgb565_t, ptr %92, i32 0, i32 0
  %889 = load i16, ptr %888, align 2
  %890 = call i32 @arm_2dp_rgb565_fill_colour_with_vertical_line_mask_and_opacity(ptr noundef null, ptr noundef %17, ptr noundef %89, ptr noundef %31, i16 %889, i8 noundef zeroext %887)
  %891 = call zeroext i1 @arm_2d_op_wait_async(ptr noundef null)
  br label %892

892:                                              ; preds = %883
  %893 = call zeroext i1 @arm_2d_op_wait_async(ptr noundef null)
  %894 = zext i1 %893 to i8
  store i8 %894, ptr %94, align 1, !tbaa !28
  %895 = load i8, ptr %94, align 1, !tbaa !28, !range !30, !noundef !31
  %896 = trunc i8 %895 to i1
  br label %866, !llvm.loop !50

897:                                              ; preds = %882
  br label %860, !llvm.loop !51

898:                                              ; preds = %864
  call void @llvm.lifetime.start.p0(i64 8, ptr %95) #5
  call void @llvm.memcpy.p0.p0.i64(ptr align 2 %95, ptr align 2 %84, i64 8, i1 false), !tbaa.struct !19
  call void @llvm.lifetime.start.p0(i64 8, ptr %96) #5
  store ptr null, ptr %96, align 8, !tbaa !5
  br label %899

899:                                              ; preds = %952, %898
  %900 = load ptr, ptr %96, align 8, !tbaa !5
  %901 = getelementptr inbounds %struct.arm_2d_region_t, ptr %900, i32 1
  store ptr %901, ptr %96, align 8, !tbaa !5
  %902 = icmp eq ptr %900, null
  br i1 %902, label %904, label %903

903:                                              ; preds = %899
  store i32 58, ptr %16, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %96) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %95) #5
  br label %953

904:                                              ; preds = %899
  call void @llvm.lifetime.start.p0(i64 8, ptr %97) #5
  call void @llvm.memcpy.p0.p0.i64(ptr align 2 %97, ptr align 2 %95, i64 8, i1 false), !tbaa.struct !19
  call void @llvm.lifetime.start.p0(i64 8, ptr %98) #5
  store ptr null, ptr %98, align 8, !tbaa !5
  br label %905

905:                                              ; preds = %947, %904
  %906 = load ptr, ptr %98, align 8, !tbaa !5
  %907 = getelementptr inbounds %struct.arm_2d_region_t, ptr %906, i32 1
  store ptr %907, ptr %98, align 8, !tbaa !5
  %908 = icmp eq ptr %906, null
  br i1 %908, label %909, label %933

909:                                              ; preds = %905
  %910 = getelementptr inbounds %struct.arm_2d_tile_t, ptr %32, i32 0, i32 1
  %911 = getelementptr inbounds %struct.arm_2d_region_t, ptr %910, i32 0, i32 1
  %912 = getelementptr inbounds %struct.arm_2d_size_t, ptr %911, i32 0, i32 1
  %913 = load i16, ptr %912, align 2, !tbaa !17
  %914 = getelementptr inbounds %struct.arm_2d_region_t, ptr %97, i32 0, i32 1
  %915 = getelementptr inbounds %struct.arm_2d_size_t, ptr %914, i32 0, i32 1
  store i16 %913, ptr %915, align 2, !tbaa !17
  %916 = getelementptr inbounds %struct.arm_2d_region_t, ptr %95, i32 0, i32 1
  %917 = getelementptr inbounds %struct.arm_2d_size_t, ptr %916, i32 0, i32 1
  %918 = load i16, ptr %917, align 2, !tbaa !17
  %919 = sext i16 %918 to i32
  %920 = getelementptr inbounds %struct.arm_2d_tile_t, ptr %32, i32 0, i32 1
  %921 = getelementptr inbounds %struct.arm_2d_region_t, ptr %920, i32 0, i32 1
  %922 = getelementptr inbounds %struct.arm_2d_size_t, ptr %921, i32 0, i32 1
  %923 = load i16, ptr %922, align 2, !tbaa !17
  %924 = sext i16 %923 to i32
  %925 = sub nsw i32 %919, %924
  %926 = getelementptr inbounds %struct.arm_2d_region_t, ptr %97, i32 0, i32 0
  %927 = getelementptr inbounds %struct.arm_2d_location_t, ptr %926, i32 0, i32 1
  %928 = load i16, ptr %927, align 2, !tbaa !17
  %929 = sext i16 %928 to i32
  %930 = add nsw i32 %929, %925
  %931 = trunc i32 %930 to i16
  store i16 %931, ptr %927, align 2, !tbaa !17
  store i16 %931, ptr %99, align 2, !tbaa !9
  %932 = load i16, ptr %99, align 2, !tbaa !9
  br label %934

933:                                              ; preds = %905
  br label %934

934:                                              ; preds = %933, %909
  %935 = phi i32 [ 1, %909 ], [ 0, %933 ]
  %936 = icmp ne i32 %935, 0
  br i1 %936, label %938, label %937

937:                                              ; preds = %934
  store i32 60, ptr %16, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %98) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %97) #5
  br label %952

938:                                              ; preds = %934
  %939 = load i16, ptr %11, align 2, !tbaa !9
  store i16 %939, ptr %101, align 2, !tbaa !17
  %940 = load i16, ptr %101, align 2, !tbaa !17
  store i16 %940, ptr %100, align 2, !tbaa !17
  %941 = getelementptr inbounds %struct.arm_2d_border_opacity_t, ptr %7, i32 0, i32 3
  %942 = load i8, ptr %941, align 1, !tbaa !41
  %943 = getelementptr inbounds %union.arm_2d_color_rgb565_t, ptr %100, i32 0, i32 0
  %944 = load i16, ptr %943, align 2
  %945 = call i32 @arm_2dp_rgb565_fill_colour_with_vertical_line_mask_and_opacity(ptr noundef null, ptr noundef %17, ptr noundef %97, ptr noundef %32, i16 %944, i8 noundef zeroext %942)
  %946 = call zeroext i1 @arm_2d_op_wait_async(ptr noundef null)
  br label %947

947:                                              ; preds = %938
  %948 = call zeroext i1 @arm_2d_op_wait_async(ptr noundef null)
  %949 = zext i1 %948 to i8
  store i8 %949, ptr %102, align 1, !tbaa !28
  %950 = load i8, ptr %102, align 1, !tbaa !28, !range !30, !noundef !31
  %951 = trunc i8 %950 to i1
  br label %905, !llvm.loop !52

952:                                              ; preds = %937
  br label %899, !llvm.loop !53

953:                                              ; preds = %903
  br label %954

954:                                              ; preds = %953
  %955 = call zeroext i1 @arm_2d_op_wait_async(ptr noundef null)
  %956 = zext i1 %955 to i8
  store i8 %956, ptr %103, align 1, !tbaa !28
  %957 = load i8, ptr %103, align 1, !tbaa !28, !range !30, !noundef !31
  %958 = trunc i8 %957 to i1
  br label %811, !llvm.loop !54

959:                                              ; preds = %858
  br label %805, !llvm.loop !55

960:                                              ; preds = %809
  call void @llvm.lifetime.end.p0(i64 24, ptr %32) #5
  call void @llvm.lifetime.end.p0(i64 24, ptr %31) #5
  call void @llvm.lifetime.end.p0(i64 24, ptr %30) #5
  call void @llvm.lifetime.end.p0(i64 24, ptr %29) #5
  call void @llvm.lifetime.end.p0(i64 24, ptr %28) #5
  call void @llvm.lifetime.end.p0(i64 2, ptr %27) #5
  call void @llvm.lifetime.end.p0(i64 2, ptr %26) #5
  br label %961

961:                                              ; preds = %960
  %962 = load ptr, ptr %24, align 8, !tbaa !5
  br label %215, !llvm.loop !56

963:                                              ; preds = %222, %219
  call void @llvm.lifetime.end.p0(i64 8, ptr %25) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %24) #5
  br label %964

964:                                              ; preds = %963
  br label %965

965:                                              ; preds = %964
  %966 = call zeroext i1 @arm_2d_op_wait_async(ptr noundef null)
  %967 = zext i1 %966 to i8
  store i8 %967, ptr %104, align 1, !tbaa !28
  %968 = load i8, ptr %104, align 1, !tbaa !28, !range !30, !noundef !31
  %969 = trunc i8 %968 to i1
  br label %201, !llvm.loop !57

970:                                              ; preds = %213
  br label %971

971:                                              ; preds = %970
  br label %120, !llvm.loop !58

972:                                              ; preds = %199, %191
  call void @llvm.lifetime.end.p0(i64 8, ptr %18) #5
  call void @llvm.lifetime.end.p0(i64 24, ptr %17) #5
  br label %973

973:                                              ; preds = %972
  br label %105, !llvm.loop !59

974:                                              ; preds = %118
  ret void
}

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

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

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

declare i32 @arm_2dp_rgb565_fill_colour_with_horizontal_line_mask_and_opacity(ptr noundef, ptr noundef, ptr noundef, ptr noundef, i16, i8 noundef zeroext) #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) #3

attributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { nocallback nofree nounwind willreturn memory(argmem: readwrite) }
attributes #2 = { nocallback nofree nounwind willreturn memory(argmem: write) }
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 = { 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 = { nounwind }

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"any pointer", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!10, !10, i64 0}
!10 = !{!"short", !7, i64 0}
!11 = !{!12, !7, i64 0}
!12 = !{!"arm_2d_margin_t", !7, i64 0, !7, i64 1, !7, i64 2, !7, i64 3}
!13 = !{!12, !7, i64 1}
!14 = !{!12, !7, i64 2}
!15 = !{!12, !7, i64 3}
!16 = !{i64 0, i64 1, !17, i64 1, i64 1, !17, i64 2, i64 1, !17, i64 3, i64 1, !17}
!17 = !{!7, !7, i64 0}
!18 = !{i64 0, i64 2, !9, i64 2, i64 2, !9}
!19 = !{i64 0, i64 4, !17, i64 4, i64 4, !17}
!20 = !{!21, !10, i64 0}
!21 = !{!"arm_2d_location_t", !10, i64 0, !10, i64 2}
!22 = !{!21, !10, i64 2}
!23 = !{!24, !10, i64 0}
!24 = !{!"arm_2d_size_t", !10, i64 0, !10, i64 2}
!25 = !{!24, !10, i64 2}
!26 = !{!27, !7, i64 0}
!27 = !{!"", !7, i64 0, !7, i64 1, !7, i64 2, !7, i64 3}
!28 = !{!29, !29, i64 0}
!29 = !{!"_Bool", !7, i64 0}
!30 = !{i8 0, i8 2}
!31 = !{}
!32 = distinct !{!32, !33}
!33 = !{!"llvm.loop.mustprogress"}
!34 = distinct !{!34, !33}
!35 = !{!27, !7, i64 1}
!36 = distinct !{!36, !33}
!37 = distinct !{!37, !33}
!38 = !{!27, !7, i64 2}
!39 = distinct !{!39, !33}
!40 = distinct !{!40, !33}
!41 = !{!27, !7, i64 3}
!42 = distinct !{!42, !33}
!43 = distinct !{!43, !33}
!44 = distinct !{!44, !33}
!45 = distinct !{!45, !33}
!46 = distinct !{!46, !33}
!47 = distinct !{!47, !33}
!48 = distinct !{!48, !33}
!49 = distinct !{!49, !33}
!50 = distinct !{!50, !33}
!51 = distinct !{!51, !33}
!52 = distinct !{!52, !33}
!53 = distinct !{!53, !33}
!54 = distinct !{!54, !33}
!55 = distinct !{!55, !33}
!56 = distinct !{!56, !33}
!57 = distinct !{!57, !33}
!58 = distinct !{!58, !33}
!59 = distinct !{!59, !33}


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

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

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

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

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

declare zeroext i1 @arm_2d_helper_pfb_is_region_being_drawing(ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #2

declare i32 @arm_2dp_rgb565_fill_colour_with_mask_and_opacity(ptr noundef, ptr noundef, ptr noundef, ptr noundef, i16, i8 noundef zeroext) local_unnamed_addr #2

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

; Function Attrs: nounwind uwtable
define dso_local void @__draw_round_corner_border(ptr noundef nonnull %0, ptr noundef readonly %1, i16 noundef zeroext %2, i32 %3, i32 %4, ptr noundef %5) local_unnamed_addr #3 {
  %7 = alloca %struct.arm_2d_tile_t, align 8
  %8 = alloca %struct.arm_2d_region_t, align 8
  %9 = alloca %struct.arm_2d_tile_t, align 8
  %10 = alloca %struct.arm_2d_tile_t, align 8
  %11 = alloca %struct.arm_2d_tile_t, align 8
  %12 = alloca %struct.arm_2d_tile_t, align 8
  %13 = alloca %struct.arm_2d_tile_t, align 8
  %14 = alloca %struct.arm_2d_region_t, align 2
  %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 2
  %18 = alloca %struct.arm_2d_region_t, align 2
  %19 = alloca %struct.arm_2d_region_t, align 2
  %20 = alloca %struct.arm_2d_region_t, align 2
  %21 = alloca %struct.arm_2d_region_t, align 2
  %.sroa.0196.0.extract.trunc = trunc i32 %3 to i8
  %.sroa.2197.0.extract.shift = lshr i32 %3, 8
  %.sroa.2197.0.extract.trunc = trunc i32 %.sroa.2197.0.extract.shift to i8
  %.sroa.3198.0.extract.shift = lshr i32 %3, 16
  %.sroa.3198.0.extract.trunc = trunc i32 %.sroa.3198.0.extract.shift to i8
  %.sroa.4199.0.extract.shift = lshr i32 %3, 24
  %.sroa.4199.0.extract.trunc = trunc nuw i32 %.sroa.4199.0.extract.shift to i8
  %.sroa.0192.0.extract.trunc = trunc i32 %4 to i8
  %.sroa.2193.0.extract.shift = lshr i32 %4, 8
  %.sroa.2193.0.extract.trunc = trunc i32 %.sroa.2193.0.extract.shift to i8
  %.sroa.3194.0.extract.shift = lshr i32 %4, 16
  %.sroa.3194.0.extract.trunc = trunc i32 %.sroa.3194.0.extract.shift to i8
  %.sroa.4195.0.extract.shift = lshr i32 %4, 24
  %.sroa.4195.0.extract.trunc = trunc nuw i32 %.sroa.4195.0.extract.shift to i8
  %22 = icmp eq ptr %1, null
  %23 = getelementptr inbounds i8, ptr %7, i64 8
  %.sroa.18.4..sroa_idx = getelementptr inbounds i8, ptr %7, i64 10
  %24 = getelementptr inbounds i8, ptr %5, i64 8
  %25 = getelementptr inbounds i8, ptr %9, i64 1
  %26 = getelementptr inbounds i8, ptr %9, i64 8
  %27 = getelementptr inbounds i8, ptr %9, i64 10
  %28 = getelementptr inbounds i8, ptr %9, i64 16
  %29 = getelementptr inbounds i8, ptr %10, i64 1
  %30 = getelementptr inbounds i8, ptr %10, i64 2
  %31 = getelementptr inbounds i8, ptr %10, i64 4
  %32 = getelementptr inbounds i8, ptr %10, i64 6
  %33 = getelementptr inbounds i8, ptr %10, i64 8
  %34 = getelementptr inbounds i8, ptr %10, i64 10
  %35 = getelementptr inbounds i8, ptr %10, i64 16
  %36 = getelementptr inbounds i8, ptr %11, i64 1
  %37 = getelementptr inbounds i8, ptr %11, i64 2
  %38 = getelementptr inbounds i8, ptr %11, i64 4
  %39 = getelementptr inbounds i8, ptr %11, i64 6
  %40 = getelementptr inbounds i8, ptr %11, i64 8
  %41 = getelementptr inbounds i8, ptr %11, i64 10
  %42 = getelementptr inbounds i8, ptr %11, i64 16
  %43 = getelementptr inbounds i8, ptr %12, i64 1
  %44 = getelementptr inbounds i8, ptr %12, i64 2
  %45 = getelementptr inbounds i8, ptr %12, i64 4
  %46 = getelementptr inbounds i8, ptr %12, i64 6
  %47 = getelementptr inbounds i8, ptr %12, i64 8
  %48 = getelementptr inbounds i8, ptr %12, i64 10
  %49 = getelementptr inbounds i8, ptr %12, i64 16
  %50 = getelementptr inbounds i8, ptr %13, i64 1
  %51 = getelementptr inbounds i8, ptr %13, i64 2
  %52 = getelementptr inbounds i8, ptr %13, i64 4
  %53 = getelementptr inbounds i8, ptr %13, i64 6
  %54 = getelementptr inbounds i8, ptr %13, i64 8
  %55 = getelementptr inbounds i8, ptr %13, i64 10
  %56 = getelementptr inbounds i8, ptr %13, i64 16
  %57 = getelementptr inbounds i8, ptr %14, i64 4
  %58 = getelementptr inbounds i8, ptr %14, i64 6
  %.sroa.4156.0..sroa_idx = getelementptr inbounds i8, ptr %14, i64 2
  %59 = getelementptr inbounds i8, ptr %15, i64 4
  %.sroa.0101.sroa.4.0..sroa_idx = getelementptr inbounds i8, ptr %15, i64 2
  %60 = getelementptr inbounds i8, ptr %16, i64 4
  %.sroa.094.sroa.4.0..sroa_idx = getelementptr inbounds i8, ptr %16, i64 2
  %61 = getelementptr inbounds i8, ptr %17, i64 4
  %62 = getelementptr inbounds i8, ptr %17, i64 6
  %.sroa.086.sroa.4.0..sroa_idx = getelementptr inbounds i8, ptr %17, i64 2
  %.sroa.472.0..sroa_idx = getelementptr inbounds i8, ptr %18, i64 2
  %.sroa.573.0..sroa_idx = getelementptr inbounds i8, ptr %18, i64 4
  %.sroa.674.0..sroa_idx = getelementptr inbounds i8, ptr %18, i64 6
  %.sroa.043.sroa.4.0..sroa_idx = getelementptr inbounds i8, ptr %19, i64 2
  %.sroa.444.0..sroa_idx45 = getelementptr inbounds i8, ptr %19, i64 4
  %.sroa.547.0..sroa_idx48 = getelementptr inbounds i8, ptr %19, i64 6
  %.sroa.430.0..sroa_idx = getelementptr inbounds i8, ptr %20, i64 2
  %.sroa.5.0..sroa_idx = getelementptr inbounds i8, ptr %20, i64 4
  %.sroa.6.0..sroa_idx = getelementptr inbounds i8, ptr %20, i64 6
  %.sroa.06.sroa.4.0..sroa_idx = getelementptr inbounds i8, ptr %21, i64 2
  %.sroa.06.sroa.5.0..sroa_idx = getelementptr inbounds i8, ptr %21, i64 4
  %.sroa.4.0..sroa_idx7 = getelementptr inbounds i8, ptr %21, i64 6
  call void @llvm.lifetime.start.p0(i64 24, ptr nonnull %7) #4
  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) #4
  store i64 0, ptr %8, align 8
  br i1 %22, label %63, label %67

63:                                               ; preds = %6
  %64 = getelementptr inbounds i8, ptr %0, i64 8
  %65 = getelementptr inbounds i8, ptr %8, i64 4
  %66 = load i32, ptr %64, align 4
  store i32 %66, ptr %65, align 4
  br label %.preheader280

67:                                               ; preds = %6
  %68 = load i64, ptr %1, align 2
  store i64 %68, ptr %8, align 8
  br label %.preheader280

.preheader280:                                    ; preds = %63, %67
  %69 = call ptr @arm_2d_tile_generate_child(ptr noundef nonnull %0, ptr noundef nonnull %8, ptr noundef nonnull %7, i1 noundef zeroext false) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %8) #4
  %.sroa.11.4.copyload294 = load i16, ptr %23, align 8
  %.sroa.18.4.copyload295 = load i16, ptr %.sroa.18.4..sroa_idx, align 2
  %70 = call zeroext i1 @arm_2d_helper_pfb_is_region_being_drawing(ptr noundef nonnull %7, ptr noundef null, ptr noundef null) #4
  br i1 %70, label %.critedge, label %.loopexit281

.critedge:                                        ; preds = %.preheader280
  %71 = load i16, ptr %24, align 4, !tbaa !5
  %72 = sdiv i16 %71, 2
  call void @llvm.lifetime.start.p0(i64 24, ptr nonnull %9) #4
  store i8 4, ptr %9, align 8
  call void @llvm.memset.p0.i64(ptr noundef nonnull align 1 dereferenceable(7) %25, i8 0, i64 7, i1 false)
  store i16 %72, ptr %26, align 8, !tbaa !8
  store i16 %72, ptr %27, align 2, !tbaa !11
  store ptr %5, ptr %28, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 24, ptr nonnull %10) #4
  store i8 4, ptr %10, align 8
  store i8 0, ptr %29, align 1
  store i16 0, ptr %30, align 2
  store i16 0, ptr %31, align 4, !tbaa !12
  store i16 %72, ptr %32, align 2, !tbaa !14
  store i16 %72, ptr %33, align 8, !tbaa !8
  store i16 1, ptr %34, align 2, !tbaa !11
  store ptr %5, ptr %35, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 24, ptr nonnull %11) #4
  store i8 4, ptr %11, align 8
  store i8 0, ptr %36, align 1
  store i16 0, ptr %37, align 2
  store i16 %72, ptr %38, align 4, !tbaa !12
  store i16 %72, ptr %39, align 2, !tbaa !14
  store i16 %72, ptr %40, align 8, !tbaa !8
  store i16 1, ptr %41, align 2, !tbaa !11
  store ptr %5, ptr %42, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 24, ptr nonnull %12) #4
  store i8 4, ptr %12, align 8
  store i8 0, ptr %43, align 1
  store i16 0, ptr %44, align 2
  store i16 %72, ptr %45, align 4, !tbaa !12
  store i16 0, ptr %46, align 2, !tbaa !14
  store i16 1, ptr %47, align 8, !tbaa !8
  store i16 %72, ptr %48, align 2, !tbaa !11
  store ptr %5, ptr %49, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 24, ptr nonnull %13) #4
  store i8 4, ptr %13, align 8
  store i8 0, ptr %50, align 1
  store i16 0, ptr %51, align 2
  store i16 %72, ptr %52, align 4, !tbaa !12
  store i16 %72, ptr %53, align 2, !tbaa !14
  store i16 1, ptr %54, align 8, !tbaa !8
  store i16 %72, ptr %55, align 2, !tbaa !11
  store ptr %5, ptr %56, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %14) #4
  store i16 %72, ptr %57, align 2, !tbaa !5
  store i16 %72, ptr %58, align 2, !tbaa !5
  store i16 0, ptr %14, align 2, !tbaa !15
  store i16 0, ptr %.sroa.4156.0..sroa_idx, align 2, !tbaa !15
  %73 = call i32 @arm_2dp_rgb565_fill_colour_with_mask_and_opacity(ptr noundef null, ptr noundef nonnull %7, ptr noundef nonnull %14, ptr noundef nonnull %9, i16 %2, i8 noundef zeroext %.sroa.0192.0.extract.trunc) #4
  %74 = call zeroext i1 @arm_2d_op_wait_async(ptr noundef null) #4
  %75 = call zeroext i1 @arm_2d_op_wait_async(ptr noundef null) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %14) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %15) #4
  %76 = load <2 x i16>, ptr %26, align 8, !tbaa !5
  store <2 x i16> %76, ptr %59, align 2, !tbaa !5
  store i16 0, ptr %.sroa.0101.sroa.4.0..sroa_idx, align 2, !tbaa !15
  %77 = extractelement <2 x i16> %76, i64 0
  %78 = sub i16 %.sroa.11.4.copyload294, %77
  store i16 %78, ptr %15, align 2, !tbaa !5
  %79 = call i32 @arm_2dp_rgb565_fill_colour_with_mask_x_mirror_and_opacity(ptr noundef null, ptr noundef nonnull %7, ptr noundef nonnull %15, ptr noundef nonnull %9, i16 %2, i8 noundef zeroext %.sroa.2193.0.extract.trunc) #4
  %80 = call zeroext i1 @arm_2d_op_wait_async(ptr noundef null) #4
  %81 = call zeroext i1 @arm_2d_op_wait_async(ptr noundef null) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %15) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %16) #4
  %82 = load <2 x i16>, ptr %26, align 8, !tbaa !5
  store <2 x i16> %82, ptr %60, align 2, !tbaa !5
  store i16 0, ptr %16, align 2, !tbaa !15
  %83 = extractelement <2 x i16> %82, i64 1
  %84 = sub i16 %.sroa.18.4.copyload295, %83
  store i16 %84, ptr %.sroa.094.sroa.4.0..sroa_idx, align 2, !tbaa !5
  %85 = call i32 @arm_2dp_rgb565_fill_colour_with_mask_y_mirror_and_opacity(ptr noundef null, ptr noundef nonnull %7, ptr noundef nonnull %16, ptr noundef nonnull %9, i16 %2, i8 noundef zeroext %.sroa.3194.0.extract.trunc) #4
  %86 = call zeroext i1 @arm_2d_op_wait_async(ptr noundef null) #4
  %87 = call zeroext i1 @arm_2d_op_wait_async(ptr noundef null) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %16) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %17) #4
  %88 = load i16, ptr %26, align 8, !tbaa !5
  store i16 %88, ptr %61, align 2, !tbaa !5
  %89 = load i16, ptr %27, align 2, !tbaa !5
  store i16 %89, ptr %62, align 2, !tbaa !5
  %90 = sub i16 %.sroa.11.4.copyload294, %88
  store i16 %90, ptr %17, align 2, !tbaa !5
  %91 = sub i16 %.sroa.18.4.copyload295, %89
  store i16 %91, ptr %.sroa.086.sroa.4.0..sroa_idx, align 2, !tbaa !5
  %92 = call i32 @arm_2dp_rgb565_fill_colour_with_mask_xy_mirror_and_opacity(ptr noundef null, ptr noundef nonnull %7, ptr noundef nonnull %17, ptr noundef nonnull %9, i16 %2, i8 noundef zeroext %.sroa.4195.0.extract.trunc) #4
  %93 = call zeroext i1 @arm_2d_op_wait_async(ptr noundef null) #4
  %94 = call zeroext i1 @arm_2d_op_wait_async(ptr noundef null) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %17) #4
  %95 = load i16, ptr %27, align 2
  %96 = shl i16 %95, 1
  %97 = sub i16 %.sroa.18.4.copyload295, %96
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %18) #4
  store i16 0, ptr %18, align 2
  store i16 %95, ptr %.sroa.472.0..sroa_idx, align 2, !tbaa !5
  store i16 %97, ptr %.sroa.674.0..sroa_idx, align 2, !tbaa !5
  store i16 %72, ptr %.sroa.573.0..sroa_idx, align 2, !tbaa !5
  %98 = call i32 @arm_2dp_rgb565_fill_colour_with_horizontal_line_mask_and_opacity(ptr noundef null, ptr noundef nonnull %7, ptr noundef nonnull %18, ptr noundef nonnull %10, i16 %2, i8 noundef zeroext %.sroa.0196.0.extract.trunc) #4
  %99 = call zeroext i1 @arm_2d_op_wait_async(ptr noundef null) #4
  %100 = call zeroext i1 @arm_2d_op_wait_async(ptr noundef null) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %18) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %19) #4
  store i16 %95, ptr %.sroa.043.sroa.4.0..sroa_idx, align 2, !tbaa !5
  store i16 %97, ptr %.sroa.547.0..sroa_idx48, align 2, !tbaa !5
  store i16 %72, ptr %.sroa.444.0..sroa_idx45, align 2, !tbaa !5
  %101 = sub i16 %.sroa.11.4.copyload294, %72
  store i16 %101, ptr %19, align 2, !tbaa !5
  %102 = call i32 @arm_2dp_rgb565_fill_colour_with_horizontal_line_mask_and_opacity(ptr noundef null, ptr noundef nonnull %7, ptr noundef nonnull %19, ptr noundef nonnull %11, i16 %2, i8 noundef zeroext %.sroa.3198.0.extract.trunc) #4
  %103 = call zeroext i1 @arm_2d_op_wait_async(ptr noundef null) #4
  %104 = call zeroext i1 @arm_2d_op_wait_async(ptr noundef null) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %19) #4
  %105 = call zeroext i1 @arm_2d_op_wait_async(ptr noundef null) #4
  %106 = load i16, ptr %26, align 8
  %107 = shl i16 %106, 1
  %108 = sub i16 %.sroa.11.4.copyload294, %107
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %20) #4
  store i16 %106, ptr %20, align 2
  store i16 0, ptr %.sroa.430.0..sroa_idx, align 2, !tbaa !5
  store i16 %108, ptr %.sroa.5.0..sroa_idx, align 2
  store i16 %72, ptr %.sroa.6.0..sroa_idx, align 2, !tbaa !5
  %109 = call i32 @arm_2dp_rgb565_fill_colour_with_vertical_line_mask_and_opacity(ptr noundef null, ptr noundef nonnull %7, ptr noundef nonnull %20, ptr noundef nonnull %12, i16 %2, i8 noundef zeroext %.sroa.2197.0.extract.trunc) #4
  %110 = call zeroext i1 @arm_2d_op_wait_async(ptr noundef null) #4
  %111 = call zeroext i1 @arm_2d_op_wait_async(ptr noundef null) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %20) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %21) #4
  store i16 %106, ptr %21, align 2
  store i16 %108, ptr %.sroa.06.sroa.5.0..sroa_idx, align 2
  store i16 %72, ptr %.sroa.4.0..sroa_idx7, align 2, !tbaa !5
  %112 = sub i16 %.sroa.18.4.copyload295, %72
  store i16 %112, ptr %.sroa.06.sroa.4.0..sroa_idx, align 2, !tbaa !5
  %113 = call i32 @arm_2dp_rgb565_fill_colour_with_vertical_line_mask_and_opacity(ptr noundef null, ptr noundef nonnull %7, ptr noundef nonnull %21, ptr noundef nonnull %13, i16 %2, i8 noundef zeroext %.sroa.4199.0.extract.trunc) #4
  %114 = call zeroext i1 @arm_2d_op_wait_async(ptr noundef null) #4
  %115 = call zeroext i1 @arm_2d_op_wait_async(ptr noundef null) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %21) #4
  %116 = call zeroext i1 @arm_2d_op_wait_async(ptr noundef null) #4
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %13) #4
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %12) #4
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %11) #4
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %10) #4
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %9) #4
  br label %.loopexit281, !llvm.loop !16

.loopexit281:                                     ; preds = %.critedge, %.preheader280
  %117 = call zeroext i1 @arm_2d_op_wait_async(ptr noundef null) #4
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %7) #4
  ret void
}

declare i32 @arm_2dp_rgb565_fill_colour_with_mask_x_mirror_and_opacity(ptr noundef, ptr noundef, ptr noundef, ptr noundef, i16, i8 noundef zeroext) local_unnamed_addr #2

declare i32 @arm_2dp_rgb565_fill_colour_with_mask_y_mirror_and_opacity(ptr noundef, ptr noundef, ptr noundef, ptr noundef, i16, i8 noundef zeroext) local_unnamed_addr #2

declare i32 @arm_2dp_rgb565_fill_colour_with_mask_xy_mirror_and_opacity(ptr noundef, ptr noundef, ptr noundef, ptr noundef, i16, i8 noundef zeroext) local_unnamed_addr #2

declare i32 @arm_2dp_rgb565_fill_colour_with_horizontal_line_mask_and_opacity(ptr noundef, ptr noundef, ptr noundef, ptr noundef, i16, i8 noundef zeroext) local_unnamed_addr #2

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 #2

attributes #0 = { mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { mustprogress nocallback nofree nounwind willreturn memory(argmem: write) }
attributes #2 = { "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 = { 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 #4 = { nounwind }

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"omnipotent char", !7, i64 0}
!7 = !{!"Simple C/C++ TBAA"}
!8 = !{!9, !10, i64 0}
!9 = !{!"arm_2d_size_t", !10, i64 0, !10, i64 2}
!10 = !{!"short", !6, i64 0}
!11 = !{!9, !10, i64 2}
!12 = !{!13, !10, i64 0}
!13 = !{!"arm_2d_location_t", !10, i64 0, !10, i64 2}
!14 = !{!13, !10, i64 2}
!15 = !{!10, !10, i64 0}
!16 = distinct !{!16, !17}
!17 = !{!"llvm.loop.mustprogress"}


; Effective O3 passes: DSEPass,EarlyCSEPass,GVNPass,GlobalOptPass,IPSCCPPass,InferAlignmentPass,InferFunctionAttrsPass,InstCombinePass,JumpThreadingPass,LICMPass,LoopInstSimplifyPass,LoopRotatePass,LoopSimplifyPass,MemCpyOptPass,PostOrderFunctionAttrsPass,ReassociatePass,SLPVectorizerPass,SROAPass,SimplifyCFGPass