; LLVM IR from intuitive-robots/mdt_policy :: pyhash-0.9.3/src/smhasher (hasshe2)

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

@.str = external hidden unnamed_addr constant [18 x i8], align 1
@.str.1 = external hidden unnamed_addr constant [97 x i8], align 1
@__PRETTY_FUNCTION__.hasshe2 = external hidden unnamed_addr constant [50 x i8], align 1
@coeffs = external hidden global [12 x i32], align 16

; Function Attrs: nounwind uwtable
define dso_local void @hasshe2(ptr noundef %0, i32 noundef %1, i32 noundef %2, ptr noundef %3) #0 {
  %5 = alloca ptr, align 8
  %6 = alloca i32, align 4
  %7 = alloca i32, align 4
  %8 = alloca ptr, align 8
  %9 = alloca <2 x i64>, align 16
  %10 = alloca <2 x i64>, align 16
  %11 = alloca <2 x i64>, align 16
  %12 = alloca <2 x i64>, align 16
  %13 = alloca <2 x i64>, align 16
  %14 = alloca <2 x i64>, align 16
  store ptr %0, ptr %5, align 8, !tbaa !5
  store i32 %1, ptr %6, align 4, !tbaa !9
  store i32 %2, ptr %7, align 4, !tbaa !9
  store ptr %3, ptr %8, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 16, ptr %9) #4
  call void @llvm.lifetime.start.p0(i64 16, ptr %10) #4
  call void @llvm.lifetime.start.p0(i64 16, ptr %11) #4
  call void @llvm.lifetime.start.p0(i64 16, ptr %12) #4
  call void @llvm.lifetime.start.p0(i64 16, ptr %13) #4
  call void @llvm.lifetime.start.p0(i64 16, ptr %14) #4
  %15 = load i32, ptr %6, align 4, !tbaa !9
  %16 = srem i32 %15, 16
  %17 = icmp eq i32 %16, 0
  br i1 %17, label %18, label %19

18:                                               ; preds = %4
  br label %20

19:                                               ; preds = %4
  call void @__assert_fail(ptr noundef @.str, ptr noundef @.str.1, i32 noundef 61, ptr noundef @__PRETTY_FUNCTION__.hasshe2) #5
  unreachable

20:                                               ; preds = %18
  %21 = call <2 x i64> @_mm_load_si128(ptr noundef @coeffs)
  store <2 x i64> %21, ptr %9, align 16, !tbaa !11
  %22 = call <2 x i64> @_mm_load_si128(ptr noundef getelementptr inbounds (i32, ptr @coeffs, i64 4))
  store <2 x i64> %22, ptr %10, align 16, !tbaa !11
  %23 = call <2 x i64> @_mm_load_si128(ptr noundef getelementptr inbounds (i32, ptr @coeffs, i64 8))
  store <2 x i64> %23, ptr %11, align 16, !tbaa !11
  %24 = load <2 x i64>, ptr %11, align 16, !tbaa !11
  store <2 x i64> %24, ptr %14, align 16, !tbaa !11
  store <2 x i64> %24, ptr %13, align 16, !tbaa !11
  br label %25

25:                                               ; preds = %28, %20
  %26 = load i32, ptr %6, align 4, !tbaa !9
  %27 = icmp sge i32 %26, 16
  br i1 %27, label %28, label %112

