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

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

; Function Attrs: nounwind uwtable
define dso_local void @cmac_data(ptr noundef %0, i64 noundef %1, ptr noundef %2) #0 {
  %4 = alloca ptr, align 8
  %5 = alloca i64, align 8
  %6 = alloca ptr, align 8
  %7 = alloca i32, align 4
  %8 = alloca i32, align 4
  %9 = alloca i32, align 4
  store ptr %0, ptr %4, align 8, !tbaa !5
  store i64 %1, ptr %5, align 8, !tbaa !9
  store ptr %2, ptr %6, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %7) #4
  store i32 0, ptr %7, align 4, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 4, ptr %8) #4
  %10 = load ptr, ptr %6, align 8, !tbaa !5
  %11 = getelementptr inbounds %struct.cmac_ctx, ptr %10, i32 0, i32 2
  %12 = load i32, ptr %11, align 16, !tbaa !13
  %13 = and i32 %12, 15
  store i32 %13, ptr %8, align 4, !tbaa !11
  %14 = load i64, ptr %5, align 8, !tbaa !9
  %15 = icmp ne i64 %14, 0
  br i1 %15, label %17, label %16

16:                                               ; preds = %3
  store i32 1, ptr %9, align 4
  br label %245

17:                                               ; preds = %3
  %18 = load ptr, ptr %6, align 8, !tbaa !5
  %19 = getelementptr inbounds %struct.cmac_ctx, ptr %18, i32 0, i32 2
  %20 = load i32, ptr %19, align 16, !tbaa !13
  %21 = icmp ne i32 %20, 0
  br i1 %21, label %22, label %26

22:                                               ; preds = %17
  %23 = load i32, ptr %8, align 4, !tbaa !11
  %24 = icmp ne i32 %23, 0
  br i1 %24, label %26, label %25

25:                                               ; preds = %22
  store i32 16, ptr %8, align 4, !tbaa !11
  br label %26

26:                                               ; preds = %25, %22, %17
  %27 = load ptr, ptr %4, align 8, !tbaa !5
  %28 = load ptr, ptr %6, align 8, !tbaa !5
  %29 = getelementptr inbounds %struct.cmac_ctx, ptr %28, i32 0, i32 0
  %30 = getelementptr inbounds [2 x i64], ptr %29, i64 0, i64 0
  %31 = load i32, ptr %8, align 4, !tbaa !11
  %32 = zext i32 %31 to i64
  %33 = getelementptr inbounds i8, ptr %30, i64 %32
  %34 = ptrtoint ptr %27 to i64
  %35 = ptrtoint ptr %33 to i64
  %36 = sub i64 %34, %35
  %37 = and i64 %36, 7
  %38 = icmp ne i64 %37, 0
  br i1 %38, label %138, label %39

39:                                               ; preds = %26
  br label %40

40:                                               ; preds = %51, %39
  %41 = load i32, ptr %7, align 4, !tbaa !11
  %42 = zext i32 %41 to i64
  %43 = load i64, ptr %5, align 8, !tbaa !9
  %44 = icmp ult i64 %42, %43
  br i1 %44, label %45, label %49

45:                                               ; preds = %40
  %46 = load i32, ptr %8, align 4, !tbaa !11
  %47 = and i32 %46, 7
  %48 = icmp ne i32 %47, 0
  br label %49

49:                                               ; preds = %45, %40
  %50 = phi i1 [ false, %40 ], [ %48, %45 ]
  br i1 %50, label %51, label %70

51:                                               ; preds = %49
  %52 = load ptr, ptr %4, align 8, !tbaa !5
  %53 = load i32, ptr %7, align 4, !tbaa !11
  %54 = add i32 %53, 1
  store i32 %54, ptr %7, align 4, !tbaa !11
  %55 = zext i32 %53 to i64
  %56 = getelementptr inbounds i8, ptr %52, i64 %55
  %57 = load i8, ptr %56, align 1, !tbaa !15
  %58 = zext i8 %57 to i32
  %59 = load ptr, ptr %6, align 8, !tbaa !5
  %60 = getelementptr inbounds %struct.cmac_ctx, ptr %59, i32 0, i32 0
  %61 = getelementptr inbounds [2 x i64], ptr %60, i64 0, i64 0
  %62 = load i32, ptr %8, align 4, !tbaa !11
  %63 = add i32 %62, 1
  store i32 %63, ptr %8, align 4, !tbaa !11
  %64 = zext i32 %62 to i64
  %65 = getelementptr inbounds i8, ptr %61, i64 %64
  %66 = load i8, ptr %65, align 1, !tbaa !15
  %67 = zext i8 %66 to i32
  %68 = xor i32 %67, %58
  %69 = trunc i32 %68 to i8
  store i8 %69, ptr %65, align 1, !tbaa !15
  br label %40, !llvm.loop !16

70:                                               ; preds = %49
  %71 = load i32, ptr %7, align 4, !tbaa !11
  %72 = add i32 %71, 16
  %73 = zext i32 %72 to i64
  %74 = load i64, ptr %5, align 8, !tbaa !9
  %75 = icmp ule i64 %73, %74
  br i1 %75, label %76, label %107

76:                                               ; preds = %70
  br label %77

