; 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: nounwind uwtable
define dso_local i32 @ccm_init_message(ptr noundef %0, i64 noundef %1, i64 noundef %2, i64 noundef %3, i64 noundef %4, ptr noundef %5) #0 {
  %7 = alloca i32, align 4
  %8 = alloca ptr, align 8
  %9 = alloca i64, align 8
  %10 = alloca i64, align 8
  %11 = alloca i64, align 8
  %12 = alloca i64, align 8
  %13 = alloca ptr, align 8
  %14 = alloca i32, align 4
  %15 = alloca i32, align 4
  %16 = alloca ptr, align 8
  %17 = alloca i64, align 8
  %18 = alloca i64, align 8
  store ptr %0, ptr %8, align 8, !tbaa !5
  store i64 %1, ptr %9, align 8, !tbaa !9
  store i64 %2, ptr %10, align 8, !tbaa !9
  store i64 %3, ptr %11, align 8, !tbaa !9
  store i64 %4, ptr %12, align 8, !tbaa !9
  store ptr %5, ptr %13, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %14) #5
  %19 = load ptr, ptr %13, align 8, !tbaa !5
  %20 = getelementptr inbounds %struct.ccm_ctx, ptr %19, i32 0, i32 11
  store i32 0, ptr %20, align 16, !tbaa !11
  %21 = load i64, ptr %12, align 8, !tbaa !9
  %22 = icmp ult i64 %21, 4
  br i1 %22, label %30, label %23

23:                                               ; preds = %6
  %24 = load i64, ptr %12, align 8, !tbaa !9
  %25 = icmp ugt i64 %24, 16
  br i1 %25, label %30, label %26

26:                                               ; preds = %23
  %27 = load i64, ptr %12, align 8, !tbaa !9
  %28 = and i64 %27, 1
  %29 = icmp ne i64 %28, 0
  br i1 %29, label %30, label %33

30:                                               ; preds = %26, %23, %6
  %31 = load ptr, ptr %13, align 8, !tbaa !5
  %32 = getelementptr inbounds %struct.ccm_ctx, ptr %31, i32 0, i32 11
  store i32 -3, ptr %32, align 16, !tbaa !11
  br label %46

33:                                               ; preds = %26
  %34 = load i64, ptr %9, align 8, !tbaa !9
  %35 = icmp ne i64 %34, 0
  br i1 %35, label %36, label %39

36:                                               ; preds = %33
  %37 = load i64, ptr %9, align 8, !tbaa !9
  %38 = icmp ult i64 %37, 7
  br i1 %38, label %42, label %39

39:                                               ; preds = %36, %33
  %40 = load i64, ptr %9, align 8, !tbaa !9
  %41 = icmp ugt i64 %40, 13
  br i1 %41, label %42, label %45

42:                                               ; preds = %39, %36
  %43 = load ptr, ptr %13, align 8, !tbaa !5
  %44 = getelementptr inbounds %struct.ccm_ctx, ptr %43, i32 0, i32 11
  store i32 -4, ptr %44, align 16, !tbaa !11
  br label %45

45:                                               ; preds = %42, %39
  br label %46

46:                                               ; preds = %45, %30
  %47 = load ptr, ptr %13, align 8, !tbaa !5
  %48 = getelementptr inbounds %struct.ccm_ctx, ptr %47, i32 0, i32 11
  %49 = load i32, ptr %48, align 16, !tbaa !11
  %50 = icmp ne i32 %49, 0
  br i1 %50, label %51, label %55

51:                                               ; preds = %46
  %52 = load ptr, ptr %13, align 8, !tbaa !5
  %53 = getelementptr inbounds %struct.ccm_ctx, ptr %52, i32 0, i32 11
  %54 = load i32, ptr %53, align 16, !tbaa !11
  store i32 %54, ptr %7, align 4
  store i32 1, ptr %15, align 4
  br label %547

55:                                               ; preds = %46
  %56 = load i64, ptr %9, align 8, !tbaa !9
  %57 = trunc i64 %56 to i32
  %58 = load ptr, ptr %13, align 8, !tbaa !5
  %59 = getelementptr inbounds %struct.ccm_ctx, ptr %58, i32 0, i32 9
  store i32 %57, ptr %59, align 8, !tbaa !14
  %60 = load i64, ptr %10, align 8, !tbaa !9
  %61 = load ptr, ptr %13, align 8, !tbaa !5
  %62 = getelementptr inbounds %struct.ccm_ctx, ptr %61, i32 0, i32 4
  store i64 %60, ptr %62, align 16, !tbaa !15
  %63 = load i64, ptr %11, align 8, !tbaa !9
  %64 = load ptr, ptr %13, align 8, !tbaa !5
  %65 = getelementptr inbounds %struct.ccm_ctx, ptr %64, i32 0, i32 5
  store i64 %63, ptr %65, align 8, !tbaa !16
  %66 = load i64, ptr %12, align 8, !tbaa !9
  %67 = trunc i64 %66 to i32
  %68 = load ptr, ptr %13, align 8, !tbaa !5
  %69 = getelementptr inbounds %struct.ccm_ctx, ptr %68, i32 0, i32 10
  store i32 %67, ptr %69, align 4, !tbaa !17
  %70 = load ptr, ptr %13, align 8, !tbaa !5
  %71 = getelementptr inbounds %struct.ccm_ctx, ptr %70, i32 0, i32 7
  store i64 0, ptr %71, align 8, !tbaa !18
  %72 = load ptr, ptr %13, align 8, !tbaa !5
  %73 = getelementptr inbounds %struct.ccm_ctx, ptr %72, i32 0, i32 8
  store i64 0, ptr %73, align 16, !tbaa !19
  %74 = load i64, ptr %10, align 8, !tbaa !9
  %75 = load ptr, ptr %13, align 8, !tbaa !5
  %76 = getelementptr inbounds %struct.ccm_ctx, ptr %75, i32 0, i32 6
  store i64 %74, ptr %76, align 16, !tbaa !20
  %77 = load i64, ptr %9, align 8, !tbaa !9
  %78 = icmp ne i64 %77, 0
  br i1 %78, label %79, label %82

79:                                               ; preds = %55
  %80 = load i64, ptr %9, align 8, !tbaa !9
  %81 = sub i64 14, %80
  br label %136

82:                                               ; preds = %55
  %83 = load ptr, ptr %13, align 8, !tbaa !5
  %84 = getelementptr inbounds %struct.ccm_ctx, ptr %83, i32 0, i32 5
  %85 = load i64, ptr %84, align 8, !tbaa !16
  %86 = and i64 %85, -72057594037927936
  %87 = icmp ne i64 %86, 0
  br i1 %87, label %88, label %89

88:                                               ; preds = %82
  br label %133

89:                                               ; preds = %82
  %90 = load ptr, ptr %13, align 8, !tbaa !5
  %91 = getelementptr inbounds %struct.ccm_ctx, ptr %90, i32 0, i32 5
  %92 = load i64, ptr %91, align 8, !tbaa !16
  %93 = and i64 %92, -281474976710656
  %94 = icmp ne i64 %93, 0
  br i1 %94, label %95, label %96

95:                                               ; preds = %89
  br label %131

