; LLVM IR from rweather/lightweight-crypto :: src/combined (knot-masked)

; 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.knot384_masked_state_t = type { [4 x %struct.mask_x4_uint64_t], [4 x %struct.mask_x4_uint32_t] }
%struct.mask_x4_uint64_t = type { i64, i64, i64, i64 }
%struct.mask_x4_uint32_t = type { i32, i32, i32, i32 }

; Function Attrs: nounwind uwtable
define dso_local i32 @knot_masked_192_384_aead_encrypt(ptr noundef %0, ptr noundef %1, ptr noundef %2, i64 noundef %3, ptr noundef %4, i64 noundef %5, ptr noundef %6, ptr noundef %7, ptr noundef %8) #0 {
  %10 = alloca ptr, align 8
  %11 = alloca ptr, align 8
  %12 = alloca ptr, align 8
  %13 = alloca i64, align 8
  %14 = alloca ptr, align 8
  %15 = alloca i64, align 8
  %16 = alloca ptr, align 8
  %17 = alloca ptr, align 8
  %18 = alloca ptr, align 8
  %19 = alloca %struct.knot384_masked_state_t, align 8
  %20 = alloca [12 x i8], align 1
  %21 = alloca i32, align 4
  %22 = alloca i64, align 8
  %23 = alloca i32, align 4
  %24 = alloca i64, align 8
  %25 = alloca i32, align 4
  %26 = alloca i64, align 8
  %27 = alloca i32, align 4
  %28 = alloca i64, align 8
  %29 = alloca i32, align 4
  store ptr %0, ptr %10, align 8, !tbaa !5
  store ptr %1, ptr %11, align 8, !tbaa !5
  store ptr %2, ptr %12, align 8, !tbaa !5
  store i64 %3, ptr %13, align 8, !tbaa !9
  store ptr %4, ptr %14, align 8, !tbaa !5
  store i64 %5, ptr %15, align 8, !tbaa !9
  store ptr %6, ptr %16, align 8, !tbaa !5
  store ptr %7, ptr %17, align 8, !tbaa !5
  store ptr %8, ptr %18, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 192, ptr %19) #5
  call void @llvm.lifetime.start.p0(i64 12, ptr %20) #5
  call void @llvm.lifetime.start.p0(i64 4, ptr %21) #5
  %30 = load ptr, ptr %16, align 8, !tbaa !5
  %31 = load i64, ptr %13, align 8, !tbaa !9
  %32 = add i64 %31, 24
  %33 = load ptr, ptr %11, align 8, !tbaa !5
  store i64 %32, ptr %33, align 8, !tbaa !9
  %34 = load ptr, ptr %18, align 8, !tbaa !5
  %35 = load ptr, ptr %17, align 8, !tbaa !5
  call void @knot_aead_192_384_init_masked(ptr noundef %19, ptr noundef %34, ptr noundef %35)
  %36 = load i64, ptr %15, align 8, !tbaa !9
  %37 = icmp ugt i64 %36, 0
  br i1 %37, label %38, label %41

38:                                               ; preds = %9
  %39 = load ptr, ptr %14, align 8, !tbaa !5
  %40 = load i64, ptr %15, align 8, !tbaa !9
  call void @knot_aead_192_384_absorb_ad_masked(ptr noundef %19, ptr noundef %39, i64 noundef %40)
  br label %41

41:                                               ; preds = %38, %9
  br label %42

42:                                               ; preds = %41
  %43 = getelementptr inbounds %struct.knot384_masked_state_t, ptr %19, i32 0, i32 1
  %44 = getelementptr inbounds [4 x %struct.mask_x4_uint32_t], ptr %43, i64 0, i64 3
  %45 = getelementptr inbounds %struct.mask_x4_uint32_t, ptr %44, i32 0, i32 0
  %46 = load i32, ptr %45, align 8, !tbaa !11
  %47 = xor i32 %46, -2147483648
  store i32 %47, ptr %45, align 8, !tbaa !11
  br label %48

48:                                               ; preds = %42
  br label %49

49:                                               ; preds = %48
  %50 = load i64, ptr %13, align 8, !tbaa !9
  %51 = icmp ugt i64 %50, 0
  br i1 %51, label %52, label %461

52:                                               ; preds = %49
  br label %53

53:                                               ; preds = %250, %52
  %54 = load i64, ptr %13, align 8, !tbaa !9
  %55 = icmp uge i64 %54, 12
  br i1 %55, label %56, label %257

56:                                               ; preds = %53
  br label %57

57:                                               ; preds = %56
  %58 = load ptr, ptr %12, align 8, !tbaa !5
  %59 = getelementptr inbounds i8, ptr %58, i64 7
  %60 = load i8, ptr %59, align 1, !tbaa !14
  %61 = zext i8 %60 to i64
  %62 = shl i64 %61, 56
  %63 = load ptr, ptr %12, align 8, !tbaa !5
  %64 = getelementptr inbounds i8, ptr %63, i64 6
  %65 = load i8, ptr %64, align 1, !tbaa !14
  %66 = zext i8 %65 to i64
  %67 = shl i64 %66, 48
  %68 = or i64 %62, %67
  %69 = load ptr, ptr %12, align 8, !tbaa !5
  %70 = getelementptr inbounds i8, ptr %69, i64 5
  %71 = load i8, ptr %70, align 1, !tbaa !14
  %72 = zext i8 %71 to i64
  %73 = shl i64 %72, 40
  %74 = or i64 %68, %73
  %75 = load ptr, ptr %12, align 8, !tbaa !5
  %76 = getelementptr inbounds i8, ptr %75, i64 4
  %77 = load i8, ptr %76, align 1, !tbaa !14
  %78 = zext i8 %77 to i64
  %79 = shl i64 %78, 32
  %80 = or i64 %74, %79
  %81 = load ptr, ptr %12, align 8, !tbaa !5
  %82 = getelementptr inbounds i8, ptr %81, i64 3
  %83 = load i8, ptr %82, align 1, !tbaa !14
  %84 = zext i8 %83 to i64
  %85 = shl i64 %84, 24
  %86 = or i64 %80, %85
  %87 = load ptr, ptr %12, align 8, !tbaa !5
  %88 = getelementptr inbounds i8, ptr %87, i64 2
  %89 = load i8, ptr %88, align 1, !tbaa !14
  %90 = zext i8 %89 to i64
  %91 = shl i64 %90, 16
  %92 = or i64 %86, %91
  %93 = load ptr, ptr %12, align 8, !tbaa !5
  %94 = getelementptr inbounds i8, ptr %93, i64 1
  %95 = load i8, ptr %94, align 1, !tbaa !14
  %96 = zext i8 %95 to i64
  %97 = shl i64 %96, 8
  %98 = or i64 %92, %97
  %99 = load ptr, ptr %12, align 8, !tbaa !5
  %100 = getelementptr inbounds i8, ptr %99, i64 0
  %101 = load i8, ptr %100, align 1, !tbaa !14
  %102 = zext i8 %101 to i64
  %103 = or i64 %98, %102
  %104 = getelementptr inbounds %struct.knot384_masked_state_t, ptr %19, i32 0, i32 0
  %105 = getelementptr inbounds [4 x %struct.mask_x4_uint64_t], ptr %104, i64 0, i64 0
  %106 = getelementptr inbounds %struct.mask_x4_uint64_t, ptr %105, i32 0, i32 0
  %107 = load i64, ptr %106, align 8, !tbaa !15
  %108 = xor i64 %107, %103
  store i64 %108, ptr %106, align 8, !tbaa !15
  br label %109

109:                                              ; preds = %57
  br label %110

110:                                              ; preds = %109
  br label %111

111:                                              ; preds = %110
  %112 = load ptr, ptr %12, align 8, !tbaa !5
  %113 = getelementptr inbounds i8, ptr %112, i64 8
  %114 = getelementptr inbounds i8, ptr %113, i64 3
  %115 = load i8, ptr %114, align 1, !tbaa !14
  %116 = zext i8 %115 to i32
  %117 = shl i32 %116, 24
  %118 = load ptr, ptr %12, align 8, !tbaa !5
  %119 = getelementptr inbounds i8, ptr %118, i64 8
  %120 = getelementptr inbounds i8, ptr %119, i64 2
  %121 = load i8, ptr %120, align 1, !tbaa !14
  %122 = zext i8 %121 to i32
  %123 = shl i32 %122, 16
  %124 = or i32 %117, %123
  %125 = load ptr, ptr %12, align 8, !tbaa !5
  %126 = getelementptr inbounds i8, ptr %125, i64 8
  %127 = getelementptr inbounds i8, ptr %126, i64 1
  %128 = load i8, ptr %127, align 1, !tbaa !14
  %129 = zext i8 %128 to i32
  %130 = shl i32 %129, 8
  %131 = or i32 %124, %130
  %132 = load ptr, ptr %12, align 8, !tbaa !5
  %133 = getelementptr inbounds i8, ptr %132, i64 8
  %134 = getelementptr inbounds i8, ptr %133, i64 0
  %135 = load i8, ptr %134, align 1, !tbaa !14
  %136 = zext i8 %135 to i32
  %137 = or i32 %131, %136
  %138 = getelementptr inbounds %struct.knot384_masked_state_t, ptr %19, i32 0, i32 1
  %139 = getelementptr inbounds [4 x %struct.mask_x4_uint32_t], ptr %138, i64 0, i64 0
  %140 = getelementptr inbounds %struct.mask_x4_uint32_t, ptr %139, i32 0, i32 0
  %141 = load i32, ptr %140, align 8, !tbaa !11
  %142 = xor i32 %141, %137
  store i32 %142, ptr %140, align 8, !tbaa !11
  br label %143

