; LLVM IR from askforalfred/alfred :: gen/ff_planner (output)

; 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._WffNode = type { i32, i32, i32, ptr, ptr, ptr, ptr, ptr, i32, ptr, i32, ptr, ptr, i8 }

@.str.11 = external hidden unnamed_addr constant [6 x i8], align 1
@.str.13 = external hidden unnamed_addr constant [5 x i8], align 1
@.str.14 = external hidden unnamed_addr constant [3 x i8], align 1
@.str.16 = external hidden unnamed_addr constant [5 x i8], align 1
@.str.17 = external hidden unnamed_addr constant [5 x i8], align 1
@.str.18 = external hidden unnamed_addr constant [5 x i8], align 1
@.str.19 = external hidden unnamed_addr constant [4 x i8], align 1
@.str.23 = external hidden unnamed_addr constant [5 x i8], align 1
@.str.24 = external hidden unnamed_addr constant [5 x i8], align 1
@.str.25 = external hidden unnamed_addr constant [8 x i8], align 1
@.str.26 = external hidden unnamed_addr constant [9 x i8], align 1
@.str.27 = external hidden unnamed_addr constant [4 x i8], align 1
@.str.28 = external hidden unnamed_addr constant [5 x i8], align 1
@.str.29 = external hidden unnamed_addr constant [4 x i8], align 1
@.str.30 = external hidden unnamed_addr constant [5 x i8], align 1
@.str.31 = external hidden unnamed_addr constant [4 x i8], align 1
@.str.38 = external hidden unnamed_addr constant [18 x i8], align 1
@.str.40 = external hidden unnamed_addr constant [2 x i8], align 1
@.str.53 = external hidden unnamed_addr constant [18 x i8], align 1
@gtype_names = external global [50 x ptr], align 16
@.str.54 = external hidden unnamed_addr constant [19 x i8], align 1
@.str.55 = external hidden unnamed_addr constant [34 x i8], align 1
@.str.56 = external hidden unnamed_addr constant [19 x i8], align 1
@.str.57 = external hidden unnamed_addr constant [42 x i8], align 1
@.str.58 = external hidden unnamed_addr constant [39 x i8], align 1

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

declare i32 @printf(ptr noundef, ...) #1

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

; Function Attrs: nounwind uwtable
declare dso_local void @print_indent(i32 noundef) #2

; Function Attrs: noreturn nounwind
declare void @exit(i32 noundef) #3

; Function Attrs: nounwind uwtable
declare dso_local void @print_ExpNode(ptr noundef) #2

; Function Attrs: nounwind uwtable
define dso_local void @print_Wff(ptr noundef %0, i32 noundef %1) #2 {
  %3 = alloca ptr, align 8
  %4 = alloca i32, align 4
  %5 = alloca ptr, align 8
  %6 = alloca i32, align 4
  store ptr %0, ptr %3, align 8, !tbaa !5
  store i32 %1, ptr %4, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %5) #4
  %7 = load ptr, ptr %3, align 8, !tbaa !5
  %8 = icmp ne ptr %7, null
  br i1 %8, label %11, label %9

9:                                                ; preds = %2
  %10 = call i32 (ptr, ...) @printf(ptr noundef @.str.11)
  store i32 1, ptr %6, align 4
  br label %205

11:                                               ; preds = %2
  %12 = load ptr, ptr %3, align 8, !tbaa !5
  %13 = getelementptr inbounds %struct._WffNode, ptr %12, i32 0, i32 0
  %14 = load i32, ptr %13, align 8, !tbaa !11
  switch i32 %14, label %198 [
    i32 2008, label %15
    i32 2009, label %38
    i32 2006, label %61
    i32 2007, label %102
    i32 2005, label %130
    i32 2002, label %155
    i32 2000, label %167
    i32 2001, label %169
    i32 2003, label %171
  ]