96:                                               ; preds = %89
  %97 = load ptr, ptr %13, align 8, !tbaa !5
  %98 = getelementptr inbounds %struct.ccm_ctx, ptr %97, i32 0, i32 5
  %99 = load i64, ptr %98, align 8, !tbaa !16
  %100 = and i64 %99, -1099511627776
  %101 = icmp ne i64 %100, 0
  br i1 %101, label %102, label %103

102:                                              ; preds = %96
  br label %129

103:                                              ; preds = %96
  %104 = load ptr, ptr %13, align 8, !tbaa !5
  %105 = getelementptr inbounds %struct.ccm_ctx, ptr %104, i32 0, i32 5
  %106 = load i64, ptr %105, align 8, !tbaa !16
  %107 = and i64 %106, -4294967296
  %108 = icmp ne i64 %107, 0
  br i1 %108, label %109, label %110

109:                                              ; preds = %103
  br label %127

110:                                              ; preds = %103
  %111 = load ptr, ptr %13, align 8, !tbaa !5
  %112 = getelementptr inbounds %struct.ccm_ctx, ptr %111, i32 0, i32 5
  %113 = load i64, ptr %112, align 8, !tbaa !16
  %114 = and i64 %113, -16777216
  %115 = icmp ne i64 %114, 0
  br i1 %115, label %116, label %117

116:                                              ; preds = %110
  br label %125

117:                                              ; preds = %110
  %118 = load ptr, ptr %13, align 8, !tbaa !5
  %119 = getelementptr inbounds %struct.ccm_ctx, ptr %118, i32 0, i32 5
  %120 = load i64, ptr %119, align 8, !tbaa !16
  %121 = and i64 %120, -65536
  %122 = icmp ne i64 %121, 0
  %123 = zext i1 %122 to i64
  %124 = select i1 %122, i32 2, i32 1
  br label %125

125:                                              ; preds = %117, %116
  %126 = phi i32 [ 3, %116 ], [ %124, %117 ]
  br label %127

127:                                              ; preds = %125, %109
  %128 = phi i32 [ 4, %109 ], [ %126, %125 ]
  br label %129

129:                                              ; preds = %127, %102
  %130 = phi i32 [ 5, %102 ], [ %128, %127 ]
  br label %131

131:                                              ; preds = %129, %95
  %132 = phi i32 [ 6, %95 ], [ %130, %129 ]
  br label %133

133:                                              ; preds = %131, %88
  %134 = phi i32 [ 7, %88 ], [ %132, %131 ]
  %135 = sext i32 %134 to i64
  br label %136

136:                                              ; preds = %133, %79
  %137 = phi i64 [ %81, %79 ], [ %135, %133 ]
  %138 = trunc i64 %137 to i8
  %139 = load ptr, ptr %13, align 8, !tbaa !5
  %140 = getelementptr inbounds %struct.ccm_ctx, ptr %139, i32 0, i32 0
  %141 = getelementptr inbounds [2 x i64], ptr %140, i64 0, i64 0
  %142 = getelementptr inbounds i8, ptr %141, i64 0
  store i8 %138, ptr %142, align 16, !tbaa !21
  store i32 1, ptr %14, align 4, !tbaa !22
  br label %143

143:                                              ; preds = %167, %136
  %144 = load i32, ptr %14, align 4, !tbaa !22
  %145 = load ptr, ptr %13, 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 = getelementptr inbounds i8, ptr %147, i64 0
  %149 = load i8, ptr %148, align 16, !tbaa !21
  %150 = zext i8 %149 to i32
  %151 = sub i32 16, %150
  %152 = sub i32 %151, 1
  %153 = icmp ult i32 %144, %152
  br i1 %153, label %154, label %170

154:                                              ; preds = %143
  %155 = load ptr, ptr %8, align 8, !tbaa !5
  %156 = load i32, ptr %14, align 4, !tbaa !22
  %157 = sub i32 %156, 1
  %158 = zext i32 %157 to i64
  %159 = getelementptr inbounds i8, ptr %155, i64 %158
  %160 = load i8, ptr %159, align 1, !tbaa !21
  %161 = load ptr, ptr %13, align 8, !tbaa !5
  %162 = getelementptr inbounds %struct.ccm_ctx, ptr %161, i32 0, i32 0
  %163 = getelementptr inbounds [2 x i64], ptr %162, i64 0, i64 0
  %164 = load i32, ptr %14, align 4, !tbaa !22
  %165 = zext i32 %164 to i64
  %166 = getelementptr inbounds i8, ptr %163, i64 %165
  store i8 %160, ptr %166, align 1, !tbaa !21
  br label %167

167:                                              ; preds = %154
  %168 = load i32, ptr %14, align 4, !tbaa !22
  %169 = add i32 %168, 1
  store i32 %169, ptr %14, align 4, !tbaa !22
  br label %143, !llvm.loop !23

170:                                              ; preds = %143
  %171 = load ptr, ptr %13, align 8, !tbaa !5
  %172 = getelementptr inbounds %struct.ccm_ctx, ptr %171, i32 0, i32 0
  %173 = getelementptr inbounds [2 x i64], ptr %172, i64 0, i64 0
  %174 = getelementptr inbounds i8, ptr %173, i64 16
  %175 = load ptr, ptr %13, align 8, !tbaa !5
  %176 = getelementptr inbounds %struct.ccm_ctx, ptr %175, i32 0, i32 0
  %177 = getelementptr inbounds [2 x i64], ptr %176, i64 0, i64 0
  %178 = getelementptr inbounds i8, ptr %177, i64 0
  %179 = load i8, ptr %178, align 16, !tbaa !21
  %180 = zext i8 %179 to i32
  %181 = add nsw i32 %180, 1
  %182 = sext i32 %181 to i64
  %183 = sub i64 0, %182
  %184 = getelementptr inbounds i8, ptr %174, i64 %183
  %185 = load ptr, ptr %13, align 8, !tbaa !5
  %186 = getelementptr inbounds %struct.ccm_ctx, ptr %185, i32 0, i32 0
  %187 = getelementptr inbounds [2 x i64], ptr %186, i64 0, i64 0
  %188 = getelementptr inbounds i8, ptr %187, i64 0
  %189 = load i8, ptr %188, align 16, !tbaa !21
  %190 = zext i8 %189 to i32
  %191 = add nsw i32 %190, 1
  %192 = sext i32 %191 to i64
  call void @llvm.memset.p0.i64(ptr align 1 %184, i8 0, i64 %192, i1 false)
  %193 = load ptr, ptr %13, align 8, !tbaa !5
  %194 = getelementptr inbounds %struct.ccm_ctx, ptr %193, i32 0, i32 2
  %195 = getelementptr inbounds [2 x i64], ptr %194, i64 0, i64 0
  %196 = load ptr, ptr %13, align 8, !tbaa !5
  %197 = getelementptr inbounds %struct.ccm_ctx, ptr %196, i32 0, i32 0
  %198 = getelementptr inbounds [2 x i64], ptr %197, i64 0, i64 0
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %195, ptr align 16 %198, i64 16, i1 false)
  %199 = load ptr, ptr %13, align 8, !tbaa !5
  %200 = getelementptr inbounds %struct.ccm_ctx, ptr %199, i32 0, i32 0
  %201 = getelementptr inbounds [2 x i64], ptr %200, i64 0, i64 0
  %202 = getelementptr inbounds i8, ptr %201, i64 15
  store i8 0, ptr %202, align 1, !tbaa !21
  call void @llvm.lifetime.start.p0(i64 8, ptr %16) #5
  %203 = load ptr, ptr %13, align 8, !tbaa !5
  %204 = getelementptr inbounds %struct.ccm_ctx, ptr %203, i32 0, i32 2
  %205 = getelementptr inbounds [2 x i64], ptr %204, i64 0, i64 0
  %206 = getelementptr inbounds i8, ptr %205, i64 16
  store ptr %206, ptr %16, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %17) #5
  %207 = load ptr, ptr %13, align 8, !tbaa !5
  %208 = getelementptr inbounds %struct.ccm_ctx, ptr %207, i32 0, i32 5
  %209 = load i64, ptr %208, align 8, !tbaa !16
  store i64 %209, ptr %17, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %18) #5
  %210 = load ptr, ptr %13, align 8, !tbaa !5
  %211 = getelementptr inbounds %struct.ccm_ctx, ptr %210, i32 0, i32 2
  %212 = getelementptr inbounds [2 x i64], ptr %211, i64 0, i64 0
  %213 = load i8, ptr %212, align 16, !tbaa !21
  %214 = zext i8 %213 to i32
  %215 = and i32 %214, 7
  %216 = add nsw i32 %215, 1
  %217 = sext i32 %216 to i64
  store i64 %217, ptr %18, align 8, !tbaa !9
  br label %218

