; LLVM IR from square/subzero :: core/external-crypto/modes (ccm)

; 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.ccm_ctx = type { [2 x i64], [2 x i64], [2 x i64], [1 x %struct.aes_crypt_ctx], i64, i64, i64, i64, i64, i32, i32, i32, [12 x i8] }
%struct.aes_crypt_ctx = type { [60 x i32], %union.aes_inf, [12 x i8] }
%union.aes_inf = type { i32 }

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

declare i32 @aes_encrypt(ptr noundef, ptr noundef, ptr noundef) #1

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @xor_block_aligned(ptr noundef, ptr noundef, ptr noundef) #2

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @xor_block(ptr noundef, ptr noundef, ptr noundef) #2

; Function Attrs: nounwind uwtable
define dso_local i32 @ccm_crypt_data(ptr noundef %0, i64 noundef %1, ptr noundef %2) #3 {
  %4 = alloca i32, align 4
  %5 = alloca ptr, align 8
  %6 = alloca i64, align 8
  %7 = alloca ptr, align 8
  %8 = alloca i32, align 4
  %9 = alloca i32, align 4
  %10 = alloca i32, align 4
  %11 = alloca ptr, align 8
  %12 = alloca i64, align 8
  %13 = alloca ptr, align 8
  %14 = alloca i64, align 8
  %15 = alloca ptr, align 8
  %16 = alloca i64, align 8
  store ptr %0, ptr %5, align 8, !tbaa !5
  store i64 %1, ptr %6, align 8, !tbaa !9
  store ptr %2, ptr %7, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %8) #4
  store i32 0, ptr %8, align 4, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 4, ptr %9) #4
  %17 = load ptr, ptr %7, align 8, !tbaa !5
  %18 = getelementptr inbounds %struct.ccm_ctx, ptr %17, i32 0, i32 7
  %19 = load i64, ptr %18, align 8, !tbaa !13
  %20 = trunc i64 %19 to i32
  %21 = and i32 %20, 15
  store i32 %21, ptr %9, align 4, !tbaa !11
  %22 = load ptr, ptr %7, align 8, !tbaa !5
  %23 = getelementptr inbounds %struct.ccm_ctx, ptr %22, i32 0, i32 11
  %24 = load i32, ptr %23, align 16, !tbaa !15
  %25 = icmp slt i32 %24, 0
  br i1 %25, label %26, label %30

26:                                               ; preds = %3
  %27 = load ptr, ptr %7, align 8, !tbaa !5
  %28 = getelementptr inbounds %struct.ccm_ctx, ptr %27, i32 0, i32 11
  %29 = load i32, ptr %28, align 16, !tbaa !15
  store i32 %29, ptr %4, align 4
  store i32 1, ptr %10, align 4
  br label %361

30:                                               ; preds = %3
  %31 = load ptr, ptr %7, align 8, !tbaa !5
  %32 = getelementptr inbounds %struct.ccm_ctx, ptr %31, i32 0, i32 11
  %33 = load i32, ptr %32, align 16, !tbaa !15
  %34 = icmp eq i32 %33, 11
  br i1 %34, label %35, label %38

35:                                               ; preds = %30
  %36 = load ptr, ptr %7, align 8, !tbaa !5
  %37 = getelementptr inbounds %struct.ccm_ctx, ptr %36, i32 0, i32 11
  store i32 -6, ptr %37, align 16, !tbaa !15
  store i32 -6, ptr %4, align 4
  store i32 1, ptr %10, align 4
  br label %361

38:                                               ; preds = %30
  %39 = load ptr, ptr %7, align 8, !tbaa !5
  %40 = getelementptr inbounds %struct.ccm_ctx, ptr %39, i32 0, i32 7
  %41 = load i64, ptr %40, align 8, !tbaa !13
  %42 = load i64, ptr %6, align 8, !tbaa !9
  %43 = add i64 %41, %42
  %44 = load ptr, ptr %7, align 8, !tbaa !5
  %45 = getelementptr inbounds %struct.ccm_ctx, ptr %44, i32 0, i32 5
  %46 = load i64, ptr %45, align 8, !tbaa !16
  %47 = icmp ugt i64 %43, %46
  br i1 %47, label %48, label %51

48:                                               ; preds = %38
  %49 = load ptr, ptr %7, align 8, !tbaa !5
  %50 = getelementptr inbounds %struct.ccm_ctx, ptr %49, i32 0, i32 11
  store i32 -7, ptr %50, align 16, !tbaa !15
  store i32 -7, ptr %4, align 4
  store i32 1, ptr %10, align 4
  br label %361

51:                                               ; preds = %38
  %52 = load i64, ptr %6, align 8, !tbaa !9
  %53 = icmp ne i64 %52, 0
  br i1 %53, label %55, label %54

54:                                               ; preds = %51
  store i32 0, ptr %4, align 4
  store i32 1, ptr %10, align 4
  br label %361

55:                                               ; preds = %51
  %56 = load ptr, ptr %5, align 8, !tbaa !5
  %57 = load ptr, ptr %7, align 8, !tbaa !5
  %58 = getelementptr inbounds %struct.ccm_ctx, ptr %57, i32 0, i32 1
  %59 = getelementptr inbounds [2 x i64], ptr %58, i64 0, i64 0
  %60 = load i32, ptr %9, align 4, !tbaa !11
  %61 = zext i32 %60 to i64
  %62 = getelementptr inbounds i8, ptr %59, i64 %61
  %63 = ptrtoint ptr %56 to i64
  %64 = ptrtoint ptr %62 to i64
  %65 = sub i64 %63, %64
  %66 = and i64 %65, 7
  %67 = icmp ne i64 %66, 0
  br i1 %67, label %192, label %68

68:                                               ; preds = %55
  %69 = load i32, ptr %9, align 4, !tbaa !11
  %70 = icmp ne i32 %69, 0
  br i1 %70, label %71, label %133

71:                                               ; preds = %68
  br label %72

72:                                               ; preds = %83, %71
  %73 = load i32, ptr %8, align 4, !tbaa !11
  %74 = zext i32 %73 to i64
  %75 = load i64, ptr %6, align 8, !tbaa !9
  %76 = icmp ult i64 %74, %75
  br i1 %76, label %77, label %81

77:                                               ; preds = %72
  %78 = load i32, ptr %9, align 4, !tbaa !11
  %79 = and i32 %78, 7
  %80 = icmp ne i32 %79, 0
  br label %81

81:                                               ; preds = %77, %72
  %82 = phi i1 [ false, %72 ], [ %80, %77 ]
  br i1 %82, label %83, label %102