15:                                               ; preds = %11
  %16 = load ptr, ptr %3, align 8, !tbaa !5
  %17 = getelementptr inbounds %struct._WffNode, ptr %16, i32 0, i32 1
  %18 = load i32, ptr %17, align 4, !tbaa !13
  %19 = load ptr, ptr %3, align 8, !tbaa !5
  %20 = getelementptr inbounds %struct._WffNode, ptr %19, i32 0, i32 3
  %21 = load ptr, ptr %20, align 8, !tbaa !14
  %22 = load ptr, ptr %3, align 8, !tbaa !5
  %23 = getelementptr inbounds %struct._WffNode, ptr %22, i32 0, i32 2
  %24 = load i32, ptr %23, align 8, !tbaa !15
  %25 = sext i32 %24 to i64
  %26 = getelementptr inbounds [50 x ptr], ptr @gtype_names, i64 0, i64 %25
  %27 = load ptr, ptr %26, align 8, !tbaa !5
  %28 = call i32 (ptr, ...) @printf(ptr noundef @.str.53, i32 noundef %18, ptr noundef %21, ptr noundef %27)
  %29 = load i32, ptr %4, align 4, !tbaa !9
  call void @print_indent(i32 noundef %29)
  %30 = call i32 (ptr, ...) @printf(ptr noundef @.str.13)
  %31 = load ptr, ptr %3, align 8, !tbaa !5
  %32 = getelementptr inbounds %struct._WffNode, ptr %31, i32 0, i32 9
  %33 = load ptr, ptr %32, align 8, !tbaa !16
  %34 = load i32, ptr %4, align 4, !tbaa !9
  %35 = add nsw i32 %34, 4
  call void @print_Wff(ptr noundef %33, i32 noundef %35)
  %36 = load i32, ptr %4, align 4, !tbaa !9
  call void @print_indent(i32 noundef %36)
  %37 = call i32 (ptr, ...) @printf(ptr noundef @.str.14)
  br label %204

38:                                               ; preds = %11
  %39 = load ptr, ptr %3, align 8, !tbaa !5
  %40 = getelementptr inbounds %struct._WffNode, ptr %39, i32 0, i32 1
  %41 = load i32, ptr %40, align 4, !tbaa !13
  %42 = load ptr, ptr %3, align 8, !tbaa !5
  %43 = getelementptr inbounds %struct._WffNode, ptr %42, i32 0, i32 3
  %44 = load ptr, ptr %43, align 8, !tbaa !14
  %45 = load ptr, ptr %3, align 8, !tbaa !5
  %46 = getelementptr inbounds %struct._WffNode, ptr %45, i32 0, i32 2
  %47 = load i32, ptr %46, align 8, !tbaa !15
  %48 = sext i32 %47 to i64
  %49 = getelementptr inbounds [50 x ptr], ptr @gtype_names, i64 0, i64 %48
  %50 = load ptr, ptr %49, align 8, !tbaa !5
  %51 = call i32 (ptr, ...) @printf(ptr noundef @.str.54, i32 noundef %41, ptr noundef %44, ptr noundef %50)
  %52 = load i32, ptr %4, align 4, !tbaa !9
  call void @print_indent(i32 noundef %52)
  %53 = call i32 (ptr, ...) @printf(ptr noundef @.str.13)
  %54 = load ptr, ptr %3, align 8, !tbaa !5
  %55 = getelementptr inbounds %struct._WffNode, ptr %54, i32 0, i32 9
  %56 = load ptr, ptr %55, align 8, !tbaa !16
  %57 = load i32, ptr %4, align 4, !tbaa !9
  %58 = add nsw i32 %57, 4
  call void @print_Wff(ptr noundef %56, i32 noundef %58)
  %59 = load i32, ptr %4, align 4, !tbaa !9
  call void @print_indent(i32 noundef %59)
  %60 = call i32 (ptr, ...) @printf(ptr noundef @.str.14)
  br label %204

61:                                               ; preds = %11
  %62 = call i32 (ptr, ...) @printf(ptr noundef @.str.16)
  %63 = load ptr, ptr %3, align 8, !tbaa !5
  %64 = getelementptr inbounds %struct._WffNode, ptr %63, i32 0, i32 4
  %65 = load ptr, ptr %64, align 8, !tbaa !17
  %66 = load i32, ptr %4, align 4, !tbaa !9
  %67 = add nsw i32 %66, 4
  call void @print_Wff(ptr noundef %65, i32 noundef %67)
  %68 = load ptr, ptr %3, align 8, !tbaa !5
  %69 = getelementptr inbounds %struct._WffNode, ptr %68, i32 0, i32 4
  %70 = load ptr, ptr %69, align 8, !tbaa !17
  %71 = icmp ne ptr %70, null
  br i1 %71, label %72, label %99

72:                                               ; preds = %61
  %73 = load ptr, ptr %3, align 8, !tbaa !5
  %74 = getelementptr inbounds %struct._WffNode, ptr %73, i32 0, i32 4
  %75 = load ptr, ptr %74, align 8, !tbaa !17
  %76 = getelementptr inbounds %struct._WffNode, ptr %75, i32 0, i32 5
  %77 = load ptr, ptr %76, align 8, !tbaa !18
  store ptr %77, ptr %5, align 8, !tbaa !5
  br label %78