28:                                               ; preds = %25
  %29 = load ptr, ptr %5, align 8, !tbaa !5
  %30 = call <2 x i64> @_mm_loadu_si128(ptr noundef %29)
  store <2 x i64> %30, ptr %12, align 16, !tbaa !11
  %31 = load ptr, ptr %5, align 8, !tbaa !5
  %32 = getelementptr inbounds i8, ptr %31, i64 16
  store ptr %32, ptr %5, align 8, !tbaa !5
  %33 = load i32, ptr %6, align 4, !tbaa !9
  %34 = sub nsw i32 %33, 16
  store i32 %34, ptr %6, align 4, !tbaa !9
  %35 = load <2 x i64>, ptr %13, align 16, !tbaa !11
  %36 = load <2 x i64>, ptr %9, align 16, !tbaa !11
  %37 = load <2 x i64>, ptr %12, align 16, !tbaa !11
  %38 = load <2 x i64>, ptr %12, align 16, !tbaa !11
  %39 = call <2 x i64> @_mm_unpackhi_epi32(<2 x i64> noundef %37, <2 x i64> noundef %38)
  %40 = call <2 x i64> @_mm_mul_epu32(<2 x i64> noundef %36, <2 x i64> noundef %39)
  %41 = call <2 x i64> @_mm_sub_epi64(<2 x i64> noundef %35, <2 x i64> noundef %40)
  store <2 x i64> %41, ptr %13, align 16, !tbaa !11
  %42 = load <2 x i64>, ptr %14, align 16, !tbaa !11
  %43 = load <2 x i64>, ptr %10, align 16, !tbaa !11
  %44 = load <2 x i64>, ptr %12, align 16, !tbaa !11
  %45 = load <2 x i64>, ptr %12, align 16, !tbaa !11
  %46 = call <2 x i64> @_mm_unpacklo_epi32(<2 x i64> noundef %44, <2 x i64> noundef %45)
  %47 = call <2 x i64> @_mm_mul_epu32(<2 x i64> noundef %43, <2 x i64> noundef %46)
  %48 = call <2 x i64> @_mm_sub_epi64(<2 x i64> noundef %42, <2 x i64> noundef %47)
  store <2 x i64> %48, ptr %14, align 16, !tbaa !11
  %49 = load <2 x i64>, ptr %13, align 16, !tbaa !11
  %50 = load <2 x i64>, ptr %13, align 16, !tbaa !11
  %51 = call <2 x i64> @_mm_srli_epi64(<2 x i64> noundef %50, i32 noundef 29)
  %52 = call <2 x i64> @_mm_xor_si128(<2 x i64> noundef %49, <2 x i64> noundef %51)
  store <2 x i64> %52, ptr %13, align 16, !tbaa !11
  %53 = load <2 x i64>, ptr %14, align 16, !tbaa !11
  %54 = load <2 x i64>, ptr %14, align 16, !tbaa !11
  %55 = call <2 x i64> @_mm_srli_epi64(<2 x i64> noundef %54, i32 noundef 29)
  %56 = call <2 x i64> @_mm_xor_si128(<2 x i64> noundef %53, <2 x i64> noundef %55)
  store <2 x i64> %56, ptr %14, align 16, !tbaa !11
  %57 = load <2 x i64>, ptr %13, align 16, !tbaa !11
  %58 = load <2 x i64>, ptr %13, align 16, !tbaa !11
  %59 = call <2 x i64> @_mm_slli_epi64(<2 x i64> noundef %58, i32 noundef 16)
  %60 = call <2 x i64> @_mm_add_epi64(<2 x i64> noundef %57, <2 x i64> noundef %59)
  store <2 x i64> %60, ptr %13, align 16, !tbaa !11
  %61 = load <2 x i64>, ptr %14, align 16, !tbaa !11
  %62 = load <2 x i64>, ptr %14, align 16, !tbaa !11
  %63 = call <2 x i64> @_mm_slli_epi64(<2 x i64> noundef %62, i32 noundef 16)
  %64 = call <2 x i64> @_mm_add_epi64(<2 x i64> noundef %61, <2 x i64> noundef %63)
  store <2 x i64> %64, ptr %14, align 16, !tbaa !11
  %65 = load <2 x i64>, ptr %13, align 16, !tbaa !11
  %66 = load <2 x i64>, ptr %13, align 16, !tbaa !11
  %67 = call <2 x i64> @_mm_srli_epi64(<2 x i64> noundef %66, i32 noundef 21)
  %68 = call <2 x i64> @_mm_xor_si128(<2 x i64> noundef %65, <2 x i64> noundef %67)
  store <2 x i64> %68, ptr %13, align 16, !tbaa !11
  %69 = load <2 x i64>, ptr %14, align 16, !tbaa !11
  %70 = load <2 x i64>, ptr %14, align 16, !tbaa !11
  %71 = call <2 x i64> @_mm_srli_epi64(<2 x i64> noundef %70, i32 noundef 21)
  %72 = call <2 x i64> @_mm_xor_si128(<2 x i64> noundef %69, <2 x i64> noundef %71)
  store <2 x i64> %72, ptr %14, align 16, !tbaa !11
  %73 = load <2 x i64>, ptr %13, align 16, !tbaa !11
  %74 = load <2 x i64>, ptr %13, align 16, !tbaa !11
  %75 = bitcast <2 x i64> %74 to <16 x i8>
  %76 = shufflevector <16 x i8> zeroinitializer, <16 x i8> %75, <16 x i32> <i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27>
  %77 = bitcast <16 x i8> %76 to <2 x i64>
  %78 = call <2 x i64> @_mm_add_epi64(<2 x i64> noundef %73, <2 x i64> noundef %77)
  store <2 x i64> %78, ptr %13, align 16, !tbaa !11
  %79 = load <2 x i64>, ptr %14, align 16, !tbaa !11
  %80 = load <2 x i64>, ptr %14, align 16, !tbaa !11
  %81 = bitcast <2 x i64> %80 to <16 x i8>
  %82 = shufflevector <16 x i8> zeroinitializer, <16 x i8> %81, <16 x i32> <i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27>
  %83 = bitcast <16 x i8> %82 to <2 x i64>
  %84 = call <2 x i64> @_mm_add_epi64(<2 x i64> noundef %79, <2 x i64> noundef %83)
  store <2 x i64> %84, ptr %14, align 16, !tbaa !11
  %85 = load <2 x i64>, ptr %13, align 16, !tbaa !11
  %86 = load <2 x i64>, ptr %14, align 16, !tbaa !11
  %87 = call <2 x i64> @_mm_sub_epi64(<2 x i64> noundef %85, <2 x i64> noundef %86)
  store <2 x i64> %87, ptr %13, align 16, !tbaa !11
  %88 = load <2 x i64>, ptr %14, align 16, !tbaa !11
  %89 = bitcast <2 x i64> %88 to <4 x i32>
  %90 = shufflevector <4 x i32> %89, <4 x i32> poison, <4 x i32> <i32 1, i32 2, i32 3, i32 0>
  %91 = bitcast <4 x i32> %90 to <2 x i64>
  %92 = load <2 x i64>, ptr %13, align 16, !tbaa !11
  %93 = call <2 x i64> @_mm_sub_epi64(<2 x i64> noundef %91, <2 x i64> noundef %92)
  store <2 x i64> %93, ptr %14, align 16, !tbaa !11
  %94 = load <2 x i64>, ptr %13, align 16, !tbaa !11
  %95 = bitcast <2 x i64> %94 to <4 x i32>
  %96 = shufflevector <4 x i32> %95, <4 x i32> poison, <4 x i32> <i32 2, i32 3, i32 1, i32 0>
  %97 = bitcast <4 x i32> %96 to <2 x i64>
  %98 = load <2 x i64>, ptr %14, align 16, !tbaa !11
  %99 = call <2 x i64> @_mm_sub_epi64(<2 x i64> noundef %97, <2 x i64> noundef %98)
  store <2 x i64> %99, ptr %13, align 16, !tbaa !11
  %100 = load <2 x i64>, ptr %14, align 16, !tbaa !11
  %101 = bitcast <2 x i64> %100 to <4 x i32>
  %102 = shufflevector <4 x i32> %101, <4 x i32> poison, <4 x i32> <i32 3, i32 0, i32 1, i32 2>
  %103 = bitcast <4 x i32> %102 to <2 x i64>
  %104 = load <2 x i64>, ptr %13, align 16, !tbaa !11
  %105 = call <2 x i64> @_mm_sub_epi64(<2 x i64> noundef %103, <2 x i64> noundef %104)
  store <2 x i64> %105, ptr %14, align 16, !tbaa !11
  %106 = load <2 x i64>, ptr %13, align 16, !tbaa !11
  %107 = bitcast <2 x i64> %106 to <4 x i32>
  %108 = shufflevector <4 x i32> %107, <4 x i32> poison, <4 x i32> <i32 3, i32 0, i32 1, i32 2>
  %109 = bitcast <4 x i32> %108 to <2 x i64>
  %110 = load <2 x i64>, ptr %14, align 16, !tbaa !11
  %111 = call <2 x i64> @_mm_sub_epi64(<2 x i64> noundef %109, <2 x i64> noundef %110)
  store <2 x i64> %111, ptr %13, align 16, !tbaa !11
  br label %25, !llvm.loop !12

