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

; 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.anon.13 = type { %struct.arm_2d_region_t, %struct.arm_2d_region_t, %struct.arm_2d_location_t, %struct.anon.14, ptr, i32, i32, i8, i8, %struct.anon.15, %struct.anon.16, %struct.anon.17, %struct.arm_2d_scratch_mem_t, %struct.arm_2d_region_t, ptr }
%struct.arm_2d_location_t = type { i16, i16 }
%struct.anon.14 = type { i16, i16 }
%struct.anon.15 = type { i8, i8 }
%struct.anon.16 = type { %struct.arm_2d_size_t, %struct.arm_2d_size_t, %struct.arm_2d_region_t }
%struct.arm_2d_size_t = type { i16, i16 }
%struct.anon.17 = type { %union.anon.18, i16, i16, [65 x i8] }
%union.anon.18 = type { i16 }
%struct.arm_2d_scratch_mem_t = type { %union.anon.19, i64 }
%union.anon.19 = type { %union.anon.20 }
%union.anon.20 = type { %struct.anon.21 }
%struct.anon.21 = type { i32 }
%struct.arm_2d_region_t = type { %union.anon.10, %union.anon.11 }
%union.anon.10 = type { %struct.arm_2d_location_t }
%union.anon.11 = type { %struct.arm_2d_size_t }
%struct.arm_2d_char_descriptor_t = type { %struct.arm_2d_tile_t, i16, i16, i16, 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 }
%union.anon.12 = type { ptr }
%struct.arm_2d_font_t = type { %struct.arm_2d_tile_t, %struct.arm_2d_size_t, i32, ptr, ptr }

@s_tLCDTextControl = external hidden global %struct.anon.13, align 8

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

; Function Attrs: inlinehint nounwind uwtable
declare hidden signext i8 @arm_2d_helper_get_utf8_byte_valid_length(ptr noundef nonnull) #1

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

; Function Attrs: nounwind uwtable
declare dso_local ptr @arm_2d_helper_get_char_descriptor(ptr noundef nonnull, ptr noundef nonnull, ptr noundef nonnull) #2

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

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

; Function Attrs: nounwind uwtable
declare hidden signext i16 @__arm_lcd_get_char_advance(ptr noundef, ptr noundef, ptr noundef) #2

; Function Attrs: nounwind uwtable
define dso_local i32 @__arm_lcd_get_string_line_box(ptr noundef %0, ptr noundef %1) #2 {
  %3 = alloca %struct.arm_2d_size_t, align 2
  %4 = alloca ptr, align 8
  %5 = alloca ptr, align 8
  %6 = alloca %struct.arm_2d_size_t, align 2
  %7 = alloca %struct.arm_2d_size_t, align 2
  %8 = alloca %struct.arm_2d_region_t, align 2
  %9 = alloca i8, align 1
  %10 = alloca %struct.arm_2d_char_descriptor_t, align 8
  %11 = alloca ptr, align 8
  %12 = alloca i16, align 2
  store ptr %0, ptr %4, align 8, !tbaa !5
  store ptr %1, ptr %5, align 8, !tbaa !5
  %13 = load ptr, ptr %5, align 8, !tbaa !5
  %14 = icmp eq ptr null, %13
  br i1 %14, label %15, label %17

15:                                               ; preds = %2
  %16 = load ptr, ptr getelementptr inbounds (%struct.anon.13, ptr @s_tLCDTextControl, i32 0, i32 14), align 8, !tbaa !9
  store ptr %16, ptr %5, align 8, !tbaa !5
  br label %17

17:                                               ; preds = %15, %2
  call void @llvm.lifetime.start.p0(i64 4, ptr %6) #5
  %18 = load ptr, ptr %5, align 8, !tbaa !5
  %19 = getelementptr inbounds %struct.arm_2d_font_t, ptr %18, i32 0, i32 1
  call void @llvm.memcpy.p0.p0.i64(ptr align 2 %6, ptr align 8 %19, i64 4, i1 false), !tbaa.struct !22
  call void @llvm.lifetime.start.p0(i64 4, ptr %7) #5
  %20 = getelementptr inbounds %struct.arm_2d_size_t, ptr %7, i32 0, i32 0
  %21 = getelementptr inbounds %struct.arm_2d_size_t, ptr %6, i32 0, i32 0
  %22 = load i16, ptr %21, align 2, !tbaa !24
  %23 = sext i16 %22 to i32
  %24 = load i8, ptr getelementptr inbounds (%struct.anon.13, ptr @s_tLCDTextControl, i32 0, i32 9), align 2, !tbaa !25
  %25 = sext i8 %24 to i32
  %26 = add nsw i32 %23, %25
  %27 = trunc i32 %26 to i16
  store i16 %27, ptr %20, align 2, !tbaa !24
  %28 = getelementptr inbounds %struct.arm_2d_size_t, ptr %7, i32 0, i32 1
  %29 = getelementptr inbounds %struct.arm_2d_size_t, ptr %6, i32 0, i32 1
  %30 = load i16, ptr %29, align 2, !tbaa !26
  %31 = sext i16 %30 to i32
  %32 = load i8, ptr getelementptr inbounds (%struct.anon.15, ptr getelementptr inbounds (%struct.anon.13, ptr @s_tLCDTextControl, i32 0, i32 9), i32 0, i32 1), align 1, !tbaa !27
  %33 = sext i8 %32 to i32
  %34 = add nsw i32 %31, %33
  %35 = trunc i32 %34 to i16
  store i16 %35, ptr %28, align 2, !tbaa !26
  %36 = load i32, ptr getelementptr inbounds (%struct.anon.13, ptr @s_tLCDTextControl, i32 0, i32 6), align 4, !tbaa !28
  %37 = icmp sgt i32 %36, 0
  br i1 %37, label %38, label %53