78:                                               ; preds = %94, %72
  %79 = load ptr, ptr %5, align 8, !tbaa !5
  %80 = icmp ne ptr %79, null
  br i1 %80, label %81, label %98

81:                                               ; preds = %78
  %82 = load ptr, ptr %5, align 8, !tbaa !5
  %83 = getelementptr inbounds %struct._WffNode, ptr %82, i32 0, i32 6
  %84 = load ptr, ptr %83, align 8, !tbaa !19
  %85 = icmp ne ptr %84, null
  br i1 %85, label %88, label %86

86:                                               ; preds = %81
  %87 = call i32 (ptr, ...) @printf(ptr noundef @.str.55)
  call void @exit(i32 noundef 1) #5
  unreachable

88:                                               ; preds = %81
  %89 = load i32, ptr %4, align 4, !tbaa !9
  call void @print_indent(i32 noundef %89)
  %90 = call i32 (ptr, ...) @printf(ptr noundef @.str.17)
  %91 = load ptr, ptr %5, align 8, !tbaa !5
  %92 = load i32, ptr %4, align 4, !tbaa !9
  %93 = add nsw i32 %92, 4
  call void @print_Wff(ptr noundef %91, i32 noundef %93)
  br label %94

94:                                               ; preds = %88
  %95 = load ptr, ptr %5, align 8, !tbaa !5
  %96 = getelementptr inbounds %struct._WffNode, ptr %95, i32 0, i32 5
  %97 = load ptr, ptr %96, align 8, !tbaa !18
  store ptr %97, ptr %5, align 8, !tbaa !5
  br label %78, !llvm.loop !20

98:                                               ; preds = %78
  br label %99

99:                                               ; preds = %98, %61
  %100 = load i32, ptr %4, align 4, !tbaa !9
  call void @print_indent(i32 noundef %100)
  %101 = call i32 (ptr, ...) @printf(ptr noundef @.str.14)
  br label %204

102:                                              ; preds = %11
  %103 = call i32 (ptr, ...) @printf(ptr noundef @.str.18)
  %104 = load ptr, ptr %3, align 8, !tbaa !5
  %105 = getelementptr inbounds %struct._WffNode, ptr %104, i32 0, i32 4
  %106 = load ptr, ptr %105, align 8, !tbaa !17
  %107 = load i32, ptr %4, align 4, !tbaa !9
  %108 = add nsw i32 %107, 4
  call void @print_Wff(ptr noundef %106, i32 noundef %108)
  %109 = load ptr, ptr %3, align 8, !tbaa !5
  %110 = getelementptr inbounds %struct._WffNode, ptr %109, i32 0, i32 4
  %111 = load ptr, ptr %110, align 8, !tbaa !17
  %112 = getelementptr inbounds %struct._WffNode, ptr %111, i32 0, i32 5
  %113 = load ptr, ptr %112, align 8, !tbaa !18
  store ptr %113, ptr %5, align 8, !tbaa !5
  br label %114

114:                                              ; preds = %123, %102
  %115 = load ptr, ptr %5, align 8, !tbaa !5
  %116 = icmp ne ptr %115, null
  br i1 %116, label %117, label %127

117:                                              ; preds = %114
  %118 = load i32, ptr %4, align 4, !tbaa !9
  call void @print_indent(i32 noundef %118)
  %119 = call i32 (ptr, ...) @printf(ptr noundef @.str.19)
  %120 = load ptr, ptr %5, align 8, !tbaa !5
  %121 = load i32, ptr %4, align 4, !tbaa !9
  %122 = add nsw i32 %121, 4
  call void @print_Wff(ptr noundef %120, i32 noundef %122)
  br label %123

123:                                              ; preds = %117
  %124 = load ptr, ptr %5, align 8, !tbaa !5
  %125 = getelementptr inbounds %struct._WffNode, ptr %124, i32 0, i32 5
  %126 = load ptr, ptr %125, align 8, !tbaa !18
  store ptr %126, ptr %5, align 8, !tbaa !5
  br label %114, !llvm.loop !22

127:                                              ; preds = %114
  %128 = load i32, ptr %4, align 4, !tbaa !9
  call void @print_indent(i32 noundef %128)
  %129 = call i32 (ptr, ...) @printf(ptr noundef @.str.14)
  br label %204