218:                                              ; preds = %225, %170
  %219 = load i64, ptr %17, align 8, !tbaa !9
  %220 = trunc i64 %219 to i8
  %221 = load ptr, ptr %16, align 8, !tbaa !5
  %222 = getelementptr inbounds i8, ptr %221, i32 -1
  store ptr %222, ptr %16, align 8, !tbaa !5
  store i8 %220, ptr %222, align 1, !tbaa !21
  %223 = load i64, ptr %17, align 8, !tbaa !9
  %224 = lshr i64 %223, 8
  store i64 %224, ptr %17, align 8, !tbaa !9
  br label %225

225:                                              ; preds = %218
  %226 = load i64, ptr %18, align 8, !tbaa !9
  %227 = add i64 %226, -1
  store i64 %227, ptr %18, align 8, !tbaa !9
  %228 = icmp ne i64 %227, 0
  br i1 %228, label %218, label %229, !llvm.loop !25

229:                                              ; preds = %225
  call void @llvm.lifetime.end.p0(i64 8, ptr %18) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %17) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %16) #5
  %230 = load ptr, ptr %13, align 8, !tbaa !5
  %231 = getelementptr inbounds %struct.ccm_ctx, ptr %230, i32 0, i32 6
  %232 = load i64, ptr %231, align 16, !tbaa !20
  %233 = icmp ne i64 %232, 0
  %234 = zext i1 %233 to i64
  %235 = select i1 %233, i32 64, i32 0
  %236 = load ptr, ptr %13, align 8, !tbaa !5
  %237 = getelementptr inbounds %struct.ccm_ctx, ptr %236, i32 0, i32 10
  %238 = load i32, ptr %237, align 4, !tbaa !17
  %239 = icmp ne i32 %238, 0
  br i1 %239, label %240, label %246

240:                                              ; preds = %229
  %241 = load ptr, ptr %13, align 8, !tbaa !5
  %242 = getelementptr inbounds %struct.ccm_ctx, ptr %241, i32 0, i32 10
  %243 = load i32, ptr %242, align 4, !tbaa !17
  %244 = sub i32 %243, 2
  %245 = shl i32 %244, 2
  br label %247

246:                                              ; preds = %229
  br label %247

247:                                              ; preds = %246, %240
  %248 = phi i32 [ %245, %240 ], [ 0, %246 ]
  %249 = add i32 %235, %248
  %250 = load ptr, ptr %13, align 8, !tbaa !5
  %251 = getelementptr inbounds %struct.ccm_ctx, ptr %250, i32 0, i32 2
  %252 = getelementptr inbounds [2 x i64], ptr %251, i64 0, i64 0
  %253 = getelementptr inbounds i8, ptr %252, i64 0
  %254 = load i8, ptr %253, align 16, !tbaa !21
  %255 = zext i8 %254 to i32
  %256 = or i32 %255, %249
  %257 = trunc i32 %256 to i8
  store i8 %257, ptr %253, align 16, !tbaa !21
  %258 = load ptr, ptr %13, align 8, !tbaa !5
  %259 = getelementptr inbounds %struct.ccm_ctx, ptr %258, i32 0, i32 2
  %260 = getelementptr inbounds [2 x i64], ptr %259, i64 0, i64 0
  %261 = load ptr, ptr %13, align 8, !tbaa !5
  %262 = getelementptr inbounds %struct.ccm_ctx, ptr %261, i32 0, i32 2
  %263 = getelementptr inbounds [2 x i64], ptr %262, i64 0, i64 0
  %264 = load ptr, ptr %13, align 8, !tbaa !5
  %265 = getelementptr inbounds %struct.ccm_ctx, ptr %264, i32 0, i32 3
  %266 = getelementptr inbounds [1 x %struct.aes_crypt_ctx], ptr %265, i64 0, i64 0
  %267 = call i32 @aes_encrypt(ptr noundef %260, ptr noundef %263, ptr noundef %266)
  %268 = load ptr, ptr %13, align 8, !tbaa !5
  %269 = getelementptr inbounds %struct.ccm_ctx, ptr %268, i32 0, i32 4
  %270 = load i64, ptr %269, align 16, !tbaa !15
  %271 = icmp ne i64 %270, 0
  br i1 %271, label %272, label %527

272:                                              ; preds = %247
  %273 = load ptr, ptr %13, align 8, !tbaa !5
  %274 = getelementptr inbounds %struct.ccm_ctx, ptr %273, i32 0, i32 4
  %275 = load i64, ptr %274, align 16, !tbaa !15
  %276 = icmp ult i64 %275, 65280
  br i1 %276, label %277, label %307

277:                                              ; preds = %272
  %278 = load ptr, ptr %13, align 8, !tbaa !5
  %279 = getelementptr inbounds %struct.ccm_ctx, ptr %278, i32 0, i32 6
  %280 = load i64, ptr %279, align 16, !tbaa !20
  %281 = lshr i64 %280, 8
  %282 = trunc i64 %281 to i8
  %283 = zext i8 %282 to i32
  %284 = load ptr, ptr %13, align 8, !tbaa !5
  %285 = getelementptr inbounds %struct.ccm_ctx, ptr %284, i32 0, i32 2
  %286 = getelementptr inbounds [2 x i64], ptr %285, i64 0, i64 0
  %287 = getelementptr inbounds i8, ptr %286, i64 0
  %288 = load i8, ptr %287, align 16, !tbaa !21
  %289 = zext i8 %288 to i32
  %290 = xor i32 %289, %283
  %291 = trunc i32 %290 to i8
  store i8 %291, ptr %287, align 16, !tbaa !21
  %292 = load ptr, ptr %13, align 8, !tbaa !5
  %293 = getelementptr inbounds %struct.ccm_ctx, ptr %292, i32 0, i32 6
  %294 = load i64, ptr %293, align 16, !tbaa !20
  %295 = trunc i64 %294 to i8
  %296 = zext i8 %295 to i32
  %297 = load ptr, ptr %13, align 8, !tbaa !5
  %298 = getelementptr inbounds %struct.ccm_ctx, ptr %297, i32 0, i32 2
  %299 = getelementptr inbounds [2 x i64], ptr %298, i64 0, i64 0
  %300 = getelementptr inbounds i8, ptr %299, i64 1
  %301 = load i8, ptr %300, align 1, !tbaa !21
  %302 = zext i8 %301 to i32
  %303 = xor i32 %302, %296
  %304 = trunc i32 %303 to i8
  store i8 %304, ptr %300, align 1, !tbaa !21
  %305 = load ptr, ptr %13, align 8, !tbaa !5
  %306 = getelementptr inbounds %struct.ccm_ctx, ptr %305, i32 0, i32 7
  store i64 2, ptr %306, align 8, !tbaa !18
  br label %517