77:                                               ; preds = %88, %76
  %78 = load i32, ptr %7, align 4, !tbaa !11
  %79 = add i32 %78, 8
  %80 = zext i32 %79 to i64
  %81 = load i64, ptr %5, align 8, !tbaa !9
  %82 = icmp ule i64 %80, %81
  br i1 %82, label %83, label %86

83:                                               ; preds = %77
  %84 = load i32, ptr %8, align 4, !tbaa !11
  %85 = icmp ule i32 %84, 8
  br label %86

86:                                               ; preds = %83, %77
  %87 = phi i1 [ false, %77 ], [ %85, %83 ]
  br i1 %87, label %88, label %106

88:                                               ; preds = %86
  %89 = load ptr, ptr %4, align 8, !tbaa !5
  %90 = load i32, ptr %7, align 4, !tbaa !11
  %91 = zext i32 %90 to i64
  %92 = getelementptr inbounds i8, ptr %89, i64 %91
  %93 = load i64, ptr %92, align 8, !tbaa !9
  %94 = load ptr, ptr %6, align 8, !tbaa !5
  %95 = getelementptr inbounds %struct.cmac_ctx, ptr %94, i32 0, i32 0
  %96 = getelementptr inbounds [2 x i64], ptr %95, i64 0, i64 0
  %97 = load i32, ptr %8, align 4, !tbaa !11
  %98 = zext i32 %97 to i64
  %99 = getelementptr inbounds i8, ptr %96, i64 %98
  %100 = load i64, ptr %99, align 8, !tbaa !9
  %101 = xor i64 %100, %93
  store i64 %101, ptr %99, align 8, !tbaa !9
  %102 = load i32, ptr %7, align 4, !tbaa !11
  %103 = add i32 %102, 8
  store i32 %103, ptr %7, align 4, !tbaa !11
  %104 = load i32, ptr %8, align 4, !tbaa !11
  %105 = add i32 %104, 8
  store i32 %105, ptr %8, align 4, !tbaa !11
  br label %77, !llvm.loop !18

106:                                              ; preds = %86
  br label %107

107:                                              ; preds = %106, %70
  br label %108

108:                                              ; preds = %114, %107
  %109 = load i32, ptr %7, align 4, !tbaa !11
  %110 = add i32 %109, 16
  %111 = zext i32 %110 to i64
  %112 = load i64, ptr %5, align 8, !tbaa !9
  %113 = icmp ule i64 %111, %112
  br i1 %113, label %114, label %137

114:                                              ; preds = %108
  %115 = load ptr, ptr %6, align 8, !tbaa !5
  %116 = getelementptr inbounds %struct.cmac_ctx, ptr %115, i32 0, i32 0
  %117 = getelementptr inbounds [2 x i64], ptr %116, i64 0, i64 0
  %118 = load ptr, ptr %6, align 8, !tbaa !5
  %119 = getelementptr inbounds %struct.cmac_ctx, ptr %118, i32 0, i32 0
  %120 = getelementptr inbounds [2 x i64], ptr %119, i64 0, i64 0
  %121 = load ptr, ptr %6, align 8, !tbaa !5
  %122 = getelementptr inbounds %struct.cmac_ctx, ptr %121, i32 0, i32 1
  %123 = getelementptr inbounds [1 x %struct.aes_crypt_ctx], ptr %122, i64 0, i64 0
  %124 = call i32 @aes_encrypt(ptr noundef %117, ptr noundef %120, ptr noundef %123)
  %125 = load ptr, ptr %6, align 8, !tbaa !5
  %126 = getelementptr inbounds %struct.cmac_ctx, ptr %125, i32 0, i32 0
  %127 = getelementptr inbounds [2 x i64], ptr %126, i64 0, i64 0
  %128 = load ptr, ptr %6, align 8, !tbaa !5
  %129 = getelementptr inbounds %struct.cmac_ctx, ptr %128, i32 0, i32 0
  %130 = getelementptr inbounds [2 x i64], ptr %129, i64 0, i64 0
  %131 = load ptr, ptr %4, align 8, !tbaa !5
  %132 = load i32, ptr %7, align 4, !tbaa !11
  %133 = zext i32 %132 to i64
  %134 = getelementptr inbounds i8, ptr %131, i64 %133
  call void @xor_block_aligned(ptr noundef %127, ptr noundef %130, ptr noundef %134)
  %135 = load i32, ptr %7, align 4, !tbaa !11
  %136 = add i32 %135, 16
  store i32 %136, ptr %7, align 4, !tbaa !11
  br label %108, !llvm.loop !19

137:                                              ; preds = %108
  br label %200

138:                                              ; preds = %26
  br label %139

139:                                              ; preds = %150, %138
  %140 = load i32, ptr %7, align 4, !tbaa !11
  %141 = zext i32 %140 to i64
  %142 = load i64, ptr %5, align 8, !tbaa !9
  %143 = icmp ult i64 %141, %142
  br i1 %143, label %144, label %148

144:                                              ; preds = %139
  %145 = load i32, ptr %8, align 4, !tbaa !11
  %146 = and i32 %145, 15
  %147 = icmp ne i32 %146, 0
  br label %148

148:                                              ; preds = %144, %139
  %149 = phi i1 [ false, %139 ], [ %147, %144 ]
  br i1 %149, label %150, label %169