38:                                               ; preds = %17
  %39 = load i32, ptr getelementptr inbounds (%struct.anon.13, ptr @s_tLCDTextControl, i32 0, i32 6), align 4, !tbaa !28
  %40 = getelementptr inbounds %struct.arm_2d_size_t, ptr %7, i32 0, i32 1
  %41 = load i16, ptr %40, align 2, !tbaa !26
  %42 = sext i16 %41 to i32
  %43 = call i32 @mul_n_q16(i32 noundef %39, i32 noundef %42)
  %44 = call signext i16 @reinterpret_s16_q16(i32 noundef %43)
  %45 = getelementptr inbounds %struct.arm_2d_size_t, ptr %7, i32 0, i32 1
  store i16 %44, ptr %45, align 2, !tbaa !26
  %46 = load i32, ptr getelementptr inbounds (%struct.anon.13, ptr @s_tLCDTextControl, i32 0, i32 6), align 4, !tbaa !28
  %47 = getelementptr inbounds %struct.arm_2d_size_t, ptr %7, i32 0, i32 0
  %48 = load i16, ptr %47, align 2, !tbaa !24
  %49 = sext i16 %48 to i32
  %50 = call i32 @mul_n_q16(i32 noundef %46, i32 noundef %49)
  %51 = call signext i16 @reinterpret_s16_q16(i32 noundef %50)
  %52 = getelementptr inbounds %struct.arm_2d_size_t, ptr %7, i32 0, i32 0
  store i16 %51, ptr %52, align 2, !tbaa !24
  br label %53

53:                                               ; preds = %38, %17
  call void @llvm.lifetime.start.p0(i64 8, ptr %8) #5
  %54 = getelementptr inbounds %struct.arm_2d_region_t, ptr %8, i32 0, i32 0
  call void @llvm.memset.p0.i64(ptr align 2 %54, i8 0, i64 4, i1 false)
  %55 = getelementptr inbounds %struct.arm_2d_region_t, ptr %8, i32 0, i32 1
  %56 = getelementptr inbounds %struct.arm_2d_size_t, ptr %55, i32 0, i32 0
  store i16 0, ptr %56, align 2, !tbaa !24
  %57 = getelementptr inbounds %struct.arm_2d_size_t, ptr %55, i32 0, i32 1
  %58 = getelementptr inbounds %struct.arm_2d_size_t, ptr %6, i32 0, i32 1
  %59 = load i16, ptr %58, align 2, !tbaa !26
  store i16 %59, ptr %57, align 2, !tbaa !26
  br label %60

60:                                               ; preds = %302, %289, %53
  %61 = load ptr, ptr %4, align 8, !tbaa !5
  %62 = load i8, ptr %61, align 1, !tbaa !29
  %63 = icmp ne i8 %62, 0
  br i1 %63, label %64, label %305

64:                                               ; preds = %60
  %65 = load ptr, ptr %4, align 8, !tbaa !5
  %66 = load i8, ptr %65, align 1, !tbaa !29
  %67 = sext i8 %66 to i32
  %68 = icmp eq i32 %67, 13
  br i1 %68, label %69, label %72

69:                                               ; preds = %64
  %70 = getelementptr inbounds %struct.arm_2d_region_t, ptr %8, i32 0, i32 0
  %71 = getelementptr inbounds %struct.arm_2d_location_t, ptr %70, i32 0, i32 0
  store i16 0, ptr %71, align 2, !tbaa !29
  br label %302

72:                                               ; preds = %64
  %73 = load ptr, ptr %4, align 8, !tbaa !5
  %74 = load i8, ptr %73, align 1, !tbaa !29
  %75 = sext i8 %74 to i32
  %76 = icmp eq i32 %75, 10
  br i1 %76, label %77, label %113

77:                                               ; preds = %72
  %78 = getelementptr inbounds %struct.arm_2d_region_t, ptr %8, i32 0, i32 0
  %79 = getelementptr inbounds %struct.arm_2d_location_t, ptr %78, i32 0, i32 0
  store i16 0, ptr %79, align 2, !tbaa !29
  %80 = getelementptr inbounds %struct.arm_2d_size_t, ptr %7, i32 0, i32 1
  %81 = load i16, ptr %80, align 2, !tbaa !26
  %82 = sext i16 %81 to i32
  %83 = getelementptr inbounds %struct.arm_2d_region_t, ptr %8, i32 0, i32 0
  %84 = getelementptr inbounds %struct.arm_2d_location_t, ptr %83, i32 0, i32 1
  %85 = load i16, ptr %84, align 2, !tbaa !29
  %86 = sext i16 %85 to i32
  %87 = add nsw i32 %86, %82
  %88 = trunc i32 %87 to i16
  store i16 %88, ptr %84, align 2, !tbaa !29
  %89 = getelementptr inbounds %struct.arm_2d_region_t, ptr %8, i32 0, i32 1
  %90 = getelementptr inbounds %struct.arm_2d_size_t, ptr %89, i32 0, i32 1
  %91 = load i16, ptr %90, align 2, !tbaa !29
  %92 = sext i16 %91 to i32
  %93 = getelementptr inbounds %struct.arm_2d_region_t, ptr %8, i32 0, i32 0
  %94 = getelementptr inbounds %struct.arm_2d_location_t, ptr %93, i32 0, i32 1
  %95 = load i16, ptr %94, align 2, !tbaa !29
  %96 = sext i16 %95 to i32
  %97 = icmp sgt i32 %92, %96
  br i1 %97, label %98, label %103