307:                                              ; preds = %272
  %308 = load ptr, ptr %13, align 8, !tbaa !5
  %309 = getelementptr inbounds %struct.ccm_ctx, ptr %308, i32 0, i32 4
  %310 = load i64, ptr %309, align 16, !tbaa !15
  %311 = icmp ult i64 %310, 4294967296
  br i1 %311, label %312, label %386

312:                                              ; preds = %307
  %313 = load ptr, ptr %13, align 8, !tbaa !5
  %314 = getelementptr inbounds %struct.ccm_ctx, ptr %313, i32 0, i32 2
  %315 = getelementptr inbounds [2 x i64], ptr %314, i64 0, i64 0
  %316 = getelementptr inbounds i8, ptr %315, i64 0
  %317 = load i8, ptr %316, align 16, !tbaa !21
  %318 = zext i8 %317 to i32
  %319 = xor i32 %318, 255
  %320 = trunc i32 %319 to i8
  store i8 %320, ptr %316, align 16, !tbaa !21
  %321 = load ptr, ptr %13, align 8, !tbaa !5
  %322 = getelementptr inbounds %struct.ccm_ctx, ptr %321, i32 0, i32 2
  %323 = getelementptr inbounds [2 x i64], ptr %322, i64 0, i64 0
  %324 = getelementptr inbounds i8, ptr %323, i64 1
  %325 = load i8, ptr %324, align 1, !tbaa !21
  %326 = zext i8 %325 to i32
  %327 = xor i32 %326, 254
  %328 = trunc i32 %327 to i8
  store i8 %328, ptr %324, align 1, !tbaa !21
  %329 = load ptr, ptr %13, align 8, !tbaa !5
  %330 = getelementptr inbounds %struct.ccm_ctx, ptr %329, i32 0, i32 6
  %331 = load i64, ptr %330, align 16, !tbaa !20
  %332 = lshr i64 %331, 24
  %333 = trunc i64 %332 to i8
  %334 = zext i8 %333 to i32
  %335 = load ptr, ptr %13, align 8, !tbaa !5
  %336 = getelementptr inbounds %struct.ccm_ctx, ptr %335, i32 0, i32 2
  %337 = getelementptr inbounds [2 x i64], ptr %336, i64 0, i64 0
  %338 = getelementptr inbounds i8, ptr %337, i64 2
  %339 = load i8, ptr %338, align 2, !tbaa !21
  %340 = zext i8 %339 to i32
  %341 = xor i32 %340, %334
  %342 = trunc i32 %341 to i8
  store i8 %342, ptr %338, align 2, !tbaa !21
  %343 = load ptr, ptr %13, align 8, !tbaa !5
  %344 = getelementptr inbounds %struct.ccm_ctx, ptr %343, i32 0, i32 6
  %345 = load i64, ptr %344, align 16, !tbaa !20
  %346 = lshr i64 %345, 16
  %347 = trunc i64 %346 to i8
  %348 = zext i8 %347 to i32
  %349 = load ptr, ptr %13, align 8, !tbaa !5
  %350 = getelementptr inbounds %struct.ccm_ctx, ptr %349, i32 0, i32 2
  %351 = getelementptr inbounds [2 x i64], ptr %350, i64 0, i64 0
  %352 = getelementptr inbounds i8, ptr %351, i64 3
  %353 = load i8, ptr %352, align 1, !tbaa !21
  %354 = zext i8 %353 to i32
  %355 = xor i32 %354, %348
  %356 = trunc i32 %355 to i8
  store i8 %356, ptr %352, align 1, !tbaa !21
  %357 = load ptr, ptr %13, align 8, !tbaa !5
  %358 = getelementptr inbounds %struct.ccm_ctx, ptr %357, i32 0, i32 6
  %359 = load i64, ptr %358, align 16, !tbaa !20
  %360 = lshr i64 %359, 8
  %361 = trunc i64 %360 to i8
  %362 = zext i8 %361 to i32
  %363 = load ptr, ptr %13, align 8, !tbaa !5
  %364 = getelementptr inbounds %struct.ccm_ctx, ptr %363, i32 0, i32 2
  %365 = getelementptr inbounds [2 x i64], ptr %364, i64 0, i64 0
  %366 = getelementptr inbounds i8, ptr %365, i64 4
  %367 = load i8, ptr %366, align 4, !tbaa !21
  %368 = zext i8 %367 to i32
  %369 = xor i32 %368, %362
  %370 = trunc i32 %369 to i8
  store i8 %370, ptr %366, align 4, !tbaa !21
  %371 = load ptr, ptr %13, align 8, !tbaa !5
  %372 = getelementptr inbounds %struct.ccm_ctx, ptr %371, i32 0, i32 6
  %373 = load i64, ptr %372, align 16, !tbaa !20
  %374 = trunc i64 %373 to i8
  %375 = zext i8 %374 to i32
  %376 = load ptr, ptr %13, align 8, !tbaa !5
  %377 = getelementptr inbounds %struct.ccm_ctx, ptr %376, i32 0, i32 2
  %378 = getelementptr inbounds [2 x i64], ptr %377, i64 0, i64 0
  %379 = getelementptr inbounds i8, ptr %378, i64 5
  %380 = load i8, ptr %379, align 1, !tbaa !21
  %381 = zext i8 %380 to i32
  %382 = xor i32 %381, %375
  %383 = trunc i32 %382 to i8
  store i8 %383, ptr %379, align 1, !tbaa !21
  %384 = load ptr, ptr %13, align 8, !tbaa !5
  %385 = getelementptr inbounds %struct.ccm_ctx, ptr %384, i32 0, i32 7
  store i64 6, ptr %385, align 8, !tbaa !18
  br label %516