130:                                              ; preds = %11
  %131 = load ptr, ptr %3, align 8, !tbaa !5
  %132 = getelementptr inbounds %struct._WffNode, ptr %131, i32 0, i32 9
  %133 = load ptr, ptr %132, align 8, !tbaa !16
  %134 = getelementptr inbounds %struct._WffNode, ptr %133, i32 0, i32 0
  %135 = load i32, ptr %134, align 8, !tbaa !11
  %136 = icmp eq i32 2002, %135
  br i1 %136, label %137, label %144

137:                                              ; preds = %130
  %138 = call i32 (ptr, ...) @printf(ptr noundef @.str.23)
  %139 = load ptr, ptr %3, align 8, !tbaa !5
  %140 = getelementptr inbounds %struct._WffNode, ptr %139, i32 0, i32 9
  %141 = load ptr, ptr %140, align 8, !tbaa !16
  %142 = load i32, ptr %4, align 4, !tbaa !9
  %143 = add nsw i32 %142, 4
  call void @print_Wff(ptr noundef %141, i32 noundef %143)
  br label %154

144:                                              ; preds = %130
  %145 = call i32 (ptr, ...) @printf(ptr noundef @.str.24)
  %146 = load ptr, ptr %3, align 8, !tbaa !5
  %147 = getelementptr inbounds %struct._WffNode, ptr %146, i32 0, i32 9
  %148 = load ptr, ptr %147, align 8, !tbaa !16
  %149 = load i32, ptr %4, align 4, !tbaa !9
  %150 = add nsw i32 %149, 4
  call void @print_Wff(ptr noundef %148, i32 noundef %150)
  %151 = load i32, ptr %4, align 4, !tbaa !9
  %152 = add nsw i32 %151, 3
  call void @print_indent(i32 noundef %152)
  %153 = call i32 (ptr, ...) @printf(ptr noundef @.str.14)
  br label %154

154:                                              ; preds = %144, %137
  br label %204

155:                                              ; preds = %11
  %156 = load ptr, ptr %3, align 8, !tbaa !5
  %157 = getelementptr inbounds %struct._WffNode, ptr %156, i32 0, i32 7
  %158 = load ptr, ptr %157, align 8, !tbaa !23
  call void @print_Fact(ptr noundef %158)
  %159 = load ptr, ptr %3, align 8, !tbaa !5
  %160 = getelementptr inbounds %struct._WffNode, ptr %159, i32 0, i32 8
  %161 = load i32, ptr %160, align 8, !tbaa !24
  %162 = icmp ne i32 %161, -1
  br i1 %162, label %163, label %165

163:                                              ; preds = %155
  %164 = call i32 (ptr, ...) @printf(ptr noundef @.str.56)
  br label %165

165:                                              ; preds = %163, %155
  %166 = call i32 (ptr, ...) @printf(ptr noundef @.str.40)
  br label %204

167:                                              ; preds = %11
  %168 = call i32 (ptr, ...) @printf(ptr noundef @.str.25)
  br label %204

169:                                              ; preds = %11
  %170 = call i32 (ptr, ...) @printf(ptr noundef @.str.26)
  br label %204

171:                                              ; preds = %11
  %172 = load ptr, ptr %3, align 8, !tbaa !5
  %173 = getelementptr inbounds %struct._WffNode, ptr %172, i32 0, i32 10
  %174 = load i32, ptr %173, align 8, !tbaa !25
  switch i32 %174, label %185 [
    i32 3001, label %175
    i32 3002, label %177
    i32 3003, label %179
    i32 3004, label %181
    i32 3005, label %183
  ]

175:                                              ; preds = %171
  %176 = call i32 (ptr, ...) @printf(ptr noundef @.str.27)
  br label %190

177:                                              ; preds = %171
  %178 = call i32 (ptr, ...) @printf(ptr noundef @.str.28)
  br label %190

179:                                              ; preds = %171
  %180 = call i32 (ptr, ...) @printf(ptr noundef @.str.29)
  br label %190

181:                                              ; preds = %171
  %182 = call i32 (ptr, ...) @printf(ptr noundef @.str.30)
  br label %190

183:                                              ; preds = %171
  %184 = call i32 (ptr, ...) @printf(ptr noundef @.str.31)
  br label %190

185:                                              ; preds = %171
  %186 = load ptr, ptr %3, align 8, !tbaa !5
  %187 = getelementptr inbounds %struct._WffNode, ptr %186, i32 0, i32 10
  %188 = load i32, ptr %187, align 8, !tbaa !25
  %189 = call i32 (ptr, ...) @printf(ptr noundef @.str.57, i32 noundef %188)
  call void @exit(i32 noundef 1) #5
  unreachable