83:                                               ; preds = %81
  %84 = load ptr, ptr %7, align 8, !tbaa !5
  %85 = getelementptr inbounds %struct.ccm_ctx, ptr %84, i32 0, i32 1
  %86 = getelementptr inbounds [2 x i64], ptr %85, i64 0, i64 0
  %87 = load i32, ptr %9, align 4, !tbaa !11
  %88 = add i32 %87, 1
  store i32 %88, ptr %9, align 4, !tbaa !11
  %89 = zext i32 %87 to i64
  %90 = getelementptr inbounds i8, ptr %86, i64 %89
  %91 = load i8, ptr %90, align 1, !tbaa !17
  %92 = zext i8 %91 to i32
  %93 = load ptr, ptr %5, align 8, !tbaa !5
  %94 = load i32, ptr %8, align 4, !tbaa !11
  %95 = add i32 %94, 1
  store i32 %95, ptr %8, align 4, !tbaa !11
  %96 = zext i32 %94 to i64
  %97 = getelementptr inbounds i8, ptr %93, i64 %96
  %98 = load i8, ptr %97, align 1, !tbaa !17
  %99 = zext i8 %98 to i32
  %100 = xor i32 %99, %92
  %101 = trunc i32 %100 to i8
  store i8 %101, ptr %97, align 1, !tbaa !17
  br label %72, !llvm.loop !18

102:                                              ; preds = %81
  br label %103

103:                                              ; preds = %114, %102
  %104 = load i32, ptr %8, align 4, !tbaa !11
  %105 = add i32 %104, 8
  %106 = zext i32 %105 to i64
  %107 = load i64, ptr %6, align 8, !tbaa !9
  %108 = icmp ule i64 %106, %107
  br i1 %108, label %109, label %112

109:                                              ; preds = %103
  %110 = load i32, ptr %9, align 4, !tbaa !11
  %111 = icmp ule i32 %110, 8
  br label %112

112:                                              ; preds = %109, %103
  %113 = phi i1 [ false, %103 ], [ %111, %109 ]
  br i1 %113, label %114, label %132

114:                                              ; preds = %112
  %115 = load ptr, ptr %7, align 8, !tbaa !5
  %116 = getelementptr inbounds %struct.ccm_ctx, ptr %115, i32 0, i32 1
  %117 = getelementptr inbounds [2 x i64], ptr %116, i64 0, i64 0
  %118 = load i32, ptr %9, align 4, !tbaa !11
  %119 = zext i32 %118 to i64
  %120 = getelementptr inbounds i8, ptr %117, i64 %119
  %121 = load i64, ptr %120, align 8, !tbaa !9
  %122 = load ptr, ptr %5, align 8, !tbaa !5
  %123 = load i32, ptr %8, align 4, !tbaa !11
  %124 = zext i32 %123 to i64
  %125 = getelementptr inbounds i8, ptr %122, i64 %124
  %126 = load i64, ptr %125, align 8, !tbaa !9
  %127 = xor i64 %126, %121
  store i64 %127, ptr %125, align 8, !tbaa !9
  %128 = load i32, ptr %8, align 4, !tbaa !11
  %129 = add i32 %128, 8
  store i32 %129, ptr %8, align 4, !tbaa !11
  %130 = load i32, ptr %9, align 4, !tbaa !11
  %131 = add i32 %130, 8
  store i32 %131, ptr %9, align 4, !tbaa !11
  br label %103, !llvm.loop !20

132:                                              ; preds = %112
  br label %133

133:                                              ; preds = %132, %68
  br label %134

134:                                              ; preds = %167, %133
  %135 = load i32, ptr %8, align 4, !tbaa !11
  %136 = add i32 %135, 16
  %137 = zext i32 %136 to i64
  %138 = load i64, ptr %6, align 8, !tbaa !9
  %139 = icmp ule i64 %137, %138
  br i1 %139, label %140, label %191

140:                                              ; preds = %134
  call void @llvm.lifetime.start.p0(i64 8, ptr %11) #4
  %141 = load ptr, ptr %7, align 8, !tbaa !5
  %142 = getelementptr inbounds %struct.ccm_ctx, ptr %141, i32 0, i32 0
  %143 = getelementptr inbounds [2 x i64], ptr %142, i64 0, i64 0
  %144 = getelementptr inbounds i8, ptr %143, i64 16
  store ptr %144, ptr %11, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %12) #4
  %145 = load ptr, ptr %7, align 8, !tbaa !5
  %146 = getelementptr inbounds %struct.ccm_ctx, ptr %145, i32 0, i32 0
  %147 = getelementptr inbounds [2 x i64], ptr %146, i64 0, i64 0
  %148 = load i8, ptr %147, align 16, !tbaa !17
  %149 = zext i8 %148 to i32
  %150 = and i32 %149, 7
  %151 = add nsw i32 %150, 1
  %152 = sext i32 %151 to i64
  store i64 %152, ptr %12, align 8, !tbaa !9
  br label %153

153:                                              ; preds = %166, %140
  %154 = load i64, ptr %12, align 8, !tbaa !9
  %155 = add i64 %154, -1
  store i64 %155, ptr %12, align 8, !tbaa !9
  %156 = icmp ne i64 %154, 0
  br i1 %156, label %157, label %164

157:                                              ; preds = %153
  %158 = load ptr, ptr %11, align 8, !tbaa !5
  %159 = getelementptr inbounds i8, ptr %158, i32 -1
  store ptr %159, ptr %11, align 8, !tbaa !5
  %160 = load i8, ptr %159, align 1, !tbaa !17
  %161 = add i8 %160, 1
  store i8 %161, ptr %159, align 1, !tbaa !17
  %162 = zext i8 %161 to i32
  %163 = icmp eq i32 %162, 0
  br label %164

164:                                              ; preds = %157, %153
  %165 = phi i1 [ false, %153 ], [ %163, %157 ]
  br i1 %165, label %166, label %167

166:                                              ; preds = %164
  br label %153, !llvm.loop !21

167:                                              ; preds = %164
  call void @llvm.lifetime.end.p0(i64 8, ptr %12) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %11) #4
  %168 = load ptr, ptr %7, align 8, !tbaa !5
  %169 = getelementptr inbounds %struct.ccm_ctx, ptr %168, i32 0, i32 0
  %170 = getelementptr inbounds [2 x i64], ptr %169, i64 0, i64 0
  %171 = load ptr, ptr %7, align 8, !tbaa !5
  %172 = getelementptr inbounds %struct.ccm_ctx, ptr %171, i32 0, i32 1
  %173 = getelementptr inbounds [2 x i64], ptr %172, i64 0, i64 0
  %174 = load ptr, ptr %7, align 8, !tbaa !5
  %175 = getelementptr inbounds %struct.ccm_ctx, ptr %174, i32 0, i32 3
  %176 = getelementptr inbounds [1 x %struct.aes_crypt_ctx], ptr %175, i64 0, i64 0
  %177 = call i32 @aes_encrypt(ptr noundef %170, ptr noundef %173, ptr noundef %176)
  %178 = load ptr, ptr %5, align 8, !tbaa !5
  %179 = load i32, ptr %8, align 4, !tbaa !11
  %180 = zext i32 %179 to i64
  %181 = getelementptr inbounds i8, ptr %178, i64 %180
  %182 = load ptr, ptr %5, align 8, !tbaa !5
  %183 = load i32, ptr %8, align 4, !tbaa !11
  %184 = zext i32 %183 to i64
  %185 = getelementptr inbounds i8, ptr %182, i64 %184
  %186 = load ptr, ptr %7, align 8, !tbaa !5
  %187 = getelementptr inbounds %struct.ccm_ctx, ptr %186, i32 0, i32 1
  %188 = getelementptr inbounds [2 x i64], ptr %187, i64 0, i64 0
  call void @xor_block_aligned(ptr noundef %181, ptr noundef %185, ptr noundef %188)
  %189 = load i32, ptr %8, align 4, !tbaa !11
  %190 = add i32 %189, 16
  store i32 %190, ptr %8, align 4, !tbaa !11
  br label %134, !llvm.loop !22