386:                                              ; preds = %307
  %387 = load ptr, ptr %13, align 8, !tbaa !5
  %388 = getelementptr inbounds %struct.ccm_ctx, ptr %387, i32 0, i32 2
  %389 = getelementptr inbounds [2 x i64], ptr %388, i64 0, i64 0
  %390 = getelementptr inbounds i8, ptr %389, i64 0
  %391 = load i8, ptr %390, align 16, !tbaa !21
  %392 = zext i8 %391 to i32
  %393 = xor i32 %392, 255
  %394 = trunc i32 %393 to i8
  store i8 %394, ptr %390, align 16, !tbaa !21
  %395 = load ptr, ptr %13, align 8, !tbaa !5
  %396 = getelementptr inbounds %struct.ccm_ctx, ptr %395, i32 0, i32 2
  %397 = getelementptr inbounds [2 x i64], ptr %396, i64 0, i64 0
  %398 = getelementptr inbounds i8, ptr %397, i64 1
  %399 = load i8, ptr %398, align 1, !tbaa !21
  %400 = zext i8 %399 to i32
  %401 = xor i32 %400, 255
  %402 = trunc i32 %401 to i8
  store i8 %402, ptr %398, align 1, !tbaa !21
  %403 = load ptr, ptr %13, align 8, !tbaa !5
  %404 = getelementptr inbounds %struct.ccm_ctx, ptr %403, i32 0, i32 6
  %405 = load i64, ptr %404, align 16, !tbaa !20
  %406 = lshr i64 %405, 56
  %407 = trunc i64 %406 to i8
  %408 = zext i8 %407 to i32
  %409 = load ptr, ptr %13, align 8, !tbaa !5
  %410 = getelementptr inbounds %struct.ccm_ctx, ptr %409, i32 0, i32 2
  %411 = getelementptr inbounds [2 x i64], ptr %410, i64 0, i64 0
  %412 = getelementptr inbounds i8, ptr %411, i64 2
  %413 = load i8, ptr %412, align 2, !tbaa !21
  %414 = zext i8 %413 to i32
  %415 = xor i32 %414, %408
  %416 = trunc i32 %415 to i8
  store i8 %416, ptr %412, align 2, !tbaa !21
  %417 = load ptr, ptr %13, align 8, !tbaa !5
  %418 = getelementptr inbounds %struct.ccm_ctx, ptr %417, i32 0, i32 6
  %419 = load i64, ptr %418, align 16, !tbaa !20
  %420 = lshr i64 %419, 48
  %421 = trunc i64 %420 to i8
  %422 = zext i8 %421 to i32
  %423 = load ptr, ptr %13, align 8, !tbaa !5
  %424 = getelementptr inbounds %struct.ccm_ctx, ptr %423, i32 0, i32 2
  %425 = getelementptr inbounds [2 x i64], ptr %424, i64 0, i64 0
  %426 = getelementptr inbounds i8, ptr %425, i64 3
  %427 = load i8, ptr %426, align 1, !tbaa !21
  %428 = zext i8 %427 to i32
  %429 = xor i32 %428, %422
  %430 = trunc i32 %429 to i8
  store i8 %430, ptr %426, align 1, !tbaa !21
  %431 = load ptr, ptr %13, align 8, !tbaa !5
  %432 = getelementptr inbounds %struct.ccm_ctx, ptr %431, i32 0, i32 6
  %433 = load i64, ptr %432, align 16, !tbaa !20
  %434 = lshr i64 %433, 40
  %435 = trunc i64 %434 to i8
  %436 = zext i8 %435 to i32
  %437 = load ptr, ptr %13, align 8, !tbaa !5
  %438 = getelementptr inbounds %struct.ccm_ctx, ptr %437, i32 0, i32 2
  %439 = getelementptr inbounds [2 x i64], ptr %438, i64 0, i64 0
  %440 = getelementptr inbounds i8, ptr %439, i64 4
  %441 = load i8, ptr %440, align 4, !tbaa !21
  %442 = zext i8 %441 to i32
  %443 = xor i32 %442, %436
  %444 = trunc i32 %443 to i8
  store i8 %444, ptr %440, align 4, !tbaa !21
  %445 = load ptr, ptr %13, align 8, !tbaa !5
  %446 = getelementptr inbounds %struct.ccm_ctx, ptr %445, i32 0, i32 6
  %447 = load i64, ptr %446, align 16, !tbaa !20
  %448 = lshr i64 %447, 32
  %449 = trunc i64 %448 to i8
  %450 = zext i8 %449 to i32
  %451 = load ptr, ptr %13, align 8, !tbaa !5
  %452 = getelementptr inbounds %struct.ccm_ctx, ptr %451, i32 0, i32 2
  %453 = getelementptr inbounds [2 x i64], ptr %452, i64 0, i64 0
  %454 = getelementptr inbounds i8, ptr %453, i64 5
  %455 = load i8, ptr %454, align 1, !tbaa !21
  %456 = zext i8 %455 to i32
  %457 = xor i32 %456, %450
  %458 = trunc i32 %457 to i8
  store i8 %458, ptr %454, align 1, !tbaa !21
  %459 = load ptr, ptr %13, align 8, !tbaa !5
  %460 = getelementptr inbounds %struct.ccm_ctx, ptr %459, i32 0, i32 6
  %461 = load i64, ptr %460, align 16, !tbaa !20
  %462 = lshr i64 %461, 24
  %463 = trunc i64 %462 to i8
  %464 = zext i8 %463 to i32
  %465 = load ptr, ptr %13, align 8, !tbaa !5
  %466 = getelementptr inbounds %struct.ccm_ctx, ptr %465, i32 0, i32 2
  %467 = getelementptr inbounds [2 x i64], ptr %466, i64 0, i64 0
  %468 = getelementptr inbounds i8, ptr %467, i64 6
  %469 = load i8, ptr %468, align 2, !tbaa !21
  %470 = zext i8 %469 to i32
  %471 = xor i32 %470, %464
  %472 = trunc i32 %471 to i8
  store i8 %472, ptr %468, align 2, !tbaa !21
  %473 = load ptr, ptr %13, align 8, !tbaa !5
  %474 = getelementptr inbounds %struct.ccm_ctx, ptr %473, i32 0, i32 6
  %475 = load i64, ptr %474, align 16, !tbaa !20
  %476 = lshr i64 %475, 16
  %477 = trunc i64 %476 to i8
  %478 = zext i8 %477 to i32
  %479 = load ptr, ptr %13, align 8, !tbaa !5
  %480 = getelementptr inbounds %struct.ccm_ctx, ptr %479, i32 0, i32 2
  %481 = getelementptr inbounds [2 x i64], ptr %480, i64 0, i64 0
  %482 = getelementptr inbounds i8, ptr %481, i64 7
  %483 = load i8, ptr %482, align 1, !tbaa !21
  %484 = zext i8 %483 to i32
  %485 = xor i32 %484, %478
  %486 = trunc i32 %485 to i8
  store i8 %486, ptr %482, align 1, !tbaa !21
  %487 = load ptr, ptr %13, align 8, !tbaa !5
  %488 = getelementptr inbounds %struct.ccm_ctx, ptr %487, i32 0, i32 6
  %489 = load i64, ptr %488, align 16, !tbaa !20
  %490 = lshr i64 %489, 8
  %491 = trunc i64 %490 to i8
  %492 = zext i8 %491 to i32
  %493 = load ptr, ptr %13, align 8, !tbaa !5
  %494 = getelementptr inbounds %struct.ccm_ctx, ptr %493, i32 0, i32 2
  %495 = getelementptr inbounds [2 x i64], ptr %494, i64 0, i64 0
  %496 = getelementptr inbounds i8, ptr %495, i64 8
  %497 = load i8, ptr %496, align 8, !tbaa !21
  %498 = zext i8 %497 to i32
  %499 = xor i32 %498, %492
  %500 = trunc i32 %499 to i8
  store i8 %500, ptr %496, align 8, !tbaa !21
  %501 = load ptr, ptr %13, align 8, !tbaa !5
  %502 = getelementptr inbounds %struct.ccm_ctx, ptr %501, i32 0, i32 6
  %503 = load i64, ptr %502, align 16, !tbaa !20
  %504 = trunc i64 %503 to i8
  %505 = zext i8 %504 to i32
  %506 = load ptr, ptr %13, align 8, !tbaa !5
  %507 = getelementptr inbounds %struct.ccm_ctx, ptr %506, i32 0, i32 2
  %508 = getelementptr inbounds [2 x i64], ptr %507, i64 0, i64 0
  %509 = getelementptr inbounds i8, ptr %508, i64 9
  %510 = load i8, ptr %509, align 1, !tbaa !21
  %511 = zext i8 %510 to i32
  %512 = xor i32 %511, %505
  %513 = trunc i32 %512 to i8
  store i8 %513, ptr %509, align 1, !tbaa !21
  %514 = load ptr, ptr %13, align 8, !tbaa !5
  %515 = getelementptr inbounds %struct.ccm_ctx, ptr %514, i32 0, i32 7
  store i64 10, ptr %515, align 8, !tbaa !18
  br label %516