112:                                              ; preds = %25
  %113 = load <2 x i64>, ptr %13, align 16, !tbaa !11
  store <2 x i64> %113, ptr %12, align 16, !tbaa !11
  %114 = load <2 x i64>, ptr %11, align 16, !tbaa !11
  store <2 x i64> %114, ptr %13, align 16, !tbaa !11
  %115 = load <2 x i64>, ptr %13, align 16, !tbaa !11
  %116 = load <2 x i64>, ptr %9, align 16, !tbaa !11
  %117 = load <2 x i64>, ptr %12, align 16, !tbaa !11
  %118 = load <2 x i64>, ptr %12, align 16, !tbaa !11
  %119 = call <2 x i64> @_mm_unpackhi_epi32(<2 x i64> noundef %117, <2 x i64> noundef %118)
  %120 = call <2 x i64> @_mm_mul_epu32(<2 x i64> noundef %116, <2 x i64> noundef %119)
  %121 = call <2 x i64> @_mm_sub_epi64(<2 x i64> noundef %115, <2 x i64> noundef %120)
  store <2 x i64> %121, ptr %13, align 16, !tbaa !11
  %122 = load <2 x i64>, ptr %14, align 16, !tbaa !11
  %123 = load <2 x i64>, ptr %10, align 16, !tbaa !11
  %124 = load <2 x i64>, ptr %12, align 16, !tbaa !11
  %125 = load <2 x i64>, ptr %12, align 16, !tbaa !11
  %126 = call <2 x i64> @_mm_unpacklo_epi32(<2 x i64> noundef %124, <2 x i64> noundef %125)
  %127 = call <2 x i64> @_mm_mul_epu32(<2 x i64> noundef %123, <2 x i64> noundef %126)
  %128 = call <2 x i64> @_mm_sub_epi64(<2 x i64> noundef %122, <2 x i64> noundef %127)
  store <2 x i64> %128, ptr %14, align 16, !tbaa !11
  %129 = load <2 x i64>, ptr %13, align 16, !tbaa !11
  %130 = load <2 x i64>, ptr %13, align 16, !tbaa !11
  %131 = call <2 x i64> @_mm_srli_epi64(<2 x i64> noundef %130, i32 noundef 29)
  %132 = call <2 x i64> @_mm_xor_si128(<2 x i64> noundef %129, <2 x i64> noundef %131)
  store <2 x i64> %132, ptr %13, align 16, !tbaa !11
  %133 = load <2 x i64>, ptr %14, align 16, !tbaa !11
  %134 = load <2 x i64>, ptr %14, align 16, !tbaa !11
  %135 = call <2 x i64> @_mm_srli_epi64(<2 x i64> noundef %134, i32 noundef 29)
  %136 = call <2 x i64> @_mm_xor_si128(<2 x i64> noundef %133, <2 x i64> noundef %135)
  store <2 x i64> %136, ptr %14, align 16, !tbaa !11
  %137 = load <2 x i64>, ptr %13, align 16, !tbaa !11
  %138 = load <2 x i64>, ptr %13, align 16, !tbaa !11
  %139 = call <2 x i64> @_mm_slli_epi64(<2 x i64> noundef %138, i32 noundef 16)
  %140 = call <2 x i64> @_mm_add_epi64(<2 x i64> noundef %137, <2 x i64> noundef %139)
  store <2 x i64> %140, ptr %13, align 16, !tbaa !11
  %141 = load <2 x i64>, ptr %14, align 16, !tbaa !11
  %142 = load <2 x i64>, ptr %14, align 16, !tbaa !11
  %143 = call <2 x i64> @_mm_slli_epi64(<2 x i64> noundef %142, i32 noundef 16)
  %144 = call <2 x i64> @_mm_add_epi64(<2 x i64> noundef %141, <2 x i64> noundef %143)
  store <2 x i64> %144, ptr %14, align 16, !tbaa !11
  %145 = load <2 x i64>, ptr %13, align 16, !tbaa !11
  %146 = load <2 x i64>, ptr %13, align 16, !tbaa !11
  %147 = call <2 x i64> @_mm_srli_epi64(<2 x i64> noundef %146, i32 noundef 21)
  %148 = call <2 x i64> @_mm_xor_si128(<2 x i64> noundef %145, <2 x i64> noundef %147)
  store <2 x i64> %148, ptr %13, align 16, !tbaa !11
  %149 = load <2 x i64>, ptr %14, align 16, !tbaa !11
  %150 = load <2 x i64>, ptr %14, align 16, !tbaa !11
  %151 = call <2 x i64> @_mm_srli_epi64(<2 x i64> noundef %150, i32 noundef 21)
  %152 = call <2 x i64> @_mm_xor_si128(<2 x i64> noundef %149, <2 x i64> noundef %151)
  store <2 x i64> %152, ptr %14, align 16, !tbaa !11
  %153 = load <2 x i64>, ptr %13, align 16, !tbaa !11
  %154 = load <2 x i64>, ptr %13, align 16, !tbaa !11
  %155 = bitcast <2 x i64> %154 to <16 x i8>
  %156 = shufflevector <16 x i8> zeroinitializer, <16 x i8> %155, <16 x i32> <i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27>
  %157 = bitcast <16 x i8> %156 to <2 x i64>
  %158 = call <2 x i64> @_mm_add_epi64(<2 x i64> noundef %153, <2 x i64> noundef %157)
  store <2 x i64> %158, ptr %13, align 16, !tbaa !11
  %159 = load <2 x i64>, ptr %14, align 16, !tbaa !11
  %160 = load <2 x i64>, ptr %14, align 16, !tbaa !11
  %161 = bitcast <2 x i64> %160 to <16 x i8>
  %162 = shufflevector <16 x i8> zeroinitializer, <16 x i8> %161, <16 x i32> <i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27>
  %163 = bitcast <16 x i8> %162 to <2 x i64>
  %164 = call <2 x i64> @_mm_add_epi64(<2 x i64> noundef %159, <2 x i64> noundef %163)
  store <2 x i64> %164, ptr %14, align 16, !tbaa !11
  %165 = load <2 x i64>, ptr %13, align 16, !tbaa !11
  %166 = load <2 x i64>, ptr %14, align 16, !tbaa !11
  %167 = call <2 x i64> @_mm_sub_epi64(<2 x i64> noundef %165, <2 x i64> noundef %166)
  store <2 x i64> %167, ptr %13, align 16, !tbaa !11
  %168 = load <2 x i64>, ptr %14, align 16, !tbaa !11
  %169 = bitcast <2 x i64> %168 to <4 x i32>
  %170 = shufflevector <4 x i32> %169, <4 x i32> poison, <4 x i32> <i32 1, i32 2, i32 3, i32 0>
  %171 = bitcast <4 x i32> %170 to <2 x i64>
  %172 = load <2 x i64>, ptr %13, align 16, !tbaa !11
  %173 = call <2 x i64> @_mm_sub_epi64(<2 x i64> noundef %171, <2 x i64> noundef %172)
  store <2 x i64> %173, ptr %14, align 16, !tbaa !11
  %174 = load <2 x i64>, ptr %13, align 16, !tbaa !11
  %175 = bitcast <2 x i64> %174 to <4 x i32>
  %176 = shufflevector <4 x i32> %175, <4 x i32> poison, <4 x i32> <i32 2, i32 3, i32 1, i32 0>
  %177 = bitcast <4 x i32> %176 to <2 x i64>
  %178 = load <2 x i64>, ptr %14, align 16, !tbaa !11
  %179 = call <2 x i64> @_mm_sub_epi64(<2 x i64> noundef %177, <2 x i64> noundef %178)
  store <2 x i64> %179, ptr %13, align 16, !tbaa !11
  %180 = load <2 x i64>, ptr %14, align 16, !tbaa !11
  %181 = bitcast <2 x i64> %180 to <4 x i32>
  %182 = shufflevector <4 x i32> %181, <4 x i32> poison, <4 x i32> <i32 3, i32 0, i32 1, i32 2>
  %183 = bitcast <4 x i32> %182 to <2 x i64>
  %184 = load <2 x i64>, ptr %13, align 16, !tbaa !11
  %185 = call <2 x i64> @_mm_sub_epi64(<2 x i64> noundef %183, <2 x i64> noundef %184)
  store <2 x i64> %185, ptr %14, align 16, !tbaa !11
  %186 = load <2 x i64>, ptr %13, align 16, !tbaa !11
  %187 = bitcast <2 x i64> %186 to <4 x i32>
  %188 = shufflevector <4 x i32> %187, <4 x i32> poison, <4 x i32> <i32 3, i32 0, i32 1, i32 2>
  %189 = bitcast <4 x i32> %188 to <2 x i64>
  %190 = load <2 x i64>, ptr %14, align 16, !tbaa !11
  %191 = call <2 x i64> @_mm_sub_epi64(<2 x i64> noundef %189, <2 x i64> noundef %190)
  store <2 x i64> %191, ptr %13, align 16, !tbaa !11
  %192 = load ptr, ptr %8, align 8, !tbaa !5
  %193 = load <2 x i64>, ptr %13, align 16, !tbaa !11
  call void @_mm_storeu_si128(ptr noundef %192, <2 x i64> noundef %193)
  %194 = load ptr, ptr %8, align 8, !tbaa !5
  %195 = getelementptr inbounds i8, ptr %194, i64 16
  %196 = load <2 x i64>, ptr %14, align 16, !tbaa !11
  call void @_mm_storeu_si128(ptr noundef %195, <2 x i64> noundef %196)
  call void @llvm.lifetime.end.p0(i64 16, ptr %14) #4
  call void @llvm.lifetime.end.p0(i64 16, ptr %13) #4
  call void @llvm.lifetime.end.p0(i64 16, ptr %12) #4
  call void @llvm.lifetime.end.p0(i64 16, ptr %11) #4
  call void @llvm.lifetime.end.p0(i64 16, ptr %10) #4
  call void @llvm.lifetime.end.p0(i64 16, ptr %9) #4
  ret void
}

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

