; LLVM IR from rweather/lightweight-crypto :: src/combined (pyjamask-128-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.pyjamask_masked_128_state_t = type { %struct.pyjamask_masked_128_key_schedule_t, [16 x i8], [16 x i8], [16 x i8], [16 x i8] }
%struct.pyjamask_masked_128_key_schedule_t = type { [60 x %struct.mask_x4_uint32_t] }
%struct.mask_x4_uint32_t = type { i32, i32, i32, i32 }

; Function Attrs: nounwind uwtable
define dso_local i32 @pyjamask_masked_128_aead_decrypt(ptr noundef %0, ptr noundef %1, ptr noundef %2, ptr noundef %3, i64 noundef %4, ptr noundef %5, i64 noundef %6, ptr noundef %7, ptr noundef %8) #0 {
  %10 = alloca i32, align 4
  %11 = alloca ptr, align 8
  %12 = alloca ptr, align 8
  %13 = alloca ptr, align 8
  %14 = alloca ptr, align 8
  %15 = alloca i64, align 8
  %16 = alloca ptr, align 8
  %17 = alloca i64, align 8
  %18 = alloca ptr, align 8
  %19 = alloca ptr, align 8
  %20 = alloca %struct.pyjamask_masked_128_state_t, align 4
  %21 = alloca ptr, align 8
  %22 = alloca [16 x i8], align 16
  %23 = alloca [16 x i8], align 16
  %24 = alloca [16 x i8], align 16
  %25 = alloca i64, align 8
  %26 = alloca i32, align 4
  %27 = alloca ptr, align 8
  %28 = alloca ptr, align 8
  %29 = alloca i32, align 4
  %30 = alloca ptr, align 8
  %31 = alloca ptr, align 8
  %32 = alloca i32, align 4
  %33 = alloca ptr, align 8
  %34 = alloca ptr, align 8
  %35 = alloca i32, align 4
  %36 = alloca ptr, align 8
  %37 = alloca ptr, align 8
  %38 = alloca ptr, align 8
  %39 = alloca i32, align 4
  %40 = alloca ptr, align 8
  %41 = alloca ptr, align 8
  %42 = alloca ptr, align 8
  %43 = alloca i32, align 4
  %44 = alloca ptr, align 8
  %45 = alloca ptr, align 8
  %46 = alloca i32, align 4
  %47 = alloca i32, align 4
  %48 = alloca ptr, align 8
  %49 = alloca ptr, align 8
  %50 = alloca i32, align 4
  %51 = alloca ptr, align 8
  %52 = alloca ptr, align 8
  %53 = alloca ptr, align 8
  %54 = alloca i32, align 4
  %55 = alloca ptr, align 8
  %56 = alloca ptr, align 8
  %57 = alloca i32, align 4
  %58 = alloca ptr, align 8
  %59 = alloca ptr, align 8
  %60 = alloca i32, align 4
  %61 = alloca ptr, align 8
  %62 = alloca ptr, align 8
  %63 = alloca i32, align 4
  store ptr %0, ptr %11, align 8, !tbaa !5
  store ptr %1, ptr %12, align 8, !tbaa !5
  store ptr %2, ptr %13, align 8, !tbaa !5
  store ptr %3, ptr %14, align 8, !tbaa !5
  store i64 %4, ptr %15, align 8, !tbaa !9
  store ptr %5, ptr %16, align 8, !tbaa !5
  store i64 %6, ptr %17, align 8, !tbaa !9
  store ptr %7, ptr %18, align 8, !tbaa !5
  store ptr %8, ptr %19, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 1024, ptr %20) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %21) #4
  %64 = load ptr, ptr %11, align 8, !tbaa !5
  store ptr %64, ptr %21, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 16, ptr %22) #4
  call void @llvm.lifetime.start.p0(i64 16, ptr %23) #4
  call void @llvm.lifetime.start.p0(i64 16, ptr %24) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %25) #4
  %65 = load ptr, ptr %13, align 8, !tbaa !5
  %66 = load i64, ptr %15, align 8, !tbaa !9
  %67 = icmp ult i64 %66, 16
  br i1 %67, label %68, label %69

68:                                               ; preds = %9
  store i32 -1, ptr %10, align 4
  store i32 1, ptr %26, align 4
  br label %398

69:                                               ; preds = %9
  %70 = load i64, ptr %15, align 8, !tbaa !9
  %71 = sub i64 %70, 16
  %72 = load ptr, ptr %12, align 8, !tbaa !5
  store i64 %71, ptr %72, align 8, !tbaa !9
  %73 = load ptr, ptr %19, align 8, !tbaa !5
  %74 = load ptr, ptr %18, align 8, !tbaa !5
  %75 = getelementptr inbounds [16 x i8], ptr %22, i64 0, i64 0
  call void @pyjamask_masked_128_init(ptr noundef %20, ptr noundef %73, ptr noundef %74, ptr noundef %75)
  %76 = getelementptr inbounds [16 x i8], ptr %23, i64 0, i64 0
  call void @llvm.memset.p0.i64(ptr align 16 %76, i8 0, i64 16, i1 false)
  store i64 1, ptr %25, align 8, !tbaa !9
  %77 = load i64, ptr %15, align 8, !tbaa !9
  %78 = sub i64 %77, 16
  store i64 %78, ptr %15, align 8, !tbaa !9
  br label %79

79:                                               ; preds = %239, %69
  %80 = load i64, ptr %15, align 8, !tbaa !9
  %81 = icmp uge i64 %80, 16
  br i1 %81, label %82, label %248

82:                                               ; preds = %79
  %83 = load i64, ptr %25, align 8, !tbaa !9
  %84 = and i64 %83, 1
  %85 = icmp ne i64 %84, 0
  br i1 %85, label %86, label %110

86:                                               ; preds = %82
  br label %87

87:                                               ; preds = %86
  call void @llvm.lifetime.start.p0(i64 8, ptr %27) #4
  %88 = getelementptr inbounds [16 x i8], ptr %22, i64 0, i64 0
  store ptr %88, ptr %27, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %28) #4
  %89 = getelementptr inbounds %struct.pyjamask_masked_128_state_t, ptr %20, i32 0, i32 3
  %90 = getelementptr inbounds [16 x i8], ptr %89, i64 0, i64 0
  store ptr %90, ptr %28, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %29) #4
  store i32 16, ptr %29, align 4, !tbaa !11
  br label %91

91:                                               ; preds = %94, %87
  %92 = load i32, ptr %29, align 4, !tbaa !11
  %93 = icmp ugt i32 %92, 0
  br i1 %93, label %94, label %107

94:                                               ; preds = %91
  %95 = load ptr, ptr %28, align 8, !tbaa !5
  %96 = getelementptr inbounds i8, ptr %95, i32 1
  store ptr %96, ptr %28, align 8, !tbaa !5
  %97 = load i8, ptr %95, align 1, !tbaa !13
  %98 = zext i8 %97 to i32
  %99 = load ptr, ptr %27, align 8, !tbaa !5
  %100 = getelementptr inbounds i8, ptr %99, i32 1
  store ptr %100, ptr %27, align 8, !tbaa !5
  %101 = load i8, ptr %99, align 1, !tbaa !13
  %102 = zext i8 %101 to i32
  %103 = xor i32 %102, %98
  %104 = trunc i32 %103 to i8
  store i8 %104, ptr %99, align 1, !tbaa !13
  %105 = load i32, ptr %29, align 4, !tbaa !11
  %106 = add i32 %105, -1
  store i32 %106, ptr %29, align 4, !tbaa !11
  br label %91, !llvm.loop !14

107:                                              ; preds = %91
  call void @llvm.lifetime.end.p0(i64 4, ptr %29) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %28) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %27) #4
  br label %108

108:                                              ; preds = %107
  br label %109

109:                                              ; preds = %108
  br label %164

110:                                              ; preds = %82
  %111 = load i64, ptr %25, align 8, !tbaa !9
  %112 = and i64 %111, 3
  %113 = icmp eq i64 %112, 2
  br i1 %113, label %114, label %138

114:                                              ; preds = %110
  br label %115

115:                                              ; preds = %114
  call void @llvm.lifetime.start.p0(i64 8, ptr %30) #4
  %116 = getelementptr inbounds [16 x i8], ptr %22, i64 0, i64 0
  store ptr %116, ptr %30, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %31) #4
  %117 = getelementptr inbounds %struct.pyjamask_masked_128_state_t, ptr %20, i32 0, i32 4
  %118 = getelementptr inbounds [16 x i8], ptr %117, i64 0, i64 0
  store ptr %118, ptr %31, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %32) #4
  store i32 16, ptr %32, align 4, !tbaa !11
  br label %119

119:                                              ; preds = %122, %115
  %120 = load i32, ptr %32, align 4, !tbaa !11
  %121 = icmp ugt i32 %120, 0
  br i1 %121, label %122, label %135

122:                                              ; preds = %119
  %123 = load ptr, ptr %31, align 8, !tbaa !5
  %124 = getelementptr inbounds i8, ptr %123, i32 1
  store ptr %124, ptr %31, align 8, !tbaa !5
  %125 = load i8, ptr %123, align 1, !tbaa !13
  %126 = zext i8 %125 to i32
  %127 = load ptr, ptr %30, align 8, !tbaa !5
  %128 = getelementptr inbounds i8, ptr %127, i32 1
  store ptr %128, ptr %30, align 8, !tbaa !5
  %129 = load i8, ptr %127, align 1, !tbaa !13
  %130 = zext i8 %129 to i32
  %131 = xor i32 %130, %126
  %132 = trunc i32 %131 to i8
  store i8 %132, ptr %127, align 1, !tbaa !13
  %133 = load i32, ptr %32, align 4, !tbaa !11
  %134 = add i32 %133, -1
  store i32 %134, ptr %32, align 4, !tbaa !11
  br label %119, !llvm.loop !16

135:                                              ; preds = %119
  call void @llvm.lifetime.end.p0(i64 4, ptr %32) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %31) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %30) #4
  br label %136

136:                                              ; preds = %135
  br label %137

137:                                              ; preds = %136
  br label %163

138:                                              ; preds = %110
  %139 = getelementptr inbounds [16 x i8], ptr %24, i64 0, i64 0
  %140 = load i64, ptr %25, align 8, !tbaa !9
  call void @pyjamask_masked_128_calculate_L(ptr noundef %20, ptr noundef %139, i64 noundef %140)
  br label %141

141:                                              ; preds = %138
  call void @llvm.lifetime.start.p0(i64 8, ptr %33) #4
  %142 = getelementptr inbounds [16 x i8], ptr %22, i64 0, i64 0
  store ptr %142, ptr %33, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %34) #4
  %143 = getelementptr inbounds [16 x i8], ptr %24, i64 0, i64 0
  store ptr %143, ptr %34, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %35) #4
  store i32 16, ptr %35, align 4, !tbaa !11
  br label %144