98:                                               ; preds = %77
  %99 = getelementptr inbounds %struct.arm_2d_region_t, ptr %8, i32 0, i32 1
  %100 = getelementptr inbounds %struct.arm_2d_size_t, ptr %99, i32 0, i32 1
  %101 = load i16, ptr %100, align 2, !tbaa !29
  %102 = sext i16 %101 to i32
  br label %108

103:                                              ; preds = %77
  %104 = getelementptr inbounds %struct.arm_2d_region_t, ptr %8, i32 0, i32 0
  %105 = getelementptr inbounds %struct.arm_2d_location_t, ptr %104, i32 0, i32 1
  %106 = load i16, ptr %105, align 2, !tbaa !29
  %107 = sext i16 %106 to i32
  br label %108

108:                                              ; preds = %103, %98
  %109 = phi i32 [ %102, %98 ], [ %107, %103 ]
  %110 = trunc i32 %109 to i16
  %111 = getelementptr inbounds %struct.arm_2d_region_t, ptr %8, i32 0, i32 1
  %112 = getelementptr inbounds %struct.arm_2d_size_t, ptr %111, i32 0, i32 1
  store i16 %110, ptr %112, align 2, !tbaa !29
  br label %301

113:                                              ; preds = %72
  %114 = load ptr, ptr %4, align 8, !tbaa !5
  %115 = load i8, ptr %114, align 1, !tbaa !29
  %116 = sext i8 %115 to i32
  %117 = icmp eq i32 %116, 9
  br i1 %117, label %118, label %167

118:                                              ; preds = %113
  %119 = getelementptr inbounds %struct.arm_2d_size_t, ptr %7, i32 0, i32 0
  %120 = load i16, ptr %119, align 2, !tbaa !24
  %121 = sext i16 %120 to i32
  %122 = mul nsw i32 %121, 4
  %123 = getelementptr inbounds %struct.arm_2d_region_t, ptr %8, i32 0, i32 0
  %124 = getelementptr inbounds %struct.arm_2d_location_t, ptr %123, i32 0, i32 0
  %125 = load i16, ptr %124, align 2, !tbaa !29
  %126 = sext i16 %125 to i32
  %127 = add nsw i32 %126, %122
  %128 = trunc i32 %127 to i16
  store i16 %128, ptr %124, align 2, !tbaa !29
  %129 = getelementptr inbounds %struct.arm_2d_region_t, ptr %8, i32 0, i32 0
  %130 = getelementptr inbounds %struct.arm_2d_location_t, ptr %129, i32 0, i32 0
  %131 = load i16, ptr %130, align 2, !tbaa !29
  %132 = sext i16 %131 to i32
  %133 = getelementptr inbounds %struct.arm_2d_size_t, ptr %7, i32 0, i32 0
  %134 = load i16, ptr %133, align 2, !tbaa !24
  %135 = sext i16 %134 to i32
  %136 = srem i32 %132, %135
  %137 = getelementptr inbounds %struct.arm_2d_region_t, ptr %8, i32 0, i32 0
  %138 = getelementptr inbounds %struct.arm_2d_location_t, ptr %137, i32 0, i32 0
  %139 = load i16, ptr %138, align 2, !tbaa !29
  %140 = sext i16 %139 to i32
  %141 = sub nsw i32 %140, %136
  %142 = trunc i32 %141 to i16
  store i16 %142, ptr %138, align 2, !tbaa !29
  %143 = getelementptr inbounds %struct.arm_2d_region_t, ptr %8, i32 0, i32 1
  %144 = getelementptr inbounds %struct.arm_2d_size_t, ptr %143, i32 0, i32 0
  %145 = load i16, ptr %144, align 2, !tbaa !29
  %146 = sext i16 %145 to i32
  %147 = getelementptr inbounds %struct.arm_2d_region_t, ptr %8, i32 0, i32 0
  %148 = getelementptr inbounds %struct.arm_2d_location_t, ptr %147, i32 0, i32 0
  %149 = load i16, ptr %148, align 2, !tbaa !29
  %150 = sext i16 %149 to i32
  %151 = icmp sgt i32 %146, %150
  br i1 %151, label %152, label %157

152:                                              ; preds = %118
  %153 = getelementptr inbounds %struct.arm_2d_region_t, ptr %8, i32 0, i32 1
  %154 = getelementptr inbounds %struct.arm_2d_size_t, ptr %153, i32 0, i32 0
  %155 = load i16, ptr %154, align 2, !tbaa !29
  %156 = sext i16 %155 to i32
  br label %162

157:                                              ; preds = %118
  %158 = getelementptr inbounds %struct.arm_2d_region_t, ptr %8, i32 0, i32 0
  %159 = getelementptr inbounds %struct.arm_2d_location_t, ptr %158, i32 0, i32 0
  %160 = load i16, ptr %159, align 2, !tbaa !29
  %161 = sext i16 %160 to i32
  br label %162

162:                                              ; preds = %157, %152
  %163 = phi i32 [ %156, %152 ], [ %161, %157 ]
  %164 = trunc i32 %163 to i16
  %165 = getelementptr inbounds %struct.arm_2d_region_t, ptr %8, i32 0, i32 1
  %166 = getelementptr inbounds %struct.arm_2d_size_t, ptr %165, i32 0, i32 0
  store i16 %164, ptr %166, align 2, !tbaa !29
  br label %300

167:                                              ; preds = %113
  %168 = load ptr, ptr %4, align 8, !tbaa !5
  %169 = load i8, ptr %168, align 1, !tbaa !29
  %170 = sext i8 %169 to i32
  %171 = icmp eq i32 %170, 8
  br i1 %171, label %172, label %195