150:                                              ; preds = %148
  %151 = load ptr, ptr %4, align 8, !tbaa !5
  %152 = load i32, ptr %7, align 4, !tbaa !11
  %153 = add i32 %152, 1
  store i32 %153, ptr %7, align 4, !tbaa !11
  %154 = zext i32 %152 to i64
  %155 = getelementptr inbounds i8, ptr %151, i64 %154
  %156 = load i8, ptr %155, align 1, !tbaa !15
  %157 = zext i8 %156 to i32
  %158 = load ptr, ptr %6, align 8, !tbaa !5
  %159 = getelementptr inbounds %struct.cmac_ctx, ptr %158, i32 0, i32 0
  %160 = getelementptr inbounds [2 x i64], ptr %159, i64 0, i64 0
  %161 = load i32, ptr %8, align 4, !tbaa !11
  %162 = add i32 %161, 1
  store i32 %162, ptr %8, align 4, !tbaa !11
  %163 = zext i32 %161 to i64
  %164 = getelementptr inbounds i8, ptr %160, i64 %163
  %165 = load i8, ptr %164, align 1, !tbaa !15
  %166 = zext i8 %165 to i32
  %167 = xor i32 %166, %157
  %168 = trunc i32 %167 to i8
  store i8 %168, ptr %164, align 1, !tbaa !15
  br label %139, !llvm.loop !20

169:                                              ; preds = %148
  br label %170

170:                                              ; preds = %176, %169
  %171 = load i32, ptr %7, align 4, !tbaa !11
  %172 = add i32 %171, 16
  %173 = zext i32 %172 to i64
  %174 = load i64, ptr %5, align 8, !tbaa !9
  %175 = icmp ule i64 %173, %174
  br i1 %175, label %176, label %199

176:                                              ; preds = %170
  %177 = load ptr, ptr %6, align 8, !tbaa !5
  %178 = getelementptr inbounds %struct.cmac_ctx, ptr %177, i32 0, i32 0
  %179 = getelementptr inbounds [2 x i64], ptr %178, i64 0, i64 0
  %180 = load ptr, ptr %6, align 8, !tbaa !5
  %181 = getelementptr inbounds %struct.cmac_ctx, ptr %180, i32 0, i32 0
  %182 = getelementptr inbounds [2 x i64], ptr %181, i64 0, i64 0
  %183 = load ptr, ptr %6, align 8, !tbaa !5
  %184 = getelementptr inbounds %struct.cmac_ctx, ptr %183, i32 0, i32 1
  %185 = getelementptr inbounds [1 x %struct.aes_crypt_ctx], ptr %184, i64 0, i64 0
  %186 = call i32 @aes_encrypt(ptr noundef %179, ptr noundef %182, ptr noundef %185)
  %187 = load ptr, ptr %6, align 8, !tbaa !5
  %188 = getelementptr inbounds %struct.cmac_ctx, ptr %187, i32 0, i32 0
  %189 = getelementptr inbounds [2 x i64], ptr %188, i64 0, i64 0
  %190 = load ptr, ptr %6, align 8, !tbaa !5
  %191 = getelementptr inbounds %struct.cmac_ctx, ptr %190, i32 0, i32 0
  %192 = getelementptr inbounds [2 x i64], ptr %191, i64 0, i64 0
  %193 = load ptr, ptr %4, align 8, !tbaa !5
  %194 = load i32, ptr %7, align 4, !tbaa !11
  %195 = zext i32 %194 to i64
  %196 = getelementptr inbounds i8, ptr %193, i64 %195
  call void @xor_block(ptr noundef %189, ptr noundef %192, ptr noundef %196)
  %197 = load i32, ptr %7, align 4, !tbaa !11
  %198 = add i32 %197, 16
  store i32 %198, ptr %7, align 4, !tbaa !11
  br label %170, !llvm.loop !21

199:                                              ; preds = %170
  br label %200

200:                                              ; preds = %199, %137
  br label %201

201:                                              ; preds = %220, %200
  %202 = load i32, ptr %7, align 4, !tbaa !11
  %203 = zext i32 %202 to i64
  %204 = load i64, ptr %5, align 8, !tbaa !9
  %205 = icmp ult i64 %203, %204
  br i1 %205, label %206, label %239

206:                                              ; preds = %201
  %207 = load i32, ptr %8, align 4, !tbaa !11
  %208 = icmp eq i32 %207, 16
  br i1 %208, label %209, label %220

209:                                              ; preds = %206
  %210 = load ptr, ptr %6, align 8, !tbaa !5
  %211 = getelementptr inbounds %struct.cmac_ctx, ptr %210, i32 0, i32 0
  %212 = getelementptr inbounds [2 x i64], ptr %211, i64 0, i64 0
  %213 = load ptr, ptr %6, align 8, !tbaa !5
  %214 = getelementptr inbounds %struct.cmac_ctx, ptr %213, i32 0, i32 0
  %215 = getelementptr inbounds [2 x i64], ptr %214, i64 0, i64 0
  %216 = load ptr, ptr %6, align 8, !tbaa !5
  %217 = getelementptr inbounds %struct.cmac_ctx, ptr %216, i32 0, i32 1
  %218 = getelementptr inbounds [1 x %struct.aes_crypt_ctx], ptr %217, i64 0, i64 0
  %219 = call i32 @aes_encrypt(ptr noundef %212, ptr noundef %215, ptr noundef %218)
  store i32 0, ptr %8, align 4, !tbaa !11
  br label %220