144:                                              ; preds = %147, %141
  %145 = load i32, ptr %35, align 4, !tbaa !11
  %146 = icmp ugt i32 %145, 0
  br i1 %146, label %147, label %160

147:                                              ; preds = %144
  %148 = load ptr, ptr %34, align 8, !tbaa !5
  %149 = getelementptr inbounds i8, ptr %148, i32 1
  store ptr %149, ptr %34, align 8, !tbaa !5
  %150 = load i8, ptr %148, align 1, !tbaa !13
  %151 = zext i8 %150 to i32
  %152 = load ptr, ptr %33, align 8, !tbaa !5
  %153 = getelementptr inbounds i8, ptr %152, i32 1
  store ptr %153, ptr %33, align 8, !tbaa !5
  %154 = load i8, ptr %152, align 1, !tbaa !13
  %155 = zext i8 %154 to i32
  %156 = xor i32 %155, %151
  %157 = trunc i32 %156 to i8
  store i8 %157, ptr %152, align 1, !tbaa !13
  %158 = load i32, ptr %35, align 4, !tbaa !11
  %159 = add i32 %158, -1
  store i32 %159, ptr %35, align 4, !tbaa !11
  br label %144, !llvm.loop !17

160:                                              ; preds = %144
  call void @llvm.lifetime.end.p0(i64 4, ptr %35) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %34) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %33) #4
  br label %161

161:                                              ; preds = %160
  br label %162

162:                                              ; preds = %161
  br label %163

163:                                              ; preds = %162, %137
  br label %164

164:                                              ; preds = %163, %109
  br label %165

165:                                              ; preds = %164
  call void @llvm.lifetime.start.p0(i64 8, ptr %36) #4
  %166 = getelementptr inbounds [16 x i8], ptr %24, i64 0, i64 0
  store ptr %166, ptr %36, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %37) #4
  %167 = getelementptr inbounds [16 x i8], ptr %22, i64 0, i64 0
  store ptr %167, ptr %37, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %38) #4
  %168 = load ptr, ptr %14, align 8, !tbaa !5
  store ptr %168, ptr %38, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %39) #4
  store i32 16, ptr %39, align 4, !tbaa !11
  br label %169

169:                                              ; preds = %172, %165
  %170 = load i32, ptr %39, align 4, !tbaa !11
  %171 = icmp ugt i32 %170, 0
  br i1 %171, label %172, label %187

172:                                              ; preds = %169
  %173 = load ptr, ptr %37, align 8, !tbaa !5
  %174 = getelementptr inbounds i8, ptr %173, i32 1
  store ptr %174, ptr %37, align 8, !tbaa !5
  %175 = load i8, ptr %173, align 1, !tbaa !13
  %176 = zext i8 %175 to i32
  %177 = load ptr, ptr %38, align 8, !tbaa !5
  %178 = getelementptr inbounds i8, ptr %177, i32 1
  store ptr %178, ptr %38, align 8, !tbaa !5
  %179 = load i8, ptr %177, align 1, !tbaa !13
  %180 = zext i8 %179 to i32
  %181 = xor i32 %176, %180
  %182 = trunc i32 %181 to i8
  %183 = load ptr, ptr %36, align 8, !tbaa !5
  %184 = getelementptr inbounds i8, ptr %183, i32 1
  store ptr %184, ptr %36, align 8, !tbaa !5
  store i8 %182, ptr %183, align 1, !tbaa !13
  %185 = load i32, ptr %39, align 4, !tbaa !11
  %186 = add i32 %185, -1
  store i32 %186, ptr %39, align 4, !tbaa !11
  br label %169, !llvm.loop !18

187:                                              ; preds = %169
  call void @llvm.lifetime.end.p0(i64 4, ptr %39) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %38) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %37) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %36) #4
  br label %188

188:                                              ; preds = %187
  br label %189

189:                                              ; preds = %188
  %190 = getelementptr inbounds %struct.pyjamask_masked_128_state_t, ptr %20, i32 0, i32 0
  %191 = getelementptr inbounds [16 x i8], ptr %24, i64 0, i64 0
  %192 = getelementptr inbounds [16 x i8], ptr %24, i64 0, i64 0
  call void @pyjamask_masked_128_decrypt(ptr noundef %190, ptr noundef %191, ptr noundef %192)
  br label %193

193:                                              ; preds = %189
  call void @llvm.lifetime.start.p0(i64 8, ptr %40) #4
  %194 = load ptr, ptr %11, align 8, !tbaa !5
  store ptr %194, ptr %40, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %41) #4
  %195 = getelementptr inbounds [16 x i8], ptr %24, i64 0, i64 0
  store ptr %195, ptr %41, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %42) #4
  %196 = getelementptr inbounds [16 x i8], ptr %22, i64 0, i64 0
  store ptr %196, ptr %42, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %43) #4
  store i32 16, ptr %43, align 4, !tbaa !11
  br label %197

197:                                              ; preds = %200, %193
  %198 = load i32, ptr %43, align 4, !tbaa !11
  %199 = icmp ugt i32 %198, 0
  br i1 %199, label %200, label %215

200:                                              ; preds = %197
  %201 = load ptr, ptr %41, align 8, !tbaa !5
  %202 = getelementptr inbounds i8, ptr %201, i32 1
  store ptr %202, ptr %41, align 8, !tbaa !5
  %203 = load i8, ptr %201, align 1, !tbaa !13
  %204 = zext i8 %203 to i32
  %205 = load ptr, ptr %42, align 8, !tbaa !5
  %206 = getelementptr inbounds i8, ptr %205, i32 1
  store ptr %206, ptr %42, align 8, !tbaa !5
  %207 = load i8, ptr %205, align 1, !tbaa !13
  %208 = zext i8 %207 to i32
  %209 = xor i32 %204, %208
  %210 = trunc i32 %209 to i8
  %211 = load ptr, ptr %40, align 8, !tbaa !5
  %212 = getelementptr inbounds i8, ptr %211, i32 1
  store ptr %212, ptr %40, align 8, !tbaa !5
  store i8 %210, ptr %211, align 1, !tbaa !13
  %213 = load i32, ptr %43, align 4, !tbaa !11
  %214 = add i32 %213, -1
  store i32 %214, ptr %43, align 4, !tbaa !11
  br label %197, !llvm.loop !19

215:                                              ; preds = %197
  call void @llvm.lifetime.end.p0(i64 4, ptr %43) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %42) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %41) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %40) #4
  br label %216

216:                                              ; preds = %215
  br label %217

217:                                              ; preds = %216
  br label %218

218:                                              ; preds = %217
  call void @llvm.lifetime.start.p0(i64 8, ptr %44) #4
  %219 = getelementptr inbounds [16 x i8], ptr %23, i64 0, i64 0
  store ptr %219, ptr %44, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %45) #4
  %220 = load ptr, ptr %11, align 8, !tbaa !5
  store ptr %220, ptr %45, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %46) #4
  store i32 16, ptr %46, align 4, !tbaa !11
  br label %221

221:                                              ; preds = %224, %218
  %222 = load i32, ptr %46, align 4, !tbaa !11
  %223 = icmp ugt i32 %222, 0
  br i1 %223, label %224, label %237

224:                                              ; preds = %221
  %225 = load ptr, ptr %45, align 8, !tbaa !5
  %226 = getelementptr inbounds i8, ptr %225, i32 1
  store ptr %226, ptr %45, align 8, !tbaa !5
  %227 = load i8, ptr %225, align 1, !tbaa !13
  %228 = zext i8 %227 to i32
  %229 = load ptr, ptr %44, align 8, !tbaa !5
  %230 = getelementptr inbounds i8, ptr %229, i32 1
  store ptr %230, ptr %44, align 8, !tbaa !5
  %231 = load i8, ptr %229, align 1, !tbaa !13
  %232 = zext i8 %231 to i32
  %233 = xor i32 %232, %228
  %234 = trunc i32 %233 to i8
  store i8 %234, ptr %229, align 1, !tbaa !13
  %235 = load i32, ptr %46, align 4, !tbaa !11
  %236 = add i32 %235, -1
  store i32 %236, ptr %46, align 4, !tbaa !11
  br label %221, !llvm.loop !20

237:                                              ; preds = %221
  call void @llvm.lifetime.end.p0(i64 4, ptr %46) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %45) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %44) #4
  br label %238

238:                                              ; preds = %237
  br label %239

239:                                              ; preds = %238
  %240 = load ptr, ptr %14, align 8, !tbaa !5
  %241 = getelementptr inbounds i8, ptr %240, i64 16
  store ptr %241, ptr %14, align 8, !tbaa !5
  %242 = load ptr, ptr %11, align 8, !tbaa !5
  %243 = getelementptr inbounds i8, ptr %242, i64 16
  store ptr %243, ptr %11, align 8, !tbaa !5
  %244 = load i64, ptr %15, align 8, !tbaa !9
  %245 = sub i64 %244, 16
  store i64 %245, ptr %15, align 8, !tbaa !9
  %246 = load i64, ptr %25, align 8, !tbaa !9
  %247 = add i64 %246, 1
  store i64 %247, ptr %25, align 8, !tbaa !9
  br label %79, !llvm.loop !21

248:                                              ; preds = %79
  %249 = load i64, ptr %15, align 8, !tbaa !9
  %250 = icmp ugt i64 %249, 0
  br i1 %250, label %251, label %340

251:                                              ; preds = %248
  call void @llvm.lifetime.start.p0(i64 4, ptr %47) #4
  %252 = load i64, ptr %15, align 8, !tbaa !9
  %253 = trunc i64 %252 to i32
  store i32 %253, ptr %47, align 4, !tbaa !11
  br label %254

254:                                              ; preds = %251
  call void @llvm.lifetime.start.p0(i64 8, ptr %48) #4
  %255 = getelementptr inbounds [16 x i8], ptr %22, i64 0, i64 0
  store ptr %255, ptr %48, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %49) #4
  %256 = getelementptr inbounds %struct.pyjamask_masked_128_state_t, ptr %20, i32 0, i32 1
  %257 = getelementptr inbounds [16 x i8], ptr %256, i64 0, i64 0
  store ptr %257, ptr %49, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %50) #4
  store i32 16, ptr %50, align 4, !tbaa !11
  br label %258

258:                                              ; preds = %261, %254
  %259 = load i32, ptr %50, align 4, !tbaa !11
  %260 = icmp ugt i32 %259, 0
  br i1 %260, label %261, label %274