190:                                              ; preds = %183, %181, %179, %177, %175
  %191 = load ptr, ptr %3, align 8, !tbaa !5
  %192 = getelementptr inbounds %struct._WffNode, ptr %191, i32 0, i32 11
  %193 = load ptr, ptr %192, align 8, !tbaa !26
  call void @print_ExpNode(ptr noundef %193)
  %194 = load ptr, ptr %3, align 8, !tbaa !5
  %195 = getelementptr inbounds %struct._WffNode, ptr %194, i32 0, i32 12
  %196 = load ptr, ptr %195, align 8, !tbaa !27
  call void @print_ExpNode(ptr noundef %196)
  %197 = call i32 (ptr, ...) @printf(ptr noundef @.str.14)
  br label %204

198:                                              ; preds = %11
  %199 = call i32 (ptr, ...) @printf(ptr noundef @.str.38)
  %200 = load ptr, ptr %3, align 8, !tbaa !5
  %201 = getelementptr inbounds %struct._WffNode, ptr %200, i32 0, i32 0
  %202 = load i32, ptr %201, align 8, !tbaa !11
  %203 = call i32 (ptr, ...) @printf(ptr noundef @.str.58, i32 noundef %202)
  call void @exit(i32 noundef 1) #5
  unreachable

204:                                              ; preds = %190, %169, %167, %165, %154, %127, %99, %38, %15
  store i32 0, ptr %6, align 4
  br label %205

205:                                              ; preds = %204, %9
  call void @llvm.lifetime.end.p0(i64 8, ptr %5) #4
  %206 = load i32, ptr %6, align 4
  switch i32 %206, label %208 [
    i32 0, label %207
    i32 1, label %207
  ]

207:                                              ; preds = %205, %205
  ret void

208:                                              ; preds = %205
  unreachable
}

; Function Attrs: nounwind uwtable
declare dso_local void @print_Fact(ptr noundef) #2

attributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
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 = { 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 = { 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 #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 = !{!12, !10, i64 0}
!12 = !{!"_WffNode", !10, i64 0, !10, i64 4, !10, i64 8, !6, i64 16, !6, i64 24, !6, i64 32, !6, i64 40, !6, i64 48, !10, i64 56, !6, i64 64, !10, i64 72, !6, i64 80, !6, i64 88, !7, i64 96}
!13 = !{!12, !10, i64 4}
!14 = !{!12, !6, i64 16}
!15 = !{!12, !10, i64 8}
!16 = !{!12, !6, i64 64}
!17 = !{!12, !6, i64 24}
!18 = !{!12, !6, i64 32}
!19 = !{!12, !6, i64 40}
!20 = distinct !{!20, !21}
!21 = !{!"llvm.loop.mustprogress"}
!22 = distinct !{!22, !21}
!23 = !{!12, !6, i64 48}
!24 = !{!12, !10, i64 56}
!25 = !{!12, !10, i64 72}
!26 = !{!12, !6, i64 80}
!27 = !{!12, !6, i64 88}


; 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.11 = external hidden unnamed_addr constant [6 x i8], align 1
@.str.13 = external hidden unnamed_addr constant [5 x i8], align 1
@.str.14 = external hidden unnamed_addr constant [3 x i8], align 1
@.str.16 = external hidden unnamed_addr constant [5 x i8], align 1
@.str.17 = external hidden unnamed_addr constant [5 x i8], align 1
@.str.18 = external hidden unnamed_addr constant [5 x i8], align 1
@.str.19 = external hidden unnamed_addr constant [4 x i8], align 1
@.str.23 = external hidden unnamed_addr constant [5 x i8], align 1
@.str.24 = external hidden unnamed_addr constant [5 x i8], align 1
@.str.25 = external hidden unnamed_addr constant [8 x i8], align 1
@.str.26 = external hidden unnamed_addr constant [9 x i8], align 1
@.str.27 = external hidden unnamed_addr constant [4 x i8], align 1
@.str.28 = external hidden unnamed_addr constant [5 x i8], align 1
@.str.29 = external hidden unnamed_addr constant [4 x i8], align 1
@.str.30 = external hidden unnamed_addr constant [5 x i8], align 1
@.str.31 = external hidden unnamed_addr constant [4 x i8], align 1
@.str.38 = external hidden unnamed_addr constant [18 x i8], align 1
@.str.40 = external hidden unnamed_addr constant [2 x i8], align 1
@.str.53 = external hidden unnamed_addr constant [18 x i8], align 1
@gtype_names = external local_unnamed_addr global [50 x ptr], align 16
@.str.54 = external hidden unnamed_addr constant [19 x i8], align 1
@.str.55 = external hidden unnamed_addr constant [34 x i8], align 1
@.str.56 = external hidden unnamed_addr constant [19 x i8], align 1
@.str.57 = external hidden unnamed_addr constant [42 x i8], align 1
@.str.58 = external hidden unnamed_addr constant [39 x i8], align 1
@switch.table.print_Wff = private unnamed_addr constant [5 x ptr] [ptr @.str.27, ptr @.str.28, ptr @.str.29, ptr @.str.30, ptr @.str.31], align 8

; Function Attrs: nofree nounwind
declare noundef i32 @printf(ptr nocapture noundef readonly, ...) local_unnamed_addr #0

; Function Attrs: nounwind uwtable
declare dso_local void @print_indent(i32 noundef) local_unnamed_addr #1

; Function Attrs: noreturn nounwind
declare void @exit(i32 noundef) local_unnamed_addr #2

; Function Attrs: nounwind uwtable
declare dso_local void @print_ExpNode(ptr noundef) local_unnamed_addr #1

; Function Attrs: nounwind uwtable
define dso_local void @print_Wff(ptr noundef readonly %0, i32 noundef %1) local_unnamed_addr #1 {
  %.not77 = icmp eq ptr %0, null
  br i1 %.not77, label %common.ret, label %.lr.ph

.lr.ph:                                           ; preds = %2, %tailrecurse
  %.tr5679 = phi i32 [ %59, %tailrecurse ], [ %1, %2 ]
  %.tr78 = phi ptr [ %61, %tailrecurse ], [ %0, %2 ]
  %3 = load i32, ptr %.tr78, align 8, !tbaa !5
  switch i32 %3, label %86 [
    i32 2008, label %5
    i32 2009, label %20
    i32 2006, label %35
    i32 2007, label %47
    i32 2005, label %54
    i32 2002, label %66
    i32 2000, label %common.ret
    i32 2001, label %73
    i32 2003, label %74
  ]

common.ret:                                       ; preds = %tailrecurse, %.lr.ph, %2, %66, %71, %switch.lookup, %73, %._crit_edge, %.loopexit, %62, %20, %5
  %.str.11.sink = phi ptr [ @.str.14, %switch.lookup ], [ @.str.26, %73 ], [ @.str.14, %._crit_edge ], [ @.str.14, %.loopexit ], [ @.str.14, %62 ], [ @.str.14, %20 ], [ @.str.14, %5 ], [ @.str.40, %71 ], [ @.str.40, %66 ], [ @.str.11, %2 ], [ @.str.25, %.lr.ph ], [ @.str.11, %tailrecurse ]
  %4 = tail call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) %.str.11.sink)
  ret void

5:                                                ; preds = %.lr.ph
  %6 = getelementptr inbounds i8, ptr %.tr78, i64 4
  %7 = load i32, ptr %6, align 4, !tbaa !11
  %8 = getelementptr inbounds i8, ptr %.tr78, i64 16
  %9 = load ptr, ptr %8, align 8, !tbaa !12
  %10 = getelementptr inbounds i8, ptr %.tr78, i64 8
  %11 = load i32, ptr %10, align 8, !tbaa !13
  %12 = sext i32 %11 to i64
  %13 = getelementptr inbounds [50 x ptr], ptr @gtype_names, i64 0, i64 %12
  %14 = load ptr, ptr %13, align 8, !tbaa !14
  %15 = tail call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.53, i32 noundef %7, ptr noundef %9, ptr noundef %14)
  tail call void @print_indent(i32 noundef %.tr5679)
  %16 = tail call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.13)
  %17 = getelementptr inbounds i8, ptr %.tr78, i64 64
  %18 = load ptr, ptr %17, align 8, !tbaa !15
  %19 = add nsw i32 %.tr5679, 4
  tail call void @print_Wff(ptr noundef %18, i32 noundef %19)
  tail call void @print_indent(i32 noundef %.tr5679)
  br label %common.ret