172:                                              ; preds = %167
  %173 = getelementptr inbounds %struct.arm_2d_region_t, ptr %8, i32 0, i32 0
  %174 = getelementptr inbounds %struct.arm_2d_location_t, ptr %173, i32 0, i32 0
  %175 = load i16, ptr %174, align 2, !tbaa !29
  %176 = sext i16 %175 to i32
  %177 = getelementptr inbounds %struct.arm_2d_size_t, ptr %7, i32 0, i32 0
  %178 = load i16, ptr %177, align 2, !tbaa !24
  %179 = sext i16 %178 to i32
  %180 = icmp sge i32 %176, %179
  br i1 %180, label %181, label %191

181:                                              ; preds = %172
  %182 = getelementptr inbounds %struct.arm_2d_size_t, ptr %7, i32 0, i32 0
  %183 = load i16, ptr %182, align 2, !tbaa !24
  %184 = sext i16 %183 to i32
  %185 = getelementptr inbounds %struct.arm_2d_region_t, ptr %8, i32 0, i32 0
  %186 = getelementptr inbounds %struct.arm_2d_location_t, ptr %185, i32 0, i32 0
  %187 = load i16, ptr %186, align 2, !tbaa !29
  %188 = sext i16 %187 to i32
  %189 = sub nsw i32 %188, %184
  %190 = trunc i32 %189 to i16
  store i16 %190, ptr %186, align 2, !tbaa !29
  br label %194

191:                                              ; preds = %172
  %192 = getelementptr inbounds %struct.arm_2d_region_t, ptr %8, i32 0, i32 0
  %193 = getelementptr inbounds %struct.arm_2d_location_t, ptr %192, i32 0, i32 0
  store i16 0, ptr %193, align 2, !tbaa !29
  br label %194

194:                                              ; preds = %191, %181
  br label %299

195:                                              ; preds = %167
  call void @llvm.lifetime.start.p0(i64 1, ptr %9) #5
  %196 = load ptr, ptr %4, align 8, !tbaa !5
  %197 = call signext i8 @arm_2d_helper_get_utf8_byte_valid_length(ptr noundef %196)
  store i8 %197, ptr %9, align 1, !tbaa !29
  %198 = load i8, ptr %9, align 1, !tbaa !29
  %199 = sext i8 %198 to i32
  %200 = icmp sle i32 %199, 0
  br i1 %200, label %201, label %202

201:                                              ; preds = %195
  store i8 1, ptr %9, align 1, !tbaa !29
  br label %202

202:                                              ; preds = %201, %195
  call void @llvm.lifetime.start.p0(i64 32, ptr %10) #5
  call void @llvm.lifetime.start.p0(i64 8, ptr %11) #5
  %203 = load ptr, ptr %5, align 8, !tbaa !5
  %204 = load ptr, ptr %4, align 8, !tbaa !5
  %205 = call ptr @arm_2d_helper_get_char_descriptor(ptr noundef %203, ptr noundef %10, ptr noundef %204)
  store ptr %205, ptr %11, align 8, !tbaa !5
  %206 = load ptr, ptr %11, align 8, !tbaa !5
  %207 = icmp ne ptr null, %206
  br i1 %207, label %208, label %255

208:                                              ; preds = %202
  call void @llvm.lifetime.start.p0(i64 2, ptr %12) #5
  %209 = load ptr, ptr %5, align 8, !tbaa !5
  %210 = getelementptr inbounds %struct.arm_2d_font_t, ptr %209, i32 0, i32 1
  %211 = getelementptr inbounds %struct.arm_2d_size_t, ptr %210, i32 0, i32 1
  %212 = load i16, ptr %211, align 2, !tbaa !30
  %213 = sext i16 %212 to i32
  %214 = getelementptr inbounds %struct.arm_2d_char_descriptor_t, ptr %10, i32 0, i32 3
  %215 = load i16, ptr %214, align 4, !tbaa !33
  %216 = sext i16 %215 to i32
  %217 = sub nsw i32 %213, %216
  %218 = getelementptr inbounds %struct.arm_2d_char_descriptor_t, ptr %10, i32 0, i32 0
  %219 = getelementptr inbounds %struct.arm_2d_tile_t, ptr %218, i32 0, i32 1
  %220 = getelementptr inbounds %struct.arm_2d_region_t, ptr %219, i32 0, i32 1
  %221 = getelementptr inbounds %struct.arm_2d_size_t, ptr %220, i32 0, i32 1
  %222 = load i16, ptr %221, align 2, !tbaa !29
  %223 = sext i16 %222 to i32
  %224 = add nsw i32 %217, %223
  %225 = trunc i32 %224 to i16
  store i16 %225, ptr %12, align 2, !tbaa !23
  %226 = load i32, ptr getelementptr inbounds (%struct.anon.13, ptr @s_tLCDTextControl, i32 0, i32 6), align 4, !tbaa !28
  %227 = icmp sgt i32 %226, 0
  br i1 %227, label %228, label %234

228:                                              ; preds = %208
  %229 = load i32, ptr getelementptr inbounds (%struct.anon.13, ptr @s_tLCDTextControl, i32 0, i32 6), align 4, !tbaa !28
  %230 = load i16, ptr %12, align 2, !tbaa !23
  %231 = sext i16 %230 to i32
  %232 = call i32 @mul_n_q16(i32 noundef %229, i32 noundef %231)
  %233 = call signext i16 @reinterpret_s16_q16(i32 noundef %232)
  store i16 %233, ptr %12, align 2, !tbaa !23
  br label %234