261:                                              ; preds = %258
  %262 = load ptr, ptr %49, align 8, !tbaa !5
  %263 = getelementptr inbounds i8, ptr %262, i32 1
  store ptr %263, ptr %49, align 8, !tbaa !5
  %264 = load i8, ptr %262, align 1, !tbaa !13
  %265 = zext i8 %264 to i32
  %266 = load ptr, ptr %48, align 8, !tbaa !5
  %267 = getelementptr inbounds i8, ptr %266, i32 1
  store ptr %267, ptr %48, align 8, !tbaa !5
  %268 = load i8, ptr %266, align 1, !tbaa !13
  %269 = zext i8 %268 to i32
  %270 = xor i32 %269, %265
  %271 = trunc i32 %270 to i8
  store i8 %271, ptr %266, align 1, !tbaa !13
  %272 = load i32, ptr %50, align 4, !tbaa !11
  %273 = add i32 %272, -1
  store i32 %273, ptr %50, align 4, !tbaa !11
  br label %258, !llvm.loop !22

274:                                              ; preds = %258
  call void @llvm.lifetime.end.p0(i64 4, ptr %50) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %49) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %48) #4
  br label %275

275:                                              ; preds = %274
  br label %276

276:                                              ; preds = %275
  %277 = getelementptr inbounds %struct.pyjamask_masked_128_state_t, ptr %20, i32 0, i32 0
  %278 = getelementptr inbounds [16 x i8], ptr %24, i64 0, i64 0
  %279 = getelementptr inbounds [16 x i8], ptr %22, i64 0, i64 0
  call void @pyjamask_masked_128_encrypt(ptr noundef %277, ptr noundef %278, ptr noundef %279)
  br label %280

280:                                              ; preds = %276
  call void @llvm.lifetime.start.p0(i64 8, ptr %51) #4
  %281 = load ptr, ptr %11, align 8, !tbaa !5
  store ptr %281, ptr %51, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %52) #4
  %282 = getelementptr inbounds [16 x i8], ptr %24, i64 0, i64 0
  store ptr %282, ptr %52, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %53) #4
  %283 = load ptr, ptr %14, align 8, !tbaa !5
  store ptr %283, ptr %53, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %54) #4
  %284 = load i32, ptr %47, align 4, !tbaa !11
  store i32 %284, ptr %54, align 4, !tbaa !11
  br label %285

285:                                              ; preds = %288, %280
  %286 = load i32, ptr %54, align 4, !tbaa !11
  %287 = icmp ugt i32 %286, 0
  br i1 %287, label %288, label %303

288:                                              ; preds = %285
  %289 = load ptr, ptr %52, align 8, !tbaa !5
  %290 = getelementptr inbounds i8, ptr %289, i32 1
  store ptr %290, ptr %52, align 8, !tbaa !5
  %291 = load i8, ptr %289, align 1, !tbaa !13
  %292 = zext i8 %291 to i32
  %293 = load ptr, ptr %53, align 8, !tbaa !5
  %294 = getelementptr inbounds i8, ptr %293, i32 1
  store ptr %294, ptr %53, align 8, !tbaa !5
  %295 = load i8, ptr %293, align 1, !tbaa !13
  %296 = zext i8 %295 to i32
  %297 = xor i32 %292, %296
  %298 = trunc i32 %297 to i8
  %299 = load ptr, ptr %51, align 8, !tbaa !5
  %300 = getelementptr inbounds i8, ptr %299, i32 1
  store ptr %300, ptr %51, align 8, !tbaa !5
  store i8 %298, ptr %299, align 1, !tbaa !13
  %301 = load i32, ptr %54, align 4, !tbaa !11
  %302 = add i32 %301, -1
  store i32 %302, ptr %54, align 4, !tbaa !11
  br label %285, !llvm.loop !23

303:                                              ; preds = %285
  call void @llvm.lifetime.end.p0(i64 4, ptr %54) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %53) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %52) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %51) #4
  br label %304

304:                                              ; preds = %303
  br label %305

305:                                              ; preds = %304
  br label %306

306:                                              ; preds = %305
  call void @llvm.lifetime.start.p0(i64 8, ptr %55) #4
  %307 = getelementptr inbounds [16 x i8], ptr %23, i64 0, i64 0
  store ptr %307, ptr %55, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %56) #4
  %308 = load ptr, ptr %11, align 8, !tbaa !5
  store ptr %308, ptr %56, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %57) #4
  %309 = load i32, ptr %47, align 4, !tbaa !11
  store i32 %309, ptr %57, align 4, !tbaa !11
  br label %310

310:                                              ; preds = %313, %306
  %311 = load i32, ptr %57, align 4, !tbaa !11
  %312 = icmp ugt i32 %311, 0
  br i1 %312, label %313, label %326

313:                                              ; preds = %310
  %314 = load ptr, ptr %56, align 8, !tbaa !5
  %315 = getelementptr inbounds i8, ptr %314, i32 1
  store ptr %315, ptr %56, align 8, !tbaa !5
  %316 = load i8, ptr %314, align 1, !tbaa !13
  %317 = zext i8 %316 to i32
  %318 = load ptr, ptr %55, align 8, !tbaa !5
  %319 = getelementptr inbounds i8, ptr %318, i32 1
  store ptr %319, ptr %55, align 8, !tbaa !5
  %320 = load i8, ptr %318, align 1, !tbaa !13
  %321 = zext i8 %320 to i32
  %322 = xor i32 %321, %317
  %323 = trunc i32 %322 to i8
  store i8 %323, ptr %318, align 1, !tbaa !13
  %324 = load i32, ptr %57, align 4, !tbaa !11
  %325 = add i32 %324, -1
  store i32 %325, ptr %57, align 4, !tbaa !11
  br label %310, !llvm.loop !24

326:                                              ; preds = %310
  call void @llvm.lifetime.end.p0(i64 4, ptr %57) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %56) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %55) #4
  br label %327

327:                                              ; preds = %326
  br label %328

328:                                              ; preds = %327
  %329 = load i32, ptr %47, align 4, !tbaa !11
  %330 = zext i32 %329 to i64
  %331 = getelementptr inbounds [16 x i8], ptr %23, i64 0, i64 %330
  %332 = load i8, ptr %331, align 1, !tbaa !13
  %333 = zext i8 %332 to i32
  %334 = xor i32 %333, 128
  %335 = trunc i32 %334 to i8
  store i8 %335, ptr %331, align 1, !tbaa !13
  %336 = load i32, ptr %47, align 4, !tbaa !11
  %337 = load ptr, ptr %14, align 8, !tbaa !5
  %338 = zext i32 %336 to i64
  %339 = getelementptr inbounds i8, ptr %337, i64 %338
  store ptr %339, ptr %14, align 8, !tbaa !5
  call void @llvm.lifetime.end.p0(i64 4, ptr %47) #4
  br label %340

340:                                              ; preds = %328, %248
  br label %341

341:                                              ; preds = %340
  call void @llvm.lifetime.start.p0(i64 8, ptr %58) #4
  %342 = getelementptr inbounds [16 x i8], ptr %23, i64 0, i64 0
  store ptr %342, ptr %58, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %59) #4
  %343 = getelementptr inbounds [16 x i8], ptr %22, i64 0, i64 0
  store ptr %343, ptr %59, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %60) #4
  store i32 16, ptr %60, align 4, !tbaa !11
  br label %344

344:                                              ; preds = %347, %341
  %345 = load i32, ptr %60, align 4, !tbaa !11
  %346 = icmp ugt i32 %345, 0
  br i1 %346, label %347, label %360

347:                                              ; preds = %344
  %348 = load ptr, ptr %59, align 8, !tbaa !5
  %349 = getelementptr inbounds i8, ptr %348, i32 1
  store ptr %349, ptr %59, align 8, !tbaa !5
  %350 = load i8, ptr %348, align 1, !tbaa !13
  %351 = zext i8 %350 to i32
  %352 = load ptr, ptr %58, align 8, !tbaa !5
  %353 = getelementptr inbounds i8, ptr %352, i32 1
  store ptr %353, ptr %58, align 8, !tbaa !5
  %354 = load i8, ptr %352, align 1, !tbaa !13
  %355 = zext i8 %354 to i32
  %356 = xor i32 %355, %351
  %357 = trunc i32 %356 to i8
  store i8 %357, ptr %352, align 1, !tbaa !13
  %358 = load i32, ptr %60, align 4, !tbaa !11
  %359 = add i32 %358, -1
  store i32 %359, ptr %60, align 4, !tbaa !11
  br label %344, !llvm.loop !25

360:                                              ; preds = %344
  call void @llvm.lifetime.end.p0(i64 4, ptr %60) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %59) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %58) #4
  br label %361

361:                                              ; preds = %360
  br label %362

362:                                              ; preds = %361
  br label %363

363:                                              ; preds = %362
  call void @llvm.lifetime.start.p0(i64 8, ptr %61) #4
  %364 = getelementptr inbounds [16 x i8], ptr %23, i64 0, i64 0
  store ptr %364, ptr %61, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %62) #4
  %365 = getelementptr inbounds %struct.pyjamask_masked_128_state_t, ptr %20, i32 0, i32 2
  %366 = getelementptr inbounds [16 x i8], ptr %365, i64 0, i64 0
  store ptr %366, ptr %62, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %63) #4
  store i32 16, ptr %63, align 4, !tbaa !11
  br label %367

367:                                              ; preds = %370, %363
  %368 = load i32, ptr %63, align 4, !tbaa !11
  %369 = icmp ugt i32 %368, 0
  br i1 %369, label %370, label %383

370:                                              ; preds = %367
  %371 = load ptr, ptr %62, align 8, !tbaa !5
  %372 = getelementptr inbounds i8, ptr %371, i32 1
  store ptr %372, ptr %62, align 8, !tbaa !5
  %373 = load i8, ptr %371, align 1, !tbaa !13
  %374 = zext i8 %373 to i32
  %375 = load ptr, ptr %61, align 8, !tbaa !5
  %376 = getelementptr inbounds i8, ptr %375, i32 1
  store ptr %376, ptr %61, align 8, !tbaa !5
  %377 = load i8, ptr %375, align 1, !tbaa !13
  %378 = zext i8 %377 to i32
  %379 = xor i32 %378, %374
  %380 = trunc i32 %379 to i8
  store i8 %380, ptr %375, align 1, !tbaa !13
  %381 = load i32, ptr %63, align 4, !tbaa !11
  %382 = add i32 %381, -1
  store i32 %382, ptr %63, align 4, !tbaa !11
  br label %367, !llvm.loop !26

383:                                              ; preds = %367
  call void @llvm.lifetime.end.p0(i64 4, ptr %63) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %62) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %61) #4
  br label %384

384:                                              ; preds = %383
  br label %385