; Function Attrs: noreturn nounwind
declare void @__assert_fail(ptr noundef, ptr noundef, i32 noundef, ptr noundef) #2

; Function Attrs: alwaysinline nounwind uwtable
declare hidden <2 x i64> @_mm_load_si128(ptr noundef) #3

; Function Attrs: alwaysinline nounwind uwtable
declare hidden <2 x i64> @_mm_loadu_si128(ptr noundef) #3

; Function Attrs: alwaysinline nounwind uwtable
declare hidden <2 x i64> @_mm_sub_epi64(<2 x i64> noundef, <2 x i64> noundef) #3

; Function Attrs: alwaysinline nounwind uwtable
declare hidden <2 x i64> @_mm_mul_epu32(<2 x i64> noundef, <2 x i64> noundef) #3

; Function Attrs: alwaysinline nounwind uwtable
declare hidden <2 x i64> @_mm_unpackhi_epi32(<2 x i64> noundef, <2 x i64> noundef) #3

; Function Attrs: alwaysinline nounwind uwtable
declare hidden <2 x i64> @_mm_unpacklo_epi32(<2 x i64> noundef, <2 x i64> noundef) #3

; Function Attrs: alwaysinline nounwind uwtable
declare hidden <2 x i64> @_mm_xor_si128(<2 x i64> noundef, <2 x i64> noundef) #3