234:                                              ; preds = %228, %208
  %235 = getelementptr inbounds %struct.arm_2d_region_t, ptr %8, i32 0, i32 1
  %236 = getelementptr inbounds %struct.arm_2d_size_t, ptr %235, i32 0, i32 1
  %237 = load i16, ptr %236, align 2, !tbaa !29
  %238 = sext i16 %237 to i32
  %239 = load i16, ptr %12, align 2, !tbaa !23
  %240 = sext i16 %239 to i32
  %241 = icmp sgt i32 %238, %240
  br i1 %241, label %242, label %247

242:                                              ; preds = %234
  %243 = getelementptr inbounds %struct.arm_2d_region_t, ptr %8, i32 0, i32 1
  %244 = getelementptr inbounds %struct.arm_2d_size_t, ptr %243, i32 0, i32 1
  %245 = load i16, ptr %244, align 2, !tbaa !29
  %246 = sext i16 %245 to i32
  br label %250

247:                                              ; preds = %234
  %248 = load i16, ptr %12, align 2, !tbaa !23
  %249 = sext i16 %248 to i32
  br label %250

250:                                              ; preds = %247, %242
  %251 = phi i32 [ %246, %242 ], [ %249, %247 ]
  %252 = trunc i32 %251 to i16
  %253 = getelementptr inbounds %struct.arm_2d_region_t, ptr %8, i32 0, i32 1
  %254 = getelementptr inbounds %struct.arm_2d_size_t, ptr %253, i32 0, i32 1
  store i16 %252, ptr %254, align 2, !tbaa !29
  call void @llvm.lifetime.end.p0(i64 2, ptr %12) #5
  br label %255

255:                                              ; preds = %250, %202
  %256 = load ptr, ptr %5, align 8, !tbaa !5
  %257 = load ptr, ptr %11, align 8, !tbaa !5
  %258 = load ptr, ptr %4, align 8, !tbaa !5
  %259 = call signext i16 @__arm_lcd_get_char_advance(ptr noundef %256, ptr noundef %257, ptr noundef %258)
  %260 = sext i16 %259 to i32
  %261 = load i16, ptr getelementptr inbounds (%struct.anon.16, ptr getelementptr inbounds (%struct.anon.13, ptr @s_tLCDTextControl, i32 0, i32 10), i32 0, i32 1), align 4, !tbaa !35
  %262 = sext i16 %261 to i32
  %263 = add nsw i32 %260, %262
  %264 = getelementptr inbounds %struct.arm_2d_region_t, ptr %8, i32 0, i32 0
  %265 = getelementptr inbounds %struct.arm_2d_location_t, ptr %264, i32 0, i32 0
  %266 = load i16, ptr %265, align 2, !tbaa !29
  %267 = sext i16 %266 to i32
  %268 = add nsw i32 %267, %263
  %269 = trunc i32 %268 to i16
  store i16 %269, ptr %265, align 2, !tbaa !29
  %270 = getelementptr inbounds %struct.arm_2d_region_t, ptr %8, i32 0, i32 1
  %271 = getelementptr inbounds %struct.arm_2d_size_t, ptr %270, i32 0, i32 0
  %272 = load i16, ptr %271, align 2, !tbaa !29
  %273 = sext i16 %272 to i32
  %274 = getelementptr inbounds %struct.arm_2d_region_t, ptr %8, i32 0, i32 0
  %275 = getelementptr inbounds %struct.arm_2d_location_t, ptr %274, i32 0, i32 0
  %276 = load i16, ptr %275, align 2, !tbaa !29
  %277 = sext i16 %276 to i32
  %278 = icmp sgt i32 %273, %277
  br i1 %278, label %279, label %284

279:                                              ; preds = %255
  %280 = getelementptr inbounds %struct.arm_2d_region_t, ptr %8, i32 0, i32 1
  %281 = getelementptr inbounds %struct.arm_2d_size_t, ptr %280, i32 0, i32 0
  %282 = load i16, ptr %281, align 2, !tbaa !29
  %283 = sext i16 %282 to i32
  br label %289

284:                                              ; preds = %255
  %285 = getelementptr inbounds %struct.arm_2d_region_t, ptr %8, i32 0, i32 0
  %286 = getelementptr inbounds %struct.arm_2d_location_t, ptr %285, i32 0, i32 0
  %287 = load i16, ptr %286, align 2, !tbaa !29
  %288 = sext i16 %287 to i32
  br label %289

289:                                              ; preds = %284, %279
  %290 = phi i32 [ %283, %279 ], [ %288, %284 ]
  %291 = trunc i32 %290 to i16
  %292 = getelementptr inbounds %struct.arm_2d_region_t, ptr %8, i32 0, i32 1
  %293 = getelementptr inbounds %struct.arm_2d_size_t, ptr %292, i32 0, i32 0
  store i16 %291, ptr %293, align 2, !tbaa !29
  %294 = load i8, ptr %9, align 1, !tbaa !29
  %295 = sext i8 %294 to i32
  %296 = load ptr, ptr %4, align 8, !tbaa !5
  %297 = sext i32 %295 to i64
  %298 = getelementptr inbounds i8, ptr %296, i64 %297
  store ptr %298, ptr %4, align 8, !tbaa !5
  call void @llvm.lifetime.end.p0(i64 8, ptr %11) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr %10) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr %9) #5
  br label %60

299:                                              ; preds = %194
  br label %300

300:                                              ; preds = %299, %162
  br label %301

301:                                              ; preds = %300, %108
  br label %302

302:                                              ; preds = %301, %69
  %303 = load ptr, ptr %4, align 8, !tbaa !5
  %304 = getelementptr inbounds i8, ptr %303, i32 1
  store ptr %304, ptr %4, align 8, !tbaa !5
  br label %60, !llvm.loop !36