385:                                              ; preds = %384
  %386 = getelementptr inbounds %struct.pyjamask_masked_128_state_t, ptr %20, i32 0, i32 0
  %387 = getelementptr inbounds [16 x i8], ptr %23, i64 0, i64 0
  %388 = getelementptr inbounds [16 x i8], ptr %23, i64 0, i64 0
  call void @pyjamask_masked_128_encrypt(ptr noundef %386, ptr noundef %387, ptr noundef %388)
  %389 = getelementptr inbounds [16 x i8], ptr %23, i64 0, i64 0
  %390 = load ptr, ptr %16, align 8, !tbaa !5
  %391 = load i64, ptr %17, align 8, !tbaa !9
  call void @pyjamask_masked_128_process_ad(ptr noundef %20, ptr noundef %389, ptr noundef %390, i64 noundef %391)
  %392 = load ptr, ptr %21, align 8, !tbaa !5
  %393 = load ptr, ptr %12, align 8, !tbaa !5
  %394 = load i64, ptr %393, align 8, !tbaa !9
  %395 = getelementptr inbounds [16 x i8], ptr %23, i64 0, i64 0
  %396 = load ptr, ptr %14, align 8, !tbaa !5
  %397 = call i32 @aead_check_tag(ptr noundef %392, i64 noundef %394, ptr noundef %395, ptr noundef %396, i32 noundef 16)
  store i32 %397, ptr %10, align 4
  store i32 1, ptr %26, align 4
  br label %398

398:                                              ; preds = %385, %68
  call void @llvm.lifetime.end.p0(i64 8, ptr %25) #4
  call void @llvm.lifetime.end.p0(i64 16, ptr %24) #4
  call void @llvm.lifetime.end.p0(i64 16, ptr %23) #4
  call void @llvm.lifetime.end.p0(i64 16, ptr %22) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %21) #4
  call void @llvm.lifetime.end.p0(i64 1024, ptr %20) #4
  %399 = load i32, ptr %10, align 4
  ret i32 %399
}

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

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

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

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

declare void @pyjamask_masked_128_encrypt(ptr noundef, ptr noundef, ptr noundef) #3

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

declare void @pyjamask_masked_128_decrypt(ptr noundef, ptr noundef, ptr noundef) #3

declare i32 @aead_check_tag(ptr noundef, i64 noundef, ptr noundef, ptr noundef, i32 noundef) #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 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #2 = { nocallback nofree nounwind willreturn memory(argmem: write) }
attributes #3 = { "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #4 = { nounwind }

!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, !12, i64 0}
!12 = !{!"int", !7, i64 0}
!13 = !{!7, !7, i64 0}
!14 = distinct !{!14, !15}
!15 = !{!"llvm.loop.mustprogress"}
!16 = distinct !{!16, !15}
!17 = distinct !{!17, !15}
!18 = distinct !{!18, !15}
!19 = distinct !{!19, !15}
!20 = distinct !{!20, !15}
!21 = distinct !{!21, !15}
!22 = distinct !{!22, !15}
!23 = distinct !{!23, !15}
!24 = distinct !{!24, !15}
!25 = distinct !{!25, !15}
!26 = distinct !{!26, !15}


; 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.pyjamask_masked_128_state_t = type { %struct.pyjamask_masked_128_key_schedule_t, [16 x i8], [16 x i8], [16 x i8], [16 x i8] }
%struct.pyjamask_masked_128_key_schedule_t = type { [60 x %struct.mask_x4_uint32_t] }
%struct.mask_x4_uint32_t = type { i32, i32, i32, i32 }

; Function Attrs: nounwind uwtable
define dso_local i32 @pyjamask_masked_128_aead_decrypt(ptr noundef %0, ptr nocapture noundef %1, ptr nocapture noundef readnone %2, ptr noundef %3, i64 noundef %4, ptr noundef %5, i64 noundef %6, ptr noundef %7, ptr noundef %8) local_unnamed_addr #0 {
  %10 = alloca %struct.pyjamask_masked_128_state_t, align 4
  %11 = alloca [16 x i8], align 16
  %12 = alloca [16 x i8], align 16
  %13 = alloca [16 x i8], align 16
  %14 = ptrtoint ptr %13 to i64
  call void @llvm.lifetime.start.p0(i64 1024, ptr nonnull %10) #4
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %11) #4
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %12) #4
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %13) #4
  %15 = icmp ult i64 %4, 16
  br i1 %15, label %316, label %16

16:                                               ; preds = %9
  %17 = add i64 %4, -16
  store i64 %17, ptr %1, align 8, !tbaa !5
  call void @pyjamask_masked_128_init(ptr noundef nonnull %10, ptr noundef %8, ptr noundef %7, ptr noundef nonnull %11)
  call void @llvm.memset.p0.i64(ptr noundef nonnull align 16 dereferenceable(16) %12, i8 0, i64 16, i1 false)
  %18 = icmp ugt i64 %17, 15
  br i1 %18, label %.lr.ph, label %._crit_edge

.lr.ph:                                           ; preds = %16
  %19 = getelementptr inbounds i8, ptr %10, i64 992
  %20 = getelementptr inbounds i8, ptr %10, i64 1008
  %21 = add i64 %4, -32
  %22 = lshr i64 %21, 4
  %23 = getelementptr inbounds i8, ptr %10, i64 993
  %24 = getelementptr inbounds i8, ptr %11, i64 1
  %25 = getelementptr inbounds i8, ptr %10, i64 994
  %26 = getelementptr inbounds i8, ptr %11, i64 2
  %27 = getelementptr inbounds i8, ptr %10, i64 995
  %28 = getelementptr inbounds i8, ptr %11, i64 3
  %29 = getelementptr inbounds i8, ptr %10, i64 996
  %30 = getelementptr inbounds i8, ptr %11, i64 4
  %31 = getelementptr inbounds i8, ptr %10, i64 997
  %32 = getelementptr inbounds i8, ptr %11, i64 5
  %33 = getelementptr inbounds i8, ptr %10, i64 998
  %34 = getelementptr inbounds i8, ptr %11, i64 6
  %35 = getelementptr inbounds i8, ptr %10, i64 999
  %36 = getelementptr inbounds i8, ptr %11, i64 7
  %37 = getelementptr inbounds i8, ptr %10, i64 1000
  %38 = getelementptr inbounds i8, ptr %11, i64 8
  %39 = getelementptr inbounds i8, ptr %10, i64 1001
  %40 = getelementptr inbounds i8, ptr %11, i64 9
  %41 = getelementptr inbounds i8, ptr %10, i64 1002
  %42 = getelementptr inbounds i8, ptr %11, i64 10
  %43 = getelementptr inbounds i8, ptr %10, i64 1003
  %44 = getelementptr inbounds i8, ptr %11, i64 11
  %45 = getelementptr inbounds i8, ptr %10, i64 1004
  %46 = getelementptr inbounds i8, ptr %11, i64 12
  %47 = getelementptr inbounds i8, ptr %10, i64 1005
  %48 = getelementptr inbounds i8, ptr %11, i64 13
  %49 = getelementptr inbounds i8, ptr %10, i64 1006
  %50 = getelementptr inbounds i8, ptr %11, i64 14
  %51 = getelementptr inbounds i8, ptr %10, i64 1007
  %52 = getelementptr inbounds i8, ptr %11, i64 15
  %53 = getelementptr inbounds i8, ptr %10, i64 1009
  %54 = getelementptr inbounds i8, ptr %11, i64 1
  %55 = getelementptr inbounds i8, ptr %10, i64 1010
  %56 = getelementptr inbounds i8, ptr %11, i64 2
  %57 = getelementptr inbounds i8, ptr %10, i64 1011
  %58 = getelementptr inbounds i8, ptr %11, i64 3
  %59 = getelementptr inbounds i8, ptr %10, i64 1012
  %60 = getelementptr inbounds i8, ptr %11, i64 4
  %61 = getelementptr inbounds i8, ptr %10, i64 1013
  %62 = getelementptr inbounds i8, ptr %11, i64 5
  %63 = getelementptr inbounds i8, ptr %10, i64 1014
  %64 = getelementptr inbounds i8, ptr %11, i64 6
  %65 = getelementptr inbounds i8, ptr %10, i64 1015
  %66 = getelementptr inbounds i8, ptr %11, i64 7
  %67 = getelementptr inbounds i8, ptr %10, i64 1016
  %68 = getelementptr inbounds i8, ptr %11, i64 8
  %69 = getelementptr inbounds i8, ptr %10, i64 1017
  %70 = getelementptr inbounds i8, ptr %11, i64 9
  %71 = getelementptr inbounds i8, ptr %10, i64 1018
  %72 = getelementptr inbounds i8, ptr %11, i64 10
  %73 = getelementptr inbounds i8, ptr %10, i64 1019
  %74 = getelementptr inbounds i8, ptr %11, i64 11
  %75 = getelementptr inbounds i8, ptr %10, i64 1020
  %76 = getelementptr inbounds i8, ptr %11, i64 12
  %77 = getelementptr inbounds i8, ptr %10, i64 1021
  %78 = getelementptr inbounds i8, ptr %11, i64 13
  %79 = getelementptr inbounds i8, ptr %10, i64 1022
  %80 = getelementptr inbounds i8, ptr %11, i64 14
  %81 = getelementptr inbounds i8, ptr %10, i64 1023
  %82 = getelementptr inbounds i8, ptr %11, i64 15
  %83 = getelementptr inbounds i8, ptr %13, i64 1
  %84 = getelementptr inbounds i8, ptr %11, i64 1
  %85 = getelementptr inbounds i8, ptr %13, i64 2
  %86 = getelementptr inbounds i8, ptr %11, i64 2
  %87 = getelementptr inbounds i8, ptr %13, i64 3
  %88 = getelementptr inbounds i8, ptr %11, i64 3
  %89 = getelementptr inbounds i8, ptr %13, i64 4
  %90 = getelementptr inbounds i8, ptr %11, i64 4
  %91 = getelementptr inbounds i8, ptr %13, i64 5
  %92 = getelementptr inbounds i8, ptr %11, i64 5
  %93 = getelementptr inbounds i8, ptr %13, i64 6
  %94 = getelementptr inbounds i8, ptr %11, i64 6
  %95 = getelementptr inbounds i8, ptr %13, i64 7
  %96 = getelementptr inbounds i8, ptr %11, i64 7
  %97 = getelementptr inbounds i8, ptr %13, i64 8
  %98 = getelementptr inbounds i8, ptr %11, i64 8
  %99 = getelementptr inbounds i8, ptr %13, i64 9
  %100 = getelementptr inbounds i8, ptr %11, i64 9
  %101 = getelementptr inbounds i8, ptr %13, i64 10
  %102 = getelementptr inbounds i8, ptr %11, i64 10
  %103 = getelementptr inbounds i8, ptr %13, i64 11
  %104 = getelementptr inbounds i8, ptr %11, i64 11
  %105 = getelementptr inbounds i8, ptr %13, i64 12
  %106 = getelementptr inbounds i8, ptr %11, i64 12
  %107 = getelementptr inbounds i8, ptr %13, i64 13
  %108 = getelementptr inbounds i8, ptr %11, i64 13
  %109 = getelementptr inbounds i8, ptr %13, i64 14
  %110 = getelementptr inbounds i8, ptr %11, i64 14
  %111 = getelementptr inbounds i8, ptr %13, i64 15
  %112 = getelementptr inbounds i8, ptr %11, i64 15
  %113 = getelementptr inbounds i8, ptr %11, i64 15
  %114 = add nuw nsw i64 %22, 1
  br label %115