143:                                              ; preds = %111
  br label %144

144:                                              ; preds = %143
  br label %145

145:                                              ; preds = %144
  call void @llvm.lifetime.start.p0(i64 8, ptr %22) #5
  %146 = getelementptr inbounds %struct.knot384_masked_state_t, ptr %19, i32 0, i32 0
  %147 = getelementptr inbounds [4 x %struct.mask_x4_uint64_t], ptr %146, i64 0, i64 0
  %148 = getelementptr inbounds %struct.mask_x4_uint64_t, ptr %147, i32 0, i32 0
  %149 = load i64, ptr %148, align 8, !tbaa !15
  %150 = getelementptr inbounds %struct.knot384_masked_state_t, ptr %19, i32 0, i32 0
  %151 = getelementptr inbounds [4 x %struct.mask_x4_uint64_t], ptr %150, i64 0, i64 0
  %152 = getelementptr inbounds %struct.mask_x4_uint64_t, ptr %151, i32 0, i32 1
  %153 = load i64, ptr %152, align 8, !tbaa !18
  %154 = xor i64 %149, %153
  %155 = getelementptr inbounds %struct.knot384_masked_state_t, ptr %19, i32 0, i32 0
  %156 = getelementptr inbounds [4 x %struct.mask_x4_uint64_t], ptr %155, i64 0, i64 0
  %157 = getelementptr inbounds %struct.mask_x4_uint64_t, ptr %156, i32 0, i32 2
  %158 = load i64, ptr %157, align 8, !tbaa !19
  %159 = xor i64 %154, %158
  %160 = getelementptr inbounds %struct.knot384_masked_state_t, ptr %19, i32 0, i32 0
  %161 = getelementptr inbounds [4 x %struct.mask_x4_uint64_t], ptr %160, i64 0, i64 0
  %162 = getelementptr inbounds %struct.mask_x4_uint64_t, ptr %161, i32 0, i32 3
  %163 = load i64, ptr %162, align 8, !tbaa !20
  %164 = xor i64 %159, %163
  store i64 %164, ptr %22, align 8, !tbaa !21
  %165 = load i64, ptr %22, align 8, !tbaa !21
  %166 = trunc i64 %165 to i8
  %167 = load ptr, ptr %10, align 8, !tbaa !5
  %168 = getelementptr inbounds i8, ptr %167, i64 0
  store i8 %166, ptr %168, align 1, !tbaa !14
  %169 = load i64, ptr %22, align 8, !tbaa !21
  %170 = lshr i64 %169, 8
  %171 = trunc i64 %170 to i8
  %172 = load ptr, ptr %10, align 8, !tbaa !5
  %173 = getelementptr inbounds i8, ptr %172, i64 1
  store i8 %171, ptr %173, align 1, !tbaa !14
  %174 = load i64, ptr %22, align 8, !tbaa !21
  %175 = lshr i64 %174, 16
  %176 = trunc i64 %175 to i8
  %177 = load ptr, ptr %10, align 8, !tbaa !5
  %178 = getelementptr inbounds i8, ptr %177, i64 2
  store i8 %176, ptr %178, align 1, !tbaa !14
  %179 = load i64, ptr %22, align 8, !tbaa !21
  %180 = lshr i64 %179, 24
  %181 = trunc i64 %180 to i8
  %182 = load ptr, ptr %10, align 8, !tbaa !5
  %183 = getelementptr inbounds i8, ptr %182, i64 3
  store i8 %181, ptr %183, align 1, !tbaa !14
  %184 = load i64, ptr %22, align 8, !tbaa !21
  %185 = lshr i64 %184, 32
  %186 = trunc i64 %185 to i8
  %187 = load ptr, ptr %10, align 8, !tbaa !5
  %188 = getelementptr inbounds i8, ptr %187, i64 4
  store i8 %186, ptr %188, align 1, !tbaa !14
  %189 = load i64, ptr %22, align 8, !tbaa !21
  %190 = lshr i64 %189, 40
  %191 = trunc i64 %190 to i8
  %192 = load ptr, ptr %10, align 8, !tbaa !5
  %193 = getelementptr inbounds i8, ptr %192, i64 5
  store i8 %191, ptr %193, align 1, !tbaa !14
  %194 = load i64, ptr %22, align 8, !tbaa !21
  %195 = lshr i64 %194, 48
  %196 = trunc i64 %195 to i8
  %197 = load ptr, ptr %10, align 8, !tbaa !5
  %198 = getelementptr inbounds i8, ptr %197, i64 6
  store i8 %196, ptr %198, align 1, !tbaa !14
  %199 = load i64, ptr %22, align 8, !tbaa !21
  %200 = lshr i64 %199, 56
  %201 = trunc i64 %200 to i8
  %202 = load ptr, ptr %10, align 8, !tbaa !5
  %203 = getelementptr inbounds i8, ptr %202, i64 7
  store i8 %201, ptr %203, align 1, !tbaa !14
  call void @llvm.lifetime.end.p0(i64 8, ptr %22) #5
  br label %204

204:                                              ; preds = %145
  br label %205

205:                                              ; preds = %204
  br label %206

206:                                              ; preds = %205
  call void @llvm.lifetime.start.p0(i64 4, ptr %23) #5
  %207 = getelementptr inbounds %struct.knot384_masked_state_t, ptr %19, i32 0, i32 1
  %208 = getelementptr inbounds [4 x %struct.mask_x4_uint32_t], ptr %207, i64 0, i64 0
  %209 = getelementptr inbounds %struct.mask_x4_uint32_t, ptr %208, i32 0, i32 0
  %210 = load i32, ptr %209, align 8, !tbaa !11
  %211 = getelementptr inbounds %struct.knot384_masked_state_t, ptr %19, i32 0, i32 1
  %212 = getelementptr inbounds [4 x %struct.mask_x4_uint32_t], ptr %211, i64 0, i64 0
  %213 = getelementptr inbounds %struct.mask_x4_uint32_t, ptr %212, i32 0, i32 1
  %214 = load i32, ptr %213, align 4, !tbaa !22
  %215 = xor i32 %210, %214
  %216 = getelementptr inbounds %struct.knot384_masked_state_t, ptr %19, i32 0, i32 1
  %217 = getelementptr inbounds [4 x %struct.mask_x4_uint32_t], ptr %216, i64 0, i64 0
  %218 = getelementptr inbounds %struct.mask_x4_uint32_t, ptr %217, i32 0, i32 2
  %219 = load i32, ptr %218, align 8, !tbaa !23
  %220 = xor i32 %215, %219
  %221 = getelementptr inbounds %struct.knot384_masked_state_t, ptr %19, i32 0, i32 1
  %222 = getelementptr inbounds [4 x %struct.mask_x4_uint32_t], ptr %221, i64 0, i64 0
  %223 = getelementptr inbounds %struct.mask_x4_uint32_t, ptr %222, i32 0, i32 3
  %224 = load i32, ptr %223, align 4, !tbaa !24
  %225 = xor i32 %220, %224
  store i32 %225, ptr %23, align 4, !tbaa !25
  %226 = load i32, ptr %23, align 4, !tbaa !25
  %227 = trunc i32 %226 to i8
  %228 = load ptr, ptr %10, align 8, !tbaa !5
  %229 = getelementptr inbounds i8, ptr %228, i64 8
  %230 = getelementptr inbounds i8, ptr %229, i64 0
  store i8 %227, ptr %230, align 1, !tbaa !14
  %231 = load i32, ptr %23, align 4, !tbaa !25
  %232 = lshr i32 %231, 8
  %233 = trunc i32 %232 to i8
  %234 = load ptr, ptr %10, align 8, !tbaa !5
  %235 = getelementptr inbounds i8, ptr %234, i64 8
  %236 = getelementptr inbounds i8, ptr %235, i64 1
  store i8 %233, ptr %236, align 1, !tbaa !14
  %237 = load i32, ptr %23, align 4, !tbaa !25
  %238 = lshr i32 %237, 16
  %239 = trunc i32 %238 to i8
  %240 = load ptr, ptr %10, align 8, !tbaa !5
  %241 = getelementptr inbounds i8, ptr %240, i64 8
  %242 = getelementptr inbounds i8, ptr %241, i64 2
  store i8 %239, ptr %242, align 1, !tbaa !14
  %243 = load i32, ptr %23, align 4, !tbaa !25
  %244 = lshr i32 %243, 24
  %245 = trunc i32 %244 to i8
  %246 = load ptr, ptr %10, align 8, !tbaa !5
  %247 = getelementptr inbounds i8, ptr %246, i64 8
  %248 = getelementptr inbounds i8, ptr %247, i64 3
  store i8 %245, ptr %248, align 1, !tbaa !14
  call void @llvm.lifetime.end.p0(i64 4, ptr %23) #5
  br label %249

249:                                              ; preds = %206
  br label %250

250:                                              ; preds = %249
  call void @knot384_masked_permute_7(ptr noundef %19, i8 noundef zeroext 40)
  %251 = load ptr, ptr %10, align 8, !tbaa !5
  %252 = getelementptr inbounds i8, ptr %251, i64 12
  store ptr %252, ptr %10, align 8, !tbaa !5
  %253 = load ptr, ptr %12, align 8, !tbaa !5
  %254 = getelementptr inbounds i8, ptr %253, i64 12
  store ptr %254, ptr %12, align 8, !tbaa !5
  %255 = load i64, ptr %13, align 8, !tbaa !9
  %256 = sub i64 %255, 12
  store i64 %256, ptr %13, align 8, !tbaa !9
  br label %53, !llvm.loop !26