220:                                              ; preds = %209, %206
  %221 = load ptr, ptr %4, align 8, !tbaa !5
  %222 = load i32, ptr %7, align 4, !tbaa !11
  %223 = add i32 %222, 1
  store i32 %223, ptr %7, align 4, !tbaa !11
  %224 = zext i32 %222 to i64
  %225 = getelementptr inbounds i8, ptr %221, i64 %224
  %226 = load i8, ptr %225, align 1, !tbaa !15
  %227 = zext i8 %226 to i32
  %228 = load ptr, ptr %6, align 8, !tbaa !5
  %229 = getelementptr inbounds %struct.cmac_ctx, ptr %228, i32 0, i32 0
  %230 = getelementptr inbounds [2 x i64], ptr %229, i64 0, i64 0
  %231 = load i32, ptr %8, align 4, !tbaa !11
  %232 = add i32 %231, 1
  store i32 %232, ptr %8, align 4, !tbaa !11
  %233 = zext i32 %231 to i64
  %234 = getelementptr inbounds i8, ptr %230, i64 %233
  %235 = load i8, ptr %234, align 1, !tbaa !15
  %236 = zext i8 %235 to i32
  %237 = xor i32 %236, %227
  %238 = trunc i32 %237 to i8
  store i8 %238, ptr %234, align 1, !tbaa !15
  br label %201, !llvm.loop !22

239:                                              ; preds = %201
  %240 = load i32, ptr %7, align 4, !tbaa !11
  %241 = load ptr, ptr %6, align 8, !tbaa !5
  %242 = getelementptr inbounds %struct.cmac_ctx, ptr %241, i32 0, i32 2
  %243 = load i32, ptr %242, align 16, !tbaa !13
  %244 = add i32 %243, %240
  store i32 %244, ptr %242, align 16, !tbaa !13
  store i32 0, ptr %9, align 4
  br label %245

245:                                              ; preds = %239, %16
  call void @llvm.lifetime.end.p0(i64 4, ptr %8) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %7) #4
  %246 = load i32, ptr %9, align 4
  switch i32 %246, label %248 [
    i32 0, label %247
    i32 1, label %247
  ]

247:                                              ; preds = %245, %245
  ret void

248:                                              ; preds = %245
  unreachable
}

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

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

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

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

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

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 = { "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #3 = { inlinehint nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #4 = { nounwind }

!llvm.module.flags = !{!0, !1, !2, !3}
!llvm.ident = !{!4}

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"any pointer", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!10, !10, i64 0}
!10 = !{!"long", !7, i64 0}
!11 = !{!12, !12, i64 0}
!12 = !{!"int", !7, i64 0}
!13 = !{!14, !12, i64 272}
!14 = !{!"", !7, i64 0, !7, i64 16, !12, i64 272}
!15 = !{!7, !7, i64 0}
!16 = distinct !{!16, !17}
!17 = !{!"llvm.loop.mustprogress"}
!18 = distinct !{!18, !17}
!19 = distinct !{!19, !17}
!20 = distinct !{!20, !17}
!21 = distinct !{!21, !17}
!22 = distinct !{!22, !17}


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

; Function Attrs: nounwind uwtable
define dso_local void @cmac_data(ptr noundef %0, i64 noundef %1, ptr noundef %2) local_unnamed_addr #0 {
  %4 = getelementptr inbounds i8, ptr %2, i64 272
  %.not = icmp eq i64 %1, 0
  br i1 %.not, label %183, label %5

5:                                                ; preds = %3
  %6 = load i32, ptr %4, align 16, !tbaa !5
  %7 = and i32 %6, 15
  %8 = icmp eq i32 %6, 0
  %9 = icmp ne i32 %7, 0
  %or.cond = or i1 %8, %9
  %spec.store.select = select i1 %or.cond, i32 %7, i32 16
  %10 = zext nneg i32 %spec.store.select to i64
  %11 = getelementptr inbounds i8, ptr %2, i64 %10
  %12 = ptrtoint ptr %0 to i64
  %13 = ptrtoint ptr %11 to i64
  %14 = sub i64 %12, %13
  %15 = and i64 %14, 7
  %.not75 = icmp eq i64 %15, 0
  br i1 %.not75, label %.preheader80, label %.preheader83

.preheader83:                                     ; preds = %5
  %16 = and i32 %spec.store.select, 15
  %.not112 = icmp eq i32 %16, 0
  br i1 %.not112, label %.preheader81, label %.lr.ph.preheader

.lr.ph.preheader:                                 ; preds = %.preheader83
  %17 = add i64 %1, -1
  %18 = and i32 %spec.store.select, 15
  %19 = xor i32 %18, 15
  %20 = zext nneg i32 %19 to i64
  %umin153 = tail call i64 @llvm.umin.i64(i64 %17, i64 %20)
  %21 = add nuw nsw i64 %umin153, 1
  %min.iters.check.not = icmp eq i64 %umin153, 15
  br i1 %min.iters.check.not, label %vector.memcheck, label %.lr.ph.preheader161

.lr.ph.preheader161:                              ; preds = %vector.memcheck, %.lr.ph.preheader
  br label %.lr.ph