191:                                              ; preds = %134
  br label %285

192:                                              ; preds = %55
  %193 = load i32, ptr %9, align 4, !tbaa !11
  %194 = icmp ne i32 %193, 0
  br i1 %194, label %195, label %226

195:                                              ; preds = %192
  br label %196

196:                                              ; preds = %206, %195
  %197 = load i32, ptr %8, align 4, !tbaa !11
  %198 = zext i32 %197 to i64
  %199 = load i64, ptr %6, align 8, !tbaa !9
  %200 = icmp ult i64 %198, %199
  br i1 %200, label %201, label %204

201:                                              ; preds = %196
  %202 = load i32, ptr %9, align 4, !tbaa !11
  %203 = icmp ult i32 %202, 16
  br label %204

204:                                              ; preds = %201, %196
  %205 = phi i1 [ false, %196 ], [ %203, %201 ]
  br i1 %205, label %206, label %225

206:                                              ; preds = %204
  %207 = load ptr, ptr %7, align 8, !tbaa !5
  %208 = getelementptr inbounds %struct.ccm_ctx, ptr %207, i32 0, i32 1
  %209 = getelementptr inbounds [2 x i64], ptr %208, i64 0, i64 0
  %210 = load i32, ptr %9, align 4, !tbaa !11
  %211 = add i32 %210, 1
  store i32 %211, ptr %9, align 4, !tbaa !11
  %212 = zext i32 %210 to i64
  %213 = getelementptr inbounds i8, ptr %209, i64 %212
  %214 = load i8, ptr %213, align 1, !tbaa !17
  %215 = zext i8 %214 to i32
  %216 = load ptr, ptr %5, align 8, !tbaa !5
  %217 = load i32, ptr %8, align 4, !tbaa !11
  %218 = add i32 %217, 1
  store i32 %218, ptr %8, align 4, !tbaa !11
  %219 = zext i32 %217 to i64
  %220 = getelementptr inbounds i8, ptr %216, i64 %219
  %221 = load i8, ptr %220, align 1, !tbaa !17
  %222 = zext i8 %221 to i32
  %223 = xor i32 %222, %215
  %224 = trunc i32 %223 to i8
  store i8 %224, ptr %220, align 1, !tbaa !17
  br label %196, !llvm.loop !23

225:                                              ; preds = %204
  br label %226

226:                                              ; preds = %225, %192
  br label %227

227:                                              ; preds = %260, %226
  %228 = load i32, ptr %8, align 4, !tbaa !11
  %229 = add i32 %228, 16
  %230 = zext i32 %229 to i64
  %231 = load i64, ptr %6, align 8, !tbaa !9
  %232 = icmp ule i64 %230, %231
  br i1 %232, label %233, label %284

233:                                              ; preds = %227
  call void @llvm.lifetime.start.p0(i64 8, ptr %13) #4
  %234 = load ptr, ptr %7, align 8, !tbaa !5
  %235 = getelementptr inbounds %struct.ccm_ctx, ptr %234, i32 0, i32 0
  %236 = getelementptr inbounds [2 x i64], ptr %235, i64 0, i64 0
  %237 = getelementptr inbounds i8, ptr %236, i64 16
  store ptr %237, ptr %13, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %14) #4
  %238 = load ptr, ptr %7, align 8, !tbaa !5
  %239 = getelementptr inbounds %struct.ccm_ctx, ptr %238, i32 0, i32 0
  %240 = getelementptr inbounds [2 x i64], ptr %239, i64 0, i64 0
  %241 = load i8, ptr %240, align 16, !tbaa !17
  %242 = zext i8 %241 to i32
  %243 = and i32 %242, 7
  %244 = add nsw i32 %243, 1
  %245 = sext i32 %244 to i64
  store i64 %245, ptr %14, align 8, !tbaa !9
  br label %246

246:                                              ; preds = %259, %233
  %247 = load i64, ptr %14, align 8, !tbaa !9
  %248 = add i64 %247, -1
  store i64 %248, ptr %14, align 8, !tbaa !9
  %249 = icmp ne i64 %247, 0
  br i1 %249, label %250, label %257

250:                                              ; preds = %246
  %251 = load ptr, ptr %13, align 8, !tbaa !5
  %252 = getelementptr inbounds i8, ptr %251, i32 -1
  store ptr %252, ptr %13, align 8, !tbaa !5
  %253 = load i8, ptr %252, align 1, !tbaa !17
  %254 = add i8 %253, 1
  store i8 %254, ptr %252, align 1, !tbaa !17
  %255 = zext i8 %254 to i32
  %256 = icmp eq i32 %255, 0
  br label %257

257:                                              ; preds = %250, %246
  %258 = phi i1 [ false, %246 ], [ %256, %250 ]
  br i1 %258, label %259, label %260

259:                                              ; preds = %257
  br label %246, !llvm.loop !24

260:                                              ; preds = %257
  call void @llvm.lifetime.end.p0(i64 8, ptr %14) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %13) #4
  %261 = load ptr, ptr %7, align 8, !tbaa !5
  %262 = getelementptr inbounds %struct.ccm_ctx, ptr %261, i32 0, i32 0
  %263 = getelementptr inbounds [2 x i64], ptr %262, i64 0, i64 0
  %264 = load ptr, ptr %7, align 8, !tbaa !5
  %265 = getelementptr inbounds %struct.ccm_ctx, ptr %264, i32 0, i32 1
  %266 = getelementptr inbounds [2 x i64], ptr %265, i64 0, i64 0
  %267 = load ptr, ptr %7, align 8, !tbaa !5
  %268 = getelementptr inbounds %struct.ccm_ctx, ptr %267, i32 0, i32 3
  %269 = getelementptr inbounds [1 x %struct.aes_crypt_ctx], ptr %268, i64 0, i64 0
  %270 = call i32 @aes_encrypt(ptr noundef %263, ptr noundef %266, ptr noundef %269)
  %271 = load ptr, ptr %5, align 8, !tbaa !5
  %272 = load i32, ptr %8, align 4, !tbaa !11
  %273 = zext i32 %272 to i64
  %274 = getelementptr inbounds i8, ptr %271, i64 %273
  %275 = load ptr, ptr %5, align 8, !tbaa !5
  %276 = load i32, ptr %8, align 4, !tbaa !11
  %277 = zext i32 %276 to i64
  %278 = getelementptr inbounds i8, ptr %275, i64 %277
  %279 = load ptr, ptr %7, align 8, !tbaa !5
  %280 = getelementptr inbounds %struct.ccm_ctx, ptr %279, i32 0, i32 1
  %281 = getelementptr inbounds [2 x i64], ptr %280, i64 0, i64 0
  call void @xor_block(ptr noundef %274, ptr noundef %278, ptr noundef %281)
  %282 = load i32, ptr %8, align 4, !tbaa !11
  %283 = add i32 %282, 16
  store i32 %283, ptr %8, align 4, !tbaa !11
  br label %227, !llvm.loop !25