257:                                              ; preds = %53
  %258 = load i64, ptr %13, align 8, !tbaa !9
  %259 = trunc i64 %258 to i32
  store i32 %259, ptr %21, align 4, !tbaa !25
  %260 = getelementptr inbounds [12 x i8], ptr %20, i64 0, i64 0
  %261 = load ptr, ptr %12, align 8, !tbaa !5
  %262 = load i32, ptr %21, align 4, !tbaa !25
  %263 = zext i32 %262 to i64
  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %260, ptr align 1 %261, i64 %263, i1 false)
  %264 = load i32, ptr %21, align 4, !tbaa !25
  %265 = zext i32 %264 to i64
  %266 = getelementptr inbounds [12 x i8], ptr %20, i64 0, i64 %265
  store i8 1, ptr %266, align 1, !tbaa !14
  %267 = getelementptr inbounds [12 x i8], ptr %20, i64 0, i64 0
  %268 = load i32, ptr %21, align 4, !tbaa !25
  %269 = zext i32 %268 to i64
  %270 = getelementptr inbounds i8, ptr %267, i64 %269
  %271 = getelementptr inbounds i8, ptr %270, i64 1
  %272 = load i32, ptr %21, align 4, !tbaa !25
  %273 = add i32 %272, 1
  %274 = zext i32 %273 to i64
  %275 = sub i64 12, %274
  call void @llvm.memset.p0.i64(ptr align 1 %271, i8 0, i64 %275, i1 false)
  br label %276

276:                                              ; preds = %257
  %277 = getelementptr inbounds [12 x i8], ptr %20, i64 0, i64 7
  %278 = load i8, ptr %277, align 1, !tbaa !14
  %279 = zext i8 %278 to i64
  %280 = shl i64 %279, 56
  %281 = getelementptr inbounds [12 x i8], ptr %20, i64 0, i64 6
  %282 = load i8, ptr %281, align 1, !tbaa !14
  %283 = zext i8 %282 to i64
  %284 = shl i64 %283, 48
  %285 = or i64 %280, %284
  %286 = getelementptr inbounds [12 x i8], ptr %20, i64 0, i64 5
  %287 = load i8, ptr %286, align 1, !tbaa !14
  %288 = zext i8 %287 to i64
  %289 = shl i64 %288, 40
  %290 = or i64 %285, %289
  %291 = getelementptr inbounds [12 x i8], ptr %20, i64 0, i64 4
  %292 = load i8, ptr %291, align 1, !tbaa !14
  %293 = zext i8 %292 to i64
  %294 = shl i64 %293, 32
  %295 = or i64 %290, %294
  %296 = getelementptr inbounds [12 x i8], ptr %20, i64 0, i64 3
  %297 = load i8, ptr %296, align 1, !tbaa !14
  %298 = zext i8 %297 to i64
  %299 = shl i64 %298, 24
  %300 = or i64 %295, %299
  %301 = getelementptr inbounds [12 x i8], ptr %20, i64 0, i64 2
  %302 = load i8, ptr %301, align 1, !tbaa !14
  %303 = zext i8 %302 to i64
  %304 = shl i64 %303, 16
  %305 = or i64 %300, %304
  %306 = getelementptr inbounds [12 x i8], ptr %20, i64 0, i64 1
  %307 = load i8, ptr %306, align 1, !tbaa !14
  %308 = zext i8 %307 to i64
  %309 = shl i64 %308, 8
  %310 = or i64 %305, %309
  %311 = getelementptr inbounds [12 x i8], ptr %20, i64 0, i64 0
  %312 = load i8, ptr %311, align 1, !tbaa !14
  %313 = zext i8 %312 to i64
  %314 = or i64 %310, %313
  %315 = getelementptr inbounds %struct.knot384_masked_state_t, ptr %19, i32 0, i32 0
  %316 = getelementptr inbounds [4 x %struct.mask_x4_uint64_t], ptr %315, i64 0, i64 0
  %317 = getelementptr inbounds %struct.mask_x4_uint64_t, ptr %316, i32 0, i32 0
  %318 = load i64, ptr %317, align 8, !tbaa !15
  %319 = xor i64 %318, %314
  store i64 %319, ptr %317, align 8, !tbaa !15
  br label %320

320:                                              ; preds = %276
  br label %321

321:                                              ; preds = %320
  br label %322

322:                                              ; preds = %321
  %323 = getelementptr inbounds [12 x i8], ptr %20, i64 0, i64 0
  %324 = getelementptr inbounds i8, ptr %323, i64 8
  %325 = getelementptr inbounds i8, ptr %324, i64 3
  %326 = load i8, ptr %325, align 1, !tbaa !14
  %327 = zext i8 %326 to i32
  %328 = shl i32 %327, 24
  %329 = getelementptr inbounds [12 x i8], ptr %20, i64 0, i64 0
  %330 = getelementptr inbounds i8, ptr %329, i64 8
  %331 = getelementptr inbounds i8, ptr %330, i64 2
  %332 = load i8, ptr %331, align 1, !tbaa !14
  %333 = zext i8 %332 to i32
  %334 = shl i32 %333, 16
  %335 = or i32 %328, %334
  %336 = getelementptr inbounds [12 x i8], ptr %20, i64 0, i64 0
  %337 = getelementptr inbounds i8, ptr %336, i64 8
  %338 = getelementptr inbounds i8, ptr %337, i64 1
  %339 = load i8, ptr %338, align 1, !tbaa !14
  %340 = zext i8 %339 to i32
  %341 = shl i32 %340, 8
  %342 = or i32 %335, %341
  %343 = getelementptr inbounds [12 x i8], ptr %20, i64 0, i64 0
  %344 = getelementptr inbounds i8, ptr %343, i64 8
  %345 = getelementptr inbounds i8, ptr %344, i64 0
  %346 = load i8, ptr %345, align 1, !tbaa !14
  %347 = zext i8 %346 to i32
  %348 = or i32 %342, %347
  %349 = getelementptr inbounds %struct.knot384_masked_state_t, ptr %19, i32 0, i32 1
  %350 = getelementptr inbounds [4 x %struct.mask_x4_uint32_t], ptr %349, i64 0, i64 0
  %351 = getelementptr inbounds %struct.mask_x4_uint32_t, ptr %350, i32 0, i32 0
  %352 = load i32, ptr %351, align 8, !tbaa !11
  %353 = xor i32 %352, %348
  store i32 %353, ptr %351, align 8, !tbaa !11
  br label %354

354:                                              ; preds = %322
  br label %355

355:                                              ; preds = %354
  br label %356

356:                                              ; preds = %355
  call void @llvm.lifetime.start.p0(i64 8, ptr %24) #5
  %357 = getelementptr inbounds %struct.knot384_masked_state_t, ptr %19, i32 0, i32 0
  %358 = getelementptr inbounds [4 x %struct.mask_x4_uint64_t], ptr %357, i64 0, i64 0
  %359 = getelementptr inbounds %struct.mask_x4_uint64_t, ptr %358, i32 0, i32 0
  %360 = load i64, ptr %359, align 8, !tbaa !15
  %361 = getelementptr inbounds %struct.knot384_masked_state_t, ptr %19, i32 0, i32 0
  %362 = getelementptr inbounds [4 x %struct.mask_x4_uint64_t], ptr %361, i64 0, i64 0
  %363 = getelementptr inbounds %struct.mask_x4_uint64_t, ptr %362, i32 0, i32 1
  %364 = load i64, ptr %363, align 8, !tbaa !18
  %365 = xor i64 %360, %364
  %366 = getelementptr inbounds %struct.knot384_masked_state_t, ptr %19, i32 0, i32 0
  %367 = getelementptr inbounds [4 x %struct.mask_x4_uint64_t], ptr %366, i64 0, i64 0
  %368 = getelementptr inbounds %struct.mask_x4_uint64_t, ptr %367, i32 0, i32 2
  %369 = load i64, ptr %368, align 8, !tbaa !19
  %370 = xor i64 %365, %369
  %371 = getelementptr inbounds %struct.knot384_masked_state_t, ptr %19, i32 0, i32 0
  %372 = getelementptr inbounds [4 x %struct.mask_x4_uint64_t], ptr %371, i64 0, i64 0
  %373 = getelementptr inbounds %struct.mask_x4_uint64_t, ptr %372, i32 0, i32 3
  %374 = load i64, ptr %373, align 8, !tbaa !20
  %375 = xor i64 %370, %374
  store i64 %375, ptr %24, align 8, !tbaa !21
  %376 = load i64, ptr %24, align 8, !tbaa !21
  %377 = trunc i64 %376 to i8
  %378 = getelementptr inbounds [12 x i8], ptr %20, i64 0, i64 0
  store i8 %377, ptr %378, align 1, !tbaa !14
  %379 = load i64, ptr %24, align 8, !tbaa !21
  %380 = lshr i64 %379, 8
  %381 = trunc i64 %380 to i8
  %382 = getelementptr inbounds [12 x i8], ptr %20, i64 0, i64 1
  store i8 %381, ptr %382, align 1, !tbaa !14
  %383 = load i64, ptr %24, align 8, !tbaa !21
  %384 = lshr i64 %383, 16
  %385 = trunc i64 %384 to i8
  %386 = getelementptr inbounds [12 x i8], ptr %20, i64 0, i64 2
  store i8 %385, ptr %386, align 1, !tbaa !14
  %387 = load i64, ptr %24, align 8, !tbaa !21
  %388 = lshr i64 %387, 24
  %389 = trunc i64 %388 to i8
  %390 = getelementptr inbounds [12 x i8], ptr %20, i64 0, i64 3
  store i8 %389, ptr %390, align 1, !tbaa !14
  %391 = load i64, ptr %24, align 8, !tbaa !21
  %392 = lshr i64 %391, 32
  %393 = trunc i64 %392 to i8
  %394 = getelementptr inbounds [12 x i8], ptr %20, i64 0, i64 4
  store i8 %393, ptr %394, align 1, !tbaa !14
  %395 = load i64, ptr %24, align 8, !tbaa !21
  %396 = lshr i64 %395, 40
  %397 = trunc i64 %396 to i8
  %398 = getelementptr inbounds [12 x i8], ptr %20, i64 0, i64 5
  store i8 %397, ptr %398, align 1, !tbaa !14
  %399 = load i64, ptr %24, align 8, !tbaa !21
  %400 = lshr i64 %399, 48
  %401 = trunc i64 %400 to i8
  %402 = getelementptr inbounds [12 x i8], ptr %20, i64 0, i64 6
  store i8 %401, ptr %402, align 1, !tbaa !14
  %403 = load i64, ptr %24, align 8, !tbaa !21
  %404 = lshr i64 %403, 56
  %405 = trunc i64 %404 to i8
  %406 = getelementptr inbounds [12 x i8], ptr %20, i64 0, i64 7
  store i8 %405, ptr %406, align 1, !tbaa !14
  call void @llvm.lifetime.end.p0(i64 8, ptr %24) #5
  br label %407