305:                                              ; preds = %60
  %306 = getelementptr inbounds %struct.arm_2d_region_t, ptr %8, i32 0, i32 1
  call void @llvm.memcpy.p0.p0.i64(ptr align 2 %3, ptr align 2 %306, i64 4, i1 false), !tbaa.struct !22
  call void @llvm.lifetime.end.p0(i64 8, ptr %8) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %7) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %6) #5
  %307 = load i32, ptr %3, align 2
  ret i32 %307
}

; Function Attrs: inlinehint nounwind uwtable
declare hidden signext i16 @reinterpret_s16_q16(i32 noundef) #1

; Function Attrs: inlinehint nounwind uwtable
declare hidden i32 @mul_n_q16(i32 noundef, i32 noundef) #1

attributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { inlinehint 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 #2 = { nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #3 = { nocallback nofree nounwind willreturn memory(argmem: readwrite) }
attributes #4 = { nocallback nofree nounwind willreturn memory(argmem: write) }
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, !6, i64 160}
!10 = !{!"", !11, i64 0, !11, i64 8, !12, i64 16, !14, i64 20, !6, i64 24, !15, i64 32, !15, i64 36, !7, i64 40, !7, i64 41, !16, i64 42, !17, i64 44, !19, i64 60, !20, i64 136, !11, i64 152, !6, i64 160}
!11 = !{!"arm_2d_region_t", !7, i64 0, !7, i64 4}
!12 = !{!"arm_2d_location_t", !13, i64 0, !13, i64 2}
!13 = !{!"short", !7, i64 0}
!14 = !{!"", !13, i64 0, !13, i64 2}
!15 = !{!"int", !7, i64 0}
!16 = !{!"", !7, i64 0, !7, i64 1}
!17 = !{!"", !18, i64 0, !18, i64 4, !11, i64 8}
!18 = !{!"arm_2d_size_t", !13, i64 0, !13, i64 2}
!19 = !{!"", !7, i64 0, !13, i64 2, !13, i64 4, !7, i64 6}
!20 = !{!"arm_2d_scratch_mem_t", !7, i64 0, !21, i64 8}
!21 = !{!"long", !7, i64 0}
!22 = !{i64 0, i64 2, !23, i64 2, i64 2, !23}
!23 = !{!13, !13, i64 0}
!24 = !{!18, !13, i64 0}
!25 = !{!10, !7, i64 42}
!26 = !{!18, !13, i64 2}
!27 = !{!10, !7, i64 43}
!28 = !{!10, !15, i64 36}
!29 = !{!7, !7, i64 0}
!30 = !{!31, !13, i64 26}
!31 = !{!"arm_2d_font_t", !32, i64 0, !18, i64 24, !15, i64 28, !6, i64 32, !6, i64 40}
!32 = !{!"arm_2d_tile_t", !7, i64 0, !7, i64 4, !7, i64 16}
!33 = !{!34, !13, i64 28}
!34 = !{!"", !32, i64 0, !13, i64 24, !13, i64 26, !13, i64 28, !7, i64 30}
!35 = !{!10, !13, i64 48}
!36 = distinct !{!36, !37}
!37 = !{!"llvm.loop.mustprogress"}


; 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.anon.13 = type { %struct.arm_2d_region_t, %struct.arm_2d_region_t, %struct.arm_2d_location_t, %struct.anon.14, ptr, i32, i32, i8, i8, %struct.anon.15, %struct.anon.16, %struct.anon.17, %struct.arm_2d_scratch_mem_t, %struct.arm_2d_region_t, ptr }
%struct.arm_2d_location_t = type { i16, i16 }
%struct.anon.14 = type { i16, i16 }
%struct.anon.15 = type { i8, i8 }
%struct.anon.16 = type { %struct.arm_2d_size_t, %struct.arm_2d_size_t, %struct.arm_2d_region_t }
%struct.arm_2d_size_t = type { i16, i16 }
%struct.anon.17 = type { %union.anon.18, i16, i16, [65 x i8] }
%union.anon.18 = type { i16 }
%struct.arm_2d_scratch_mem_t = type { %union.anon.19, i64 }
%union.anon.19 = type { %union.anon.20 }
%union.anon.20 = type { %struct.anon.21 }
%struct.anon.21 = type { i32 }
%struct.arm_2d_region_t = type { %union.anon.10, %union.anon.11 }
%union.anon.10 = type { %struct.arm_2d_location_t }
%union.anon.11 = type { %struct.arm_2d_size_t }
%struct.arm_2d_char_descriptor_t = type { %struct.arm_2d_tile_t, i16, i16, i16, 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 }
%union.anon.12 = type { ptr }

@s_tLCDTextControl = external hidden local_unnamed_addr global %struct.anon.13, align 8

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

; Function Attrs: inlinehint nounwind uwtable
declare hidden signext i8 @arm_2d_helper_get_utf8_byte_valid_length(ptr noundef nonnull) local_unnamed_addr #1

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

; Function Attrs: nounwind uwtable
declare dso_local ptr @arm_2d_helper_get_char_descriptor(ptr noundef nonnull, ptr noundef nonnull, ptr noundef nonnull) local_unnamed_addr #2