20:                                               ; preds = %.lr.ph
  %21 = getelementptr inbounds i8, ptr %.tr78, i64 4
  %22 = load i32, ptr %21, align 4, !tbaa !11
  %23 = getelementptr inbounds i8, ptr %.tr78, i64 16
  %24 = load ptr, ptr %23, align 8, !tbaa !12
  %25 = getelementptr inbounds i8, ptr %.tr78, i64 8
  %26 = load i32, ptr %25, align 8, !tbaa !13
  %27 = sext i32 %26 to i64
  %28 = getelementptr inbounds [50 x ptr], ptr @gtype_names, i64 0, i64 %27
  %29 = load ptr, ptr %28, align 8, !tbaa !14
  %30 = tail call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.54, i32 noundef %22, ptr noundef %24, ptr noundef %29)
  tail call void @print_indent(i32 noundef %.tr5679)
  %31 = tail call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.13)
  %32 = getelementptr inbounds i8, ptr %.tr78, i64 64
  %33 = load ptr, ptr %32, align 8, !tbaa !15
  %34 = add nsw i32 %.tr5679, 4
  tail call void @print_Wff(ptr noundef %33, i32 noundef %34)
  tail call void @print_indent(i32 noundef %.tr5679)
  br label %common.ret

35:                                               ; preds = %.lr.ph
  %36 = tail call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.16)
  %37 = getelementptr inbounds i8, ptr %.tr78, i64 24
  %38 = load ptr, ptr %37, align 8, !tbaa !16
  %39 = add nsw i32 %.tr5679, 4
  tail call void @print_Wff(ptr noundef %38, i32 noundef %39)
  %40 = load ptr, ptr %37, align 8, !tbaa !16
  %.not52 = icmp eq ptr %40, null
  br i1 %.not52, label %.loopexit, label %.preheader

.preheader:                                       ; preds = %35
  %.0.in85 = getelementptr inbounds i8, ptr %40, i64 32
  %.086 = load ptr, ptr %.0.in85, align 8, !tbaa !17
  %.not5387 = icmp eq ptr %.086, null
  br i1 %.not5387, label %.loopexit, label %.lr.ph89

.lr.ph89:                                         ; preds = %.preheader, %45
  %.088 = phi ptr [ %.0, %45 ], [ %.086, %.preheader ]
  %41 = getelementptr inbounds i8, ptr %.088, i64 40
  %42 = load ptr, ptr %41, align 8, !tbaa !18
  %.not54 = icmp eq ptr %42, null
  br i1 %.not54, label %43, label %45

43:                                               ; preds = %.lr.ph89
  %44 = tail call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.55)
  tail call void @exit(i32 noundef 1) #3
  unreachable

45:                                               ; preds = %.lr.ph89
  tail call void @print_indent(i32 noundef %.tr5679)
  %46 = tail call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.17)
  tail call void @print_Wff(ptr noundef nonnull %.088, i32 noundef %39)
  %.0.in = getelementptr inbounds i8, ptr %.088, i64 32
  %.0 = load ptr, ptr %.0.in, align 8, !tbaa !17
  %.not53 = icmp eq ptr %.0, null
  br i1 %.not53, label %.loopexit, label %.lr.ph89, !llvm.loop !19

.loopexit:                                        ; preds = %45, %.preheader, %35
  tail call void @print_indent(i32 noundef %.tr5679)
  br label %common.ret

47:                                               ; preds = %.lr.ph
  %48 = tail call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.18)
  %49 = getelementptr inbounds i8, ptr %.tr78, i64 24
  %50 = load ptr, ptr %49, align 8, !tbaa !16
  %51 = add nsw i32 %.tr5679, 4
  tail call void @print_Wff(ptr noundef %50, i32 noundef %51)
  %52 = load ptr, ptr %49, align 8, !tbaa !16
  %.1.in80 = getelementptr inbounds i8, ptr %52, i64 32
  %.181 = load ptr, ptr %.1.in80, align 8, !tbaa !17
  %.not5182 = icmp eq ptr %.181, null
  br i1 %.not5182, label %._crit_edge, label %.lr.ph84

.lr.ph84:                                         ; preds = %47, %.lr.ph84
  %.183 = phi ptr [ %.1, %.lr.ph84 ], [ %.181, %47 ]
  tail call void @print_indent(i32 noundef %.tr5679)
  %53 = tail call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.19)
  tail call void @print_Wff(ptr noundef nonnull %.183, i32 noundef %51)
  %.1.in = getelementptr inbounds i8, ptr %.183, i64 32
  %.1 = load ptr, ptr %.1.in, align 8, !tbaa !17
  %.not51 = icmp eq ptr %.1, null
  br i1 %.not51, label %._crit_edge, label %.lr.ph84, !llvm.loop !21

._crit_edge:                                      ; preds = %.lr.ph84, %47
  tail call void @print_indent(i32 noundef %.tr5679)
  br label %common.ret