516:                                              ; preds = %386, %312
  br label %517

517:                                              ; preds = %516, %277
  %518 = load ptr, ptr %13, align 8, !tbaa !5
  %519 = getelementptr inbounds %struct.ccm_ctx, ptr %518, i32 0, i32 7
  %520 = load i64, ptr %519, align 8, !tbaa !18
  %521 = load ptr, ptr %13, align 8, !tbaa !5
  %522 = getelementptr inbounds %struct.ccm_ctx, ptr %521, i32 0, i32 6
  %523 = load i64, ptr %522, align 16, !tbaa !20
  %524 = add i64 %523, %520
  store i64 %524, ptr %522, align 16, !tbaa !20
  %525 = load ptr, ptr %13, align 8, !tbaa !5
  %526 = getelementptr inbounds %struct.ccm_ctx, ptr %525, i32 0, i32 11
  store i32 11, ptr %526, align 16, !tbaa !11
  br label %532

527:                                              ; preds = %247
  %528 = load ptr, ptr %13, align 8, !tbaa !5
  %529 = getelementptr inbounds %struct.ccm_ctx, ptr %528, i32 0, i32 7
  store i64 0, ptr %529, align 8, !tbaa !18
  %530 = load ptr, ptr %13, align 8, !tbaa !5
  %531 = getelementptr inbounds %struct.ccm_ctx, ptr %530, i32 0, i32 11
  store i32 12, ptr %531, align 16, !tbaa !11
  br label %532

532:                                              ; preds = %527, %517
  %533 = load ptr, ptr %13, align 8, !tbaa !5
  %534 = getelementptr inbounds %struct.ccm_ctx, ptr %533, i32 0, i32 4
  %535 = load i64, ptr %534, align 16, !tbaa !15
  %536 = load ptr, ptr %13, align 8, !tbaa !5
  %537 = getelementptr inbounds %struct.ccm_ctx, ptr %536, i32 0, i32 7
  %538 = load i64, ptr %537, align 8, !tbaa !18
  %539 = add i64 %535, %538
  %540 = load ptr, ptr %13, align 8, !tbaa !5
  %541 = getelementptr inbounds %struct.ccm_ctx, ptr %540, i32 0, i32 6
  store i64 %539, ptr %541, align 16, !tbaa !20
  %542 = load ptr, ptr %13, align 8, !tbaa !5
  %543 = getelementptr inbounds %struct.ccm_ctx, ptr %542, i32 0, i32 7
  %544 = load i64, ptr %543, align 8, !tbaa !18
  %545 = load ptr, ptr %13, align 8, !tbaa !5
  %546 = getelementptr inbounds %struct.ccm_ctx, ptr %545, i32 0, i32 8
  store i64 %544, ptr %546, align 16, !tbaa !19
  store i32 0, ptr %7, align 4
  store i32 1, ptr %15, align 4
  br label %547

547:                                              ; preds = %532, %51
  call void @llvm.lifetime.end.p0(i64 4, ptr %14) #5
  %548 = load i32, ptr %7, align 4
  ret i32 %548
}

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

; Function Attrs: nocallback nofree nounwind willreturn memory(argmem: write)
declare void @llvm.memset.p0.i64(ptr nocapture writeonly, i8, i64, i1 immarg) #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 nosync nounwind willreturn memory(argmem: readwrite)
declare void @llvm.lifetime.end.p0(i64 immarg, ptr nocapture) #1

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

attributes #0 = { nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #1 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #2 = { nocallback nofree nounwind willreturn memory(argmem: write) }
attributes #3 = { nocallback nofree nounwind willreturn memory(argmem: readwrite) }
attributes #4 = { "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 = !{!"long", !7, i64 0}
!11 = !{!12, !13, i64 352}
!12 = !{!"", !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, !13, i64 344, !13, i64 348, !13, i64 352}
!13 = !{!"int", !7, i64 0}
!14 = !{!12, !13, i64 344}
!15 = !{!12, !10, i64 304}
!16 = !{!12, !10, i64 312}
!17 = !{!12, !13, i64 348}
!18 = !{!12, !10, i64 328}
!19 = !{!12, !10, i64 336}
!20 = !{!12, !10, i64 320}
!21 = !{!7, !7, i64 0}
!22 = !{!13, !13, i64 0}
!23 = distinct !{!23, !24}
!24 = !{!"llvm.loop.mustprogress"}
!25 = distinct !{!25, !24}


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

; Function Attrs: nounwind uwtable
define dso_local noundef i32 @ccm_init_message(ptr nocapture noundef readonly %0, i64 noundef %1, i64 noundef %2, i64 noundef %3, i64 noundef %4, ptr noundef %5) local_unnamed_addr #0 {
  %7 = getelementptr inbounds i8, ptr %5, i64 352
  store i32 0, ptr %7, align 16, !tbaa !5
  %8 = add i64 %4, -4
  %or.cond = icmp ult i64 %8, 13
  %9 = and i64 %4, 1
  %.not = icmp eq i64 %9, 0
  %or.cond133 = and i1 %or.cond, %.not
  br i1 %or.cond133, label %11, label %10

10:                                               ; preds = %6
  store i32 -3, ptr %7, align 16, !tbaa !5
  br label %.thread

11:                                               ; preds = %6
  %12 = add i64 %1, -1
  %or.cond3 = icmp ult i64 %12, 6
  %13 = icmp ugt i64 %1, 13
  %or.cond5 = or i1 %13, %or.cond3
  br i1 %or.cond5, label %14, label %15

14:                                               ; preds = %11
  store i32 -4, ptr %7, align 16, !tbaa !5
  br label %.thread

15:                                               ; preds = %11
  %16 = trunc nuw i64 %1 to i32
  %17 = getelementptr inbounds i8, ptr %5, i64 344
  store i32 %16, ptr %17, align 8, !tbaa !11
  %18 = getelementptr inbounds i8, ptr %5, i64 304
  store i64 %2, ptr %18, align 16, !tbaa !12
  %19 = getelementptr inbounds i8, ptr %5, i64 312
  store i64 %3, ptr %19, align 8, !tbaa !13
  %20 = trunc nuw i64 %4 to i32
  %21 = getelementptr inbounds i8, ptr %5, i64 348
  store i32 %20, ptr %21, align 4, !tbaa !14
  %22 = getelementptr inbounds i8, ptr %5, i64 328
  %23 = getelementptr inbounds i8, ptr %5, i64 336
  %24 = getelementptr inbounds i8, ptr %5, i64 320
  tail call void @llvm.memset.p0.i64(ptr noundef nonnull align 8 dereferenceable(16) %22, i8 0, i64 16, i1 false)
  store i64 %2, ptr %24, align 16, !tbaa !15
  %.not122 = icmp eq i64 %1, 0
  br i1 %.not122, label %27, label %25