; Function Attrs: alwaysinline nounwind uwtable
declare hidden <2 x i64> @_mm_srli_epi64(<2 x i64> noundef, i32 noundef) #3

; Function Attrs: alwaysinline nounwind uwtable
declare hidden <2 x i64> @_mm_add_epi64(<2 x i64> noundef, <2 x i64> noundef) #3

; Function Attrs: alwaysinline nounwind uwtable
declare hidden <2 x i64> @_mm_slli_epi64(<2 x i64> noundef, i32 noundef) #3

; Function Attrs: alwaysinline nounwind uwtable
declare hidden void @_mm_storeu_si128(ptr noundef, <2 x i64> 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"="128" "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 = { noreturn nounwind "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 = { alwaysinline nounwind uwtable "min-legal-vector-width"="128" "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 }
attributes #5 = { noreturn 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 = !{!"int", !7, i64 0}
!11 = !{!7, !7, i64 0}
!12 = distinct !{!12, !13}
!13 = !{!"llvm.loop.mustprogress"}


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

@.str = external hidden unnamed_addr constant [18 x i8], align 1
@.str.1 = external hidden unnamed_addr constant [97 x i8], align 1
@__PRETTY_FUNCTION__.hasshe2 = external hidden unnamed_addr constant [50 x i8], align 1
@coeffs = external hidden global [12 x i32], align 16

; Function Attrs: nounwind uwtable
define dso_local void @hasshe2(ptr noundef %0, i32 noundef %1, i32 noundef %2, ptr noundef %3) local_unnamed_addr #0 {
  %5 = and i32 %1, 15
  %6 = icmp eq i32 %5, 0
  br i1 %6, label %8, label %7

7:                                                ; preds = %4
  tail call void @__assert_fail(ptr noundef nonnull @.str, ptr noundef nonnull @.str.1, i32 noundef 61, ptr noundef nonnull @__PRETTY_FUNCTION__.hasshe2) #3
  unreachable

8:                                                ; preds = %4
  %9 = tail call <2 x i64> @_mm_load_si128(ptr noundef nonnull @coeffs)
  %10 = tail call <2 x i64> @_mm_load_si128(ptr noundef nonnull getelementptr inbounds (i8, ptr @coeffs, i64 16))
  %11 = tail call <2 x i64> @_mm_load_si128(ptr noundef nonnull getelementptr inbounds (i8, ptr @coeffs, i64 32))
  %12 = icmp sgt i32 %1, 15
  br i1 %12, label %.lr.ph, label %._crit_edge

.lr.ph:                                           ; preds = %8, %.lr.ph
  %.085 = phi <2 x i64> [ %54, %.lr.ph ], [ %11, %8 ]
  %.07984 = phi <2 x i64> [ %58, %.lr.ph ], [ %11, %8 ]
  %.08083 = phi ptr [ %14, %.lr.ph ], [ %0, %8 ]
  %.08182 = phi i32 [ %15, %.lr.ph ], [ %1, %8 ]
  %13 = tail call <2 x i64> @_mm_loadu_si128(ptr noundef %.08083)
  %14 = getelementptr inbounds i8, ptr %.08083, i64 16
  %15 = add nsw i32 %.08182, -16
  %16 = tail call <2 x i64> @_mm_unpackhi_epi32(<2 x i64> noundef %13, <2 x i64> noundef %13)
  %17 = tail call <2 x i64> @_mm_mul_epu32(<2 x i64> noundef %9, <2 x i64> noundef %16)
  %18 = tail call <2 x i64> @_mm_sub_epi64(<2 x i64> noundef %.07984, <2 x i64> noundef %17)
  %19 = tail call <2 x i64> @_mm_unpacklo_epi32(<2 x i64> noundef %13, <2 x i64> noundef %13)
  %20 = tail call <2 x i64> @_mm_mul_epu32(<2 x i64> noundef %10, <2 x i64> noundef %19)
  %21 = tail call <2 x i64> @_mm_sub_epi64(<2 x i64> noundef %.085, <2 x i64> noundef %20)
  %22 = tail call <2 x i64> @_mm_srli_epi64(<2 x i64> noundef %18, i32 noundef 29)
  %23 = tail call <2 x i64> @_mm_xor_si128(<2 x i64> noundef %18, <2 x i64> noundef %22)
  %24 = tail call <2 x i64> @_mm_srli_epi64(<2 x i64> noundef %21, i32 noundef 29)
  %25 = tail call <2 x i64> @_mm_xor_si128(<2 x i64> noundef %21, <2 x i64> noundef %24)
  %26 = tail call <2 x i64> @_mm_slli_epi64(<2 x i64> noundef %23, i32 noundef 16)
  %27 = tail call <2 x i64> @_mm_add_epi64(<2 x i64> noundef %23, <2 x i64> noundef %26)
  %28 = tail call <2 x i64> @_mm_slli_epi64(<2 x i64> noundef %25, i32 noundef 16)
  %29 = tail call <2 x i64> @_mm_add_epi64(<2 x i64> noundef %25, <2 x i64> noundef %28)
  %30 = tail call <2 x i64> @_mm_srli_epi64(<2 x i64> noundef %27, i32 noundef 21)
  %31 = tail call <2 x i64> @_mm_xor_si128(<2 x i64> noundef %27, <2 x i64> noundef %30)
  %32 = tail call <2 x i64> @_mm_srli_epi64(<2 x i64> noundef %29, i32 noundef 21)
  %33 = tail call <2 x i64> @_mm_xor_si128(<2 x i64> noundef %29, <2 x i64> noundef %32)
  %34 = bitcast <2 x i64> %31 to <16 x i8>
  %35 = shufflevector <16 x i8> <i8 poison, i8 poison, i8 poison, i8 poison, i8 poison, i8 poison, i8 poison, i8 poison, i8 poison, i8 poison, i8 poison, i8 poison, i8 0, i8 0, i8 0, i8 0>, <16 x i8> %34, <16 x i32> <i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27>
  %36 = bitcast <16 x i8> %35 to <2 x i64>
  %37 = tail call <2 x i64> @_mm_add_epi64(<2 x i64> noundef %31, <2 x i64> noundef %36)
  %38 = bitcast <2 x i64> %33 to <16 x i8>
  %39 = shufflevector <16 x i8> <i8 poison, i8 poison, i8 poison, i8 poison, i8 poison, i8 poison, i8 poison, i8 poison, i8 poison, i8 poison, i8 poison, i8 poison, i8 0, i8 0, i8 0, i8 0>, <16 x i8> %38, <16 x i32> <i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27>
  %40 = bitcast <16 x i8> %39 to <2 x i64>
  %41 = tail call <2 x i64> @_mm_add_epi64(<2 x i64> noundef %33, <2 x i64> noundef %40)
  %42 = tail call <2 x i64> @_mm_sub_epi64(<2 x i64> noundef %37, <2 x i64> noundef %41)
  %43 = bitcast <2 x i64> %41 to <4 x i32>
  %44 = shufflevector <4 x i32> %43, <4 x i32> poison, <4 x i32> <i32 1, i32 2, i32 3, i32 0>
  %45 = bitcast <4 x i32> %44 to <2 x i64>
  %46 = tail call <2 x i64> @_mm_sub_epi64(<2 x i64> noundef %45, <2 x i64> noundef %42)
  %47 = bitcast <2 x i64> %42 to <4 x i32>
  %48 = shufflevector <4 x i32> %47, <4 x i32> poison, <4 x i32> <i32 2, i32 3, i32 1, i32 0>
  %49 = bitcast <4 x i32> %48 to <2 x i64>
  %50 = tail call <2 x i64> @_mm_sub_epi64(<2 x i64> noundef %49, <2 x i64> noundef %46)
  %51 = bitcast <2 x i64> %46 to <4 x i32>
  %52 = shufflevector <4 x i32> %51, <4 x i32> poison, <4 x i32> <i32 3, i32 0, i32 1, i32 2>
  %53 = bitcast <4 x i32> %52 to <2 x i64>
  %54 = tail call <2 x i64> @_mm_sub_epi64(<2 x i64> noundef %53, <2 x i64> noundef %50)
  %55 = bitcast <2 x i64> %50 to <4 x i32>
  %56 = shufflevector <4 x i32> %55, <4 x i32> poison, <4 x i32> <i32 3, i32 0, i32 1, i32 2>
  %57 = bitcast <4 x i32> %56 to <2 x i64>
  %58 = tail call <2 x i64> @_mm_sub_epi64(<2 x i64> noundef %57, <2 x i64> noundef %54)
  %59 = icmp ugt i32 %.08182, 31
  br i1 %59, label %.lr.ph, label %._crit_edge, !llvm.loop !5

._crit_edge:                                      ; preds = %.lr.ph, %8
  %.079.lcssa = phi <2 x i64> [ %11, %8 ], [ %58, %.lr.ph ]
  %.0.lcssa = phi <2 x i64> [ %11, %8 ], [ %54, %.lr.ph ]
  %60 = tail call <2 x i64> @_mm_unpackhi_epi32(<2 x i64> noundef %.079.lcssa, <2 x i64> noundef %.079.lcssa)
  %61 = tail call <2 x i64> @_mm_mul_epu32(<2 x i64> noundef %9, <2 x i64> noundef %60)
  %62 = tail call <2 x i64> @_mm_sub_epi64(<2 x i64> noundef %11, <2 x i64> noundef %61)
  %63 = tail call <2 x i64> @_mm_unpacklo_epi32(<2 x i64> noundef %.079.lcssa, <2 x i64> noundef %.079.lcssa)
  %64 = tail call <2 x i64> @_mm_mul_epu32(<2 x i64> noundef %10, <2 x i64> noundef %63)
  %65 = tail call <2 x i64> @_mm_sub_epi64(<2 x i64> noundef %.0.lcssa, <2 x i64> noundef %64)
  %66 = tail call <2 x i64> @_mm_srli_epi64(<2 x i64> noundef %62, i32 noundef 29)
  %67 = tail call <2 x i64> @_mm_xor_si128(<2 x i64> noundef %62, <2 x i64> noundef %66)
  %68 = tail call <2 x i64> @_mm_srli_epi64(<2 x i64> noundef %65, i32 noundef 29)
  %69 = tail call <2 x i64> @_mm_xor_si128(<2 x i64> noundef %65, <2 x i64> noundef %68)
  %70 = tail call <2 x i64> @_mm_slli_epi64(<2 x i64> noundef %67, i32 noundef 16)
  %71 = tail call <2 x i64> @_mm_add_epi64(<2 x i64> noundef %67, <2 x i64> noundef %70)
  %72 = tail call <2 x i64> @_mm_slli_epi64(<2 x i64> noundef %69, i32 noundef 16)
  %73 = tail call <2 x i64> @_mm_add_epi64(<2 x i64> noundef %69, <2 x i64> noundef %72)
  %74 = tail call <2 x i64> @_mm_srli_epi64(<2 x i64> noundef %71, i32 noundef 21)
  %75 = tail call <2 x i64> @_mm_xor_si128(<2 x i64> noundef %71, <2 x i64> noundef %74)
  %76 = tail call <2 x i64> @_mm_srli_epi64(<2 x i64> noundef %73, i32 noundef 21)
  %77 = tail call <2 x i64> @_mm_xor_si128(<2 x i64> noundef %73, <2 x i64> noundef %76)
  %78 = bitcast <2 x i64> %75 to <16 x i8>
  %79 = shufflevector <16 x i8> <i8 poison, i8 poison, i8 poison, i8 poison, i8 poison, i8 poison, i8 poison, i8 poison, i8 poison, i8 poison, i8 poison, i8 poison, i8 0, i8 0, i8 0, i8 0>, <16 x i8> %78, <16 x i32> <i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27>
  %80 = bitcast <16 x i8> %79 to <2 x i64>
  %81 = tail call <2 x i64> @_mm_add_epi64(<2 x i64> noundef %75, <2 x i64> noundef %80)
  %82 = bitcast <2 x i64> %77 to <16 x i8>
  %83 = shufflevector <16 x i8> <i8 poison, i8 poison, i8 poison, i8 poison, i8 poison, i8 poison, i8 poison, i8 poison, i8 poison, i8 poison, i8 poison, i8 poison, i8 0, i8 0, i8 0, i8 0>, <16 x i8> %82, <16 x i32> <i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27>
  %84 = bitcast <16 x i8> %83 to <2 x i64>
  %85 = tail call <2 x i64> @_mm_add_epi64(<2 x i64> noundef %77, <2 x i64> noundef %84)
  %86 = tail call <2 x i64> @_mm_sub_epi64(<2 x i64> noundef %81, <2 x i64> noundef %85)
  %87 = bitcast <2 x i64> %85 to <4 x i32>
  %88 = shufflevector <4 x i32> %87, <4 x i32> poison, <4 x i32> <i32 1, i32 2, i32 3, i32 0>
  %89 = bitcast <4 x i32> %88 to <2 x i64>
  %90 = tail call <2 x i64> @_mm_sub_epi64(<2 x i64> noundef %89, <2 x i64> noundef %86)
  %91 = bitcast <2 x i64> %86 to <4 x i32>
  %92 = shufflevector <4 x i32> %91, <4 x i32> poison, <4 x i32> <i32 2, i32 3, i32 1, i32 0>
  %93 = bitcast <4 x i32> %92 to <2 x i64>
  %94 = tail call <2 x i64> @_mm_sub_epi64(<2 x i64> noundef %93, <2 x i64> noundef %90)
  %95 = bitcast <2 x i64> %90 to <4 x i32>
  %96 = shufflevector <4 x i32> %95, <4 x i32> poison, <4 x i32> <i32 3, i32 0, i32 1, i32 2>
  %97 = bitcast <4 x i32> %96 to <2 x i64>
  %98 = tail call <2 x i64> @_mm_sub_epi64(<2 x i64> noundef %97, <2 x i64> noundef %94)
  %99 = bitcast <2 x i64> %94 to <4 x i32>
  %100 = shufflevector <4 x i32> %99, <4 x i32> poison, <4 x i32> <i32 3, i32 0, i32 1, i32 2>
  %101 = bitcast <4 x i32> %100 to <2 x i64>
  %102 = tail call <2 x i64> @_mm_sub_epi64(<2 x i64> noundef %101, <2 x i64> noundef %98)
  tail call void @_mm_storeu_si128(ptr noundef %3, <2 x i64> noundef %102)
  %103 = getelementptr inbounds i8, ptr %3, i64 16
  tail call void @_mm_storeu_si128(ptr noundef nonnull %103, <2 x i64> noundef %98)
  ret void
}