407:                                              ; preds = %356
  br label %408

408:                                              ; preds = %407
  br label %409

409:                                              ; preds = %408
  call void @llvm.lifetime.start.p0(i64 4, ptr %25) #5
  %410 = getelementptr inbounds %struct.knot384_masked_state_t, ptr %19, i32 0, i32 1
  %411 = getelementptr inbounds [4 x %struct.mask_x4_uint32_t], ptr %410, i64 0, i64 0
  %412 = getelementptr inbounds %struct.mask_x4_uint32_t, ptr %411, i32 0, i32 0
  %413 = load i32, ptr %412, align 8, !tbaa !11
  %414 = getelementptr inbounds %struct.knot384_masked_state_t, ptr %19, i32 0, i32 1
  %415 = getelementptr inbounds [4 x %struct.mask_x4_uint32_t], ptr %414, i64 0, i64 0
  %416 = getelementptr inbounds %struct.mask_x4_uint32_t, ptr %415, i32 0, i32 1
  %417 = load i32, ptr %416, align 4, !tbaa !22
  %418 = xor i32 %413, %417
  %419 = getelementptr inbounds %struct.knot384_masked_state_t, ptr %19, i32 0, i32 1
  %420 = getelementptr inbounds [4 x %struct.mask_x4_uint32_t], ptr %419, i64 0, i64 0
  %421 = getelementptr inbounds %struct.mask_x4_uint32_t, ptr %420, i32 0, i32 2
  %422 = load i32, ptr %421, align 8, !tbaa !23
  %423 = xor i32 %418, %422
  %424 = getelementptr inbounds %struct.knot384_masked_state_t, ptr %19, i32 0, i32 1
  %425 = getelementptr inbounds [4 x %struct.mask_x4_uint32_t], ptr %424, i64 0, i64 0
  %426 = getelementptr inbounds %struct.mask_x4_uint32_t, ptr %425, i32 0, i32 3
  %427 = load i32, ptr %426, align 4, !tbaa !24
  %428 = xor i32 %423, %427
  store i32 %428, ptr %25, align 4, !tbaa !25
  %429 = load i32, ptr %25, align 4, !tbaa !25
  %430 = trunc i32 %429 to i8
  %431 = getelementptr inbounds [12 x i8], ptr %20, i64 0, i64 0
  %432 = getelementptr inbounds i8, ptr %431, i64 8
  %433 = getelementptr inbounds i8, ptr %432, i64 0
  store i8 %430, ptr %433, align 1, !tbaa !14
  %434 = load i32, ptr %25, align 4, !tbaa !25
  %435 = lshr i32 %434, 8
  %436 = trunc i32 %435 to i8
  %437 = getelementptr inbounds [12 x i8], ptr %20, i64 0, i64 0
  %438 = getelementptr inbounds i8, ptr %437, i64 8
  %439 = getelementptr inbounds i8, ptr %438, i64 1
  store i8 %436, ptr %439, align 1, !tbaa !14
  %440 = load i32, ptr %25, align 4, !tbaa !25
  %441 = lshr i32 %440, 16
  %442 = trunc i32 %441 to i8
  %443 = getelementptr inbounds [12 x i8], ptr %20, i64 0, i64 0
  %444 = getelementptr inbounds i8, ptr %443, i64 8
  %445 = getelementptr inbounds i8, ptr %444, i64 2
  store i8 %442, ptr %445, align 1, !tbaa !14
  %446 = load i32, ptr %25, align 4, !tbaa !25
  %447 = lshr i32 %446, 24
  %448 = trunc i32 %447 to i8
  %449 = getelementptr inbounds [12 x i8], ptr %20, i64 0, i64 0
  %450 = getelementptr inbounds i8, ptr %449, i64 8
  %451 = getelementptr inbounds i8, ptr %450, i64 3
  store i8 %448, ptr %451, align 1, !tbaa !14
  call void @llvm.lifetime.end.p0(i64 4, ptr %25) #5
  br label %452

452:                                              ; preds = %409
  br label %453

453:                                              ; preds = %452
  %454 = load ptr, ptr %10, align 8, !tbaa !5
  %455 = getelementptr inbounds [12 x i8], ptr %20, i64 0, i64 0
  %456 = load i32, ptr %21, align 4, !tbaa !25
  %457 = zext i32 %456 to i64
  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %454, ptr align 1 %455, i64 %457, i1 false)
  %458 = load i64, ptr %13, align 8, !tbaa !9
  %459 = load ptr, ptr %10, align 8, !tbaa !5
  %460 = getelementptr inbounds i8, ptr %459, i64 %458
  store ptr %460, ptr %10, align 8, !tbaa !5
  br label %461

461:                                              ; preds = %453, %49
  call void @knot384_masked_permute_7(ptr noundef %19, i8 noundef zeroext 44)
  br label %462

462:                                              ; preds = %461
  call void @llvm.lifetime.start.p0(i64 8, ptr %26) #5
  %463 = getelementptr inbounds %struct.knot384_masked_state_t, ptr %19, i32 0, i32 0
  %464 = getelementptr inbounds [4 x %struct.mask_x4_uint64_t], ptr %463, i64 0, i64 0
  %465 = getelementptr inbounds %struct.mask_x4_uint64_t, ptr %464, i32 0, i32 0
  %466 = load i64, ptr %465, align 8, !tbaa !15
  %467 = getelementptr inbounds %struct.knot384_masked_state_t, ptr %19, i32 0, i32 0
  %468 = getelementptr inbounds [4 x %struct.mask_x4_uint64_t], ptr %467, i64 0, i64 0
  %469 = getelementptr inbounds %struct.mask_x4_uint64_t, ptr %468, i32 0, i32 1
  %470 = load i64, ptr %469, align 8, !tbaa !18
  %471 = xor i64 %466, %470
  %472 = getelementptr inbounds %struct.knot384_masked_state_t, ptr %19, i32 0, i32 0
  %473 = getelementptr inbounds [4 x %struct.mask_x4_uint64_t], ptr %472, i64 0, i64 0
  %474 = getelementptr inbounds %struct.mask_x4_uint64_t, ptr %473, i32 0, i32 2
  %475 = load i64, ptr %474, align 8, !tbaa !19
  %476 = xor i64 %471, %475
  %477 = getelementptr inbounds %struct.knot384_masked_state_t, ptr %19, i32 0, i32 0
  %478 = getelementptr inbounds [4 x %struct.mask_x4_uint64_t], ptr %477, i64 0, i64 0
  %479 = getelementptr inbounds %struct.mask_x4_uint64_t, ptr %478, i32 0, i32 3
  %480 = load i64, ptr %479, align 8, !tbaa !20
  %481 = xor i64 %476, %480
  store i64 %481, ptr %26, align 8, !tbaa !21
  %482 = load i64, ptr %26, align 8, !tbaa !21
  %483 = trunc i64 %482 to i8
  %484 = load ptr, ptr %10, align 8, !tbaa !5
  %485 = getelementptr inbounds i8, ptr %484, i64 0
  store i8 %483, ptr %485, align 1, !tbaa !14
  %486 = load i64, ptr %26, align 8, !tbaa !21
  %487 = lshr i64 %486, 8
  %488 = trunc i64 %487 to i8
  %489 = load ptr, ptr %10, align 8, !tbaa !5
  %490 = getelementptr inbounds i8, ptr %489, i64 1
  store i8 %488, ptr %490, align 1, !tbaa !14
  %491 = load i64, ptr %26, align 8, !tbaa !21
  %492 = lshr i64 %491, 16
  %493 = trunc i64 %492 to i8
  %494 = load ptr, ptr %10, align 8, !tbaa !5
  %495 = getelementptr inbounds i8, ptr %494, i64 2
  store i8 %493, ptr %495, align 1, !tbaa !14
  %496 = load i64, ptr %26, align 8, !tbaa !21
  %497 = lshr i64 %496, 24
  %498 = trunc i64 %497 to i8
  %499 = load ptr, ptr %10, align 8, !tbaa !5
  %500 = getelementptr inbounds i8, ptr %499, i64 3
  store i8 %498, ptr %500, align 1, !tbaa !14
  %501 = load i64, ptr %26, align 8, !tbaa !21
  %502 = lshr i64 %501, 32
  %503 = trunc i64 %502 to i8
  %504 = load ptr, ptr %10, align 8, !tbaa !5
  %505 = getelementptr inbounds i8, ptr %504, i64 4
  store i8 %503, ptr %505, align 1, !tbaa !14
  %506 = load i64, ptr %26, align 8, !tbaa !21
  %507 = lshr i64 %506, 40
  %508 = trunc i64 %507 to i8
  %509 = load ptr, ptr %10, align 8, !tbaa !5
  %510 = getelementptr inbounds i8, ptr %509, i64 5
  store i8 %508, ptr %510, align 1, !tbaa !14
  %511 = load i64, ptr %26, align 8, !tbaa !21
  %512 = lshr i64 %511, 48
  %513 = trunc i64 %512 to i8
  %514 = load ptr, ptr %10, align 8, !tbaa !5
  %515 = getelementptr inbounds i8, ptr %514, i64 6
  store i8 %513, ptr %515, align 1, !tbaa !14
  %516 = load i64, ptr %26, align 8, !tbaa !21
  %517 = lshr i64 %516, 56
  %518 = trunc i64 %517 to i8
  %519 = load ptr, ptr %10, align 8, !tbaa !5
  %520 = getelementptr inbounds i8, ptr %519, i64 7
  store i8 %518, ptr %520, align 1, !tbaa !14
  call void @llvm.lifetime.end.p0(i64 8, ptr %26) #5
  br label %521