115:                                              ; preds = %.lr.ph, %.loopexit
  %.0117161 = phi i64 [ 1, %.lr.ph ], [ %206, %.loopexit ]
  %.0118160 = phi ptr [ %0, %.lr.ph ], [ %204, %.loopexit ]
  %.0119159 = phi ptr [ %3, %.lr.ph ], [ %203, %.loopexit ]
  %.0120158 = phi i64 [ %17, %.lr.ph ], [ %205, %.loopexit ]
  %116 = and i64 %.0117161, 1
  %.not127 = icmp eq i64 %116, 0
  br i1 %.not127, label %120, label %.preheader182

.preheader182:                                    ; preds = %115
  %117 = load i8, ptr %19, align 4, !tbaa !9
  %118 = load i8, ptr %11, align 16, !tbaa !9
  %119 = xor i8 %118, %117
  store i8 %119, ptr %11, align 16, !tbaa !9
  br label %.loopexit

120:                                              ; preds = %115
  %121 = and i64 %.0117161, 2
  %.not128 = icmp eq i64 %121, 0
  br i1 %.not128, label %.loopexit.loopexit, label %.preheader180

.preheader180:                                    ; preds = %120
  %122 = load i8, ptr %20, align 4, !tbaa !9
  %123 = load i8, ptr %11, align 16, !tbaa !9
  %124 = xor i8 %123, %122
  store i8 %124, ptr %11, align 16, !tbaa !9
  br label %.loopexit

.loopexit.loopexit:                               ; preds = %120
  call void @pyjamask_masked_128_calculate_L(ptr noundef nonnull %10, ptr noundef nonnull %13, i64 noundef %.0117161)
  %125 = load i8, ptr %13, align 16, !tbaa !9
  %126 = load i8, ptr %11, align 16, !tbaa !9
  %127 = xor i8 %126, %125
  store i8 %127, ptr %11, align 16, !tbaa !9
  br label %.loopexit

.loopexit:                                        ; preds = %.preheader182, %.preheader180, %.loopexit.loopexit
  %.sink425 = phi ptr [ %23, %.preheader182 ], [ %53, %.preheader180 ], [ %83, %.loopexit.loopexit ]
  %.sink424 = phi ptr [ %24, %.preheader182 ], [ %54, %.preheader180 ], [ %84, %.loopexit.loopexit ]
  %.sink419 = phi ptr [ %25, %.preheader182 ], [ %55, %.preheader180 ], [ %85, %.loopexit.loopexit ]
  %.sink418 = phi ptr [ %26, %.preheader182 ], [ %56, %.preheader180 ], [ %86, %.loopexit.loopexit ]
  %.sink413 = phi ptr [ %27, %.preheader182 ], [ %57, %.preheader180 ], [ %87, %.loopexit.loopexit ]
  %.sink412 = phi ptr [ %28, %.preheader182 ], [ %58, %.preheader180 ], [ %88, %.loopexit.loopexit ]
  %.sink407 = phi ptr [ %29, %.preheader182 ], [ %59, %.preheader180 ], [ %89, %.loopexit.loopexit ]
  %.sink406 = phi ptr [ %30, %.preheader182 ], [ %60, %.preheader180 ], [ %90, %.loopexit.loopexit ]
  %.sink401 = phi ptr [ %31, %.preheader182 ], [ %61, %.preheader180 ], [ %91, %.loopexit.loopexit ]
  %.sink400 = phi ptr [ %32, %.preheader182 ], [ %62, %.preheader180 ], [ %92, %.loopexit.loopexit ]
  %.sink395 = phi ptr [ %33, %.preheader182 ], [ %63, %.preheader180 ], [ %93, %.loopexit.loopexit ]
  %.sink394 = phi ptr [ %34, %.preheader182 ], [ %64, %.preheader180 ], [ %94, %.loopexit.loopexit ]
  %.sink389 = phi ptr [ %35, %.preheader182 ], [ %65, %.preheader180 ], [ %95, %.loopexit.loopexit ]
  %.sink388 = phi ptr [ %36, %.preheader182 ], [ %66, %.preheader180 ], [ %96, %.loopexit.loopexit ]
  %.sink383 = phi ptr [ %37, %.preheader182 ], [ %67, %.preheader180 ], [ %97, %.loopexit.loopexit ]
  %.sink382 = phi ptr [ %38, %.preheader182 ], [ %68, %.preheader180 ], [ %98, %.loopexit.loopexit ]
  %.sink377 = phi ptr [ %39, %.preheader182 ], [ %69, %.preheader180 ], [ %99, %.loopexit.loopexit ]
  %.sink376 = phi ptr [ %40, %.preheader182 ], [ %70, %.preheader180 ], [ %100, %.loopexit.loopexit ]
  %.sink371 = phi ptr [ %41, %.preheader182 ], [ %71, %.preheader180 ], [ %101, %.loopexit.loopexit ]
  %.sink370 = phi ptr [ %42, %.preheader182 ], [ %72, %.preheader180 ], [ %102, %.loopexit.loopexit ]
  %.sink365 = phi ptr [ %43, %.preheader182 ], [ %73, %.preheader180 ], [ %103, %.loopexit.loopexit ]
  %.sink364 = phi ptr [ %44, %.preheader182 ], [ %74, %.preheader180 ], [ %104, %.loopexit.loopexit ]
  %.sink359 = phi ptr [ %45, %.preheader182 ], [ %75, %.preheader180 ], [ %105, %.loopexit.loopexit ]
  %.sink358 = phi ptr [ %46, %.preheader182 ], [ %76, %.preheader180 ], [ %106, %.loopexit.loopexit ]
  %.sink353 = phi ptr [ %47, %.preheader182 ], [ %77, %.preheader180 ], [ %107, %.loopexit.loopexit ]
  %.sink352 = phi ptr [ %48, %.preheader182 ], [ %78, %.preheader180 ], [ %108, %.loopexit.loopexit ]
  %.sink347 = phi ptr [ %49, %.preheader182 ], [ %79, %.preheader180 ], [ %109, %.loopexit.loopexit ]
  %.sink346 = phi ptr [ %50, %.preheader182 ], [ %80, %.preheader180 ], [ %110, %.loopexit.loopexit ]
  %.sink341 = phi ptr [ %51, %.preheader182 ], [ %81, %.preheader180 ], [ %111, %.loopexit.loopexit ]
  %.sink = phi ptr [ %52, %.preheader182 ], [ %82, %.preheader180 ], [ %112, %.loopexit.loopexit ]
  %128 = phi i8 [ %119, %.preheader182 ], [ %124, %.preheader180 ], [ %127, %.loopexit.loopexit ]
  %129 = load i8, ptr %.sink425, align 1, !tbaa !9
  %130 = load i8, ptr %.sink424, align 1, !tbaa !9
  %131 = xor i8 %130, %129
  store i8 %131, ptr %.sink424, align 1, !tbaa !9
  %132 = load i8, ptr %.sink419, align 1, !tbaa !9
  %133 = load i8, ptr %.sink418, align 1, !tbaa !9
  %134 = xor i8 %133, %132
  store i8 %134, ptr %.sink418, align 1, !tbaa !9
  %135 = load i8, ptr %.sink413, align 1, !tbaa !9
  %136 = load i8, ptr %.sink412, align 1, !tbaa !9
  %137 = xor i8 %136, %135
  store i8 %137, ptr %.sink412, align 1, !tbaa !9
  %138 = load i8, ptr %.sink407, align 1, !tbaa !9
  %139 = load i8, ptr %.sink406, align 1, !tbaa !9
  %140 = xor i8 %139, %138
  store i8 %140, ptr %.sink406, align 1, !tbaa !9
  %141 = load i8, ptr %.sink401, align 1, !tbaa !9
  %142 = load i8, ptr %.sink400, align 1, !tbaa !9
  %143 = xor i8 %142, %141
  store i8 %143, ptr %.sink400, align 1, !tbaa !9
  %144 = load i8, ptr %.sink395, align 1, !tbaa !9
  %145 = load i8, ptr %.sink394, align 1, !tbaa !9
  %146 = xor i8 %145, %144
  store i8 %146, ptr %.sink394, align 1, !tbaa !9
  %147 = load i8, ptr %.sink389, align 1, !tbaa !9
  %148 = load i8, ptr %.sink388, align 1, !tbaa !9
  %149 = xor i8 %148, %147
  store i8 %149, ptr %.sink388, align 1, !tbaa !9
  %150 = load i8, ptr %.sink383, align 1, !tbaa !9
  %151 = load i8, ptr %.sink382, align 1, !tbaa !9
  %152 = xor i8 %151, %150
  store i8 %152, ptr %.sink382, align 1, !tbaa !9
  %153 = load i8, ptr %.sink377, align 1, !tbaa !9
  %154 = load i8, ptr %.sink376, align 1, !tbaa !9
  %155 = xor i8 %154, %153
  store i8 %155, ptr %.sink376, align 1, !tbaa !9
  %156 = load i8, ptr %.sink371, align 1, !tbaa !9
  %157 = load i8, ptr %.sink370, align 1, !tbaa !9
  %158 = xor i8 %157, %156
  store i8 %158, ptr %.sink370, align 1, !tbaa !9
  %159 = load i8, ptr %.sink365, align 1, !tbaa !9
  %160 = load i8, ptr %.sink364, align 1, !tbaa !9
  %161 = xor i8 %160, %159
  store i8 %161, ptr %.sink364, align 1, !tbaa !9
  %162 = load i8, ptr %.sink359, align 1, !tbaa !9
  %163 = load i8, ptr %.sink358, align 1, !tbaa !9
  %164 = xor i8 %163, %162
  store i8 %164, ptr %.sink358, align 1, !tbaa !9
  %165 = load i8, ptr %.sink353, align 1, !tbaa !9
  %166 = load i8, ptr %.sink352, align 1, !tbaa !9
  %167 = xor i8 %166, %165
  store i8 %167, ptr %.sink352, align 1, !tbaa !9
  %168 = load i8, ptr %.sink347, align 1, !tbaa !9
  %169 = load i8, ptr %.sink346, align 1, !tbaa !9
  %170 = xor i8 %169, %168
  store i8 %170, ptr %.sink346, align 1, !tbaa !9
  %171 = load i8, ptr %.sink341, align 1, !tbaa !9
  %172 = load i8, ptr %.sink, align 1, !tbaa !9
  %173 = xor i8 %172, %171
  store i8 %173, ptr %.sink, align 1, !tbaa !9
  %174 = load i8, ptr %113, align 1, !tbaa !9
  %175 = load <16 x i8>, ptr %.0119159, align 1, !tbaa !9
  %176 = insertelement <16 x i8> poison, i8 %128, i64 0
  %177 = insertelement <16 x i8> %176, i8 %131, i64 1
  %178 = insertelement <16 x i8> %177, i8 %134, i64 2
  %179 = insertelement <16 x i8> %178, i8 %137, i64 3
  %180 = insertelement <16 x i8> %179, i8 %140, i64 4
  %181 = insertelement <16 x i8> %180, i8 %143, i64 5
  %182 = insertelement <16 x i8> %181, i8 %146, i64 6
  %183 = insertelement <16 x i8> %182, i8 %149, i64 7
  %184 = insertelement <16 x i8> %183, i8 %152, i64 8
  %185 = insertelement <16 x i8> %184, i8 %155, i64 9
  %186 = insertelement <16 x i8> %185, i8 %158, i64 10
  %187 = insertelement <16 x i8> %186, i8 %161, i64 11
  %188 = insertelement <16 x i8> %187, i8 %164, i64 12
  %189 = insertelement <16 x i8> %188, i8 %167, i64 13
  %190 = insertelement <16 x i8> %189, i8 %170, i64 14
  %191 = insertelement <16 x i8> %190, i8 %174, i64 15
  %192 = xor <16 x i8> %175, %191
  store <16 x i8> %192, ptr %13, align 16, !tbaa !9
  call void @pyjamask_masked_128_decrypt(ptr noundef nonnull %10, ptr noundef nonnull %13, ptr noundef nonnull %13) #4
  %193 = getelementptr inbounds i8, ptr %.0118160, i64 4
  %194 = load <16 x i8>, ptr %13, align 16, !tbaa !9
  %195 = load <16 x i8>, ptr %11, align 16, !tbaa !9
  %196 = xor <16 x i8> %195, %194
  store <16 x i8> %196, ptr %.0118160, align 1, !tbaa !9
  %197 = load <8 x i8>, ptr %193, align 1, !tbaa !9
  %198 = load <16 x i8>, ptr %12, align 16, !tbaa !9
  %199 = shufflevector <8 x i8> %197, <8 x i8> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
  %200 = shufflevector <16 x i8> %196, <16 x i8> %199, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 poison, i32 poison, i32 poison, i32 poison>
  %201 = shufflevector <16 x i8> %200, <16 x i8> %196, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 28, i32 29, i32 30, i32 31>
  %202 = xor <16 x i8> %198, %201
  store <16 x i8> %202, ptr %12, align 16, !tbaa !9
  %203 = getelementptr inbounds i8, ptr %.0119159, i64 16
  %204 = getelementptr inbounds i8, ptr %.0118160, i64 16
  %205 = add i64 %.0120158, -16
  %206 = add nuw nsw i64 %.0117161, 1
  %exitcond.not = icmp eq i64 %.0117161, %114
  br i1 %exitcond.not, label %._crit_edge, label %115, !llvm.loop !10