25:                                               ; preds = %15
  %26 = sub nuw nsw i64 14, %1
  br label %.lr.ph.preheader

27:                                               ; preds = %15
  %.not123 = icmp ult i64 %3, 72057594037927936
  br i1 %.not123, label %28, label %.lr.ph.preheader

28:                                               ; preds = %27
  %.not124 = icmp ult i64 %3, 281474976710656
  br i1 %.not124, label %29, label %.lr.ph.preheader

29:                                               ; preds = %28
  %.not125 = icmp ult i64 %3, 1099511627776
  br i1 %.not125, label %30, label %.lr.ph.preheader

30:                                               ; preds = %29
  %.not126 = icmp ult i64 %3, 4294967296
  br i1 %.not126, label %31, label %.lr.ph.preheader

31:                                               ; preds = %30
  %.not127 = icmp ult i64 %3, 16777216
  br i1 %.not127, label %32, label %.lr.ph.preheader

32:                                               ; preds = %31
  %.not128 = icmp ult i64 %3, 65536
  %33 = select i1 %.not128, i64 1, i64 2
  br label %.lr.ph.preheader

.lr.ph.preheader:                                 ; preds = %25, %32, %31, %30, %29, %28, %27
  %.sink139 = phi i64 [ 3, %31 ], [ 4, %30 ], [ 5, %29 ], [ 6, %28 ], [ 7, %27 ], [ %26, %25 ], [ %33, %32 ]
  %34 = trunc nuw nsw i64 %.sink139 to i8
  store i8 %34, ptr %5, align 16, !tbaa !16
  %invariant.gep = getelementptr i8, ptr %0, i64 -1
  br label %.lr.ph

.lr.ph:                                           ; preds = %.lr.ph.preheader, %.lr.ph
  %indvars.iv = phi i64 [ 1, %.lr.ph.preheader ], [ %indvars.iv.next, %.lr.ph ]
  %gep = getelementptr i8, ptr %invariant.gep, i64 %indvars.iv
  %35 = load i8, ptr %gep, align 1, !tbaa !16
  %36 = getelementptr inbounds i8, ptr %5, i64 %indvars.iv
  store i8 %35, ptr %36, align 1, !tbaa !16
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
  %37 = xor i64 %.sink139, %indvars.iv.next
  %exitcond.not = icmp eq i64 %37, 15
  br i1 %exitcond.not, label %._crit_edge, label %.lr.ph, !llvm.loop !17

._crit_edge:                                      ; preds = %.lr.ph
  %38 = getelementptr inbounds i8, ptr %5, i64 16
  %39 = add nuw nsw i64 %.sink139, 1
  %40 = xor i64 %.sink139, -1
  %41 = getelementptr inbounds i8, ptr %38, i64 %40
  tail call void @llvm.memset.p0.i64(ptr noundef nonnull align 1 dereferenceable(1) %41, i8 0, i64 %39, i1 false)
  %42 = getelementptr inbounds i8, ptr %5, i64 32
  tail call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 16 dereferenceable(16) %42, ptr noundef nonnull align 16 dereferenceable(16) %5, i64 16, i1 false)
  %43 = getelementptr inbounds i8, ptr %5, i64 15
  store i8 0, ptr %43, align 1, !tbaa !16
  %44 = getelementptr inbounds i8, ptr %5, i64 48
  %45 = load i8, ptr %42, align 16, !tbaa !16
  %46 = and i8 %45, 7
  %narrow = add nuw nsw i8 %46, 1
  %47 = load i64, ptr %19, align 8, !tbaa !13
  %48 = trunc i64 %47 to i8
  %49 = getelementptr inbounds i8, ptr %5, i64 47
  store i8 %48, ptr %49, align 1, !tbaa !16
  %.not129 = icmp eq i8 %46, 0
  br i1 %.not129, label %78, label %50, !llvm.loop !19

50:                                               ; preds = %._crit_edge
  %51 = lshr i64 %47, 8
  %52 = trunc i64 %51 to i8
  %53 = getelementptr inbounds i8, ptr %5, i64 46
  store i8 %52, ptr %53, align 1, !tbaa !16
  %.not129.1 = icmp eq i8 %narrow, 2
  br i1 %.not129.1, label %78, label %54, !llvm.loop !19

54:                                               ; preds = %50
  %55 = lshr i64 %47, 16
  %56 = trunc i64 %55 to i8
  %57 = getelementptr inbounds i8, ptr %5, i64 45
  store i8 %56, ptr %57, align 1, !tbaa !16
  %.not129.2 = icmp eq i8 %narrow, 3
  br i1 %.not129.2, label %78, label %58, !llvm.loop !19

58:                                               ; preds = %54
  %59 = lshr i64 %47, 24
  %60 = trunc i64 %59 to i8
  %61 = getelementptr inbounds i8, ptr %5, i64 44
  store i8 %60, ptr %61, align 1, !tbaa !16
  %.not129.3 = icmp eq i8 %narrow, 4
  br i1 %.not129.3, label %78, label %62, !llvm.loop !19

62:                                               ; preds = %58
  %63 = lshr i64 %47, 32
  %64 = trunc i64 %63 to i8
  %65 = getelementptr inbounds i8, ptr %5, i64 43
  store i8 %64, ptr %65, align 1, !tbaa !16
  %.not129.4 = icmp eq i8 %narrow, 5
  br i1 %.not129.4, label %78, label %66, !llvm.loop !19

66:                                               ; preds = %62
  %67 = lshr i64 %47, 40
  %68 = trunc i64 %67 to i8
  %69 = getelementptr inbounds i8, ptr %5, i64 42
  store i8 %68, ptr %69, align 1, !tbaa !16
  %.not129.5 = icmp eq i8 %narrow, 6
  br i1 %.not129.5, label %78, label %70, !llvm.loop !19

70:                                               ; preds = %66
  %71 = lshr i64 %47, 48
  %72 = trunc i64 %71 to i8
  %73 = getelementptr inbounds i8, ptr %5, i64 41
  store i8 %72, ptr %73, align 1, !tbaa !16
  %.not129.6 = icmp eq i8 %46, 6
  br i1 %.not129.6, label %78, label %74, !llvm.loop !19

74:                                               ; preds = %70
  %75 = lshr i64 %47, 56
  %76 = trunc nuw i64 %75 to i8
  %77 = getelementptr inbounds i8, ptr %5, i64 40
  store i8 %76, ptr %77, align 1, !tbaa !16
  br label %78