; Function Attrs: nounwind uwtable
declare hidden signext i16 @__arm_lcd_get_char_advance(ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #2

; Function Attrs: nounwind uwtable
define dso_local i32 @__arm_lcd_get_string_line_box(ptr noundef %0, ptr noundef %1) local_unnamed_addr #2 {
  %3 = alloca %struct.arm_2d_char_descriptor_t, align 8
  %4 = icmp eq ptr %1, null
  %5 = load ptr, ptr getelementptr inbounds (i8, ptr @s_tLCDTextControl, i64 160), align 8
  %spec.select = select i1 %4, ptr %5, ptr %1
  %6 = getelementptr inbounds i8, ptr %spec.select, i64 24
  %.sroa.038.0.copyload = load i16, ptr %6, align 8, !tbaa !5
  %.sroa.4.0..sroa_idx = getelementptr inbounds i8, ptr %spec.select, i64 26
  %.sroa.4.0.copyload = load i16, ptr %.sroa.4.0..sroa_idx, align 2, !tbaa !5
  %7 = load i8, ptr getelementptr inbounds (i8, ptr @s_tLCDTextControl, i64 42), align 2, !tbaa !9
  %8 = sext i8 %7 to i16
  %9 = add i16 %.sroa.038.0.copyload, %8
  %10 = load i8, ptr getelementptr inbounds (i8, ptr @s_tLCDTextControl, i64 43), align 1, !tbaa !22
  %11 = sext i8 %10 to i16
  %12 = add i16 %.sroa.4.0.copyload, %11
  %13 = load i32, ptr getelementptr inbounds (i8, ptr @s_tLCDTextControl, i64 36), align 4, !tbaa !23
  %14 = icmp sgt i32 %13, 0
  br i1 %14, label %15, label %23

15:                                               ; preds = %2
  %16 = sext i16 %12 to i32
  %17 = tail call i32 @mul_n_q16(i32 noundef %13, i32 noundef %16)
  %18 = tail call signext i16 @reinterpret_s16_q16(i32 noundef %17)
  %19 = load i32, ptr getelementptr inbounds (i8, ptr @s_tLCDTextControl, i64 36), align 4, !tbaa !23
  %20 = sext i16 %9 to i32
  %21 = tail call i32 @mul_n_q16(i32 noundef %19, i32 noundef %20)
  %22 = tail call signext i16 @reinterpret_s16_q16(i32 noundef %21)
  br label %23

23:                                               ; preds = %15, %2
  %.sroa.9.0 = phi i16 [ %18, %15 ], [ %12, %2 ]
  %.sroa.032.0 = phi i16 [ %22, %15 ], [ %9, %2 ]
  %24 = getelementptr inbounds i8, ptr %3, i64 28
  %25 = getelementptr inbounds i8, ptr %3, i64 10
  %26 = sext i16 %.sroa.032.0 to i32
  %27 = shl i16 %.sroa.032.0, 2
  br label %.outer

.outer:                                           ; preds = %.loopexit, %23
  %.sroa.0.0.ph = phi i16 [ %.sroa.0.1, %.loopexit ], [ 0, %23 ]
  %.sroa.32.0.ph = phi i16 [ %.sroa.32.2, %.loopexit ], [ %.sroa.4.0.copyload, %23 ]
  %.sroa.24.0.ph = phi i16 [ %.sroa.24.1, %.loopexit ], [ 0, %23 ]
  %.sroa.20.0.ph = phi i16 [ %.sroa.20.1, %.loopexit ], [ 0, %23 ]
  %.056.ph = phi ptr [ %67, %.loopexit ], [ %0, %23 ]
  br label %28

28:                                               ; preds = %.outer, %59
  %.sroa.0.0 = phi i16 [ %63, %59 ], [ %.sroa.0.0.ph, %.outer ]
  %.sroa.32.0 = phi i16 [ %.sroa.32.1, %59 ], [ %.sroa.32.0.ph, %.outer ]
  %.sroa.24.0 = phi i16 [ %64, %59 ], [ %.sroa.24.0.ph, %.outer ]
  %.056 = phi ptr [ %66, %59 ], [ %.056.ph, %.outer ]
  %29 = load i8, ptr %.056, align 1, !tbaa !24
  switch i8 %29, label %42 [
    i8 0, label %68
    i8 13, label %.loopexit
    i8 10, label %30
    i8 9, label %33
    i8 8, label %40
  ]

30:                                               ; preds = %28
  %31 = add i16 %.sroa.20.0.ph, %.sroa.9.0
  %32 = call i16 @llvm.smax.i16(i16 %.sroa.32.0, i16 %31)
  br label %.loopexit

33:                                               ; preds = %28
  %34 = add i16 %.sroa.0.0, %27
  %35 = sext i16 %34 to i32
  %36 = srem i32 %35, %26
  %37 = trunc nsw i32 %36 to i16
  %38 = sub i16 %34, %37
  %39 = call i16 @llvm.smax.i16(i16 %.sroa.24.0, i16 %38)
  br label %.loopexit

40:                                               ; preds = %28
  %.not66 = icmp slt i16 %.sroa.0.0, %.sroa.032.0
  %41 = sub i16 %.sroa.0.0, %.sroa.032.0
  %spec.select67 = select i1 %.not66, i16 0, i16 %41
  br label %.loopexit

42:                                               ; preds = %28
  %43 = call signext i8 @arm_2d_helper_get_utf8_byte_valid_length(ptr noundef %.056)
  %spec.store.select = call i8 @llvm.smax.i8(i8 %43, i8 1)
  call void @llvm.lifetime.start.p0(i64 32, ptr nonnull %3) #4
  %44 = call ptr @arm_2d_helper_get_char_descriptor(ptr noundef %spec.select, ptr noundef %3, ptr noundef %.056)
  %.not65 = icmp eq ptr %44, null
  br i1 %.not65, label %59, label %45

45:                                               ; preds = %42
  %46 = load i16, ptr %.sroa.4.0..sroa_idx, align 2, !tbaa !25
  %47 = load i16, ptr %24, align 4, !tbaa !28
  %48 = sub i16 %46, %47
  %49 = load i16, ptr %25, align 2, !tbaa !24
  %50 = add i16 %48, %49
  %51 = load i32, ptr getelementptr inbounds (i8, ptr @s_tLCDTextControl, i64 36), align 4, !tbaa !23
  %52 = icmp sgt i32 %51, 0
  br i1 %52, label %53, label %57

53:                                               ; preds = %45
  %54 = sext i16 %50 to i32
  %55 = call i32 @mul_n_q16(i32 noundef %51, i32 noundef %54)
  %56 = call signext i16 @reinterpret_s16_q16(i32 noundef %55)
  br label %57

57:                                               ; preds = %53, %45
  %.0 = phi i16 [ %56, %53 ], [ %50, %45 ]
  %58 = call i16 @llvm.smax.i16(i16 %.sroa.32.0, i16 %.0)
  br label %59

59:                                               ; preds = %57, %42
  %.sroa.32.1 = phi i16 [ %58, %57 ], [ %.sroa.32.0, %42 ]
  %60 = call signext i16 @__arm_lcd_get_char_advance(ptr noundef nonnull %spec.select, ptr noundef %44, ptr noundef nonnull %.056)
  %61 = load i16, ptr getelementptr inbounds (i8, ptr @s_tLCDTextControl, i64 48), align 8, !tbaa !30
  %62 = add i16 %60, %.sroa.0.0
  %63 = add i16 %62, %61
  %64 = call i16 @llvm.smax.i16(i16 %.sroa.24.0, i16 %63)
  %65 = zext nneg i8 %spec.store.select to i64
  %66 = getelementptr inbounds i8, ptr %.056, i64 %65
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %3) #4
  br label %28