._crit_edge:                                      ; preds = %.loopexit, %16
  %.0120.lcssa = phi i64 [ %17, %16 ], [ %205, %.loopexit ]
  %.0119.lcssa = phi ptr [ %3, %16 ], [ %203, %.loopexit ]
  %.0118.lcssa = phi ptr [ %0, %16 ], [ %204, %.loopexit ]
  %207 = phi <16 x i8> [ zeroinitializer, %16 ], [ %202, %.loopexit ]
  %.0118.lcssa444 = ptrtoint ptr %.0118.lcssa to i64
  %.0119.lcssa445 = ptrtoint ptr %.0119.lcssa to i64
  %.not = icmp eq i64 %.0120.lcssa, 0
  br i1 %.not, label %307, label %iter.check

iter.check:                                       ; preds = %._crit_edge
  %208 = getelementptr inbounds i8, ptr %10, i64 960
  %209 = load <16 x i8>, ptr %208, align 4, !tbaa !9
  %210 = load <16 x i8>, ptr %11, align 16, !tbaa !9
  %211 = xor <16 x i8> %210, %209
  store <16 x i8> %211, ptr %11, align 16, !tbaa !9
  %212 = trunc i64 %.0120.lcssa to i32
  call void @pyjamask_masked_128_encrypt(ptr noundef nonnull %10, ptr noundef nonnull %13, ptr noundef nonnull %11) #4
  %213 = add i64 %.0120.lcssa, 4294967295
  %214 = and i64 %213, 4294967295
  %215 = add nuw nsw i64 %214, 1
  %min.iters.check = icmp ult i64 %214, 7
  br i1 %min.iters.check, label %vec.epilog.scalar.ph.preheader, label %vector.memcheck

vector.memcheck:                                  ; preds = %iter.check
  %216 = sub i64 %.0118.lcssa444, %14
  %diff.check = icmp ult i64 %216, 32
  %217 = sub i64 %.0118.lcssa444, %.0119.lcssa445
  %diff.check446 = icmp ult i64 %217, 32
  %conflict.rdx = or i1 %diff.check, %diff.check446
  br i1 %conflict.rdx, label %vec.epilog.scalar.ph.preheader, label %vector.main.loop.iter.check

vector.main.loop.iter.check:                      ; preds = %vector.memcheck
  %min.iters.check447 = icmp ult i64 %214, 31
  br i1 %min.iters.check447, label %vec.epilog.ph, label %vector.ph

vector.ph:                                        ; preds = %vector.main.loop.iter.check
  %n.vec = and i64 %215, 8589934560
  br label %vector.body

vector.body:                                      ; preds = %vector.body, %vector.ph
  %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ]
  %next.gep = getelementptr i8, ptr %.0119.lcssa, i64 %index
  %next.gep449 = getelementptr i8, ptr %13, i64 %index
  %next.gep451 = getelementptr i8, ptr %.0118.lcssa, i64 %index
  %218 = getelementptr i8, ptr %next.gep449, i64 16
  %wide.load = load <16 x i8>, ptr %next.gep449, align 16, !tbaa !9
  %wide.load453 = load <16 x i8>, ptr %218, align 16, !tbaa !9
  %219 = getelementptr i8, ptr %next.gep, i64 16
  %wide.load454 = load <16 x i8>, ptr %next.gep, align 1, !tbaa !9
  %wide.load455 = load <16 x i8>, ptr %219, align 1, !tbaa !9
  %220 = xor <16 x i8> %wide.load454, %wide.load
  %221 = xor <16 x i8> %wide.load455, %wide.load453
  %222 = getelementptr i8, ptr %next.gep451, i64 16
  store <16 x i8> %220, ptr %next.gep451, align 1, !tbaa !9
  store <16 x i8> %221, ptr %222, align 1, !tbaa !9
  %index.next = add nuw i64 %index, 32
  %223 = icmp eq i64 %index.next, %n.vec
  br i1 %223, label %middle.block, label %vector.body, !llvm.loop !12

middle.block:                                     ; preds = %vector.body
  %cmp.n = icmp eq i64 %215, %n.vec
  br i1 %cmp.n, label %iter.check482, label %vec.epilog.iter.check

vec.epilog.iter.check:                            ; preds = %middle.block
  %ind.end467 = getelementptr i8, ptr %.0118.lcssa, i64 %n.vec
  %ind.end464 = getelementptr i8, ptr %13, i64 %n.vec
  %ind.end461 = getelementptr i8, ptr %.0119.lcssa, i64 %n.vec
  %.cast458 = trunc i64 %n.vec to i32
  %ind.end459 = sub i32 %212, %.cast458
  %n.vec.remaining = and i64 %215, 24
  %min.epilog.iters.check = icmp eq i64 %n.vec.remaining, 0
  br i1 %min.epilog.iters.check, label %vec.epilog.scalar.ph.preheader, label %vec.epilog.ph

vec.epilog.ph:                                    ; preds = %vector.main.loop.iter.check, %vec.epilog.iter.check
  %vec.epilog.resume.val = phi i64 [ %n.vec, %vec.epilog.iter.check ], [ 0, %vector.main.loop.iter.check ]
  %n.vec457 = and i64 %215, 8589934584
  %.cast = trunc i64 %n.vec457 to i32
  %ind.end = sub i32 %212, %.cast
  %ind.end460 = getelementptr i8, ptr %.0119.lcssa, i64 %n.vec457
  %ind.end463 = getelementptr i8, ptr %13, i64 %n.vec457
  %ind.end466 = getelementptr i8, ptr %.0118.lcssa, i64 %n.vec457
  br label %vec.epilog.vector.body

vec.epilog.vector.body:                           ; preds = %vec.epilog.vector.body, %vec.epilog.ph
  %index469 = phi i64 [ %vec.epilog.resume.val, %vec.epilog.ph ], [ %index.next475, %vec.epilog.vector.body ]
  %next.gep470 = getelementptr i8, ptr %.0119.lcssa, i64 %index469
  %next.gep471 = getelementptr i8, ptr %13, i64 %index469
  %next.gep472 = getelementptr i8, ptr %.0118.lcssa, i64 %index469
  %wide.load473 = load <8 x i8>, ptr %next.gep471, align 8, !tbaa !9
  %wide.load474 = load <8 x i8>, ptr %next.gep470, align 1, !tbaa !9
  %224 = xor <8 x i8> %wide.load474, %wide.load473
  store <8 x i8> %224, ptr %next.gep472, align 1, !tbaa !9
  %index.next475 = add nuw i64 %index469, 8
  %225 = icmp eq i64 %index.next475, %n.vec457
  br i1 %225, label %vec.epilog.middle.block, label %vec.epilog.vector.body, !llvm.loop !15

vec.epilog.middle.block:                          ; preds = %vec.epilog.vector.body
  %cmp.n476 = icmp eq i64 %215, %n.vec457
  br i1 %cmp.n476, label %iter.check482, label %vec.epilog.scalar.ph.preheader

vec.epilog.scalar.ph.preheader:                   ; preds = %vec.epilog.middle.block, %vector.memcheck, %iter.check, %vec.epilog.iter.check
  %.089170.ph = phi i32 [ %212, %iter.check ], [ %212, %vector.memcheck ], [ %ind.end459, %vec.epilog.iter.check ], [ %ind.end, %vec.epilog.middle.block ]
  %.090169.ph = phi ptr [ %.0119.lcssa, %iter.check ], [ %.0119.lcssa, %vector.memcheck ], [ %ind.end461, %vec.epilog.iter.check ], [ %ind.end460, %vec.epilog.middle.block ]
  %.091168.ph = phi ptr [ %13, %iter.check ], [ %13, %vector.memcheck ], [ %ind.end464, %vec.epilog.iter.check ], [ %ind.end463, %vec.epilog.middle.block ]
  %.092167.ph = phi ptr [ %.0118.lcssa, %iter.check ], [ %.0118.lcssa, %vector.memcheck ], [ %ind.end467, %vec.epilog.iter.check ], [ %ind.end466, %vec.epilog.middle.block ]
  %226 = add nsw i32 %.089170.ph, -1
  %xtraiter = and i32 %.089170.ph, 3
  %lcmp.mod.not = icmp eq i32 %xtraiter, 0
  br i1 %lcmp.mod.not, label %vec.epilog.scalar.ph.prol.loopexit, label %vec.epilog.scalar.ph.prol