521:                                              ; preds = %462
  br label %522

522:                                              ; preds = %521
  br label %523

523:                                              ; preds = %522
  call void @llvm.lifetime.start.p0(i64 4, ptr %27) #5
  %524 = getelementptr inbounds %struct.knot384_masked_state_t, ptr %19, i32 0, i32 1
  %525 = getelementptr inbounds [4 x %struct.mask_x4_uint32_t], ptr %524, i64 0, i64 0
  %526 = getelementptr inbounds %struct.mask_x4_uint32_t, ptr %525, i32 0, i32 0
  %527 = load i32, ptr %526, align 8, !tbaa !11
  %528 = getelementptr inbounds %struct.knot384_masked_state_t, ptr %19, i32 0, i32 1
  %529 = getelementptr inbounds [4 x %struct.mask_x4_uint32_t], ptr %528, i64 0, i64 0
  %530 = getelementptr inbounds %struct.mask_x4_uint32_t, ptr %529, i32 0, i32 1
  %531 = load i32, ptr %530, align 4, !tbaa !22
  %532 = xor i32 %527, %531
  %533 = getelementptr inbounds %struct.knot384_masked_state_t, ptr %19, i32 0, i32 1
  %534 = getelementptr inbounds [4 x %struct.mask_x4_uint32_t], ptr %533, i64 0, i64 0
  %535 = getelementptr inbounds %struct.mask_x4_uint32_t, ptr %534, i32 0, i32 2
  %536 = load i32, ptr %535, align 8, !tbaa !23
  %537 = xor i32 %532, %536
  %538 = getelementptr inbounds %struct.knot384_masked_state_t, ptr %19, i32 0, i32 1
  %539 = getelementptr inbounds [4 x %struct.mask_x4_uint32_t], ptr %538, i64 0, i64 0
  %540 = getelementptr inbounds %struct.mask_x4_uint32_t, ptr %539, i32 0, i32 3
  %541 = load i32, ptr %540, align 4, !tbaa !24
  %542 = xor i32 %537, %541
  store i32 %542, ptr %27, align 4, !tbaa !25
  %543 = load i32, ptr %27, align 4, !tbaa !25
  %544 = trunc i32 %543 to i8
  %545 = load ptr, ptr %10, align 8, !tbaa !5
  %546 = getelementptr inbounds i8, ptr %545, i64 8
  %547 = getelementptr inbounds i8, ptr %546, i64 0
  store i8 %544, ptr %547, align 1, !tbaa !14
  %548 = load i32, ptr %27, align 4, !tbaa !25
  %549 = lshr i32 %548, 8
  %550 = trunc i32 %549 to i8
  %551 = load ptr, ptr %10, align 8, !tbaa !5
  %552 = getelementptr inbounds i8, ptr %551, i64 8
  %553 = getelementptr inbounds i8, ptr %552, i64 1
  store i8 %550, ptr %553, align 1, !tbaa !14
  %554 = load i32, ptr %27, align 4, !tbaa !25
  %555 = lshr i32 %554, 16
  %556 = trunc i32 %555 to i8
  %557 = load ptr, ptr %10, align 8, !tbaa !5
  %558 = getelementptr inbounds i8, ptr %557, i64 8
  %559 = getelementptr inbounds i8, ptr %558, i64 2
  store i8 %556, ptr %559, align 1, !tbaa !14
  %560 = load i32, ptr %27, align 4, !tbaa !25
  %561 = lshr i32 %560, 24
  %562 = trunc i32 %561 to i8
  %563 = load ptr, ptr %10, align 8, !tbaa !5
  %564 = getelementptr inbounds i8, ptr %563, i64 8
  %565 = getelementptr inbounds i8, ptr %564, i64 3
  store i8 %562, ptr %565, align 1, !tbaa !14
  call void @llvm.lifetime.end.p0(i64 4, ptr %27) #5
  br label %566

566:                                              ; preds = %523
  br label %567

567:                                              ; preds = %566
  br label %568

568:                                              ; preds = %567
  call void @llvm.lifetime.start.p0(i64 8, ptr %28) #5
  %569 = getelementptr inbounds %struct.knot384_masked_state_t, ptr %19, i32 0, i32 0
  %570 = getelementptr inbounds [4 x %struct.mask_x4_uint64_t], ptr %569, i64 0, i64 1
  %571 = getelementptr inbounds %struct.mask_x4_uint64_t, ptr %570, i32 0, i32 0
  %572 = load i64, ptr %571, align 8, !tbaa !15
  %573 = getelementptr inbounds %struct.knot384_masked_state_t, ptr %19, i32 0, i32 0
  %574 = getelementptr inbounds [4 x %struct.mask_x4_uint64_t], ptr %573, i64 0, i64 1
  %575 = getelementptr inbounds %struct.mask_x4_uint64_t, ptr %574, i32 0, i32 1
  %576 = load i64, ptr %575, align 8, !tbaa !18
  %577 = xor i64 %572, %576
  %578 = getelementptr inbounds %struct.knot384_masked_state_t, ptr %19, i32 0, i32 0
  %579 = getelementptr inbounds [4 x %struct.mask_x4_uint64_t], ptr %578, i64 0, i64 1
  %580 = getelementptr inbounds %struct.mask_x4_uint64_t, ptr %579, i32 0, i32 2
  %581 = load i64, ptr %580, align 8, !tbaa !19
  %582 = xor i64 %577, %581
  %583 = getelementptr inbounds %struct.knot384_masked_state_t, ptr %19, i32 0, i32 0
  %584 = getelementptr inbounds [4 x %struct.mask_x4_uint64_t], ptr %583, i64 0, i64 1
  %585 = getelementptr inbounds %struct.mask_x4_uint64_t, ptr %584, i32 0, i32 3
  %586 = load i64, ptr %585, align 8, !tbaa !20
  %587 = xor i64 %582, %586
  store i64 %587, ptr %28, align 8, !tbaa !21
  %588 = load i64, ptr %28, align 8, !tbaa !21
  %589 = trunc i64 %588 to i8
  %590 = load ptr, ptr %10, align 8, !tbaa !5
  %591 = getelementptr inbounds i8, ptr %590, i64 12
  %592 = getelementptr inbounds i8, ptr %591, i64 0
  store i8 %589, ptr %592, align 1, !tbaa !14
  %593 = load i64, ptr %28, align 8, !tbaa !21
  %594 = lshr i64 %593, 8
  %595 = trunc i64 %594 to i8
  %596 = load ptr, ptr %10, align 8, !tbaa !5
  %597 = getelementptr inbounds i8, ptr %596, i64 12
  %598 = getelementptr inbounds i8, ptr %597, i64 1
  store i8 %595, ptr %598, align 1, !tbaa !14
  %599 = load i64, ptr %28, align 8, !tbaa !21
  %600 = lshr i64 %599, 16
  %601 = trunc i64 %600 to i8
  %602 = load ptr, ptr %10, align 8, !tbaa !5
  %603 = getelementptr inbounds i8, ptr %602, i64 12
  %604 = getelementptr inbounds i8, ptr %603, i64 2
  store i8 %601, ptr %604, align 1, !tbaa !14
  %605 = load i64, ptr %28, align 8, !tbaa !21
  %606 = lshr i64 %605, 24
  %607 = trunc i64 %606 to i8
  %608 = load ptr, ptr %10, align 8, !tbaa !5
  %609 = getelementptr inbounds i8, ptr %608, i64 12
  %610 = getelementptr inbounds i8, ptr %609, i64 3
  store i8 %607, ptr %610, align 1, !tbaa !14
  %611 = load i64, ptr %28, align 8, !tbaa !21
  %612 = lshr i64 %611, 32
  %613 = trunc i64 %612 to i8
  %614 = load ptr, ptr %10, align 8, !tbaa !5
  %615 = getelementptr inbounds i8, ptr %614, i64 12
  %616 = getelementptr inbounds i8, ptr %615, i64 4
  store i8 %613, ptr %616, align 1, !tbaa !14
  %617 = load i64, ptr %28, align 8, !tbaa !21
  %618 = lshr i64 %617, 40
  %619 = trunc i64 %618 to i8
  %620 = load ptr, ptr %10, align 8, !tbaa !5
  %621 = getelementptr inbounds i8, ptr %620, i64 12
  %622 = getelementptr inbounds i8, ptr %621, i64 5
  store i8 %619, ptr %622, align 1, !tbaa !14
  %623 = load i64, ptr %28, align 8, !tbaa !21
  %624 = lshr i64 %623, 48
  %625 = trunc i64 %624 to i8
  %626 = load ptr, ptr %10, align 8, !tbaa !5
  %627 = getelementptr inbounds i8, ptr %626, i64 12
  %628 = getelementptr inbounds i8, ptr %627, i64 6
  store i8 %625, ptr %628, align 1, !tbaa !14
  %629 = load i64, ptr %28, align 8, !tbaa !21
  %630 = lshr i64 %629, 56
  %631 = trunc i64 %630 to i8
  %632 = load ptr, ptr %10, align 8, !tbaa !5
  %633 = getelementptr inbounds i8, ptr %632, i64 12
  %634 = getelementptr inbounds i8, ptr %633, i64 7
  store i8 %631, ptr %634, align 1, !tbaa !14
  call void @llvm.lifetime.end.p0(i64 8, ptr %28) #5
  br label %635