vector.memcheck:                                  ; preds = %.lr.ph.preheader
  %22 = add i64 %1, -1
  %23 = and i32 %spec.store.select, 15
  %24 = xor i32 %23, 15
  %25 = zext nneg i32 %24 to i64
  %umin = tail call i64 @llvm.umin.i64(i64 %22, i64 %25)
  %26 = getelementptr i8, ptr %2, i64 %umin
  %27 = getelementptr i8, ptr %26, i64 %10
  %scevgep = getelementptr i8, ptr %27, i64 1
  %28 = getelementptr i8, ptr %0, i64 %umin
  %scevgep152 = getelementptr i8, ptr %28, i64 1
  %bound0 = icmp ult ptr %11, %scevgep152
  %bound1 = icmp ugt ptr %scevgep, %0
  %found.conflict = and i1 %bound0, %bound1
  br i1 %found.conflict, label %.lr.ph.preheader161, label %vector.body

vector.body:                                      ; preds = %vector.memcheck
  %wide.load = load <16 x i8>, ptr %0, align 1, !tbaa !10, !alias.scope !11
  %29 = getelementptr inbounds i8, ptr %2, i64 %10
  %wide.load155 = load <16 x i8>, ptr %29, align 1, !tbaa !10, !alias.scope !14, !noalias !11
  %30 = xor <16 x i8> %wide.load155, %wide.load
  store <16 x i8> %30, ptr %29, align 1, !tbaa !10, !alias.scope !14, !noalias !11
  %31 = add nuw nsw i32 %spec.store.select, 16
  br label %.preheader81.loopexit

.preheader80:                                     ; preds = %5
  %32 = and i32 %spec.store.select, 7
  %.not113 = icmp eq i32 %32, 0
  br i1 %.not113, label %._crit_edge, label %.lr.ph93

.lr.ph93:                                         ; preds = %.preheader80
  %33 = load i8, ptr %0, align 1, !tbaa !10
  %indvars.iv.next129 = add nuw nsw i64 %10, 1
  %34 = getelementptr inbounds i8, ptr %2, i64 %10
  %35 = load i8, ptr %34, align 1, !tbaa !10
  %36 = xor i8 %35, %33
  store i8 %36, ptr %34, align 1, !tbaa !10
  %37 = icmp ne i64 %1, 1
  %38 = trunc nuw nsw i64 %indvars.iv.next129 to i32
  %39 = and i32 %38, 7
  %40 = icmp ne i32 %39, 0
  %41 = and i1 %37, %40
  br i1 %41, label %.lr.ph93.1, label %._crit_edge, !llvm.loop !16

.lr.ph93.1:                                       ; preds = %.lr.ph93
  %42 = getelementptr inbounds i8, ptr %0, i64 1
  %43 = load i8, ptr %42, align 1, !tbaa !10
  %indvars.iv.next129.1 = add nuw nsw i64 %10, 2
  %44 = getelementptr inbounds i8, ptr %2, i64 %indvars.iv.next129
  %45 = load i8, ptr %44, align 1, !tbaa !10
  %46 = xor i8 %45, %43
  store i8 %46, ptr %44, align 1, !tbaa !10
  %47 = icmp ugt i64 %1, 2
  %48 = trunc nuw nsw i64 %indvars.iv.next129.1 to i32
  %49 = and i32 %48, 7
  %50 = icmp ne i32 %49, 0
  %51 = and i1 %47, %50
  br i1 %51, label %.lr.ph93.2, label %._crit_edge, !llvm.loop !16

.lr.ph93.2:                                       ; preds = %.lr.ph93.1
  %52 = getelementptr inbounds i8, ptr %0, i64 2
  %53 = load i8, ptr %52, align 1, !tbaa !10
  %indvars.iv.next129.2 = add nuw nsw i64 %10, 3
  %54 = getelementptr inbounds i8, ptr %2, i64 %indvars.iv.next129.1
  %55 = load i8, ptr %54, align 1, !tbaa !10
  %56 = xor i8 %55, %53
  store i8 %56, ptr %54, align 1, !tbaa !10
  %57 = icmp ugt i64 %1, 3
  %58 = trunc nuw nsw i64 %indvars.iv.next129.2 to i32
  %59 = and i32 %58, 7
  %60 = icmp ne i32 %59, 0
  %61 = and i1 %57, %60
  br i1 %61, label %.lr.ph93.3, label %._crit_edge, !llvm.loop !16

.lr.ph93.3:                                       ; preds = %.lr.ph93.2
  %62 = getelementptr inbounds i8, ptr %0, i64 3
  %63 = load i8, ptr %62, align 1, !tbaa !10
  %indvars.iv.next129.3 = add nuw nsw i64 %10, 4
  %64 = getelementptr inbounds i8, ptr %2, i64 %indvars.iv.next129.2
  %65 = load i8, ptr %64, align 1, !tbaa !10
  %66 = xor i8 %65, %63
  store i8 %66, ptr %64, align 1, !tbaa !10
  %67 = icmp ugt i64 %1, 4
  %68 = trunc nuw nsw i64 %indvars.iv.next129.3 to i32
  %69 = and i32 %68, 7
  %70 = icmp ne i32 %69, 0
  %71 = and i1 %67, %70
  br i1 %71, label %.lr.ph93.4, label %._crit_edge, !llvm.loop !16