vec.epilog.scalar.ph.prol:                        ; preds = %vec.epilog.scalar.ph.preheader, %vec.epilog.scalar.ph.prol
  %.089170.prol = phi i32 [ %233, %vec.epilog.scalar.ph.prol ], [ %.089170.ph, %vec.epilog.scalar.ph.preheader ]
  %.090169.prol = phi ptr [ %229, %vec.epilog.scalar.ph.prol ], [ %.090169.ph, %vec.epilog.scalar.ph.preheader ]
  %.091168.prol = phi ptr [ %227, %vec.epilog.scalar.ph.prol ], [ %.091168.ph, %vec.epilog.scalar.ph.preheader ]
  %.092167.prol = phi ptr [ %232, %vec.epilog.scalar.ph.prol ], [ %.092167.ph, %vec.epilog.scalar.ph.preheader ]
  %prol.iter = phi i32 [ %prol.iter.next, %vec.epilog.scalar.ph.prol ], [ 0, %vec.epilog.scalar.ph.preheader ]
  %227 = getelementptr inbounds i8, ptr %.091168.prol, i64 1
  %228 = load i8, ptr %.091168.prol, align 1, !tbaa !9
  %229 = getelementptr inbounds i8, ptr %.090169.prol, i64 1
  %230 = load i8, ptr %.090169.prol, align 1, !tbaa !9
  %231 = xor i8 %230, %228
  %232 = getelementptr inbounds i8, ptr %.092167.prol, i64 1
  store i8 %231, ptr %.092167.prol, align 1, !tbaa !9
  %233 = add nsw i32 %.089170.prol, -1
  %prol.iter.next = add i32 %prol.iter, 1
  %prol.iter.cmp.not = icmp eq i32 %prol.iter.next, %xtraiter
  br i1 %prol.iter.cmp.not, label %vec.epilog.scalar.ph.prol.loopexit, label %vec.epilog.scalar.ph.prol, !llvm.loop !16

vec.epilog.scalar.ph.prol.loopexit:               ; preds = %vec.epilog.scalar.ph.prol, %vec.epilog.scalar.ph.preheader
  %.089170.unr = phi i32 [ %.089170.ph, %vec.epilog.scalar.ph.preheader ], [ %233, %vec.epilog.scalar.ph.prol ]
  %.090169.unr = phi ptr [ %.090169.ph, %vec.epilog.scalar.ph.preheader ], [ %229, %vec.epilog.scalar.ph.prol ]
  %.091168.unr = phi ptr [ %.091168.ph, %vec.epilog.scalar.ph.preheader ], [ %227, %vec.epilog.scalar.ph.prol ]
  %.092167.unr = phi ptr [ %.092167.ph, %vec.epilog.scalar.ph.preheader ], [ %232, %vec.epilog.scalar.ph.prol ]
  %234 = icmp ult i32 %226, 3
  br i1 %234, label %iter.check482, label %vec.epilog.scalar.ph

vec.epilog.scalar.ph:                             ; preds = %vec.epilog.scalar.ph.prol.loopexit, %vec.epilog.scalar.ph
  %.089170 = phi i32 [ %259, %vec.epilog.scalar.ph ], [ %.089170.unr, %vec.epilog.scalar.ph.prol.loopexit ]
  %.090169 = phi ptr [ %255, %vec.epilog.scalar.ph ], [ %.090169.unr, %vec.epilog.scalar.ph.prol.loopexit ]
  %.091168 = phi ptr [ %253, %vec.epilog.scalar.ph ], [ %.091168.unr, %vec.epilog.scalar.ph.prol.loopexit ]
  %.092167 = phi ptr [ %258, %vec.epilog.scalar.ph ], [ %.092167.unr, %vec.epilog.scalar.ph.prol.loopexit ]
  %235 = getelementptr inbounds i8, ptr %.091168, i64 1
  %236 = load i8, ptr %.091168, align 1, !tbaa !9
  %237 = getelementptr inbounds i8, ptr %.090169, i64 1
  %238 = load i8, ptr %.090169, align 1, !tbaa !9
  %239 = xor i8 %238, %236
  %240 = getelementptr inbounds i8, ptr %.092167, i64 1
  store i8 %239, ptr %.092167, align 1, !tbaa !9
  %241 = getelementptr inbounds i8, ptr %.091168, i64 2
  %242 = load i8, ptr %235, align 1, !tbaa !9
  %243 = getelementptr inbounds i8, ptr %.090169, i64 2
  %244 = load i8, ptr %237, align 1, !tbaa !9
  %245 = xor i8 %244, %242
  %246 = getelementptr inbounds i8, ptr %.092167, i64 2
  store i8 %245, ptr %240, align 1, !tbaa !9
  %247 = getelementptr inbounds i8, ptr %.091168, i64 3
  %248 = load i8, ptr %241, align 1, !tbaa !9
  %249 = getelementptr inbounds i8, ptr %.090169, i64 3
  %250 = load i8, ptr %243, align 1, !tbaa !9
  %251 = xor i8 %250, %248
  %252 = getelementptr inbounds i8, ptr %.092167, i64 3
  store i8 %251, ptr %246, align 1, !tbaa !9
  %253 = getelementptr inbounds i8, ptr %.091168, i64 4
  %254 = load i8, ptr %247, align 1, !tbaa !9
  %255 = getelementptr inbounds i8, ptr %.090169, i64 4
  %256 = load i8, ptr %249, align 1, !tbaa !9
  %257 = xor i8 %256, %254
  %258 = getelementptr inbounds i8, ptr %.092167, i64 4
  store i8 %257, ptr %252, align 1, !tbaa !9
  %259 = add nsw i32 %.089170, -4
  %.not123.3 = icmp eq i32 %259, 0
  br i1 %.not123.3, label %iter.check482, label %vec.epilog.scalar.ph, !llvm.loop !18

iter.check482:                                    ; preds = %vec.epilog.scalar.ph.prol.loopexit, %vec.epilog.scalar.ph, %vec.epilog.middle.block, %middle.block
  %260 = add i64 %.0120.lcssa, 4294967295
  %261 = and i64 %260, 4294967295
  %262 = add nuw nsw i64 %261, 1
  %min.iters.check480 = icmp ult i64 %261, 7
  br i1 %min.iters.check480, label %.preheader.preheader, label %vector.memcheck477

vector.memcheck477:                               ; preds = %iter.check482
  %263 = add i64 %.0120.lcssa, 4294967295
  %264 = and i64 %263, 4294967295
  %265 = add nuw nsw i64 %264, 1
  %scevgep = getelementptr i8, ptr %12, i64 %265
  %scevgep478 = getelementptr i8, ptr %.0118.lcssa, i64 %265
  %bound0 = icmp ult ptr %12, %scevgep478
  %bound1 = icmp ult ptr %.0118.lcssa, %scevgep
  %found.conflict = and i1 %bound0, %bound1
  br i1 %found.conflict, label %.preheader.preheader, label %vector.main.loop.iter.check484

vector.main.loop.iter.check484:                   ; preds = %vector.memcheck477
  %min.iters.check483 = icmp ult i64 %261, 31
  br i1 %min.iters.check483, label %vec.epilog.ph502, label %vector.ph485

vector.ph485:                                     ; preds = %vector.main.loop.iter.check484
  %n.vec487 = and i64 %262, 8589934560
  br label %vector.body488

vector.body488:                                   ; preds = %vector.body488, %vector.ph485
  %index489 = phi i64 [ 0, %vector.ph485 ], [ %index.next498, %vector.body488 ]
  %next.gep490 = getelementptr i8, ptr %.0118.lcssa, i64 %index489
  %next.gep492 = getelementptr i8, ptr %12, i64 %index489
  %266 = getelementptr i8, ptr %next.gep490, i64 16
  %wide.load494 = load <16 x i8>, ptr %next.gep490, align 1, !tbaa !9, !alias.scope !19
  %wide.load495 = load <16 x i8>, ptr %266, align 1, !tbaa !9, !alias.scope !19
  %267 = getelementptr i8, ptr %next.gep492, i64 16
  %wide.load496 = load <16 x i8>, ptr %next.gep492, align 16, !tbaa !9, !alias.scope !22, !noalias !19
  %wide.load497 = load <16 x i8>, ptr %267, align 16, !tbaa !9, !alias.scope !22, !noalias !19
  %268 = xor <16 x i8> %wide.load496, %wide.load494
  %269 = xor <16 x i8> %wide.load497, %wide.load495
  store <16 x i8> %268, ptr %next.gep492, align 16, !tbaa !9, !alias.scope !22, !noalias !19
  store <16 x i8> %269, ptr %267, align 16, !tbaa !9, !alias.scope !22, !noalias !19
  %index.next498 = add nuw i64 %index489, 32
  %270 = icmp eq i64 %index.next498, %n.vec487
  br i1 %270, label %middle.block479, label %vector.body488, !llvm.loop !24

middle.block479:                                  ; preds = %vector.body488
  %cmp.n499 = icmp eq i64 %262, %n.vec487
  br i1 %cmp.n499, label %.loopexit528, label %vec.epilog.iter.check503

vec.epilog.iter.check503:                         ; preds = %middle.block479
  %ind.end518 = getelementptr i8, ptr %12, i64 %n.vec487
  %ind.end515 = getelementptr i8, ptr %.0118.lcssa, i64 %n.vec487
  %.cast511 = trunc i64 %n.vec487 to i32
  %ind.end512 = sub i32 %212, %.cast511
  %n.vec.remaining504 = and i64 %262, 24
  %min.epilog.iters.check505 = icmp eq i64 %n.vec.remaining504, 0
  br i1 %min.epilog.iters.check505, label %.preheader.preheader, label %vec.epilog.ph502

vec.epilog.ph502:                                 ; preds = %vector.main.loop.iter.check484, %vec.epilog.iter.check503
  %vec.epilog.resume.val506 = phi i64 [ %n.vec487, %vec.epilog.iter.check503 ], [ 0, %vector.main.loop.iter.check484 ]
  %n.vec508 = and i64 %262, 8589934584
  %.cast509 = trunc i64 %n.vec508 to i32
  %ind.end510 = sub i32 %212, %.cast509
  %ind.end514 = getelementptr i8, ptr %.0118.lcssa, i64 %n.vec508
  %ind.end517 = getelementptr i8, ptr %12, i64 %n.vec508
  br label %vec.epilog.vector.body520