635:                                              ; preds = %568
  br label %636

636:                                              ; preds = %635
  br label %637

637:                                              ; preds = %636
  call void @llvm.lifetime.start.p0(i64 4, ptr %29) #5
  %638 = getelementptr inbounds %struct.knot384_masked_state_t, ptr %19, i32 0, i32 1
  %639 = getelementptr inbounds [4 x %struct.mask_x4_uint32_t], ptr %638, i64 0, i64 1
  %640 = getelementptr inbounds %struct.mask_x4_uint32_t, ptr %639, i32 0, i32 0
  %641 = load i32, ptr %640, align 8, !tbaa !11
  %642 = getelementptr inbounds %struct.knot384_masked_state_t, ptr %19, i32 0, i32 1
  %643 = getelementptr inbounds [4 x %struct.mask_x4_uint32_t], ptr %642, i64 0, i64 1
  %644 = getelementptr inbounds %struct.mask_x4_uint32_t, ptr %643, i32 0, i32 1
  %645 = load i32, ptr %644, align 4, !tbaa !22
  %646 = xor i32 %641, %645
  %647 = getelementptr inbounds %struct.knot384_masked_state_t, ptr %19, i32 0, i32 1
  %648 = getelementptr inbounds [4 x %struct.mask_x4_uint32_t], ptr %647, i64 0, i64 1
  %649 = getelementptr inbounds %struct.mask_x4_uint32_t, ptr %648, i32 0, i32 2
  %650 = load i32, ptr %649, align 8, !tbaa !23
  %651 = xor i32 %646, %650
  %652 = getelementptr inbounds %struct.knot384_masked_state_t, ptr %19, i32 0, i32 1
  %653 = getelementptr inbounds [4 x %struct.mask_x4_uint32_t], ptr %652, i64 0, i64 1
  %654 = getelementptr inbounds %struct.mask_x4_uint32_t, ptr %653, i32 0, i32 3
  %655 = load i32, ptr %654, align 4, !tbaa !24
  %656 = xor i32 %651, %655
  store i32 %656, ptr %29, align 4, !tbaa !25
  %657 = load i32, ptr %29, align 4, !tbaa !25
  %658 = trunc i32 %657 to i8
  %659 = load ptr, ptr %10, align 8, !tbaa !5
  %660 = getelementptr inbounds i8, ptr %659, i64 20
  %661 = getelementptr inbounds i8, ptr %660, i64 0
  store i8 %658, ptr %661, align 1, !tbaa !14
  %662 = load i32, ptr %29, align 4, !tbaa !25
  %663 = lshr i32 %662, 8
  %664 = trunc i32 %663 to i8
  %665 = load ptr, ptr %10, align 8, !tbaa !5
  %666 = getelementptr inbounds i8, ptr %665, i64 20
  %667 = getelementptr inbounds i8, ptr %666, i64 1
  store i8 %664, ptr %667, align 1, !tbaa !14
  %668 = load i32, ptr %29, align 4, !tbaa !25
  %669 = lshr i32 %668, 16
  %670 = trunc i32 %669 to i8
  %671 = load ptr, ptr %10, align 8, !tbaa !5
  %672 = getelementptr inbounds i8, ptr %671, i64 20
  %673 = getelementptr inbounds i8, ptr %672, i64 2
  store i8 %670, ptr %673, align 1, !tbaa !14
  %674 = load i32, ptr %29, align 4, !tbaa !25
  %675 = lshr i32 %674, 24
  %676 = trunc i32 %675 to i8
  %677 = load ptr, ptr %10, align 8, !tbaa !5
  %678 = getelementptr inbounds i8, ptr %677, i64 20
  %679 = getelementptr inbounds i8, ptr %678, i64 3
  store i8 %676, ptr %679, align 1, !tbaa !14
  call void @llvm.lifetime.end.p0(i64 4, ptr %29) #5
  br label %680

680:                                              ; preds = %637
  br label %681

681:                                              ; preds = %680
  call void @aead_random_finish()
  call void @llvm.lifetime.end.p0(i64 4, ptr %21) #5
  call void @llvm.lifetime.end.p0(i64 12, ptr %20) #5
  call void @llvm.lifetime.end.p0(i64 192, ptr %19) #5
  ret i32 0
}

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

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

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

declare void @aead_random_finish() #4

declare void @knot384_masked_permute_7(ptr noundef, i8 noundef zeroext) #4

; Function Attrs: nounwind uwtable
declare hidden void @knot_aead_192_384_init_masked(ptr noundef, ptr noundef, ptr noundef) #0

; Function Attrs: nounwind uwtable
declare hidden void @knot_aead_192_384_absorb_ad_masked(ptr noundef, ptr noundef, i64 noundef) #0

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: readwrite) }
attributes #3 = { nocallback nofree nounwind willreturn memory(argmem: write) }
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 long", !7, i64 0}
!11 = !{!12, !13, i64 0}
!12 = !{!"", !13, i64 0, !13, i64 4, !13, i64 8, !13, i64 12}
!13 = !{!"int", !7, i64 0}
!14 = !{!7, !7, i64 0}
!15 = !{!16, !17, i64 0}
!16 = !{!"", !17, i64 0, !17, i64 8, !17, i64 16, !17, i64 24}
!17 = !{!"long", !7, i64 0}
!18 = !{!16, !17, i64 8}
!19 = !{!16, !17, i64 16}
!20 = !{!16, !17, i64 24}
!21 = !{!17, !17, i64 0}
!22 = !{!12, !13, i64 4}
!23 = !{!12, !13, i64 8}
!24 = !{!12, !13, i64 12}
!25 = !{!13, !13, i64 0}
!26 = distinct !{!26, !27}
!27 = !{!"llvm.loop.mustprogress"}


; Optimized IR (opt -passes='default<O3>'):
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

%struct.knot384_masked_state_t = type { [4 x %struct.mask_x4_uint64_t], [4 x %struct.mask_x4_uint32_t] }
%struct.mask_x4_uint64_t = type { i64, i64, i64, i64 }
%struct.mask_x4_uint32_t = type { i32, i32, i32, i32 }

; Function Attrs: nounwind uwtable
define dso_local noundef i32 @knot_masked_192_384_aead_encrypt(ptr nocapture noundef writeonly %0, ptr nocapture noundef writeonly %1, ptr nocapture noundef readonly %2, i64 noundef %3, ptr noundef %4, i64 noundef %5, ptr nocapture noundef readnone %6, ptr noundef %7, ptr noundef %8) local_unnamed_addr #0 {
  %10 = alloca %struct.knot384_masked_state_t, align 8
  %11 = alloca [12 x i8], align 8
  call void @llvm.lifetime.start.p0(i64 192, ptr nonnull %10) #5
  call void @llvm.lifetime.start.p0(i64 12, ptr nonnull %11) #5
  %12 = add i64 %3, 24
  store i64 %12, ptr %1, align 8, !tbaa !5
  call void @knot_aead_192_384_init_masked(ptr noundef nonnull %10, ptr noundef %8, ptr noundef %7)
  %.not = icmp eq i64 %5, 0
  br i1 %.not, label %14, label %13

13:                                               ; preds = %9
  call void @knot_aead_192_384_absorb_ad_masked(ptr noundef nonnull %10, ptr noundef %4, i64 noundef %5)
  br label %14

14:                                               ; preds = %9, %13
  %15 = getelementptr inbounds i8, ptr %10, i64 128
  %16 = getelementptr inbounds i8, ptr %10, i64 176
  %17 = load i32, ptr %16, align 8, !tbaa !9
  %18 = xor i32 %17, -2147483648
  store i32 %18, ptr %16, align 8, !tbaa !9
  %.not122 = icmp eq i64 %3, 0
  br i1 %.not122, label %144, label %.preheader

.preheader:                                       ; preds = %14
  %19 = icmp ugt i64 %3, 11
  br i1 %19, label %.lr.ph, label %._crit_edge

.lr.ph:                                           ; preds = %.preheader
  %20 = getelementptr inbounds i8, ptr %10, i64 8
  %21 = getelementptr inbounds i8, ptr %10, i64 16
  %22 = getelementptr inbounds i8, ptr %10, i64 24
  %23 = getelementptr inbounds i8, ptr %10, i64 132
  %24 = getelementptr inbounds i8, ptr %10, i64 136
  %25 = getelementptr inbounds i8, ptr %10, i64 140
  br label %26