.lr.ph93.4:                                       ; preds = %.lr.ph93.3
  %72 = getelementptr inbounds i8, ptr %0, i64 4
  %73 = load i8, ptr %72, align 1, !tbaa !10
  %indvars.iv.next129.4 = add nuw nsw i64 %10, 5
  %74 = getelementptr inbounds i8, ptr %2, i64 %indvars.iv.next129.3
  %75 = load i8, ptr %74, align 1, !tbaa !10
  %76 = xor i8 %75, %73
  store i8 %76, ptr %74, align 1, !tbaa !10
  %77 = icmp ugt i64 %1, 5
  %78 = trunc nuw nsw i64 %indvars.iv.next129.4 to i32
  %79 = and i32 %78, 7
  %80 = icmp ne i32 %79, 0
  %81 = and i1 %77, %80
  br i1 %81, label %.lr.ph93.5, label %._crit_edge, !llvm.loop !16

.lr.ph93.5:                                       ; preds = %.lr.ph93.4
  %82 = getelementptr inbounds i8, ptr %0, i64 5
  %83 = load i8, ptr %82, align 1, !tbaa !10
  %indvars.iv.next129.5 = add nuw nsw i64 %10, 6
  %84 = getelementptr inbounds i8, ptr %2, i64 %indvars.iv.next129.4
  %85 = load i8, ptr %84, align 1, !tbaa !10
  %86 = xor i8 %85, %83
  store i8 %86, ptr %84, align 1, !tbaa !10
  %87 = icmp ugt i64 %1, 6
  %88 = trunc nuw nsw i64 %indvars.iv.next129.5 to i32
  %89 = and i32 %88, 7
  %90 = icmp ne i32 %89, 0
  %91 = and i1 %87, %90
  br i1 %91, label %.lr.ph93.6, label %._crit_edge, !llvm.loop !16

.lr.ph93.6:                                       ; preds = %.lr.ph93.5
  %92 = getelementptr inbounds i8, ptr %0, i64 6
  %93 = load i8, ptr %92, align 1, !tbaa !10
  %indvars.iv.next129.6 = add nuw nsw i64 %10, 7
  %94 = getelementptr inbounds i8, ptr %2, i64 %indvars.iv.next129.5
  %95 = load i8, ptr %94, align 1, !tbaa !10
  %96 = xor i8 %95, %93
  store i8 %96, ptr %94, align 1, !tbaa !10
  %97 = icmp ugt i64 %1, 7
  %98 = trunc nuw nsw i64 %indvars.iv.next129.6 to i32
  %99 = and i32 %98, 7
  %100 = icmp ne i32 %99, 0
  %101 = and i1 %97, %100
  br i1 %101, label %.lr.ph93.7, label %._crit_edge, !llvm.loop !16

.lr.ph93.7:                                       ; preds = %.lr.ph93.6
  %102 = getelementptr inbounds i8, ptr %0, i64 7
  %103 = load i8, ptr %102, align 1, !tbaa !10
  %indvars.iv.next129.7 = add nuw nsw i32 %spec.store.select, 8
  %104 = getelementptr inbounds i8, ptr %2, i64 %indvars.iv.next129.6
  %105 = load i8, ptr %104, align 1, !tbaa !10
  %106 = xor i8 %105, %103
  store i8 %106, ptr %104, align 1, !tbaa !10
  br label %._crit_edge

._crit_edge:                                      ; preds = %.lr.ph93, %.lr.ph93.1, %.lr.ph93.2, %.lr.ph93.3, %.lr.ph93.4, %.lr.ph93.5, %.lr.ph93.6, %.lr.ph93.7, %.preheader80
  %.064.lcssa = phi i32 [ 0, %.preheader80 ], [ 1, %.lr.ph93 ], [ 2, %.lr.ph93.1 ], [ 3, %.lr.ph93.2 ], [ 4, %.lr.ph93.3 ], [ 5, %.lr.ph93.4 ], [ 6, %.lr.ph93.5 ], [ 7, %.lr.ph93.6 ], [ 8, %.lr.ph93.7 ]
  %.0.lcssa = phi i32 [ %spec.store.select, %.preheader80 ], [ %38, %.lr.ph93 ], [ %48, %.lr.ph93.1 ], [ %58, %.lr.ph93.2 ], [ %68, %.lr.ph93.3 ], [ %78, %.lr.ph93.4 ], [ %88, %.lr.ph93.5 ], [ %98, %.lr.ph93.6 ], [ %indvars.iv.next129.7, %.lr.ph93.7 ]
  %107 = add nsw i32 %.064.lcssa, 16
  %108 = zext i32 %107 to i64
  %.not76 = icmp ugt i64 %108, %1
  br i1 %.not76, label %.loopexit79, label %.preheader

.preheader:                                       ; preds = %._crit_edge
  %109 = add nsw i32 %.064.lcssa, 8
  %110 = zext i32 %109 to i64
  %111 = icmp ule i64 %110, %1
  %112 = icmp ult i32 %.0.lcssa, 9
  %113 = and i1 %111, %112
  br i1 %113, label %.lr.ph98.preheader, label %.loopexit79