284:                                              ; preds = %227
  br label %285

285:                                              ; preds = %284, %191
  br label %286

286:                                              ; preds = %335, %285
  %287 = load i32, ptr %8, align 4, !tbaa !11
  %288 = zext i32 %287 to i64
  %289 = load i64, ptr %6, align 8, !tbaa !9
  %290 = icmp ult i64 %288, %289
  br i1 %290, label %291, label %354

291:                                              ; preds = %286
  %292 = load i32, ptr %9, align 4, !tbaa !11
  %293 = icmp eq i32 %292, 16
  br i1 %293, label %297, label %294

294:                                              ; preds = %291
  %295 = load i32, ptr %9, align 4, !tbaa !11
  %296 = icmp ne i32 %295, 0
  br i1 %296, label %335, label %297

297:                                              ; preds = %294, %291
  call void @llvm.lifetime.start.p0(i64 8, ptr %15) #4
  %298 = load ptr, ptr %7, align 8, !tbaa !5
  %299 = getelementptr inbounds %struct.ccm_ctx, ptr %298, i32 0, i32 0
  %300 = getelementptr inbounds [2 x i64], ptr %299, i64 0, i64 0
  %301 = getelementptr inbounds i8, ptr %300, i64 16
  store ptr %301, ptr %15, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %16) #4
  %302 = load ptr, ptr %7, align 8, !tbaa !5
  %303 = getelementptr inbounds %struct.ccm_ctx, ptr %302, i32 0, i32 0
  %304 = getelementptr inbounds [2 x i64], ptr %303, i64 0, i64 0
  %305 = load i8, ptr %304, align 16, !tbaa !17
  %306 = zext i8 %305 to i32
  %307 = and i32 %306, 7
  %308 = add nsw i32 %307, 1
  %309 = sext i32 %308 to i64
  store i64 %309, ptr %16, align 8, !tbaa !9
  br label %310

310:                                              ; preds = %323, %297
  %311 = load i64, ptr %16, align 8, !tbaa !9
  %312 = add i64 %311, -1
  store i64 %312, ptr %16, align 8, !tbaa !9
  %313 = icmp ne i64 %311, 0
  br i1 %313, label %314, label %321

314:                                              ; preds = %310
  %315 = load ptr, ptr %15, align 8, !tbaa !5
  %316 = getelementptr inbounds i8, ptr %315, i32 -1
  store ptr %316, ptr %15, align 8, !tbaa !5
  %317 = load i8, ptr %316, align 1, !tbaa !17
  %318 = add i8 %317, 1
  store i8 %318, ptr %316, align 1, !tbaa !17
  %319 = zext i8 %318 to i32
  %320 = icmp eq i32 %319, 0
  br label %321

321:                                              ; preds = %314, %310
  %322 = phi i1 [ false, %310 ], [ %320, %314 ]
  br i1 %322, label %323, label %324

323:                                              ; preds = %321
  br label %310, !llvm.loop !26

324:                                              ; preds = %321
  call void @llvm.lifetime.end.p0(i64 8, ptr %16) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %15) #4
  %325 = load ptr, ptr %7, align 8, !tbaa !5
  %326 = getelementptr inbounds %struct.ccm_ctx, ptr %325, i32 0, i32 0
  %327 = getelementptr inbounds [2 x i64], ptr %326, i64 0, i64 0
  %328 = load ptr, ptr %7, align 8, !tbaa !5
  %329 = getelementptr inbounds %struct.ccm_ctx, ptr %328, i32 0, i32 1
  %330 = getelementptr inbounds [2 x i64], ptr %329, i64 0, i64 0
  %331 = load ptr, ptr %7, align 8, !tbaa !5
  %332 = getelementptr inbounds %struct.ccm_ctx, ptr %331, i32 0, i32 3
  %333 = getelementptr inbounds [1 x %struct.aes_crypt_ctx], ptr %332, i64 0, i64 0
  %334 = call i32 @aes_encrypt(ptr noundef %327, ptr noundef %330, ptr noundef %333)
  store i32 0, ptr %9, align 4, !tbaa !11
  br label %335

335:                                              ; preds = %324, %294
  %336 = load ptr, ptr %7, align 8, !tbaa !5
  %337 = getelementptr inbounds %struct.ccm_ctx, ptr %336, i32 0, i32 1
  %338 = getelementptr inbounds [2 x i64], ptr %337, i64 0, i64 0
  %339 = load i32, ptr %9, align 4, !tbaa !11
  %340 = add i32 %339, 1
  store i32 %340, ptr %9, align 4, !tbaa !11
  %341 = zext i32 %339 to i64
  %342 = getelementptr inbounds i8, ptr %338, i64 %341
  %343 = load i8, ptr %342, align 1, !tbaa !17
  %344 = zext i8 %343 to i32
  %345 = load ptr, ptr %5, align 8, !tbaa !5
  %346 = load i32, ptr %8, align 4, !tbaa !11
  %347 = add i32 %346, 1
  store i32 %347, ptr %8, align 4, !tbaa !11
  %348 = zext i32 %346 to i64
  %349 = getelementptr inbounds i8, ptr %345, i64 %348
  %350 = load i8, ptr %349, align 1, !tbaa !17
  %351 = zext i8 %350 to i32
  %352 = xor i32 %351, %344
  %353 = trunc i32 %352 to i8
  store i8 %353, ptr %349, align 1, !tbaa !17
  br label %286, !llvm.loop !27

354:                                              ; preds = %286
  %355 = load i32, ptr %8, align 4, !tbaa !11
  %356 = zext i32 %355 to i64
  %357 = load ptr, ptr %7, align 8, !tbaa !5
  %358 = getelementptr inbounds %struct.ccm_ctx, ptr %357, i32 0, i32 7
  %359 = load i64, ptr %358, align 8, !tbaa !13
  %360 = add i64 %359, %356
  store i64 %360, ptr %358, align 8, !tbaa !13
  store i32 0, ptr %4, align 4
  store i32 1, ptr %10, align 4
  br label %361