26:                                               ; preds = %.lr.ph, %26
  %.0125 = phi ptr [ %0, %.lr.ph ], [ %79, %26 ]
  %.0118124 = phi ptr [ %2, %.lr.ph ], [ %80, %26 ]
  %.0119123 = phi i64 [ %3, %.lr.ph ], [ %81, %26 ]
  %27 = load i64, ptr %.0118124, align 1
  %28 = load i64, ptr %10, align 8, !tbaa !12
  %29 = xor i64 %28, %27
  store i64 %29, ptr %10, align 8, !tbaa !12
  %30 = getelementptr inbounds i8, ptr %.0118124, i64 8
  %31 = load i32, ptr %30, align 1
  %32 = load i32, ptr %15, align 8, !tbaa !9
  %33 = xor i32 %32, %31
  store i32 %33, ptr %15, align 8, !tbaa !9
  %34 = load i64, ptr %20, align 8, !tbaa !15
  %35 = load i64, ptr %21, align 8, !tbaa !16
  %36 = load i64, ptr %22, align 8, !tbaa !17
  %37 = xor i64 %34, %35
  %38 = xor i64 %37, %36
  %39 = xor i64 %38, %29
  %40 = trunc i64 %39 to i8
  store i8 %40, ptr %.0125, align 1, !tbaa !18
  %41 = lshr i64 %39, 8
  %42 = trunc i64 %41 to i8
  %43 = getelementptr inbounds i8, ptr %.0125, i64 1
  store i8 %42, ptr %43, align 1, !tbaa !18
  %44 = lshr i64 %39, 16
  %45 = trunc i64 %44 to i8
  %46 = getelementptr inbounds i8, ptr %.0125, i64 2
  store i8 %45, ptr %46, align 1, !tbaa !18
  %47 = lshr i64 %39, 24
  %48 = trunc i64 %47 to i8
  %49 = getelementptr inbounds i8, ptr %.0125, i64 3
  store i8 %48, ptr %49, align 1, !tbaa !18
  %50 = lshr i64 %39, 32
  %51 = trunc i64 %50 to i8
  %52 = getelementptr inbounds i8, ptr %.0125, i64 4
  store i8 %51, ptr %52, align 1, !tbaa !18
  %53 = lshr i64 %39, 40
  %54 = trunc i64 %53 to i8
  %55 = getelementptr inbounds i8, ptr %.0125, i64 5
  store i8 %54, ptr %55, align 1, !tbaa !18
  %56 = lshr i64 %39, 48
  %57 = trunc i64 %56 to i8
  %58 = getelementptr inbounds i8, ptr %.0125, i64 6
  store i8 %57, ptr %58, align 1, !tbaa !18
  %59 = lshr i64 %39, 56
  %60 = trunc nuw i64 %59 to i8
  %61 = getelementptr inbounds i8, ptr %.0125, i64 7
  store i8 %60, ptr %61, align 1, !tbaa !18
  %62 = load i32, ptr %23, align 4, !tbaa !19
  %63 = load i32, ptr %24, align 8, !tbaa !20
  %64 = load i32, ptr %25, align 4, !tbaa !21
  %65 = xor i32 %62, %63
  %66 = xor i32 %65, %64
  %67 = xor i32 %66, %33
  %68 = trunc i32 %67 to i8
  %69 = getelementptr inbounds i8, ptr %.0125, i64 8
  store i8 %68, ptr %69, align 1, !tbaa !18
  %70 = lshr i32 %67, 8
  %71 = trunc i32 %70 to i8
  %72 = getelementptr inbounds i8, ptr %.0125, i64 9
  store i8 %71, ptr %72, align 1, !tbaa !18
  %73 = lshr i32 %67, 16
  %74 = trunc i32 %73 to i8
  %75 = getelementptr inbounds i8, ptr %.0125, i64 10
  store i8 %74, ptr %75, align 1, !tbaa !18
  %76 = lshr i32 %67, 24
  %77 = trunc nuw i32 %76 to i8
  %78 = getelementptr inbounds i8, ptr %.0125, i64 11
  store i8 %77, ptr %78, align 1, !tbaa !18
  call void @knot384_masked_permute_7(ptr noundef nonnull %10, i8 noundef zeroext 40) #5
  %79 = getelementptr inbounds i8, ptr %.0125, i64 12
  %80 = getelementptr inbounds i8, ptr %.0118124, i64 12
  %81 = add i64 %.0119123, -12
  %82 = icmp ugt i64 %81, 11
  br i1 %82, label %26, label %._crit_edge, !llvm.loop !22

._crit_edge:                                      ; preds = %26, %.preheader
  %.0119.lcssa = phi i64 [ %3, %.preheader ], [ %81, %26 ]
  %.0118.lcssa = phi ptr [ %2, %.preheader ], [ %80, %26 ]
  %.0.lcssa = phi ptr [ %0, %.preheader ], [ %79, %26 ]
  call void @llvm.memcpy.p0.p0.i64(ptr nonnull align 8 %11, ptr align 1 %.0118.lcssa, i64 %.0119.lcssa, i1 false)
  %83 = getelementptr inbounds [12 x i8], ptr %11, i64 0, i64 %.0119.lcssa
  store i8 1, ptr %83, align 1, !tbaa !18
  %84 = getelementptr inbounds i8, ptr %83, i64 1
  %85 = sub nuw nsw i64 11, %.0119.lcssa
  call void @llvm.memset.p0.i64(ptr nonnull align 1 %84, i8 0, i64 %85, i1 false)
  %86 = getelementptr inbounds i8, ptr %11, i64 7
  %87 = load i64, ptr %11, align 8
  %88 = getelementptr inbounds i8, ptr %11, i64 6
  %89 = getelementptr inbounds i8, ptr %11, i64 5
  %90 = getelementptr inbounds i8, ptr %11, i64 4
  %91 = getelementptr inbounds i8, ptr %11, i64 3
  %92 = getelementptr inbounds i8, ptr %11, i64 2
  %93 = getelementptr inbounds i8, ptr %11, i64 1
  %94 = load i64, ptr %10, align 8, !tbaa !12
  %95 = xor i64 %94, %87
  store i64 %95, ptr %10, align 8, !tbaa !12
  %96 = getelementptr inbounds i8, ptr %11, i64 8
  %97 = getelementptr inbounds i8, ptr %11, i64 11
  %98 = load i32, ptr %96, align 8
  %99 = getelementptr inbounds i8, ptr %11, i64 10
  %100 = getelementptr inbounds i8, ptr %11, i64 9
  %101 = load i32, ptr %15, align 8, !tbaa !9
  %102 = xor i32 %101, %98
  store i32 %102, ptr %15, align 8, !tbaa !9
  %103 = getelementptr inbounds i8, ptr %10, i64 8
  %104 = load i64, ptr %103, align 8, !tbaa !15
  %105 = getelementptr inbounds i8, ptr %10, i64 16
  %106 = load i64, ptr %105, align 8, !tbaa !16
  %107 = getelementptr inbounds i8, ptr %10, i64 24
  %108 = load i64, ptr %107, align 8, !tbaa !17
  %109 = xor i64 %104, %106
  %110 = xor i64 %109, %108
  %111 = xor i64 %110, %95
  %112 = trunc i64 %111 to i8
  store i8 %112, ptr %11, align 8, !tbaa !18
  %113 = lshr i64 %111, 8
  %114 = trunc i64 %113 to i8
  store i8 %114, ptr %93, align 1, !tbaa !18
  %115 = lshr i64 %111, 16
  %116 = trunc i64 %115 to i8
  store i8 %116, ptr %92, align 2, !tbaa !18
  %117 = lshr i64 %111, 24
  %118 = trunc i64 %117 to i8
  store i8 %118, ptr %91, align 1, !tbaa !18
  %119 = lshr i64 %111, 32
  %120 = trunc i64 %119 to i8
  store i8 %120, ptr %90, align 4, !tbaa !18
  %121 = lshr i64 %111, 40
  %122 = trunc i64 %121 to i8
  store i8 %122, ptr %89, align 1, !tbaa !18
  %123 = lshr i64 %111, 48
  %124 = trunc i64 %123 to i8
  store i8 %124, ptr %88, align 2, !tbaa !18
  %125 = lshr i64 %111, 56
  %126 = trunc nuw i64 %125 to i8
  store i8 %126, ptr %86, align 1, !tbaa !18
  %127 = getelementptr inbounds i8, ptr %10, i64 132
  %128 = load i32, ptr %127, align 4, !tbaa !19
  %129 = getelementptr inbounds i8, ptr %10, i64 136
  %130 = load i32, ptr %129, align 8, !tbaa !20
  %131 = getelementptr inbounds i8, ptr %10, i64 140
  %132 = load i32, ptr %131, align 4, !tbaa !21
  %133 = xor i32 %128, %130
  %134 = xor i32 %133, %132
  %135 = xor i32 %134, %102
  %136 = trunc i32 %135 to i8
  store i8 %136, ptr %96, align 8, !tbaa !18
  %137 = lshr i32 %135, 8
  %138 = trunc i32 %137 to i8
  store i8 %138, ptr %100, align 1, !tbaa !18
  %139 = lshr i32 %135, 16
  %140 = trunc i32 %139 to i8
  store i8 %140, ptr %99, align 2, !tbaa !18
  %141 = lshr i32 %135, 24
  %142 = trunc nuw i32 %141 to i8
  store i8 %142, ptr %97, align 1, !tbaa !18
  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %.0.lcssa, ptr nonnull align 8 %11, i64 %.0119.lcssa, i1 false)
  %143 = getelementptr inbounds i8, ptr %.0.lcssa, i64 %.0119.lcssa
  br label %144