.lr.ph98.preheader:                               ; preds = %.preheader
  %114 = zext nneg i32 %.0.lcssa to i64
  %115 = zext i32 %.064.lcssa to i64
  %116 = getelementptr inbounds i8, ptr %0, i64 %115
  %117 = load i64, ptr %116, align 8, !tbaa !18
  %118 = getelementptr inbounds i8, ptr %2, i64 %114
  %119 = load i64, ptr %118, align 8, !tbaa !18
  %120 = xor i64 %119, %117
  store i64 %120, ptr %118, align 8, !tbaa !18
  %121 = add nsw i32 %.064.lcssa, 16
  %122 = zext i32 %121 to i64
  %123 = icmp ule i64 %122, %1
  %124 = icmp eq i32 %.0.lcssa, 0
  %125 = and i1 %123, %124
  br i1 %125, label %.lr.ph98.preheader.peel.newph, label %.loopexit79.loopexit

.lr.ph98.preheader.peel.newph:                    ; preds = %.lr.ph98.preheader
  %126 = zext i32 %109 to i64
  %127 = getelementptr inbounds i8, ptr %0, i64 %126
  %128 = getelementptr inbounds i8, ptr %2, i64 8
  %129 = load i64, ptr %127, align 8, !tbaa !18
  %130 = load i64, ptr %128, align 8, !tbaa !18
  %131 = xor i64 %130, %129
  store i64 %131, ptr %128, align 8, !tbaa !18
  br label %.loopexit79.loopexit

.loopexit79.loopexit:                             ; preds = %.lr.ph98.preheader.peel.newph, %.lr.ph98.preheader
  %indvars.iv135.lcssa = phi i32 [ %.0.lcssa, %.lr.ph98.preheader ], [ 8, %.lr.ph98.preheader.peel.newph ]
  %.lcssa157 = phi i32 [ %109, %.lr.ph98.preheader ], [ %121, %.lr.ph98.preheader.peel.newph ]
  %132 = add nuw nsw i32 %indvars.iv135.lcssa, 8
  %.pre = add nsw i32 %.lcssa157, 16
  %.pre138 = zext i32 %.pre to i64
  br label %.loopexit79

.loopexit79:                                      ; preds = %.loopexit79.loopexit, %.preheader, %._crit_edge
  %.pre-phi139 = phi i64 [ %.pre138, %.loopexit79.loopexit ], [ %108, %.preheader ], [ %108, %._crit_edge ]
  %.pre-phi = phi i32 [ %.pre, %.loopexit79.loopexit ], [ %107, %.preheader ], [ %107, %._crit_edge ]
  %.266 = phi i32 [ %.lcssa157, %.loopexit79.loopexit ], [ %.064.lcssa, %.preheader ], [ %.064.lcssa, %._crit_edge ]
  %.2 = phi i32 [ %132, %.loopexit79.loopexit ], [ %.0.lcssa, %.preheader ], [ %.0.lcssa, %._crit_edge ]
  %.not77101 = icmp ugt i64 %.pre-phi139, %1
  br i1 %.not77101, label %.loopexit, label %.lr.ph104

.lr.ph104:                                        ; preds = %.loopexit79
  %133 = getelementptr inbounds i8, ptr %2, i64 16
  br label %134

134:                                              ; preds = %.lr.ph104, %134
  %135 = phi i32 [ %.pre-phi, %.lr.ph104 ], [ %139, %134 ]
  %.367102 = phi i32 [ %.266, %.lr.ph104 ], [ %135, %134 ]
  %136 = tail call i32 @aes_encrypt(ptr noundef %2, ptr noundef %2, ptr noundef nonnull %133) #4
  %137 = zext i32 %.367102 to i64
  %138 = getelementptr inbounds i8, ptr %0, i64 %137
  tail call void @xor_block_aligned(ptr noundef %2, ptr noundef %2, ptr noundef %138)
  %139 = add i32 %135, 16
  %140 = zext i32 %139 to i64
  %.not77 = icmp ugt i64 %140, %1
  br i1 %.not77, label %.loopexit, label %134, !llvm.loop !20

.preheader81.loopexit:                            ; preds = %.lr.ph, %vector.body
  %indvars.iv.next124.lcssa = phi i64 [ %21, %vector.body ], [ %indvars.iv.next124, %.lr.ph ]
  %.lcssa151 = phi i32 [ %31, %vector.body ], [ %151, %.lr.ph ]
  %141 = trunc nuw nsw i64 %indvars.iv.next124.lcssa to i32
  br label %.preheader81

.preheader81:                                     ; preds = %.preheader81.loopexit, %.preheader83
  %.468.lcssa = phi i32 [ 0, %.preheader83 ], [ %141, %.preheader81.loopexit ]
  %.3.lcssa = phi i32 [ %spec.store.select, %.preheader83 ], [ %.lcssa151, %.preheader81.loopexit ]
  %142 = add i32 %.468.lcssa, 16
  %143 = zext i32 %142 to i64
  %.not7887 = icmp ugt i64 %143, %1
  br i1 %.not7887, label %.loopexit, label %.lr.ph89

.lr.ph89:                                         ; preds = %.preheader81
  %144 = getelementptr inbounds i8, ptr %2, i64 16
  br label %155