vec.epilog.vector.body520:                        ; preds = %vec.epilog.vector.body520, %vec.epilog.ph502
  %index521 = phi i64 [ %vec.epilog.resume.val506, %vec.epilog.ph502 ], [ %index.next526, %vec.epilog.vector.body520 ]
  %next.gep522 = getelementptr i8, ptr %.0118.lcssa, i64 %index521
  %next.gep523 = getelementptr i8, ptr %12, i64 %index521
  %wide.load524 = load <8 x i8>, ptr %next.gep522, align 1, !tbaa !9, !alias.scope !25
  %wide.load525 = load <8 x i8>, ptr %next.gep523, align 8, !tbaa !9, !alias.scope !28, !noalias !25
  %271 = xor <8 x i8> %wide.load525, %wide.load524
  store <8 x i8> %271, ptr %next.gep523, align 8, !tbaa !9, !alias.scope !28, !noalias !25
  %index.next526 = add nuw i64 %index521, 8
  %272 = icmp eq i64 %index.next526, %n.vec508
  br i1 %272, label %vec.epilog.middle.block500, label %vec.epilog.vector.body520, !llvm.loop !30

vec.epilog.middle.block500:                       ; preds = %vec.epilog.vector.body520
  %cmp.n527 = icmp eq i64 %262, %n.vec508
  br i1 %cmp.n527, label %.loopexit528, label %.preheader.preheader

.preheader.preheader:                             ; preds = %vec.epilog.middle.block500, %vector.memcheck477, %iter.check482, %vec.epilog.iter.check503
  %.086173.ph = phi i32 [ %212, %iter.check482 ], [ %212, %vector.memcheck477 ], [ %ind.end512, %vec.epilog.iter.check503 ], [ %ind.end510, %vec.epilog.middle.block500 ]
  %.087172.ph = phi ptr [ %.0118.lcssa, %iter.check482 ], [ %.0118.lcssa, %vector.memcheck477 ], [ %ind.end515, %vec.epilog.iter.check503 ], [ %ind.end514, %vec.epilog.middle.block500 ]
  %.088171.ph = phi ptr [ %12, %iter.check482 ], [ %12, %vector.memcheck477 ], [ %ind.end518, %vec.epilog.iter.check503 ], [ %ind.end517, %vec.epilog.middle.block500 ]
  %273 = add nsw i32 %.086173.ph, -1
  %xtraiter532 = and i32 %.086173.ph, 3
  %lcmp.mod533.not = icmp eq i32 %xtraiter532, 0
  br i1 %lcmp.mod533.not, label %.preheader.prol.loopexit, label %.preheader.prol

.preheader.prol:                                  ; preds = %.preheader.preheader, %.preheader.prol
  %.086173.prol = phi i32 [ %279, %.preheader.prol ], [ %.086173.ph, %.preheader.preheader ]
  %.087172.prol = phi ptr [ %274, %.preheader.prol ], [ %.087172.ph, %.preheader.preheader ]
  %.088171.prol = phi ptr [ %276, %.preheader.prol ], [ %.088171.ph, %.preheader.preheader ]
  %prol.iter534 = phi i32 [ %prol.iter534.next, %.preheader.prol ], [ 0, %.preheader.preheader ]
  %274 = getelementptr inbounds i8, ptr %.087172.prol, i64 1
  %275 = load i8, ptr %.087172.prol, align 1, !tbaa !9
  %276 = getelementptr inbounds i8, ptr %.088171.prol, i64 1
  %277 = load i8, ptr %.088171.prol, align 1, !tbaa !9
  %278 = xor i8 %277, %275
  store i8 %278, ptr %.088171.prol, align 1, !tbaa !9
  %279 = add nsw i32 %.086173.prol, -1
  %prol.iter534.next = add i32 %prol.iter534, 1
  %prol.iter534.cmp.not = icmp eq i32 %prol.iter534.next, %xtraiter532
  br i1 %prol.iter534.cmp.not, label %.preheader.prol.loopexit, label %.preheader.prol, !llvm.loop !31

.preheader.prol.loopexit:                         ; preds = %.preheader.prol, %.preheader.preheader
  %.086173.unr = phi i32 [ %.086173.ph, %.preheader.preheader ], [ %279, %.preheader.prol ]
  %.087172.unr = phi ptr [ %.087172.ph, %.preheader.preheader ], [ %274, %.preheader.prol ]
  %.088171.unr = phi ptr [ %.088171.ph, %.preheader.preheader ], [ %276, %.preheader.prol ]
  %280 = icmp ult i32 %273, 3
  br i1 %280, label %.loopexit528, label %.preheader

.preheader:                                       ; preds = %.preheader.prol.loopexit, %.preheader
  %.086173 = phi i32 [ %301, %.preheader ], [ %.086173.unr, %.preheader.prol.loopexit ]
  %.087172 = phi ptr [ %296, %.preheader ], [ %.087172.unr, %.preheader.prol.loopexit ]
  %.088171 = phi ptr [ %298, %.preheader ], [ %.088171.unr, %.preheader.prol.loopexit ]
  %281 = getelementptr inbounds i8, ptr %.087172, i64 1
  %282 = load i8, ptr %.087172, align 1, !tbaa !9
  %283 = getelementptr inbounds i8, ptr %.088171, i64 1
  %284 = load i8, ptr %.088171, align 1, !tbaa !9
  %285 = xor i8 %284, %282
  store i8 %285, ptr %.088171, align 1, !tbaa !9
  %286 = getelementptr inbounds i8, ptr %.087172, i64 2
  %287 = load i8, ptr %281, align 1, !tbaa !9
  %288 = getelementptr inbounds i8, ptr %.088171, i64 2
  %289 = load i8, ptr %283, align 1, !tbaa !9
  %290 = xor i8 %289, %287
  store i8 %290, ptr %283, align 1, !tbaa !9
  %291 = getelementptr inbounds i8, ptr %.087172, i64 3
  %292 = load i8, ptr %286, align 1, !tbaa !9
  %293 = getelementptr inbounds i8, ptr %.088171, i64 3
  %294 = load i8, ptr %288, align 1, !tbaa !9
  %295 = xor i8 %294, %292
  store i8 %295, ptr %288, align 1, !tbaa !9
  %296 = getelementptr inbounds i8, ptr %.087172, i64 4
  %297 = load i8, ptr %291, align 1, !tbaa !9
  %298 = getelementptr inbounds i8, ptr %.088171, i64 4
  %299 = load i8, ptr %293, align 1, !tbaa !9
  %300 = xor i8 %299, %297
  store i8 %300, ptr %293, align 1, !tbaa !9
  %301 = add nsw i32 %.086173, -4
  %.not124.3 = icmp eq i32 %301, 0
  br i1 %.not124.3, label %.loopexit528, label %.preheader, !llvm.loop !32

.loopexit528:                                     ; preds = %.preheader.prol.loopexit, %.preheader, %vec.epilog.middle.block500, %middle.block479
  %302 = getelementptr inbounds [16 x i8], ptr %12, i64 0, i64 %.0120.lcssa
  %303 = load i8, ptr %302, align 1, !tbaa !9
  %304 = xor i8 %303, -128
  store i8 %304, ptr %302, align 1, !tbaa !9
  %305 = getelementptr inbounds i8, ptr %.0119.lcssa, i64 %.0120.lcssa
  %306 = load <16 x i8>, ptr %12, align 16, !tbaa !9
  br label %307

307:                                              ; preds = %._crit_edge, %.loopexit528
  %.1 = phi ptr [ %305, %.loopexit528 ], [ %.0119.lcssa, %._crit_edge ]
  %308 = phi <16 x i8> [ %306, %.loopexit528 ], [ %207, %._crit_edge ]
  %309 = getelementptr inbounds i8, ptr %10, i64 976
  %310 = load <16 x i8>, ptr %11, align 16, !tbaa !9
  %311 = xor <16 x i8> %308, %310
  %312 = load <16 x i8>, ptr %309, align 4, !tbaa !9
  %313 = xor <16 x i8> %311, %312
  store <16 x i8> %313, ptr %12, align 16, !tbaa !9
  call void @pyjamask_masked_128_encrypt(ptr noundef nonnull %10, ptr noundef nonnull %12, ptr noundef nonnull %12) #4
  call void @pyjamask_masked_128_process_ad(ptr noundef nonnull %10, ptr noundef nonnull %12, ptr noundef %5, i64 noundef %6)
  %314 = load i64, ptr %1, align 8, !tbaa !5
  %315 = call i32 @aead_check_tag(ptr noundef %0, i64 noundef %314, ptr noundef nonnull %12, ptr noundef %.1, i32 noundef 16) #4
  br label %316

316:                                              ; preds = %9, %307
  %.096 = phi i32 [ %315, %307 ], [ -1, %9 ]
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %13) #4
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %12) #4
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %11) #4
  call void @llvm.lifetime.end.p0(i64 1024, ptr nonnull %10) #4
  ret i32 %.096
}

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

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

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

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

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

declare void @pyjamask_masked_128_encrypt(ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #3

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

declare void @pyjamask_masked_128_decrypt(ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #3

declare i32 @aead_check_tag(ptr noundef, i64 noundef, ptr noundef, ptr noundef, i32 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 nosync nounwind willreturn memory(argmem: readwrite) }
attributes #2 = { mustprogress nocallback nofree nounwind willreturn memory(argmem: write) }
attributes #3 = { "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #4 = { nounwind }

!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 = !{!7, !7, i64 0}
!10 = distinct !{!10, !11}
!11 = !{!"llvm.loop.mustprogress"}
!12 = distinct !{!12, !11, !13, !14}
!13 = !{!"llvm.loop.isvectorized", i32 1}
!14 = !{!"llvm.loop.unroll.runtime.disable"}
!15 = distinct !{!15, !11, !13, !14}
!16 = distinct !{!16, !17}
!17 = !{!"llvm.loop.unroll.disable"}
!18 = distinct !{!18, !11, !13}
!19 = !{!20}
!20 = distinct !{!20, !21}
!21 = distinct !{!21, !"LVerDomain"}
!22 = !{!23}
!23 = distinct !{!23, !21}
!24 = distinct !{!24, !11, !13, !14}
!25 = !{!26}
!26 = distinct !{!26, !27}
!27 = distinct !{!27, !"LVerDomain"}
!28 = !{!29}
!29 = distinct !{!29, !27}
!30 = distinct !{!30, !11, !13, !14}
!31 = distinct !{!31, !17}
!32 = distinct !{!32, !11, !13}


; Effective O3 passes: DSEPass,EarlyCSEPass,GVNPass,GlobalOptPass,IPSCCPPass,IndVarSimplifyPass,InferAlignmentPass,InferFunctionAttrsPass,InstCombinePass,InstSimplifyPass,JumpThreadingPass,LCSSAPass,LICMPass,LoopLoadEliminationPass,LoopRotatePass,LoopSimplifyPass,LoopUnrollPass,LoopVectorizePass,PostOrderFunctionAttrsPass,ReassociatePass,SLPVectorizerPass,SROAPass,SimplifyCFGPass,VectorCombinePass