361:                                              ; preds = %354, %54, %48, %35, %26
  call void @llvm.lifetime.end.p0(i64 4, ptr %9) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %8) #4
  %362 = load i32, ptr %4, align 4
  ret i32 %362
}

attributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { "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 = { 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 #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 = !{!"any pointer", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!10, !10, i64 0}
!10 = !{!"long", !7, i64 0}
!11 = !{!12, !12, i64 0}
!12 = !{!"int", !7, i64 0}
!13 = !{!14, !10, i64 328}
!14 = !{!"", !7, i64 0, !7, i64 16, !7, i64 32, !7, i64 48, !10, i64 304, !10, i64 312, !10, i64 320, !10, i64 328, !10, i64 336, !12, i64 344, !12, i64 348, !12, i64 352}
!15 = !{!14, !12, i64 352}
!16 = !{!14, !10, i64 312}
!17 = !{!7, !7, i64 0}
!18 = distinct !{!18, !19}
!19 = !{!"llvm.loop.mustprogress"}
!20 = distinct !{!20, !19}
!21 = distinct !{!21, !19}
!22 = distinct !{!22, !19}
!23 = distinct !{!23, !19}
!24 = distinct !{!24, !19}
!25 = distinct !{!25, !19}
!26 = distinct !{!26, !19}
!27 = distinct !{!27, !19}


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

declare i32 @aes_encrypt(ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #0

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @xor_block_aligned(ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #1

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @xor_block(ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #1

; Function Attrs: nounwind uwtable
define dso_local range(i32 -2147483648, 1) i32 @ccm_crypt_data(ptr noundef %0, i64 noundef %1, ptr noundef %2) local_unnamed_addr #2 {
  %4 = getelementptr inbounds i8, ptr %2, i64 328
  %5 = load i64, ptr %4, align 8, !tbaa !5
  %6 = trunc i64 %5 to i32
  %7 = and i32 %6, 15
  %8 = getelementptr inbounds i8, ptr %2, i64 352
  %9 = load i32, ptr %8, align 16, !tbaa !11
  %10 = icmp slt i32 %9, 0
  br i1 %10, label %208, label %11

11:                                               ; preds = %3
  %12 = icmp eq i32 %9, 11
  br i1 %12, label %13, label %14

13:                                               ; preds = %11
  store i32 -6, ptr %8, align 16, !tbaa !11
  br label %208

14:                                               ; preds = %11
  %15 = add i64 %5, %1
  %16 = getelementptr inbounds i8, ptr %2, i64 312
  %17 = load i64, ptr %16, align 8, !tbaa !12
  %18 = icmp ugt i64 %15, %17
  br i1 %18, label %19, label %20

19:                                               ; preds = %14
  store i32 -7, ptr %8, align 16, !tbaa !11
  br label %208

20:                                               ; preds = %14
  %.not = icmp eq i64 %1, 0
  br i1 %.not, label %208, label %21

21:                                               ; preds = %20
  %22 = getelementptr inbounds i8, ptr %2, i64 16
  %23 = and i64 %5, 15
  %24 = getelementptr inbounds i8, ptr %22, i64 %23
  %25 = ptrtoint ptr %0 to i64
  %26 = ptrtoint ptr %24 to i64
  %27 = sub i64 %25, %26
  %28 = and i64 %27, 7
  %.not116 = icmp eq i64 %28, 0
  %.not117 = icmp eq i32 %7, 0
  br i1 %.not116, label %29, label %136

29:                                               ; preds = %21
  br i1 %.not117, label %.loopexit126, label %.preheader127

.preheader127:                                    ; preds = %29
  %30 = and i32 %6, 7
  %.not153 = icmp eq i32 %30, 0
  br i1 %.not153, label %.preheader, label %.lr.ph137

.preheader:                                       ; preds = %.lr.ph137, %.lr.ph137.1, %.lr.ph137.2, %.lr.ph137.3, %.lr.ph137.4, %.lr.ph137.5, %.lr.ph137.6, %.lr.ph137.7, %.preheader127
  %.096.lcssa = phi i32 [ 0, %.preheader127 ], [ 1, %.lr.ph137 ], [ 2, %.lr.ph137.1 ], [ 3, %.lr.ph137.2 ], [ 4, %.lr.ph137.3 ], [ 5, %.lr.ph137.4 ], [ 6, %.lr.ph137.5 ], [ 7, %.lr.ph137.6 ], [ 8, %.lr.ph137.7 ]
  %.095.lcssa = phi i32 [ %7, %.preheader127 ], [ %41, %.lr.ph137 ], [ %51, %.lr.ph137.1 ], [ %61, %.lr.ph137.2 ], [ %71, %.lr.ph137.3 ], [ %81, %.lr.ph137.4 ], [ %91, %.lr.ph137.5 ], [ %101, %.lr.ph137.6 ], [ %111, %.lr.ph137.7 ]
  %31 = add nsw i32 %.096.lcssa, 8
  %32 = zext i32 %31 to i64
  %33 = icmp ule i64 %32, %1
  %34 = icmp ult i32 %.095.lcssa, 9
  %35 = select i1 %33, i1 %34, i1 false
  br i1 %35, label %.loopexit126.loopexit, label %.loopexit126

.lr.ph137:                                        ; preds = %.preheader127
  %indvars.iv.next170 = add nuw nsw i64 %23, 1
  %36 = getelementptr inbounds i8, ptr %22, i64 %23
  %37 = load i8, ptr %36, align 1, !tbaa !13
  %38 = load i8, ptr %0, align 1, !tbaa !13
  %39 = xor i8 %38, %37
  store i8 %39, ptr %0, align 1, !tbaa !13
  %40 = icmp ne i64 %1, 1
  %41 = trunc nuw nsw i64 %indvars.iv.next170 to i32
  %42 = and i32 %41, 7
  %43 = icmp ne i32 %42, 0
  %44 = and i1 %40, %43
  br i1 %44, label %.lr.ph137.1, label %.preheader, !llvm.loop !14

.lr.ph137.1:                                      ; preds = %.lr.ph137
  %indvars.iv.next170.1 = add nuw nsw i64 %23, 2
  %45 = getelementptr inbounds i8, ptr %22, i64 %indvars.iv.next170
  %46 = load i8, ptr %45, align 1, !tbaa !13
  %47 = getelementptr inbounds i8, ptr %0, i64 1
  %48 = load i8, ptr %47, align 1, !tbaa !13
  %49 = xor i8 %48, %46
  store i8 %49, ptr %47, align 1, !tbaa !13
  %50 = icmp ugt i64 %1, 2
  %51 = trunc nuw nsw i64 %indvars.iv.next170.1 to i32
  %52 = and i32 %51, 7
  %53 = icmp ne i32 %52, 0
  %54 = and i1 %50, %53
  br i1 %54, label %.lr.ph137.2, label %.preheader, !llvm.loop !14

.lr.ph137.2:                                      ; preds = %.lr.ph137.1
  %indvars.iv.next170.2 = add nuw nsw i64 %23, 3
  %55 = getelementptr inbounds i8, ptr %22, i64 %indvars.iv.next170.1
  %56 = load i8, ptr %55, align 1, !tbaa !13
  %57 = getelementptr inbounds i8, ptr %0, i64 2
  %58 = load i8, ptr %57, align 1, !tbaa !13
  %59 = xor i8 %58, %56
  store i8 %59, ptr %57, align 1, !tbaa !13
  %60 = icmp ugt i64 %1, 3
  %61 = trunc nuw nsw i64 %indvars.iv.next170.2 to i32
  %62 = and i32 %61, 7
  %63 = icmp ne i32 %62, 0
  %64 = and i1 %60, %63
  br i1 %64, label %.lr.ph137.3, label %.preheader, !llvm.loop !14

.lr.ph137.3:                                      ; preds = %.lr.ph137.2
  %indvars.iv.next170.3 = add nuw nsw i64 %23, 4
  %65 = getelementptr inbounds i8, ptr %22, i64 %indvars.iv.next170.2
  %66 = load i8, ptr %65, align 1, !tbaa !13
  %67 = getelementptr inbounds i8, ptr %0, i64 3
  %68 = load i8, ptr %67, align 1, !tbaa !13
  %69 = xor i8 %68, %66
  store i8 %69, ptr %67, align 1, !tbaa !13
  %70 = icmp ugt i64 %1, 4
  %71 = trunc nuw nsw i64 %indvars.iv.next170.3 to i32
  %72 = and i32 %71, 7
  %73 = icmp ne i32 %72, 0
  %74 = and i1 %70, %73
  br i1 %74, label %.lr.ph137.4, label %.preheader, !llvm.loop !14

.lr.ph137.4:                                      ; preds = %.lr.ph137.3
  %indvars.iv.next170.4 = add nuw nsw i64 %23, 5
  %75 = getelementptr inbounds i8, ptr %22, i64 %indvars.iv.next170.3
  %76 = load i8, ptr %75, align 1, !tbaa !13
  %77 = getelementptr inbounds i8, ptr %0, i64 4
  %78 = load i8, ptr %77, align 1, !tbaa !13
  %79 = xor i8 %78, %76
  store i8 %79, ptr %77, align 1, !tbaa !13
  %80 = icmp ugt i64 %1, 5
  %81 = trunc nuw nsw i64 %indvars.iv.next170.4 to i32
  %82 = and i32 %81, 7
  %83 = icmp ne i32 %82, 0
  %84 = and i1 %80, %83
  br i1 %84, label %.lr.ph137.5, label %.preheader, !llvm.loop !14

.lr.ph137.5:                                      ; preds = %.lr.ph137.4
  %indvars.iv.next170.5 = add nuw nsw i64 %23, 6
  %85 = getelementptr inbounds i8, ptr %22, i64 %indvars.iv.next170.4
  %86 = load i8, ptr %85, align 1, !tbaa !13
  %87 = getelementptr inbounds i8, ptr %0, i64 5
  %88 = load i8, ptr %87, align 1, !tbaa !13
  %89 = xor i8 %88, %86
  store i8 %89, ptr %87, align 1, !tbaa !13
  %90 = icmp ugt i64 %1, 6
  %91 = trunc nuw nsw i64 %indvars.iv.next170.5 to i32
  %92 = and i32 %91, 7
  %93 = icmp ne i32 %92, 0
  %94 = and i1 %90, %93
  br i1 %94, label %.lr.ph137.6, label %.preheader, !llvm.loop !14

.lr.ph137.6:                                      ; preds = %.lr.ph137.5
  %indvars.iv.next170.6 = add nuw nsw i64 %23, 7
  %95 = getelementptr inbounds i8, ptr %22, i64 %indvars.iv.next170.5
  %96 = load i8, ptr %95, align 1, !tbaa !13
  %97 = getelementptr inbounds i8, ptr %0, i64 6
  %98 = load i8, ptr %97, align 1, !tbaa !13
  %99 = xor i8 %98, %96
  store i8 %99, ptr %97, align 1, !tbaa !13
  %100 = icmp ugt i64 %1, 7
  %101 = trunc nuw nsw i64 %indvars.iv.next170.6 to i32
  %102 = and i32 %101, 7
  %103 = icmp ne i32 %102, 0
  %104 = and i1 %100, %103
  br i1 %104, label %.lr.ph137.7, label %.preheader, !llvm.loop !14

.lr.ph137.7:                                      ; preds = %.lr.ph137.6
  %105 = getelementptr inbounds i8, ptr %22, i64 %indvars.iv.next170.6
  %106 = load i8, ptr %105, align 1, !tbaa !13
  %107 = getelementptr inbounds i8, ptr %0, i64 7
  %108 = load i8, ptr %107, align 1, !tbaa !13
  %109 = xor i8 %108, %106
  store i8 %109, ptr %107, align 1, !tbaa !13
  %110 = trunc nuw nsw i64 %23 to i32
  %111 = add nuw nsw i32 %110, 8
  br label %.preheader

.loopexit126.loopexit:                            ; preds = %.preheader
  %.phi.trans.insert = zext i32 %.096.lcssa to i64
  %.phi.trans.insert179 = getelementptr inbounds i8, ptr %0, i64 %.phi.trans.insert
  %.pre = load i64, ptr %.phi.trans.insert179, align 8, !tbaa !16
  %112 = zext nneg i32 %.095.lcssa to i64
  %113 = getelementptr inbounds i8, ptr %22, i64 %112
  %114 = load i64, ptr %113, align 8, !tbaa !16
  %115 = xor i64 %.pre, %114
  store i64 %115, ptr %.phi.trans.insert179, align 8, !tbaa !16
  %indvars.iv.next177 = add nuw nsw i32 %.095.lcssa, 8
  br label %.loopexit126

.loopexit126:                                     ; preds = %.loopexit126.loopexit, %.preheader, %29
  %.298 = phi i32 [ 0, %29 ], [ %.096.lcssa, %.preheader ], [ %31, %.loopexit126.loopexit ]
  %.2 = phi i32 [ 0, %29 ], [ %.095.lcssa, %.preheader ], [ %indvars.iv.next177, %.loopexit126.loopexit ]
  %116 = add nsw i32 %.298, 16
  %117 = zext i32 %116 to i64
  %.not118145 = icmp ugt i64 %117, %1
  br i1 %.not118145, label %.loopexit, label %.lr.ph147

.lr.ph147:                                        ; preds = %.loopexit126
  %118 = getelementptr inbounds i8, ptr %2, i64 48
  br label %119

119:                                              ; preds = %.lr.ph147, %.critedge
  %120 = phi i32 [ %116, %.lr.ph147 ], [ %134, %.critedge ]
  %.399146 = phi i32 [ %.298, %.lr.ph147 ], [ %120, %.critedge ]
  %121 = load i8, ptr %2, align 16, !tbaa !13
  %122 = and i8 %121, 7
  %narrow = add nuw nsw i8 %122, 1
  %123 = zext nneg i8 %narrow to i64
  br label %124

124:                                              ; preds = %125, %119
  %.094 = phi ptr [ %22, %119 ], [ %127, %125 ]
  %.093 = phi i64 [ %123, %119 ], [ %126, %125 ]
  %.not119 = icmp eq i64 %.093, 0
  br i1 %.not119, label %.critedge, label %125

125:                                              ; preds = %124
  %126 = add nsw i64 %.093, -1
  %127 = getelementptr inbounds i8, ptr %.094, i64 -1
  %128 = load i8, ptr %127, align 1, !tbaa !13
  %129 = add i8 %128, 1
  store i8 %129, ptr %127, align 1, !tbaa !13
  %130 = icmp eq i8 %129, 0
  br i1 %130, label %124, label %.critedge, !llvm.loop !17

.critedge:                                        ; preds = %124, %125
  %131 = tail call i32 @aes_encrypt(ptr noundef nonnull %2, ptr noundef nonnull %22, ptr noundef nonnull %118) #4
  %132 = zext i32 %.399146 to i64
  %133 = getelementptr inbounds i8, ptr %0, i64 %132
  tail call void @xor_block_aligned(ptr noundef %133, ptr noundef %133, ptr noundef nonnull %22)
  %134 = add i32 %120, 16
  %135 = zext i32 %134 to i64
  %.not118 = icmp ugt i64 %135, %1
  br i1 %.not118, label %.loopexit, label %119, !llvm.loop !18

136:                                              ; preds = %21
  br i1 %.not117, label %.loopexit130, label %.preheader129.preheader

.preheader129.preheader:                          ; preds = %136
  %137 = add i64 %1, -1
  %138 = xor i64 %23, 15
  %umin191 = tail call i64 @llvm.umin.i64(i64 %137, i64 %138)
  %139 = add nuw nsw i64 %umin191, 1
  %min.iters.check.not = icmp eq i64 %umin191, 15
  br i1 %min.iters.check.not, label %vector.memcheck, label %.preheader129.preheader199

.preheader129.preheader199:                       ; preds = %vector.memcheck, %.preheader129.preheader
  br label %.preheader129

vector.memcheck:                                  ; preds = %.preheader129.preheader
  %140 = add i64 %1, -1
  %141 = xor i64 %23, 15
  %umin = tail call i64 @llvm.umin.i64(i64 %140, i64 %141)
  %142 = getelementptr i8, ptr %0, i64 %umin
  %scevgep = getelementptr i8, ptr %142, i64 1
  %143 = getelementptr i8, ptr %2, i64 %umin
  %144 = getelementptr i8, ptr %143, i64 %23
  %scevgep190 = getelementptr i8, ptr %144, i64 17
  %bound0 = icmp ugt ptr %scevgep190, %0
  %bound1 = icmp ult ptr %24, %scevgep
  %found.conflict = and i1 %bound0, %bound1
  br i1 %found.conflict, label %.preheader129.preheader199, label %vector.ph

vector.ph:                                        ; preds = %vector.memcheck
  %ind.end = or disjoint i64 %23, %139
  %145 = getelementptr inbounds i8, ptr %22, i64 %23
  %wide.load = load <16 x i8>, ptr %145, align 1, !tbaa !13, !alias.scope !19
  %wide.load193 = load <16 x i8>, ptr %0, align 1, !tbaa !13, !alias.scope !22, !noalias !19
  %146 = xor <16 x i8> %wide.load193, %wide.load
  store <16 x i8> %146, ptr %0, align 1, !tbaa !13, !alias.scope !22, !noalias !19
  br label %.loopexit130.loopexit

.preheader129:                                    ; preds = %.preheader129.preheader199, %.preheader129
  %indvars.iv164 = phi i64 [ %indvars.iv.next165, %.preheader129 ], [ 0, %.preheader129.preheader199 ]
  %indvars.iv = phi i64 [ %indvars.iv.next, %.preheader129 ], [ %23, %.preheader129.preheader199 ]
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
  %147 = getelementptr inbounds i8, ptr %22, i64 %indvars.iv
  %148 = load i8, ptr %147, align 1, !tbaa !13
  %indvars.iv.next165 = add nuw nsw i64 %indvars.iv164, 1
  %149 = getelementptr inbounds i8, ptr %0, i64 %indvars.iv164
  %150 = load i8, ptr %149, align 1, !tbaa !13
  %151 = xor i8 %150, %148
  store i8 %151, ptr %149, align 1, !tbaa !13
  %152 = icmp ult i64 %indvars.iv.next165, %1
  %153 = icmp ult i64 %indvars.iv, 15
  %154 = and i1 %152, %153
  br i1 %154, label %.preheader129, label %.loopexit130.loopexit, !llvm.loop !24

.loopexit130.loopexit:                            ; preds = %.preheader129, %vector.ph
  %indvars.iv.next.lcssa = phi i64 [ %ind.end, %vector.ph ], [ %indvars.iv.next, %.preheader129 ]
  %indvars.iv.next165.lcssa = phi i64 [ %139, %vector.ph ], [ %indvars.iv.next165, %.preheader129 ]
  %155 = trunc nuw nsw i64 %indvars.iv.next165.lcssa to i32
  %156 = trunc nuw nsw i64 %indvars.iv.next.lcssa to i32
  br label %.loopexit130

.loopexit130:                                     ; preds = %.loopexit130.loopexit, %136
  %.5101 = phi i32 [ 0, %136 ], [ %155, %.loopexit130.loopexit ]
  %.4 = phi i32 [ 0, %136 ], [ %156, %.loopexit130.loopexit ]
  %157 = add i32 %.5101, 16
  %158 = zext i32 %157 to i64
  %.not121133 = icmp ugt i64 %158, %1
  br i1 %.not121133, label %.loopexit, label %.lr.ph

.lr.ph:                                           ; preds = %.loopexit130
  %159 = getelementptr inbounds i8, ptr %2, i64 48
  br label %160

160:                                              ; preds = %.lr.ph, %.critedge2
  %161 = phi i32 [ %157, %.lr.ph ], [ %175, %.critedge2 ]
  %.6102134 = phi i32 [ %.5101, %.lr.ph ], [ %161, %.critedge2 ]
  %162 = load i8, ptr %2, align 16, !tbaa !13
  %163 = and i8 %162, 7
  %narrow124 = add nuw nsw i8 %163, 1
  %164 = zext nneg i8 %narrow124 to i64
  br label %165

165:                                              ; preds = %166, %160
  %.092 = phi ptr [ %22, %160 ], [ %168, %166 ]
  %.091 = phi i64 [ %164, %160 ], [ %167, %166 ]
  %.not125 = icmp eq i64 %.091, 0
  br i1 %.not125, label %.critedge2, label %166

166:                                              ; preds = %165
  %167 = add nsw i64 %.091, -1
  %168 = getelementptr inbounds i8, ptr %.092, i64 -1
  %169 = load i8, ptr %168, align 1, !tbaa !13
  %170 = add i8 %169, 1
  store i8 %170, ptr %168, align 1, !tbaa !13
  %171 = icmp eq i8 %170, 0
  br i1 %171, label %165, label %.critedge2, !llvm.loop !26

.critedge2:                                       ; preds = %165, %166
  %172 = tail call i32 @aes_encrypt(ptr noundef nonnull %2, ptr noundef nonnull %22, ptr noundef nonnull %159) #4
  %173 = zext i32 %.6102134 to i64
  %174 = getelementptr inbounds i8, ptr %0, i64 %173
  tail call void @xor_block(ptr noundef %174, ptr noundef %174, ptr noundef nonnull %22)
  %175 = add i32 %161, 16
  %176 = zext i32 %175 to i64
  %.not121 = icmp ugt i64 %176, %1
  br i1 %.not121, label %.loopexit, label %160, !llvm.loop !27

.loopexit:                                        ; preds = %.critedge2, %.critedge, %.loopexit130, %.loopexit126
  %.7103 = phi i32 [ %.298, %.loopexit126 ], [ %.5101, %.loopexit130 ], [ %120, %.critedge ], [ %161, %.critedge2 ]
  %.5 = phi i32 [ %.2, %.loopexit126 ], [ %.4, %.loopexit130 ], [ %.2, %.critedge ], [ %.4, %.critedge2 ]
  %177 = zext i32 %.7103 to i64
  %178 = icmp ult i64 %177, %1
  br i1 %178, label %.lr.ph151, label %._crit_edge

.lr.ph151:                                        ; preds = %.loopexit
  %179 = getelementptr inbounds i8, ptr %2, i64 48
  br label %180

180:                                              ; preds = %.lr.ph151, %195
  %181 = phi i64 [ %177, %.lr.ph151 ], [ %204, %195 ]
  %.6150 = phi i32 [ %.5, %.lr.ph151 ], [ %196, %195 ]
  %.8149 = phi i32 [ %.7103, %.lr.ph151 ], [ %200, %195 ]
  %182 = and i32 %.6150, -17
  %or.cond.not = icmp eq i32 %182, 0
  br i1 %or.cond.not, label %183, label %195

183:                                              ; preds = %180
  %184 = load i8, ptr %2, align 16, !tbaa !13
  %185 = and i8 %184, 7
  %narrow122 = add nuw nsw i8 %185, 1
  %186 = zext nneg i8 %narrow122 to i64
  br label %187

187:                                              ; preds = %188, %183
  %.090 = phi ptr [ %22, %183 ], [ %190, %188 ]
  %.0 = phi i64 [ %186, %183 ], [ %189, %188 ]
  %.not123 = icmp eq i64 %.0, 0
  br i1 %.not123, label %.critedge5, label %188

188:                                              ; preds = %187
  %189 = add nsw i64 %.0, -1
  %190 = getelementptr inbounds i8, ptr %.090, i64 -1
  %191 = load i8, ptr %190, align 1, !tbaa !13
  %192 = add i8 %191, 1
  store i8 %192, ptr %190, align 1, !tbaa !13
  %193 = icmp eq i8 %192, 0
  br i1 %193, label %187, label %.critedge5, !llvm.loop !28

.critedge5:                                       ; preds = %187, %188
  %194 = tail call i32 @aes_encrypt(ptr noundef nonnull %2, ptr noundef nonnull %22, ptr noundef nonnull %179) #4
  br label %195

195:                                              ; preds = %180, %.critedge5
  %.7 = phi i32 [ %.6150, %180 ], [ 0, %.critedge5 ]
  %196 = add i32 %.7, 1
  %197 = zext i32 %.7 to i64
  %198 = getelementptr inbounds i8, ptr %22, i64 %197
  %199 = load i8, ptr %198, align 1, !tbaa !13
  %200 = add i32 %.8149, 1
  %201 = getelementptr inbounds i8, ptr %0, i64 %181
  %202 = load i8, ptr %201, align 1, !tbaa !13
  %203 = xor i8 %202, %199
  store i8 %203, ptr %201, align 1, !tbaa !13
  %204 = zext i32 %200 to i64
  %205 = icmp ult i64 %204, %1
  br i1 %205, label %180, label %._crit_edge, !llvm.loop !29

._crit_edge:                                      ; preds = %195, %.loopexit
  %.lcssa = phi i64 [ %177, %.loopexit ], [ %204, %195 ]
  %206 = load i64, ptr %4, align 8, !tbaa !5
  %207 = add i64 %206, %.lcssa
  store i64 %207, ptr %4, align 8, !tbaa !5
  br label %208

208:                                              ; preds = %20, %3, %._crit_edge, %19, %13
  %.0104 = phi i32 [ -6, %13 ], [ -7, %19 ], [ 0, %._crit_edge ], [ %9, %3 ], [ 0, %20 ]
  ret i32 %.0104
}

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

attributes #0 = { "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #1 = { 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, !9, i64 328}
!6 = !{!"", !7, i64 0, !7, i64 16, !7, i64 32, !7, i64 48, !9, i64 304, !9, i64 312, !9, i64 320, !9, i64 328, !9, i64 336, !10, i64 344, !10, i64 348, !10, i64 352}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!"long", !7, i64 0}
!10 = !{!"int", !7, i64 0}
!11 = !{!6, !10, i64 352}
!12 = !{!6, !9, i64 312}
!13 = !{!7, !7, i64 0}
!14 = distinct !{!14, !15}
!15 = !{!"llvm.loop.mustprogress"}
!16 = !{!9, !9, i64 0}
!17 = distinct !{!17, !15}
!18 = distinct !{!18, !15}
!19 = !{!20}
!20 = distinct !{!20, !21}
!21 = distinct !{!21, !"LVerDomain"}
!22 = !{!23}
!23 = distinct !{!23, !21}
!24 = distinct !{!24, !15, !25}
!25 = !{!"llvm.loop.isvectorized", i32 1}
!26 = distinct !{!26, !15}
!27 = distinct !{!27, !15}
!28 = distinct !{!28, !15}
!29 = distinct !{!29, !15}


; Effective O3 passes: BDCEPass,EarlyCSEPass,GVNPass,GlobalOptPass,IPSCCPPass,IndVarSimplifyPass,InferFunctionAttrsPass,InstCombinePass,InstSimplifyPass,JumpThreadingPass,LCSSAPass,LICMPass,LoopLoadEliminationPass,LoopRotatePass,LoopSimplifyPass,LoopUnrollPass,LoopVectorizePass,SCCPPass,SROAPass,SimplifyCFGPass,TailCallElimPass