54:                                               ; preds = %.lr.ph
  %55 = getelementptr inbounds i8, ptr %.tr78, i64 64
  %56 = load ptr, ptr %55, align 8, !tbaa !15
  %57 = load i32, ptr %56, align 8, !tbaa !5
  %58 = icmp eq i32 %57, 2002
  %59 = add nsw i32 %.tr5679, 4
  br i1 %58, label %tailrecurse, label %62

tailrecurse:                                      ; preds = %54
  %60 = tail call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.23)
  %61 = load ptr, ptr %55, align 8, !tbaa !15
  %.not = icmp eq ptr %61, null
  br i1 %.not, label %common.ret, label %.lr.ph

62:                                               ; preds = %54
  %63 = tail call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.24)
  %64 = load ptr, ptr %55, align 8, !tbaa !15
  tail call void @print_Wff(ptr noundef %64, i32 noundef %59)
  %65 = add nsw i32 %.tr5679, 3
  tail call void @print_indent(i32 noundef %65)
  br label %common.ret

66:                                               ; preds = %.lr.ph
  %67 = getelementptr inbounds i8, ptr %.tr78, i64 48
  %68 = load ptr, ptr %67, align 8, !tbaa !22
  tail call void @print_Fact(ptr noundef %68)
  %69 = getelementptr inbounds i8, ptr %.tr78, i64 56
  %70 = load i32, ptr %69, align 8, !tbaa !23
  %.not50 = icmp eq i32 %70, -1
  br i1 %.not50, label %common.ret, label %71

71:                                               ; preds = %66
  %72 = tail call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.56)
  br label %common.ret

73:                                               ; preds = %.lr.ph
  br label %common.ret

74:                                               ; preds = %.lr.ph
  %75 = getelementptr inbounds i8, ptr %.tr78, i64 72
  %76 = load i32, ptr %75, align 8, !tbaa !24
  %switch.tableidx = add i32 %76, -3001
  %77 = icmp ult i32 %switch.tableidx, 5
  br i1 %77, label %switch.lookup, label %78

78:                                               ; preds = %74
  %79 = tail call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.57, i32 noundef %76)
  tail call void @exit(i32 noundef 1) #3
  unreachable

switch.lookup:                                    ; preds = %74
  %80 = zext nneg i32 %switch.tableidx to i64
  %switch.gep = getelementptr inbounds [5 x ptr], ptr @switch.table.print_Wff, i64 0, i64 %80
  %switch.load = load ptr, ptr %switch.gep, align 8
  %81 = tail call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) %switch.load)
  %82 = getelementptr inbounds i8, ptr %.tr78, i64 80
  %83 = load ptr, ptr %82, align 8, !tbaa !25
  tail call void @print_ExpNode(ptr noundef %83)
  %84 = getelementptr inbounds i8, ptr %.tr78, i64 88
  %85 = load ptr, ptr %84, align 8, !tbaa !26
  tail call void @print_ExpNode(ptr noundef %85)
  br label %common.ret

86:                                               ; preds = %.lr.ph
  %87 = tail call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.38)
  %88 = load i32, ptr %.tr78, align 8, !tbaa !5
  %89 = tail call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.58, i32 noundef %88)
  tail call void @exit(i32 noundef 1) #3
  unreachable
}

; Function Attrs: nounwind uwtable
declare dso_local void @print_Fact(ptr noundef) local_unnamed_addr #1

attributes #0 = { nofree 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 #1 = { 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 #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 = { 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, !7, i64 0}
!6 = !{!"_WffNode", !7, i64 0, !7, i64 4, !7, i64 8, !10, i64 16, !10, i64 24, !10, i64 32, !10, i64 40, !10, i64 48, !7, i64 56, !10, i64 64, !7, i64 72, !10, i64 80, !10, i64 88, !8, i64 96}
!7 = !{!"int", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C/C++ TBAA"}
!10 = !{!"any pointer", !8, i64 0}
!11 = !{!6, !7, i64 4}
!12 = !{!6, !10, i64 16}
!13 = !{!6, !7, i64 8}
!14 = !{!10, !10, i64 0}
!15 = !{!6, !10, i64 64}
!16 = !{!6, !10, i64 24}
!17 = !{!6, !10, i64 32}
!18 = !{!6, !10, i64 40}
!19 = distinct !{!19, !20}
!20 = !{!"llvm.loop.mustprogress"}
!21 = distinct !{!21, !20}
!22 = !{!6, !10, i64 48}
!23 = !{!6, !7, i64 56}
!24 = !{!6, !7, i64 72}
!25 = !{!6, !10, i64 80}
!26 = !{!6, !10, i64 88}


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