144:                                              ; preds = %._crit_edge, %14
  %.1 = phi ptr [ %143, %._crit_edge ], [ %0, %14 ]
  call void @knot384_masked_permute_7(ptr noundef nonnull %10, i8 noundef zeroext 44) #5
  %145 = load i64, ptr %10, align 8, !tbaa !12
  %146 = getelementptr inbounds i8, ptr %10, i64 8
  %147 = load i64, ptr %146, align 8, !tbaa !15
  %148 = xor i64 %147, %145
  %149 = getelementptr inbounds i8, ptr %10, i64 16
  %150 = load i64, ptr %149, align 8, !tbaa !16
  %151 = xor i64 %148, %150
  %152 = getelementptr inbounds i8, ptr %10, i64 24
  %153 = load i64, ptr %152, align 8, !tbaa !17
  %154 = xor i64 %151, %153
  %155 = trunc i64 %154 to i8
  store i8 %155, ptr %.1, align 1, !tbaa !18
  %156 = lshr i64 %154, 8
  %157 = trunc i64 %156 to i8
  %158 = getelementptr inbounds i8, ptr %.1, i64 1
  store i8 %157, ptr %158, align 1, !tbaa !18
  %159 = lshr i64 %154, 16
  %160 = trunc i64 %159 to i8
  %161 = getelementptr inbounds i8, ptr %.1, i64 2
  store i8 %160, ptr %161, align 1, !tbaa !18
  %162 = lshr i64 %154, 24
  %163 = trunc i64 %162 to i8
  %164 = getelementptr inbounds i8, ptr %.1, i64 3
  store i8 %163, ptr %164, align 1, !tbaa !18
  %165 = lshr i64 %154, 32
  %166 = trunc i64 %165 to i8
  %167 = getelementptr inbounds i8, ptr %.1, i64 4
  store i8 %166, ptr %167, align 1, !tbaa !18
  %168 = lshr i64 %154, 40
  %169 = trunc i64 %168 to i8
  %170 = getelementptr inbounds i8, ptr %.1, i64 5
  store i8 %169, ptr %170, align 1, !tbaa !18
  %171 = lshr i64 %154, 48
  %172 = trunc i64 %171 to i8
  %173 = getelementptr inbounds i8, ptr %.1, i64 6
  store i8 %172, ptr %173, align 1, !tbaa !18
  %174 = lshr i64 %154, 56
  %175 = trunc nuw i64 %174 to i8
  %176 = getelementptr inbounds i8, ptr %.1, i64 7
  store i8 %175, ptr %176, align 1, !tbaa !18
  %177 = load i32, ptr %15, align 8, !tbaa !9
  %178 = getelementptr inbounds i8, ptr %10, i64 132
  %179 = load i32, ptr %178, align 4, !tbaa !19
  %180 = xor i32 %179, %177
  %181 = getelementptr inbounds i8, ptr %10, i64 136
  %182 = load i32, ptr %181, align 8, !tbaa !20
  %183 = xor i32 %180, %182
  %184 = getelementptr inbounds i8, ptr %10, i64 140
  %185 = load i32, ptr %184, align 4, !tbaa !21
  %186 = xor i32 %183, %185
  %187 = trunc i32 %186 to i8
  %188 = getelementptr inbounds i8, ptr %.1, i64 8
  store i8 %187, ptr %188, align 1, !tbaa !18
  %189 = lshr i32 %186, 8
  %190 = trunc i32 %189 to i8
  %191 = getelementptr inbounds i8, ptr %.1, i64 9
  store i8 %190, ptr %191, align 1, !tbaa !18
  %192 = lshr i32 %186, 16
  %193 = trunc i32 %192 to i8
  %194 = getelementptr inbounds i8, ptr %.1, i64 10
  store i8 %193, ptr %194, align 1, !tbaa !18
  %195 = lshr i32 %186, 24
  %196 = trunc nuw i32 %195 to i8
  %197 = getelementptr inbounds i8, ptr %.1, i64 11
  store i8 %196, ptr %197, align 1, !tbaa !18
  %198 = getelementptr inbounds i8, ptr %10, i64 32
  %199 = load i64, ptr %198, align 8, !tbaa !12
  %200 = getelementptr inbounds i8, ptr %10, i64 40
  %201 = load i64, ptr %200, align 8, !tbaa !15
  %202 = xor i64 %201, %199
  %203 = getelementptr inbounds i8, ptr %10, i64 48
  %204 = load i64, ptr %203, align 8, !tbaa !16
  %205 = xor i64 %202, %204
  %206 = getelementptr inbounds i8, ptr %10, i64 56
  %207 = load i64, ptr %206, align 8, !tbaa !17
  %208 = xor i64 %205, %207
  %209 = trunc i64 %208 to i8
  %210 = getelementptr inbounds i8, ptr %.1, i64 12
  store i8 %209, ptr %210, align 1, !tbaa !18
  %211 = lshr i64 %208, 8
  %212 = trunc i64 %211 to i8
  %213 = getelementptr inbounds i8, ptr %.1, i64 13
  store i8 %212, ptr %213, align 1, !tbaa !18
  %214 = lshr i64 %208, 16
  %215 = trunc i64 %214 to i8
  %216 = getelementptr inbounds i8, ptr %.1, i64 14
  store i8 %215, ptr %216, align 1, !tbaa !18
  %217 = lshr i64 %208, 24
  %218 = trunc i64 %217 to i8
  %219 = getelementptr inbounds i8, ptr %.1, i64 15
  store i8 %218, ptr %219, align 1, !tbaa !18
  %220 = lshr i64 %208, 32
  %221 = trunc i64 %220 to i8
  %222 = getelementptr inbounds i8, ptr %.1, i64 16
  store i8 %221, ptr %222, align 1, !tbaa !18
  %223 = lshr i64 %208, 40
  %224 = trunc i64 %223 to i8
  %225 = getelementptr inbounds i8, ptr %.1, i64 17
  store i8 %224, ptr %225, align 1, !tbaa !18
  %226 = lshr i64 %208, 48
  %227 = trunc i64 %226 to i8
  %228 = getelementptr inbounds i8, ptr %.1, i64 18
  store i8 %227, ptr %228, align 1, !tbaa !18
  %229 = lshr i64 %208, 56
  %230 = trunc nuw i64 %229 to i8
  %231 = getelementptr inbounds i8, ptr %.1, i64 19
  store i8 %230, ptr %231, align 1, !tbaa !18
  %232 = getelementptr inbounds i8, ptr %10, i64 144
  %233 = load i32, ptr %232, align 8, !tbaa !9
  %234 = getelementptr inbounds i8, ptr %10, i64 148
  %235 = load i32, ptr %234, align 4, !tbaa !19
  %236 = xor i32 %235, %233
  %237 = getelementptr inbounds i8, ptr %10, i64 152
  %238 = load i32, ptr %237, align 8, !tbaa !20
  %239 = xor i32 %236, %238
  %240 = getelementptr inbounds i8, ptr %10, i64 156
  %241 = load i32, ptr %240, align 4, !tbaa !21
  %242 = xor i32 %239, %241
  %243 = trunc i32 %242 to i8
  %244 = getelementptr inbounds i8, ptr %.1, i64 20
  store i8 %243, ptr %244, align 1, !tbaa !18
  %245 = lshr i32 %242, 8
  %246 = trunc i32 %245 to i8
  %247 = getelementptr inbounds i8, ptr %.1, i64 21
  store i8 %246, ptr %247, align 1, !tbaa !18
  %248 = lshr i32 %242, 16
  %249 = trunc i32 %248 to i8
  %250 = getelementptr inbounds i8, ptr %.1, i64 22
  store i8 %249, ptr %250, align 1, !tbaa !18
  %251 = lshr i32 %242, 24
  %252 = trunc nuw i32 %251 to i8
  %253 = getelementptr inbounds i8, ptr %.1, i64 23
  store i8 %252, ptr %253, align 1, !tbaa !18
  call void @aead_random_finish() #5
  call void @llvm.lifetime.end.p0(i64 12, ptr nonnull %11) #5
  call void @llvm.lifetime.end.p0(i64 192, ptr nonnull %10) #5
  ret i32 0
}

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

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

; Function Attrs: 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

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

declare void @aead_random_finish() local_unnamed_addr #4

declare void @knot384_masked_permute_7(ptr noundef, i8 noundef zeroext) local_unnamed_addr #4

; Function Attrs: nounwind uwtable
declare hidden void @knot_aead_192_384_init_masked(ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #0

; Function Attrs: nounwind uwtable
declare hidden void @knot_aead_192_384_absorb_ad_masked(ptr noundef, ptr noundef, i64 noundef) local_unnamed_addr #0

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 nosync nounwind willreturn memory(argmem: readwrite) }
attributes #2 = { mustprogress nocallback nofree nounwind willreturn memory(argmem: readwrite) }
attributes #3 = { mustprogress nocallback nofree nounwind willreturn memory(argmem: write) }
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 = !{!"long long", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!10, !11, i64 0}
!10 = !{!"", !11, i64 0, !11, i64 4, !11, i64 8, !11, i64 12}
!11 = !{!"int", !7, i64 0}
!12 = !{!13, !14, i64 0}
!13 = !{!"", !14, i64 0, !14, i64 8, !14, i64 16, !14, i64 24}
!14 = !{!"long", !7, i64 0}
!15 = !{!13, !14, i64 8}
!16 = !{!13, !14, i64 16}
!17 = !{!13, !14, i64 24}
!18 = !{!7, !7, i64 0}
!19 = !{!10, !11, i64 4}
!20 = !{!10, !11, i64 8}
!21 = !{!10, !11, i64 12}
!22 = distinct !{!22, !23}
!23 = !{!"llvm.loop.mustprogress"}


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