; Function Attrs: noreturn nounwind
declare void @__assert_fail(ptr noundef, ptr noundef, i32 noundef, ptr noundef) local_unnamed_addr #1

; Function Attrs: alwaysinline nounwind uwtable
declare hidden <2 x i64> @_mm_load_si128(ptr noundef) local_unnamed_addr #2

; Function Attrs: alwaysinline nounwind uwtable
declare hidden <2 x i64> @_mm_loadu_si128(ptr noundef) local_unnamed_addr #2

; Function Attrs: alwaysinline nounwind uwtable
declare hidden <2 x i64> @_mm_sub_epi64(<2 x i64> noundef, <2 x i64> noundef) local_unnamed_addr #2

; Function Attrs: alwaysinline nounwind uwtable
declare hidden <2 x i64> @_mm_mul_epu32(<2 x i64> noundef, <2 x i64> noundef) local_unnamed_addr #2

; Function Attrs: alwaysinline nounwind uwtable
declare hidden <2 x i64> @_mm_unpackhi_epi32(<2 x i64> noundef, <2 x i64> noundef) local_unnamed_addr #2

; Function Attrs: alwaysinline nounwind uwtable
declare hidden <2 x i64> @_mm_unpacklo_epi32(<2 x i64> noundef, <2 x i64> noundef) local_unnamed_addr #2

; Function Attrs: alwaysinline nounwind uwtable
declare hidden <2 x i64> @_mm_xor_si128(<2 x i64> noundef, <2 x i64> noundef) local_unnamed_addr #2

; Function Attrs: alwaysinline nounwind uwtable
declare hidden <2 x i64> @_mm_srli_epi64(<2 x i64> noundef, i32 noundef) local_unnamed_addr #2

; Function Attrs: alwaysinline nounwind uwtable
declare hidden <2 x i64> @_mm_add_epi64(<2 x i64> noundef, <2 x i64> noundef) local_unnamed_addr #2

; Function Attrs: alwaysinline nounwind uwtable
declare hidden <2 x i64> @_mm_slli_epi64(<2 x i64> noundef, i32 noundef) local_unnamed_addr #2

; Function Attrs: alwaysinline nounwind uwtable
declare hidden void @_mm_storeu_si128(ptr noundef, <2 x i64> noundef) local_unnamed_addr #2

attributes #0 = { nounwind uwtable "min-legal-vector-width"="128" "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 = { noreturn nounwind "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 = { alwaysinline nounwind uwtable "min-legal-vector-width"="128" "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 = { noreturn 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 = distinct !{!5, !6}
!6 = !{!"llvm.loop.mustprogress"}


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