78:                                               ; preds = %74, %70, %66, %62, %58, %54, %50, %._crit_edge
  %79 = load i64, ptr %24, align 16, !tbaa !15
  %.not130 = icmp eq i64 %79, 0
  %80 = select i1 %.not130, i32 0, i32 64
  %81 = load i32, ptr %21, align 4, !tbaa !14
  %.not131 = icmp eq i32 %81, 0
  %82 = shl i32 %81, 2
  %83 = add i32 %82, 248
  %84 = select i1 %.not131, i32 0, i32 %83
  %85 = add i32 %84, %80
  %86 = load i8, ptr %42, align 16, !tbaa !16
  %87 = trunc i32 %85 to i8
  %88 = or i8 %86, %87
  store i8 %88, ptr %42, align 16, !tbaa !16
  %89 = tail call i32 @aes_encrypt(ptr noundef nonnull %42, ptr noundef nonnull %42, ptr noundef nonnull %44) #4
  %90 = load i64, ptr %18, align 16, !tbaa !12
  %.not132 = icmp eq i64 %90, 0
  br i1 %.not132, label %165, label %91

91:                                               ; preds = %78
  %92 = icmp ult i64 %90, 65280
  %93 = load i8, ptr %42, align 16, !tbaa !16
  br i1 %92, label %94, label %99

94:                                               ; preds = %91
  %95 = load i64, ptr %24, align 16, !tbaa !15
  %96 = lshr i64 %95, 8
  %97 = trunc i64 %96 to i8
  %98 = xor i8 %93, %97
  store i8 %98, ptr %42, align 16, !tbaa !16
  br label %160

99:                                               ; preds = %91
  %100 = icmp ult i64 %90, 4294967296
  %101 = xor i8 %93, -1
  store i8 %101, ptr %42, align 16, !tbaa !16
  %102 = getelementptr inbounds i8, ptr %5, i64 33
  %103 = load i8, ptr %102, align 1, !tbaa !16
  br i1 %100, label %104, label %122

104:                                              ; preds = %99
  %105 = xor i8 %103, -2
  store i8 %105, ptr %102, align 1, !tbaa !16
  %106 = load i64, ptr %24, align 16, !tbaa !15
  %107 = getelementptr inbounds i8, ptr %5, i64 34
  %108 = load i8, ptr %107, align 2, !tbaa !16
  %109 = lshr i64 %106, 24
  %110 = trunc i64 %109 to i8
  %111 = xor i8 %108, %110
  store i8 %111, ptr %107, align 2, !tbaa !16
  %112 = getelementptr inbounds i8, ptr %5, i64 35
  %113 = load i8, ptr %112, align 1, !tbaa !16
  %114 = lshr i64 %106, 16
  %115 = trunc i64 %114 to i8
  %116 = xor i8 %113, %115
  store i8 %116, ptr %112, align 1, !tbaa !16
  %117 = getelementptr inbounds i8, ptr %5, i64 36
  %118 = load i8, ptr %117, align 4, !tbaa !16
  %119 = lshr i64 %106, 8
  %120 = trunc i64 %119 to i8
  %121 = xor i8 %118, %120
  store i8 %121, ptr %117, align 4, !tbaa !16
  br label %160

122:                                              ; preds = %99
  %123 = xor i8 %103, -1
  store i8 %123, ptr %102, align 1, !tbaa !16
  %124 = load i64, ptr %24, align 16, !tbaa !15
  %125 = lshr i64 %124, 56
  %126 = trunc nuw i64 %125 to i8
  %127 = getelementptr inbounds i8, ptr %5, i64 34
  %128 = load i8, ptr %127, align 2, !tbaa !16
  %129 = xor i8 %128, %126
  store i8 %129, ptr %127, align 2, !tbaa !16
  %130 = lshr i64 %124, 48
  %131 = trunc i64 %130 to i8
  %132 = getelementptr inbounds i8, ptr %5, i64 35
  %133 = load i8, ptr %132, align 1, !tbaa !16
  %134 = xor i8 %133, %131
  store i8 %134, ptr %132, align 1, !tbaa !16
  %135 = lshr i64 %124, 40
  %136 = trunc i64 %135 to i8
  %137 = getelementptr inbounds i8, ptr %5, i64 36
  %138 = load i8, ptr %137, align 4, !tbaa !16
  %139 = xor i8 %138, %136
  store i8 %139, ptr %137, align 4, !tbaa !16
  %140 = lshr i64 %124, 32
  %141 = trunc i64 %140 to i8
  %142 = getelementptr inbounds i8, ptr %5, i64 37
  %143 = load i8, ptr %142, align 1, !tbaa !16
  %144 = xor i8 %143, %141
  store i8 %144, ptr %142, align 1, !tbaa !16
  %145 = getelementptr inbounds i8, ptr %5, i64 38
  %146 = load i8, ptr %145, align 2, !tbaa !16
  %147 = lshr i64 %124, 24
  %148 = trunc i64 %147 to i8
  %149 = xor i8 %146, %148
  store i8 %149, ptr %145, align 2, !tbaa !16
  %150 = getelementptr inbounds i8, ptr %5, i64 39
  %151 = load i8, ptr %150, align 1, !tbaa !16
  %152 = lshr i64 %124, 16
  %153 = trunc i64 %152 to i8
  %154 = xor i8 %151, %153
  store i8 %154, ptr %150, align 1, !tbaa !16
  %155 = getelementptr inbounds i8, ptr %5, i64 40
  %156 = load i8, ptr %155, align 8, !tbaa !16
  %157 = lshr i64 %124, 8
  %158 = trunc i64 %157 to i8
  %159 = xor i8 %156, %158
  store i8 %159, ptr %155, align 8, !tbaa !16
  br label %160

160:                                              ; preds = %104, %122, %94
  %.sink146 = phi i64 [ %106, %104 ], [ %124, %122 ], [ %95, %94 ]
  %.sink145 = phi i64 [ 37, %104 ], [ 41, %122 ], [ 33, %94 ]
  %.sink = phi i64 [ 6, %104 ], [ 10, %122 ], [ 2, %94 ]
  %161 = trunc i64 %.sink146 to i8
  %162 = getelementptr inbounds i8, ptr %5, i64 %.sink145
  %163 = load i8, ptr %162, align 1, !tbaa !16
  %164 = xor i8 %163, %161
  store i8 %164, ptr %162, align 1, !tbaa !16
  br label %165

165:                                              ; preds = %78, %160
  %.sink147 = phi i64 [ %.sink, %160 ], [ 0, %78 ]
  %storemerge = phi i32 [ 11, %160 ], [ 12, %78 ]
  store i64 %.sink147, ptr %22, align 8, !tbaa !20
  store i32 %storemerge, ptr %7, align 16, !tbaa !5
  %166 = add i64 %.sink147, %90
  store i64 %166, ptr %24, align 16, !tbaa !15
  store i64 %.sink147, ptr %23, align 16, !tbaa !21
  br label %.thread

.thread:                                          ; preds = %10, %14, %165
  %.0115 = phi i32 [ 0, %165 ], [ -3, %10 ], [ -4, %14 ]
  ret i32 %.0115
}

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

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

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

attributes #0 = { nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #1 = { mustprogress nocallback nofree nounwind willreturn memory(argmem: write) }
attributes #2 = { mustprogress nocallback nofree nounwind willreturn memory(argmem: readwrite) }
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 }

!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, !10, i64 352}
!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 344}
!12 = !{!6, !9, i64 304}
!13 = !{!6, !9, i64 312}
!14 = !{!6, !10, i64 348}
!15 = !{!6, !9, i64 320}
!16 = !{!7, !7, i64 0}
!17 = distinct !{!17, !18}
!18 = !{!"llvm.loop.mustprogress"}
!19 = distinct !{!19, !18}
!20 = !{!6, !9, i64 328}
!21 = !{!6, !9, i64 336}


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