.lr.ph:                                           ; preds = %.lr.ph.preheader161, %.lr.ph
  %indvars.iv123 = phi i64 [ %indvars.iv.next124, %.lr.ph ], [ 0, %.lr.ph.preheader161 ]
  %indvars.iv = phi i64 [ %indvars.iv.next, %.lr.ph ], [ %10, %.lr.ph.preheader161 ]
  %indvars.iv.next124 = add nuw nsw i64 %indvars.iv123, 1
  %145 = getelementptr inbounds i8, ptr %0, i64 %indvars.iv123
  %146 = load i8, ptr %145, align 1, !tbaa !10
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
  %147 = getelementptr inbounds i8, ptr %2, i64 %indvars.iv
  %148 = load i8, ptr %147, align 1, !tbaa !10
  %149 = xor i8 %148, %146
  store i8 %149, ptr %147, align 1, !tbaa !10
  %150 = icmp ult i64 %indvars.iv.next124, %1
  %151 = trunc nuw nsw i64 %indvars.iv.next to i32
  %152 = and i32 %151, 15
  %153 = icmp ne i32 %152, 0
  %154 = and i1 %150, %153
  br i1 %154, label %.lr.ph, label %.preheader81.loopexit, !llvm.loop !21

155:                                              ; preds = %.lr.ph89, %155
  %156 = phi i32 [ %142, %.lr.ph89 ], [ %160, %155 ]
  %.56988 = phi i32 [ %.468.lcssa, %.lr.ph89 ], [ %156, %155 ]
  %157 = tail call i32 @aes_encrypt(ptr noundef %2, ptr noundef %2, ptr noundef nonnull %144) #4
  %158 = zext i32 %.56988 to i64
  %159 = getelementptr inbounds i8, ptr %0, i64 %158
  tail call void @xor_block(ptr noundef %2, ptr noundef %2, ptr noundef %159)
  %160 = add i32 %156, 16
  %161 = zext i32 %160 to i64
  %.not78 = icmp ugt i64 %161, %1
  br i1 %.not78, label %.loopexit, label %155, !llvm.loop !23

.loopexit:                                        ; preds = %155, %134, %.preheader81, %.loopexit79
  %.670 = phi i32 [ %.266, %.loopexit79 ], [ %.468.lcssa, %.preheader81 ], [ %135, %134 ], [ %156, %155 ]
  %.4 = phi i32 [ %.2, %.loopexit79 ], [ %.3.lcssa, %.preheader81 ], [ %.2, %134 ], [ %.3.lcssa, %155 ]
  %162 = zext i32 %.670 to i64
  %163 = icmp ult i64 %162, %1
  br i1 %163, label %.lr.ph109, label %._crit_edge110

.lr.ph109:                                        ; preds = %.loopexit
  %164 = getelementptr inbounds i8, ptr %2, i64 16
  br label %165

165:                                              ; preds = %.lr.ph109, %170
  %166 = phi i64 [ %162, %.lr.ph109 ], [ %179, %170 ]
  %.5107 = phi i32 [ %.4, %.lr.ph109 ], [ %174, %170 ]
  %.7106 = phi i32 [ %.670, %.lr.ph109 ], [ %171, %170 ]
  %167 = icmp eq i32 %.5107, 16
  br i1 %167, label %168, label %170

168:                                              ; preds = %165
  %169 = tail call i32 @aes_encrypt(ptr noundef %2, ptr noundef %2, ptr noundef nonnull %164) #4
  br label %170

170:                                              ; preds = %168, %165
  %.6 = phi i32 [ 0, %168 ], [ %.5107, %165 ]
  %171 = add i32 %.7106, 1
  %172 = getelementptr inbounds i8, ptr %0, i64 %166
  %173 = load i8, ptr %172, align 1, !tbaa !10
  %174 = add i32 %.6, 1
  %175 = zext i32 %.6 to i64
  %176 = getelementptr inbounds i8, ptr %2, i64 %175
  %177 = load i8, ptr %176, align 1, !tbaa !10
  %178 = xor i8 %177, %173
  store i8 %178, ptr %176, align 1, !tbaa !10
  %179 = zext i32 %171 to i64
  %180 = icmp ult i64 %179, %1
  br i1 %180, label %165, label %._crit_edge110, !llvm.loop !24

._crit_edge110:                                   ; preds = %170, %.loopexit
  %.7.lcssa = phi i32 [ %.670, %.loopexit ], [ %171, %170 ]
  %181 = load i32, ptr %4, align 16, !tbaa !5
  %182 = add i32 %181, %.7.lcssa
  store i32 %182, ptr %4, align 16, !tbaa !5
  br label %183

183:                                              ; preds = %3, %._crit_edge110
  ret void
}

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

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

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

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare i64 @llvm.umin.i64(i64, i64) #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 = { "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #2 = { inlinehint nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #3 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #4 = { nounwind }

!llvm.module.flags = !{!0, !1, !2, !3}
!llvm.ident = !{!4}

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !9, i64 272}
!6 = !{!"", !7, i64 0, !7, i64 16, !9, i64 272}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!"int", !7, i64 0}
!10 = !{!7, !7, i64 0}
!11 = !{!12}
!12 = distinct !{!12, !13}
!13 = distinct !{!13, !"LVerDomain"}
!14 = !{!15}
!15 = distinct !{!15, !13}
!16 = distinct !{!16, !17}
!17 = !{!"llvm.loop.mustprogress"}
!18 = !{!19, !19, i64 0}
!19 = !{!"long", !7, i64 0}
!20 = distinct !{!20, !17}
!21 = distinct !{!21, !17, !22}
!22 = !{!"llvm.loop.isvectorized", i32 1}
!23 = distinct !{!23, !17}
!24 = distinct !{!24, !17}


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