.loopexit:                                        ; preds = %28, %40, %30, %33
  %.sroa.0.1 = phi i16 [ 0, %30 ], [ %38, %33 ], [ %spec.select67, %40 ], [ 0, %28 ]
  %.sroa.32.2 = phi i16 [ %32, %30 ], [ %.sroa.32.0, %33 ], [ %.sroa.32.0, %40 ], [ %.sroa.32.0, %28 ]
  %.sroa.24.1 = phi i16 [ %.sroa.24.0, %30 ], [ %39, %33 ], [ %.sroa.24.0, %40 ], [ %.sroa.24.0, %28 ]
  %.sroa.20.1 = phi i16 [ %31, %30 ], [ %.sroa.20.0.ph, %33 ], [ %.sroa.20.0.ph, %40 ], [ %.sroa.20.0.ph, %28 ]
  %67 = getelementptr inbounds i8, ptr %.056, i64 1
  br label %.outer, !llvm.loop !31

68:                                               ; preds = %28
  %.sroa.2.0.insert.ext = zext i16 %.sroa.32.0 to i32
  %.sroa.2.0.insert.shift = shl nuw i32 %.sroa.2.0.insert.ext, 16
  %.sroa.055.0.insert.ext = zext nneg i16 %.sroa.24.0 to i32
  %.sroa.055.0.insert.insert = or disjoint i32 %.sroa.2.0.insert.shift, %.sroa.055.0.insert.ext
  ret i32 %.sroa.055.0.insert.insert
}

; Function Attrs: inlinehint nounwind uwtable
declare hidden signext i16 @reinterpret_s16_q16(i32 noundef) local_unnamed_addr #1

; Function Attrs: inlinehint nounwind uwtable
declare hidden i32 @mul_n_q16(i32 noundef, i32 noundef) local_unnamed_addr #1

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

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

attributes #0 = { mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { inlinehint 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 #2 = { nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #3 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
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 = !{!"short", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!10, !7, i64 42}
!10 = !{!"", !11, i64 0, !11, i64 8, !12, i64 16, !13, i64 20, !14, i64 24, !15, i64 32, !15, i64 36, !7, i64 40, !7, i64 41, !16, i64 42, !17, i64 44, !19, i64 60, !20, i64 136, !11, i64 152, !14, i64 160}
!11 = !{!"arm_2d_region_t", !7, i64 0, !7, i64 4}
!12 = !{!"arm_2d_location_t", !6, i64 0, !6, i64 2}
!13 = !{!"", !6, i64 0, !6, i64 2}
!14 = !{!"any pointer", !7, i64 0}
!15 = !{!"int", !7, i64 0}
!16 = !{!"", !7, i64 0, !7, i64 1}
!17 = !{!"", !18, i64 0, !18, i64 4, !11, i64 8}
!18 = !{!"arm_2d_size_t", !6, i64 0, !6, i64 2}
!19 = !{!"", !7, i64 0, !6, i64 2, !6, i64 4, !7, i64 6}
!20 = !{!"arm_2d_scratch_mem_t", !7, i64 0, !21, i64 8}
!21 = !{!"long", !7, i64 0}
!22 = !{!10, !7, i64 43}
!23 = !{!10, !15, i64 36}
!24 = !{!7, !7, i64 0}
!25 = !{!26, !6, i64 26}
!26 = !{!"arm_2d_font_t", !27, i64 0, !18, i64 24, !15, i64 28, !14, i64 32, !14, i64 40}
!27 = !{!"arm_2d_tile_t", !7, i64 0, !7, i64 4, !7, i64 16}
!28 = !{!29, !6, i64 28}
!29 = !{!"", !27, i64 0, !6, i64 24, !6, i64 26, !6, i64 28, !7, i64 30}
!30 = !{!10, !6, i64 48}
!31 = distinct !{!31, !32}
!32 = !{!"llvm.loop.mustprogress"}


; Effective O3 passes: EarlyCSEPass,GVNPass,GlobalOptPass,IPSCCPPass,InferAlignmentPass,InferFunctionAttrsPass,InstCombinePass,InstSimplifyPass,JumpThreadingPass,LCSSAPass,LICMPass,LoopSimplifyPass,LoopUnrollPass,ReassociatePass,SCCPPass,SROAPass,SimplifyCFGPass,TailCallElimPass