Shellmiao 1 mesiac pred
commit
1f3db8e90c

+ 61 - 0
.vscode/settings.json

@@ -0,0 +1,61 @@
+{
+    "files.associations": {
+        "array": "cpp",
+        "atomic": "cpp",
+        "bit": "cpp",
+        "*.tcc": "cpp",
+        "bitset": "cpp",
+        "cctype": "cpp",
+        "chrono": "cpp",
+        "clocale": "cpp",
+        "cmath": "cpp",
+        "condition_variable": "cpp",
+        "cstdarg": "cpp",
+        "cstddef": "cpp",
+        "cstdint": "cpp",
+        "cstdio": "cpp",
+        "cstdlib": "cpp",
+        "cstring": "cpp",
+        "ctime": "cpp",
+        "cwchar": "cpp",
+        "cwctype": "cpp",
+        "deque": "cpp",
+        "map": "cpp",
+        "set": "cpp",
+        "unordered_map": "cpp",
+        "vector": "cpp",
+        "exception": "cpp",
+        "algorithm": "cpp",
+        "functional": "cpp",
+        "iterator": "cpp",
+        "memory": "cpp",
+        "memory_resource": "cpp",
+        "numeric": "cpp",
+        "optional": "cpp",
+        "random": "cpp",
+        "ratio": "cpp",
+        "string": "cpp",
+        "string_view": "cpp",
+        "system_error": "cpp",
+        "tuple": "cpp",
+        "type_traits": "cpp",
+        "utility": "cpp",
+        "fstream": "cpp",
+        "initializer_list": "cpp",
+        "iosfwd": "cpp",
+        "istream": "cpp",
+        "limits": "cpp",
+        "mutex": "cpp",
+        "new": "cpp",
+        "ostream": "cpp",
+        "shared_mutex": "cpp",
+        "sstream": "cpp",
+        "stdexcept": "cpp",
+        "streambuf": "cpp",
+        "thread": "cpp",
+        "cinttypes": "cpp",
+        "typeinfo": "cpp",
+        "list": "cpp",
+        "stdio.h": "c"
+    }
+}

+ 7 - 0
Scripts/CallGraphPassScript.sh

@@ -0,0 +1,7 @@
+#!/bin/bash
+# 获取脚本所在目录
+SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
+# 切换到项目根目录
+cd "$SCRIPT_DIR/.."
+
+opt -load ./build/CallGraphPass.so -codefusion < proprocess_output/combined_tagged.ll > output/graph.ll 2> output/log_graph.txt

+ 12 - 0
Scripts/CombineScript.sh

@@ -0,0 +1,12 @@
+#!/bin/bash
+# 获取脚本所在目录
+SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
+# 切换到项目根目录
+cd "$SCRIPT_DIR/.."
+
+clang -S -emit-llvm data/projectA.c -o combine_output/projectA.ll -Dmain=projectA_main
+clang -S -emit-llvm data/projectB.c -o combine_output/projectB.ll -Dmain=projectB_main
+llvm-as combine_output/projectA.ll -o combine_output/projectA.bc
+llvm-as combine_output/projectB.ll -o combine_output/projectB.bc
+llvm-link combine_output/projectA.bc combine_output/projectB.bc -o combine_output/combined.bc
+llvm-dis combine_output/combined.bc -o combine_output/combined.ll

+ 7 - 0
Scripts/CompileCallGraphScript.sh

@@ -0,0 +1,7 @@
+#!/bin/bash
+# 获取脚本所在目录
+SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
+# 切换到项目根目录
+cd "$SCRIPT_DIR/.."
+
+clang++ -fPIC -shared src/CallGraphPass.cpp `llvm-config --cxxflags --ldflags` -o build/CallGraphPass.so

+ 7 - 0
Scripts/CompileModuleFusionScript.sh

@@ -0,0 +1,7 @@
+#!/bin/bash
+# 获取脚本所在目录
+SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
+# 切换到项目根目录
+cd "$SCRIPT_DIR/.."
+
+clang++ -fPIC -shared src/ModuleFusion.cpp `llvm-config --cxxflags --ldflags` -o build/ModuleFusion.so

+ 7 - 0
Scripts/CompileProprocessScript.sh

@@ -0,0 +1,7 @@
+#!/bin/bash
+# 获取脚本所在目录
+SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
+# 切换到项目根目录
+cd "$SCRIPT_DIR/.."
+
+clang++ -fPIC -shared src/ProprocessFunctionPass.cpp `llvm-config --cxxflags --ldflags` -o build/ProprocessFunctionPass.so

+ 7 - 0
Scripts/CompileSliceScript.sh

@@ -0,0 +1,7 @@
+#!/bin/bash
+# 获取脚本所在目录
+SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
+# 切换到项目根目录
+cd "$SCRIPT_DIR/.."
+
+clang++ -fPIC -shared src/SliceFusionPass.cpp `llvm-config --cxxflags --ldflags` -o build/SliceFusionPass.so

+ 7 - 0
Scripts/ModuleFusionScript.sh

@@ -0,0 +1,7 @@
+#!/bin/bash
+# 获取脚本所在目录
+SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
+# 切换到项目根目录
+cd "$SCRIPT_DIR/.."
+
+opt -load ./build/ModuleFusion.so -codefusion < proprocess_output/combined_tagged.ll > output/module_fusion.ll 2> output/log_module_fusion.txt

+ 10 - 0
Scripts/ProprocessScript.sh

@@ -0,0 +1,10 @@
+#!/bin/bash
+# 获取脚本所在目录
+SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
+# 切换到项目根目录
+cd "$SCRIPT_DIR/.."
+
+opt -load build/ProprocessFunctionPass.so -add-project-metadata -project-name=Bunker < combine_output/projectA.bc > proprocess_output/projectA_tagged.bc
+opt -load build/ProprocessFunctionPass.so -add-project-metadata -project-name=Target < combine_output/projectB.bc > proprocess_output/projectB_tagged.bc
+llvm-link proprocess_output/projectA_tagged.bc proprocess_output/projectB_tagged.bc -o proprocess_output/combined_tagged.bc
+llvm-dis proprocess_output/combined_tagged.bc -o proprocess_output/combined_tagged.ll

+ 7 - 0
Scripts/SliceFusionScript.sh

@@ -0,0 +1,7 @@
+#!/bin/bash
+# 获取脚本所在目录
+SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
+# 切换到项目根目录
+cd "$SCRIPT_DIR/.."
+
+opt -load ./build/SliceFusionPass.so -codefusion < proprocess_output/combined_tagged.ll > output/fused.ll 2> output/log.txt

BIN
build/CallGraphPass.so


BIN
build/ModuleFusion.so


BIN
build/ProprocessFunctionPass.so


BIN
build/SliceFusionPass.so


BIN
combine_output/combined.bc


+ 3577 - 0
combine_output/combined.ll

@@ -0,0 +1,3577 @@
+; ModuleID = 'combine_output/combined.bc'
+source_filename = "llvm-link"
+target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-pc-linux-gnu"
+
+%struct._IO_FILE = type { i32, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, %struct._IO_marker*, %struct._IO_FILE*, i32, i32, i64, i16, i8, [1 x i8], i8*, i64, %struct._IO_codecvt*, %struct._IO_wide_data*, %struct._IO_FILE*, i8*, i64, i32, [20 x i8] }
+%struct._IO_marker = type opaque
+%struct._IO_codecvt = type opaque
+%struct._IO_wide_data = type opaque
+%struct.DynamicArray = type { i32*, i32, i32, i32, i32 }
+%struct.Matrix = type { i32**, i32, i32, i32, double }
+%struct.Node = type { i32, %struct.Node*, %struct.Node*, i32, i32 }
+%struct.Point = type { i32, i32, [256 x i8], double }
+%struct.Circle = type { %struct.Point, double, i32, [256 x i8] }
+
+@globalCounter = dso_local global i32 0, align 4
+@globalErrorMessage = dso_local global i8* null, align 8
+@recursionDepth = dso_local global i32 0, align 4
+@.str = private unnamed_addr constant [9 x i8] c"No error\00", align 1
+@stderr = external dso_local global %struct._IO_FILE*, align 8
+@.str.1 = private unnamed_addr constant [55 x i8] c"Critical: Failed to allocate memory for error message\0A\00", align 1
+@.str.2 = private unnamed_addr constant [33 x i8] c"Maximum recursion depth exceeded\00", align 1
+@.str.3 = private unnamed_addr constant [29 x i8] c"Factorial of negative number\00", align 1
+@.str.4 = private unnamed_addr constant [36 x i8] c"Input too large, potential overflow\00", align 1
+@.str.5 = private unnamed_addr constant [31 x i8] c"Factorial calculation overflow\00", align 1
+@.str.6 = private unnamed_addr constant [25 x i8] c"Invalid initial capacity\00", align 1
+@.str.7 = private unnamed_addr constant [46 x i8] c"Initial capacity exceeds maximum allowed size\00", align 1
+@.str.8 = private unnamed_addr constant [49 x i8] c"Memory allocation failed for DynamicArray struct\00", align 1
+@.str.9 = private unnamed_addr constant [35 x i8] c"Memory allocation failed for array\00", align 1
+@.str.10 = private unnamed_addr constant [19 x i8] c"Null array pointer\00", align 1
+@.str.11 = private unnamed_addr constant [25 x i8] c"Array size limit reached\00", align 1
+@.str.12 = private unnamed_addr constant [27 x i8] c"Memory reallocation failed\00", align 1
+@.str.13 = private unnamed_addr constant [46 x i8] c"Maximum recursion depth exceeded in quickSort\00", align 1
+@.str.14 = private unnamed_addr constant [32 x i8] c"Null array pointer in quickSort\00", align 1
+@.str.15 = private unnamed_addr constant [39 x i8] c"Array index out of bounds in quickSort\00", align 1
+@.str.16 = private unnamed_addr constant [28 x i8] c"Matrix dimensions too small\00", align 1
+@.str.17 = private unnamed_addr constant [46 x i8] c"Matrix dimensions exceed maximum allowed size\00", align 1
+@.str.18 = private unnamed_addr constant [43 x i8] c"Memory allocation failed for matrix struct\00", align 1
+@.str.19 = private unnamed_addr constant [41 x i8] c"Memory allocation failed for matrix rows\00", align 1
+@.str.20 = private unnamed_addr constant [44 x i8] c"Memory allocation failed for matrix columns\00", align 1
+@.str.21 = private unnamed_addr constant [20 x i8] c"Null matrix pointer\00", align 1
+@.str.22 = private unnamed_addr constant [20 x i8] c"Invalid matrix data\00", align 1
+@.str.23 = private unnamed_addr constant [45 x i8] c"Invalid matrix dimensions for multiplication\00", align 1
+@.str.24 = private unnamed_addr constant [42 x i8] c"Integer overflow in matrix multiplication\00", align 1
+@.str.25 = private unnamed_addr constant [38 x i8] c"Memory allocation failed for new node\00", align 1
+@insertNode.maxDepth = internal global i32 0, align 4
+@.str.26 = private unnamed_addr constant [34 x i8] c"List exceeds maximum allowed size\00", align 1
+@calculationResult = internal global i32 0, align 4
+@.str.27 = private unnamed_addr constant [30 x i8] c"Final calculation result: %d\0A\00", align 1
+@.str.28 = private unnamed_addr constant [11 x i8] c"Error: %s\0A\00", align 1
+@.str.29 = private unnamed_addr constant [29 x i8] c"Error during array push: %s\0A\00", align 1
+@.str.30 = private unnamed_addr constant [33 x i8] c"Error during list insertion: %s\0A\00", align 1
+@.str.31 = private unnamed_addr constant [43 x i8] c"Circular reference detected in linked list\00", align 1
+@.str.32 = private unnamed_addr constant [22 x i8] c"Invalid point weights\00", align 1
+@.str.33 = private unnamed_addr constant [31 x i8] c"Coordinates out of valid range\00", align 1
+@.str.34 = private unnamed_addr constant [30 x i8] c"Distance calculation overflow\00", align 1
+@.str.35 = private unnamed_addr constant [36 x i8] c"Invalid distance calculation result\00", align 1
+@.str.36 = private unnamed_addr constant [15 x i8] c"Invalid circle\00", align 1
+@.str.37 = private unnamed_addr constant [22 x i8] c"Invalid circle radius\00", align 1
+@.str.38 = private unnamed_addr constant [24 x i8] c"Circle radius too large\00", align 1
+@.str.39 = private unnamed_addr constant [45 x i8] c"Circle center coordinates out of valid range\00", align 1
+@.str.40 = private unnamed_addr constant [26 x i8] c"Area calculation overflow\00", align 1
+@.str.41 = private unnamed_addr constant [9 x i8] c"standard\00", align 1
+@.str.42 = private unnamed_addr constant [9 x i8] c"weighted\00", align 1
+@.str.43 = private unnamed_addr constant [35 x i8] c"Invalid weight for weighted circle\00", align 1
+@.str.44 = private unnamed_addr constant [20 x i8] c"Unknown circle type\00", align 1
+@.str.45 = private unnamed_addr constant [17 x i8] c"Null matrix data\00", align 1
+@.str.46 = private unnamed_addr constant [28 x i8] c"Matrix dimensions too large\00", align 1
+@.str.47 = private unnamed_addr constant [27 x i8] c"Invalid matrix row pointer\00", align 1
+@.str.48 = private unnamed_addr constant [32 x i8] c"Inconsistent square matrix flag\00", align 1
+@.str.49 = private unnamed_addr constant [14 x i8] c"Invalid array\00", align 1
+@.str.50 = private unnamed_addr constant [21 x i8] c"Invalid points array\00", align 1
+@.str.51 = private unnamed_addr constant [16 x i8] c"Too many points\00", align 1
+@.str.52 = private unnamed_addr constant [39 x i8] c"Failed to allocate memory for centroid\00", align 1
+@.str.53 = private unnamed_addr constant [21 x i8] c"Invalid point weight\00", align 1
+@.str.54 = private unnamed_addr constant [30 x i8] c"Centroid calculation overflow\00", align 1
+@.str.55 = private unnamed_addr constant [21 x i8] c"Total weight is zero\00", align 1
+@.str.56 = private unnamed_addr constant [9 x i8] c"Centroid\00", align 1
+@cache = internal global [100 x i32] zeroinitializer, align 16
+@__const.projectB_main.str = private unnamed_addr constant [14 x i8] c"Hello, World!\00", align 1
+@__const.projectB_main.arr = private unnamed_addr constant [8 x i32] [i32 10, i32 22, i32 9, i32 33, i32 21, i32 50, i32 41, i32 60], align 16
+@__const.projectB_main.matrix = private unnamed_addr constant <{ <{ i32, i32, i32, [97 x i32] }>, <{ i32, i32, i32, [97 x i32] }>, <{ i32, i32, i32, [97 x i32] }>, [97 x <{ i32, i32, i32, [97 x i32] }>] }> <{ <{ i32, i32, i32, [97 x i32] }> <{ i32 1, i32 2, i32 3, [97 x i32] zeroinitializer }>, <{ i32, i32, i32, [97 x i32] }> <{ i32 4, i32 5, i32 6, [97 x i32] zeroinitializer }>, <{ i32, i32, i32, [97 x i32] }> <{ i32 7, i32 8, i32 9, [97 x i32] zeroinitializer }>, [97 x <{ i32, i32, i32, [97 x i32] }>] zeroinitializer }>, align 16
+
+; Function Attrs: noinline nounwind optnone uwtable
+define dso_local i8* @getErrorMessage() #0 {
+  %1 = load i8*, i8** @globalErrorMessage, align 8
+  %2 = icmp ne i8* %1, null
+  br i1 %2, label %3, label %5
+
+3:                                                ; preds = %0
+  %4 = load i8*, i8** @globalErrorMessage, align 8
+  br label %6
+
+5:                                                ; preds = %0
+  br label %6
+
+6:                                                ; preds = %5, %3
+  %7 = phi i8* [ %4, %3 ], [ getelementptr inbounds ([9 x i8], [9 x i8]* @.str, i64 0, i64 0), %5 ]
+  ret i8* %7
+}
+
+; Function Attrs: noinline nounwind optnone uwtable
+define dso_local void @setErrorMessage(i8* %0) #0 {
+  %2 = alloca i8*, align 8
+  store i8* %0, i8** %2, align 8
+  %3 = load i8*, i8** @globalErrorMessage, align 8
+  %4 = icmp ne i8* %3, null
+  br i1 %4, label %5, label %7
+
+5:                                                ; preds = %1
+  %6 = load i8*, i8** @globalErrorMessage, align 8
+  call void @free(i8* %6) #7
+  br label %7
+
+7:                                                ; preds = %5, %1
+  %8 = load i8*, i8** %2, align 8
+  %9 = icmp ne i8* %8, null
+  br i1 %9, label %10, label %19
+
+10:                                               ; preds = %7
+  %11 = load i8*, i8** %2, align 8
+  %12 = call noalias i8* @strdup(i8* %11) #7
+  store i8* %12, i8** @globalErrorMessage, align 8
+  %13 = load i8*, i8** @globalErrorMessage, align 8
+  %14 = icmp eq i8* %13, null
+  br i1 %14, label %15, label %18
+
+15:                                               ; preds = %10
+  %16 = load %struct._IO_FILE*, %struct._IO_FILE** @stderr, align 8
+  %17 = call i32 (%struct._IO_FILE*, i8*, ...) @fprintf(%struct._IO_FILE* %16, i8* getelementptr inbounds ([55 x i8], [55 x i8]* @.str.1, i64 0, i64 0))
+  br label %18
+
+18:                                               ; preds = %15, %10
+  br label %20
+
+19:                                               ; preds = %7
+  store i8* null, i8** @globalErrorMessage, align 8
+  br label %20
+
+20:                                               ; preds = %19, %18
+  ret void
+}
+
+; Function Attrs: nounwind
+declare dso_local void @free(i8*) #1
+
+; Function Attrs: nounwind
+declare dso_local noalias i8* @strdup(i8*) #1
+
+declare dso_local i32 @fprintf(%struct._IO_FILE*, i8*, ...) #2
+
+; Function Attrs: noinline nounwind optnone uwtable
+define dso_local i32 @factorial(i32 %0) #0 {
+  %2 = alloca i32, align 4
+  %3 = alloca i32, align 4
+  %4 = alloca i32, align 4
+  %5 = alloca i32, align 4
+  store i32 %0, i32* %3, align 4
+  %6 = load i32, i32* @recursionDepth, align 4
+  %7 = add nsw i32 %6, 1
+  store i32 %7, i32* @recursionDepth, align 4
+  %8 = icmp sgt i32 %7, 1000
+  br i1 %8, label %9, label %12
+
+9:                                                ; preds = %1
+  call void @setErrorMessage(i8* getelementptr inbounds ([33 x i8], [33 x i8]* @.str.2, i64 0, i64 0))
+  %10 = load i32, i32* @recursionDepth, align 4
+  %11 = add nsw i32 %10, -1
+  store i32 %11, i32* @recursionDepth, align 4
+  store i32 -1, i32* %2, align 4
+  br label %53
+
+12:                                               ; preds = %1
+  %13 = load i32, i32* %3, align 4
+  %14 = icmp slt i32 %13, 0
+  br i1 %14, label %15, label %18
+
+15:                                               ; preds = %12
+  call void @setErrorMessage(i8* getelementptr inbounds ([29 x i8], [29 x i8]* @.str.3, i64 0, i64 0))
+  %16 = load i32, i32* @recursionDepth, align 4
+  %17 = add nsw i32 %16, -1
+  store i32 %17, i32* @recursionDepth, align 4
+  store i32 -1, i32* %2, align 4
+  br label %53
+
+18:                                               ; preds = %12
+  %19 = load i32, i32* %3, align 4
+  %20 = icmp sgt i32 %19, 20
+  br i1 %20, label %21, label %24
+
+21:                                               ; preds = %18
+  call void @setErrorMessage(i8* getelementptr inbounds ([36 x i8], [36 x i8]* @.str.4, i64 0, i64 0))
+  %22 = load i32, i32* @recursionDepth, align 4
+  %23 = add nsw i32 %22, -1
+  store i32 %23, i32* @recursionDepth, align 4
+  store i32 -1, i32* %2, align 4
+  br label %53
+
+24:                                               ; preds = %18
+  %25 = load i32, i32* %3, align 4
+  %26 = icmp sle i32 %25, 1
+  br i1 %26, label %27, label %28
+
+27:                                               ; preds = %24
+  store i32 1, i32* %4, align 4
+  br label %49
+
+28:                                               ; preds = %24
+  %29 = load i32, i32* %3, align 4
+  %30 = sub nsw i32 %29, 1
+  %31 = call i32 @factorial(i32 %30)
+  store i32 %31, i32* %5, align 4
+  %32 = load i32, i32* %5, align 4
+  %33 = icmp eq i32 %32, -1
+  br i1 %33, label %34, label %37
+
+34:                                               ; preds = %28
+  %35 = load i32, i32* @recursionDepth, align 4
+  %36 = add nsw i32 %35, -1
+  store i32 %36, i32* @recursionDepth, align 4
+  store i32 -1, i32* %2, align 4
+  br label %53
+
+37:                                               ; preds = %28
+  %38 = load i32, i32* %5, align 4
+  %39 = load i32, i32* %3, align 4
+  %40 = sdiv i32 2147483647, %39
+  %41 = icmp sgt i32 %38, %40
+  br i1 %41, label %42, label %45
+
+42:                                               ; preds = %37
+  call void @setErrorMessage(i8* getelementptr inbounds ([31 x i8], [31 x i8]* @.str.5, i64 0, i64 0))
+  %43 = load i32, i32* @recursionDepth, align 4
+  %44 = add nsw i32 %43, -1
+  store i32 %44, i32* @recursionDepth, align 4
+  store i32 -1, i32* %2, align 4
+  br label %53
+
+45:                                               ; preds = %37
+  %46 = load i32, i32* %3, align 4
+  %47 = load i32, i32* %5, align 4
+  %48 = mul nsw i32 %46, %47
+  store i32 %48, i32* %4, align 4
+  br label %49
+
+49:                                               ; preds = %45, %27
+  %50 = load i32, i32* @recursionDepth, align 4
+  %51 = add nsw i32 %50, -1
+  store i32 %51, i32* @recursionDepth, align 4
+  %52 = load i32, i32* %4, align 4
+  store i32 %52, i32* %2, align 4
+  br label %53
+
+53:                                               ; preds = %49, %42, %34, %21, %15, %9
+  %54 = load i32, i32* %2, align 4
+  ret i32 %54
+}
+
+; Function Attrs: noinline nounwind optnone uwtable
+define dso_local %struct.DynamicArray* @createDynamicArray(i32 %0) #0 {
+  %2 = alloca %struct.DynamicArray*, align 8
+  %3 = alloca i32, align 4
+  %4 = alloca %struct.DynamicArray*, align 8
+  store i32 %0, i32* %3, align 4
+  %5 = load i32, i32* %3, align 4
+  %6 = icmp sle i32 %5, 0
+  br i1 %6, label %7, label %8
+
+7:                                                ; preds = %1
+  call void @setErrorMessage(i8* getelementptr inbounds ([25 x i8], [25 x i8]* @.str.6, i64 0, i64 0))
+  store %struct.DynamicArray* null, %struct.DynamicArray** %2, align 8
+  br label %44
+
+8:                                                ; preds = %1
+  %9 = load i32, i32* %3, align 4
+  %10 = icmp sgt i32 %9, 1000
+  br i1 %10, label %11, label %12
+
+11:                                               ; preds = %8
+  call void @setErrorMessage(i8* getelementptr inbounds ([46 x i8], [46 x i8]* @.str.7, i64 0, i64 0))
+  store %struct.DynamicArray* null, %struct.DynamicArray** %2, align 8
+  br label %44
+
+12:                                               ; preds = %8
+  %13 = call noalias i8* @malloc(i64 24) #7
+  %14 = bitcast i8* %13 to %struct.DynamicArray*
+  store %struct.DynamicArray* %14, %struct.DynamicArray** %4, align 8
+  %15 = load %struct.DynamicArray*, %struct.DynamicArray** %4, align 8
+  %16 = icmp ne %struct.DynamicArray* %15, null
+  br i1 %16, label %18, label %17
+
+17:                                               ; preds = %12
+  call void @setErrorMessage(i8* getelementptr inbounds ([49 x i8], [49 x i8]* @.str.8, i64 0, i64 0))
+  store %struct.DynamicArray* null, %struct.DynamicArray** %2, align 8
+  br label %44
+
+18:                                               ; preds = %12
+  %19 = load i32, i32* %3, align 4
+  %20 = sext i32 %19 to i64
+  %21 = mul i64 4, %20
+  %22 = call noalias i8* @malloc(i64 %21) #7
+  %23 = bitcast i8* %22 to i32*
+  %24 = load %struct.DynamicArray*, %struct.DynamicArray** %4, align 8
+  %25 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %24, i32 0, i32 0
+  store i32* %23, i32** %25, align 8
+  %26 = load %struct.DynamicArray*, %struct.DynamicArray** %4, align 8
+  %27 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %26, i32 0, i32 0
+  %28 = load i32*, i32** %27, align 8
+  %29 = icmp ne i32* %28, null
+  br i1 %29, label %33, label %30
+
+30:                                               ; preds = %18
+  %31 = load %struct.DynamicArray*, %struct.DynamicArray** %4, align 8
+  %32 = bitcast %struct.DynamicArray* %31 to i8*
+  call void @free(i8* %32) #7
+  call void @setErrorMessage(i8* getelementptr inbounds ([35 x i8], [35 x i8]* @.str.9, i64 0, i64 0))
+  store %struct.DynamicArray* null, %struct.DynamicArray** %2, align 8
+  br label %44
+
+33:                                               ; preds = %18
+  %34 = load %struct.DynamicArray*, %struct.DynamicArray** %4, align 8
+  %35 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %34, i32 0, i32 1
+  store i32 0, i32* %35, align 8
+  %36 = load i32, i32* %3, align 4
+  %37 = load %struct.DynamicArray*, %struct.DynamicArray** %4, align 8
+  %38 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %37, i32 0, i32 2
+  store i32 %36, i32* %38, align 4
+  %39 = load %struct.DynamicArray*, %struct.DynamicArray** %4, align 8
+  %40 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %39, i32 0, i32 3
+  store i32 1, i32* %40, align 8
+  %41 = load %struct.DynamicArray*, %struct.DynamicArray** %4, align 8
+  %42 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %41, i32 0, i32 4
+  store i32 0, i32* %42, align 4
+  %43 = load %struct.DynamicArray*, %struct.DynamicArray** %4, align 8
+  store %struct.DynamicArray* %43, %struct.DynamicArray** %2, align 8
+  br label %44
+
+44:                                               ; preds = %33, %30, %17, %11, %7
+  %45 = load %struct.DynamicArray*, %struct.DynamicArray** %2, align 8
+  ret %struct.DynamicArray* %45
+}
+
+; Function Attrs: nounwind
+declare dso_local noalias i8* @malloc(i64) #1
+
+; Function Attrs: noinline nounwind optnone uwtable
+define dso_local void @pushBack(%struct.DynamicArray* %0, i32 %1) #0 {
+  %3 = alloca %struct.DynamicArray*, align 8
+  %4 = alloca i32, align 4
+  %5 = alloca i32, align 4
+  %6 = alloca i32*, align 8
+  store %struct.DynamicArray* %0, %struct.DynamicArray** %3, align 8
+  store i32 %1, i32* %4, align 4
+  %7 = load %struct.DynamicArray*, %struct.DynamicArray** %3, align 8
+  %8 = icmp ne %struct.DynamicArray* %7, null
+  br i1 %8, label %10, label %9
+
+9:                                                ; preds = %2
+  call void @setErrorMessage(i8* getelementptr inbounds ([19 x i8], [19 x i8]* @.str.10, i64 0, i64 0))
+  br label %91
+
+10:                                               ; preds = %2
+  %11 = load %struct.DynamicArray*, %struct.DynamicArray** %3, align 8
+  %12 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %11, i32 0, i32 1
+  %13 = load i32, i32* %12, align 8
+  %14 = icmp sge i32 %13, 1000
+  br i1 %14, label %15, label %16
+
+15:                                               ; preds = %10
+  call void @setErrorMessage(i8* getelementptr inbounds ([25 x i8], [25 x i8]* @.str.11, i64 0, i64 0))
+  br label %91
+
+16:                                               ; preds = %10
+  %17 = load %struct.DynamicArray*, %struct.DynamicArray** %3, align 8
+  %18 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %17, i32 0, i32 1
+  %19 = load i32, i32* %18, align 8
+  %20 = load %struct.DynamicArray*, %struct.DynamicArray** %3, align 8
+  %21 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %20, i32 0, i32 2
+  %22 = load i32, i32* %21, align 4
+  %23 = icmp sge i32 %19, %22
+  br i1 %23, label %24, label %52
+
+24:                                               ; preds = %16
+  %25 = load %struct.DynamicArray*, %struct.DynamicArray** %3, align 8
+  %26 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %25, i32 0, i32 2
+  %27 = load i32, i32* %26, align 4
+  %28 = mul nsw i32 %27, 2
+  store i32 %28, i32* %5, align 4
+  %29 = load i32, i32* %5, align 4
+  %30 = icmp sgt i32 %29, 1000
+  br i1 %30, label %31, label %32
+
+31:                                               ; preds = %24
+  store i32 1000, i32* %5, align 4
+  br label %32
+
+32:                                               ; preds = %31, %24
+  %33 = load %struct.DynamicArray*, %struct.DynamicArray** %3, align 8
+  %34 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %33, i32 0, i32 0
+  %35 = load i32*, i32** %34, align 8
+  %36 = bitcast i32* %35 to i8*
+  %37 = load i32, i32* %5, align 4
+  %38 = sext i32 %37 to i64
+  %39 = mul i64 4, %38
+  %40 = call i8* @realloc(i8* %36, i64 %39) #7
+  %41 = bitcast i8* %40 to i32*
+  store i32* %41, i32** %6, align 8
+  %42 = load i32*, i32** %6, align 8
+  %43 = icmp ne i32* %42, null
+  br i1 %43, label %45, label %44
+
+44:                                               ; preds = %32
+  call void @setErrorMessage(i8* getelementptr inbounds ([27 x i8], [27 x i8]* @.str.12, i64 0, i64 0))
+  br label %91
+
+45:                                               ; preds = %32
+  %46 = load i32*, i32** %6, align 8
+  %47 = load %struct.DynamicArray*, %struct.DynamicArray** %3, align 8
+  %48 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %47, i32 0, i32 0
+  store i32* %46, i32** %48, align 8
+  %49 = load i32, i32* %5, align 4
+  %50 = load %struct.DynamicArray*, %struct.DynamicArray** %3, align 8
+  %51 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %50, i32 0, i32 2
+  store i32 %49, i32* %51, align 4
+  br label %52
+
+52:                                               ; preds = %45, %16
+  %53 = load %struct.DynamicArray*, %struct.DynamicArray** %3, align 8
+  %54 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %53, i32 0, i32 3
+  %55 = load i32, i32* %54, align 8
+  %56 = icmp ne i32 %55, 0
+  br i1 %56, label %57, label %78
+
+57:                                               ; preds = %52
+  %58 = load %struct.DynamicArray*, %struct.DynamicArray** %3, align 8
+  %59 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %58, i32 0, i32 1
+  %60 = load i32, i32* %59, align 8
+  %61 = icmp sgt i32 %60, 0
+  br i1 %61, label %62, label %78
+
+62:                                               ; preds = %57
+  %63 = load i32, i32* %4, align 4
+  %64 = load %struct.DynamicArray*, %struct.DynamicArray** %3, align 8
+  %65 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %64, i32 0, i32 0
+  %66 = load i32*, i32** %65, align 8
+  %67 = load %struct.DynamicArray*, %struct.DynamicArray** %3, align 8
+  %68 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %67, i32 0, i32 1
+  %69 = load i32, i32* %68, align 8
+  %70 = sub nsw i32 %69, 1
+  %71 = sext i32 %70 to i64
+  %72 = getelementptr inbounds i32, i32* %66, i64 %71
+  %73 = load i32, i32* %72, align 4
+  %74 = icmp slt i32 %63, %73
+  br i1 %74, label %75, label %78
+
+75:                                               ; preds = %62
+  %76 = load %struct.DynamicArray*, %struct.DynamicArray** %3, align 8
+  %77 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %76, i32 0, i32 3
+  store i32 0, i32* %77, align 8
+  br label %78
+
+78:                                               ; preds = %75, %62, %57, %52
+  %79 = load i32, i32* %4, align 4
+  %80 = load %struct.DynamicArray*, %struct.DynamicArray** %3, align 8
+  %81 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %80, i32 0, i32 0
+  %82 = load i32*, i32** %81, align 8
+  %83 = load %struct.DynamicArray*, %struct.DynamicArray** %3, align 8
+  %84 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %83, i32 0, i32 1
+  %85 = load i32, i32* %84, align 8
+  %86 = add nsw i32 %85, 1
+  store i32 %86, i32* %84, align 8
+  %87 = sext i32 %85 to i64
+  %88 = getelementptr inbounds i32, i32* %82, i64 %87
+  store i32 %79, i32* %88, align 4
+  %89 = load %struct.DynamicArray*, %struct.DynamicArray** %3, align 8
+  %90 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %89, i32 0, i32 4
+  store i32 1, i32* %90, align 4
+  br label %91
+
+91:                                               ; preds = %78, %44, %15, %9
+  ret void
+}
+
+; Function Attrs: nounwind
+declare dso_local i8* @realloc(i8*, i64) #1
+
+; Function Attrs: noinline nounwind optnone uwtable
+define dso_local void @quickSort(i32* %0, i32 %1, i32 %2, i32* %3) #0 {
+  %5 = alloca i32*, align 8
+  %6 = alloca i32, align 4
+  %7 = alloca i32, align 4
+  %8 = alloca i32*, align 8
+  %9 = alloca i32, align 4
+  %10 = alloca i32, align 4
+  %11 = alloca i32, align 4
+  %12 = alloca i32, align 4
+  %13 = alloca i32, align 4
+  %14 = alloca i32, align 4
+  store i32* %0, i32** %5, align 8
+  store i32 %1, i32* %6, align 4
+  store i32 %2, i32* %7, align 4
+  store i32* %3, i32** %8, align 8
+  %15 = load i32, i32* @recursionDepth, align 4
+  %16 = add nsw i32 %15, 1
+  store i32 %16, i32* @recursionDepth, align 4
+  %17 = icmp sgt i32 %16, 1000
+  br i1 %17, label %18, label %22
+
+18:                                               ; preds = %4
+  call void @setErrorMessage(i8* getelementptr inbounds ([46 x i8], [46 x i8]* @.str.13, i64 0, i64 0))
+  %19 = load i32*, i32** %8, align 8
+  store i32 1, i32* %19, align 4
+  %20 = load i32, i32* @recursionDepth, align 4
+  %21 = add nsw i32 %20, -1
+  store i32 %21, i32* @recursionDepth, align 4
+  br label %247
+
+22:                                               ; preds = %4
+  %23 = load i32*, i32** %5, align 8
+  %24 = icmp ne i32* %23, null
+  br i1 %24, label %29, label %25
+
+25:                                               ; preds = %22
+  call void @setErrorMessage(i8* getelementptr inbounds ([32 x i8], [32 x i8]* @.str.14, i64 0, i64 0))
+  %26 = load i32*, i32** %8, align 8
+  store i32 1, i32* %26, align 4
+  %27 = load i32, i32* @recursionDepth, align 4
+  %28 = add nsw i32 %27, -1
+  store i32 %28, i32* @recursionDepth, align 4
+  br label %247
+
+29:                                               ; preds = %22
+  %30 = load i32, i32* %6, align 4
+  %31 = icmp slt i32 %30, 0
+  br i1 %31, label %41, label %32
+
+32:                                               ; preds = %29
+  %33 = load i32, i32* %7, align 4
+  %34 = icmp slt i32 %33, 0
+  br i1 %34, label %41, label %35
+
+35:                                               ; preds = %32
+  %36 = load i32, i32* %6, align 4
+  %37 = icmp sge i32 %36, 1000
+  br i1 %37, label %41, label %38
+
+38:                                               ; preds = %35
+  %39 = load i32, i32* %7, align 4
+  %40 = icmp sge i32 %39, 1000
+  br i1 %40, label %41, label %45
+
+41:                                               ; preds = %38, %35, %32, %29
+  call void @setErrorMessage(i8* getelementptr inbounds ([39 x i8], [39 x i8]* @.str.15, i64 0, i64 0))
+  %42 = load i32*, i32** %8, align 8
+  store i32 1, i32* %42, align 4
+  %43 = load i32, i32* @recursionDepth, align 4
+  %44 = add nsw i32 %43, -1
+  store i32 %44, i32* @recursionDepth, align 4
+  br label %247
+
+45:                                               ; preds = %38
+  %46 = load i32, i32* %6, align 4
+  %47 = load i32, i32* %7, align 4
+  %48 = icmp slt i32 %46, %47
+  br i1 %48, label %49, label %244
+
+49:                                               ; preds = %45
+  %50 = load i32, i32* %6, align 4
+  %51 = load i32, i32* %7, align 4
+  %52 = load i32, i32* %6, align 4
+  %53 = sub nsw i32 %51, %52
+  %54 = sdiv i32 %53, 2
+  %55 = add nsw i32 %50, %54
+  store i32 %55, i32* %9, align 4
+  %56 = load i32*, i32** %5, align 8
+  %57 = load i32, i32* %6, align 4
+  %58 = sext i32 %57 to i64
+  %59 = getelementptr inbounds i32, i32* %56, i64 %58
+  %60 = load i32, i32* %59, align 4
+  %61 = load i32*, i32** %5, align 8
+  %62 = load i32, i32* %9, align 4
+  %63 = sext i32 %62 to i64
+  %64 = getelementptr inbounds i32, i32* %61, i64 %63
+  %65 = load i32, i32* %64, align 4
+  %66 = icmp sle i32 %60, %65
+  br i1 %66, label %67, label %99
+
+67:                                               ; preds = %49
+  %68 = load i32*, i32** %5, align 8
+  %69 = load i32, i32* %9, align 4
+  %70 = sext i32 %69 to i64
+  %71 = getelementptr inbounds i32, i32* %68, i64 %70
+  %72 = load i32, i32* %71, align 4
+  %73 = load i32*, i32** %5, align 8
+  %74 = load i32, i32* %7, align 4
+  %75 = sext i32 %74 to i64
+  %76 = getelementptr inbounds i32, i32* %73, i64 %75
+  %77 = load i32, i32* %76, align 4
+  %78 = icmp sle i32 %72, %77
+  br i1 %78, label %79, label %81
+
+79:                                               ; preds = %67
+  %80 = load i32, i32* %9, align 4
+  store i32 %80, i32* %10, align 4
+  br label %98
+
+81:                                               ; preds = %67
+  %82 = load i32*, i32** %5, align 8
+  %83 = load i32, i32* %6, align 4
+  %84 = sext i32 %83 to i64
+  %85 = getelementptr inbounds i32, i32* %82, i64 %84
+  %86 = load i32, i32* %85, align 4
+  %87 = load i32*, i32** %5, align 8
+  %88 = load i32, i32* %7, align 4
+  %89 = sext i32 %88 to i64
+  %90 = getelementptr inbounds i32, i32* %87, i64 %89
+  %91 = load i32, i32* %90, align 4
+  %92 = icmp sle i32 %86, %91
+  br i1 %92, label %93, label %95
+
+93:                                               ; preds = %81
+  %94 = load i32, i32* %7, align 4
+  store i32 %94, i32* %10, align 4
+  br label %97
+
+95:                                               ; preds = %81
+  %96 = load i32, i32* %6, align 4
+  store i32 %96, i32* %10, align 4
+  br label %97
+
+97:                                               ; preds = %95, %93
+  br label %98
+
+98:                                               ; preds = %97, %79
+  br label %131
+
+99:                                               ; preds = %49
+  %100 = load i32*, i32** %5, align 8
+  %101 = load i32, i32* %6, align 4
+  %102 = sext i32 %101 to i64
+  %103 = getelementptr inbounds i32, i32* %100, i64 %102
+  %104 = load i32, i32* %103, align 4
+  %105 = load i32*, i32** %5, align 8
+  %106 = load i32, i32* %7, align 4
+  %107 = sext i32 %106 to i64
+  %108 = getelementptr inbounds i32, i32* %105, i64 %107
+  %109 = load i32, i32* %108, align 4
+  %110 = icmp sle i32 %104, %109
+  br i1 %110, label %111, label %113
+
+111:                                              ; preds = %99
+  %112 = load i32, i32* %6, align 4
+  store i32 %112, i32* %10, align 4
+  br label %130
+
+113:                                              ; preds = %99
+  %114 = load i32*, i32** %5, align 8
+  %115 = load i32, i32* %9, align 4
+  %116 = sext i32 %115 to i64
+  %117 = getelementptr inbounds i32, i32* %114, i64 %116
+  %118 = load i32, i32* %117, align 4
+  %119 = load i32*, i32** %5, align 8
+  %120 = load i32, i32* %7, align 4
+  %121 = sext i32 %120 to i64
+  %122 = getelementptr inbounds i32, i32* %119, i64 %121
+  %123 = load i32, i32* %122, align 4
+  %124 = icmp sle i32 %118, %123
+  br i1 %124, label %125, label %127
+
+125:                                              ; preds = %113
+  %126 = load i32, i32* %7, align 4
+  store i32 %126, i32* %10, align 4
+  br label %129
+
+127:                                              ; preds = %113
+  %128 = load i32, i32* %9, align 4
+  store i32 %128, i32* %10, align 4
+  br label %129
+
+129:                                              ; preds = %127, %125
+  br label %130
+
+130:                                              ; preds = %129, %111
+  br label %131
+
+131:                                              ; preds = %130, %98
+  %132 = load i32*, i32** %5, align 8
+  %133 = load i32, i32* %7, align 4
+  %134 = sext i32 %133 to i64
+  %135 = getelementptr inbounds i32, i32* %132, i64 %134
+  %136 = load i32, i32* %135, align 4
+  store i32 %136, i32* %11, align 4
+  %137 = load i32*, i32** %5, align 8
+  %138 = load i32, i32* %10, align 4
+  %139 = sext i32 %138 to i64
+  %140 = getelementptr inbounds i32, i32* %137, i64 %139
+  %141 = load i32, i32* %140, align 4
+  %142 = load i32*, i32** %5, align 8
+  %143 = load i32, i32* %7, align 4
+  %144 = sext i32 %143 to i64
+  %145 = getelementptr inbounds i32, i32* %142, i64 %144
+  store i32 %141, i32* %145, align 4
+  %146 = load i32, i32* %11, align 4
+  %147 = load i32*, i32** %5, align 8
+  %148 = load i32, i32* %10, align 4
+  %149 = sext i32 %148 to i64
+  %150 = getelementptr inbounds i32, i32* %147, i64 %149
+  store i32 %146, i32* %150, align 4
+  %151 = load i32*, i32** %5, align 8
+  %152 = load i32, i32* %7, align 4
+  %153 = sext i32 %152 to i64
+  %154 = getelementptr inbounds i32, i32* %151, i64 %153
+  %155 = load i32, i32* %154, align 4
+  store i32 %155, i32* %12, align 4
+  %156 = load i32, i32* %6, align 4
+  %157 = sub nsw i32 %156, 1
+  store i32 %157, i32* %13, align 4
+  %158 = load i32, i32* %6, align 4
+  store i32 %158, i32* %14, align 4
+  br label %159
+
+159:                                              ; preds = %196, %131
+  %160 = load i32, i32* %14, align 4
+  %161 = load i32, i32* %7, align 4
+  %162 = icmp slt i32 %160, %161
+  br i1 %162, label %163, label %199
+
+163:                                              ; preds = %159
+  %164 = load i32*, i32** %5, align 8
+  %165 = load i32, i32* %14, align 4
+  %166 = sext i32 %165 to i64
+  %167 = getelementptr inbounds i32, i32* %164, i64 %166
+  %168 = load i32, i32* %167, align 4
+  %169 = load i32, i32* %12, align 4
+  %170 = icmp sle i32 %168, %169
+  br i1 %170, label %171, label %195
+
+171:                                              ; preds = %163
+  %172 = load i32, i32* %13, align 4
+  %173 = add nsw i32 %172, 1
+  store i32 %173, i32* %13, align 4
+  %174 = load i32*, i32** %5, align 8
+  %175 = load i32, i32* %13, align 4
+  %176 = sext i32 %175 to i64
+  %177 = getelementptr inbounds i32, i32* %174, i64 %176
+  %178 = load i32, i32* %177, align 4
+  store i32 %178, i32* %11, align 4
+  %179 = load i32*, i32** %5, align 8
+  %180 = load i32, i32* %14, align 4
+  %181 = sext i32 %180 to i64
+  %182 = getelementptr inbounds i32, i32* %179, i64 %181
+  %183 = load i32, i32* %182, align 4
+  %184 = load i32*, i32** %5, align 8
+  %185 = load i32, i32* %13, align 4
+  %186 = sext i32 %185 to i64
+  %187 = getelementptr inbounds i32, i32* %184, i64 %186
+  store i32 %183, i32* %187, align 4
+  %188 = load i32, i32* %11, align 4
+  %189 = load i32*, i32** %5, align 8
+  %190 = load i32, i32* %14, align 4
+  %191 = sext i32 %190 to i64
+  %192 = getelementptr inbounds i32, i32* %189, i64 %191
+  store i32 %188, i32* %192, align 4
+  %193 = load i32, i32* @globalCounter, align 4
+  %194 = add nsw i32 %193, 1
+  store i32 %194, i32* @globalCounter, align 4
+  br label %195
+
+195:                                              ; preds = %171, %163
+  br label %196
+
+196:                                              ; preds = %195
+  %197 = load i32, i32* %14, align 4
+  %198 = add nsw i32 %197, 1
+  store i32 %198, i32* %14, align 4
+  br label %159
+
+199:                                              ; preds = %159
+  %200 = load i32*, i32** %5, align 8
+  %201 = load i32, i32* %13, align 4
+  %202 = add nsw i32 %201, 1
+  %203 = sext i32 %202 to i64
+  %204 = getelementptr inbounds i32, i32* %200, i64 %203
+  %205 = load i32, i32* %204, align 4
+  store i32 %205, i32* %11, align 4
+  %206 = load i32*, i32** %5, align 8
+  %207 = load i32, i32* %7, align 4
+  %208 = sext i32 %207 to i64
+  %209 = getelementptr inbounds i32, i32* %206, i64 %208
+  %210 = load i32, i32* %209, align 4
+  %211 = load i32*, i32** %5, align 8
+  %212 = load i32, i32* %13, align 4
+  %213 = add nsw i32 %212, 1
+  %214 = sext i32 %213 to i64
+  %215 = getelementptr inbounds i32, i32* %211, i64 %214
+  store i32 %210, i32* %215, align 4
+  %216 = load i32, i32* %11, align 4
+  %217 = load i32*, i32** %5, align 8
+  %218 = load i32, i32* %7, align 4
+  %219 = sext i32 %218 to i64
+  %220 = getelementptr inbounds i32, i32* %217, i64 %219
+  store i32 %216, i32* %220, align 4
+  %221 = load i32*, i32** %5, align 8
+  %222 = load i32, i32* %6, align 4
+  %223 = load i32, i32* %13, align 4
+  %224 = load i32*, i32** %8, align 8
+  call void @quickSort(i32* %221, i32 %222, i32 %223, i32* %224)
+  %225 = load i32*, i32** %8, align 8
+  %226 = load i32, i32* %225, align 4
+  %227 = icmp ne i32 %226, 0
+  br i1 %227, label %228, label %231
+
+228:                                              ; preds = %199
+  %229 = load i32, i32* @recursionDepth, align 4
+  %230 = add nsw i32 %229, -1
+  store i32 %230, i32* @recursionDepth, align 4
+  br label %247
+
+231:                                              ; preds = %199
+  %232 = load i32*, i32** %5, align 8
+  %233 = load i32, i32* %13, align 4
+  %234 = add nsw i32 %233, 2
+  %235 = load i32, i32* %7, align 4
+  %236 = load i32*, i32** %8, align 8
+  call void @quickSort(i32* %232, i32 %234, i32 %235, i32* %236)
+  %237 = load i32*, i32** %8, align 8
+  %238 = load i32, i32* %237, align 4
+  %239 = icmp ne i32 %238, 0
+  br i1 %239, label %240, label %243
+
+240:                                              ; preds = %231
+  %241 = load i32, i32* @recursionDepth, align 4
+  %242 = add nsw i32 %241, -1
+  store i32 %242, i32* @recursionDepth, align 4
+  br label %247
+
+243:                                              ; preds = %231
+  br label %244
+
+244:                                              ; preds = %243, %45
+  %245 = load i32, i32* @recursionDepth, align 4
+  %246 = add nsw i32 %245, -1
+  store i32 %246, i32* @recursionDepth, align 4
+  br label %247
+
+247:                                              ; preds = %244, %240, %228, %41, %25, %18
+  ret void
+}
+
+; Function Attrs: noinline nounwind optnone uwtable
+define dso_local %struct.Matrix* @createMatrix(i32 %0, i32 %1) #0 {
+  %3 = alloca %struct.Matrix*, align 8
+  %4 = alloca i32, align 4
+  %5 = alloca i32, align 4
+  %6 = alloca %struct.Matrix*, align 8
+  %7 = alloca i32, align 4
+  %8 = alloca i32, align 4
+  store i32 %0, i32* %4, align 4
+  store i32 %1, i32* %5, align 4
+  %9 = load i32, i32* %4, align 4
+  %10 = icmp slt i32 %9, 1
+  br i1 %10, label %14, label %11
+
+11:                                               ; preds = %2
+  %12 = load i32, i32* %5, align 4
+  %13 = icmp slt i32 %12, 1
+  br i1 %13, label %14, label %15
+
+14:                                               ; preds = %11, %2
+  call void @setErrorMessage(i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.str.16, i64 0, i64 0))
+  store %struct.Matrix* null, %struct.Matrix** %3, align 8
+  br label %111
+
+15:                                               ; preds = %11
+  %16 = load i32, i32* %4, align 4
+  %17 = icmp sgt i32 %16, 100
+  br i1 %17, label %21, label %18
+
+18:                                               ; preds = %15
+  %19 = load i32, i32* %5, align 4
+  %20 = icmp sgt i32 %19, 100
+  br i1 %20, label %21, label %22
+
+21:                                               ; preds = %18, %15
+  call void @setErrorMessage(i8* getelementptr inbounds ([46 x i8], [46 x i8]* @.str.17, i64 0, i64 0))
+  store %struct.Matrix* null, %struct.Matrix** %3, align 8
+  br label %111
+
+22:                                               ; preds = %18
+  %23 = call noalias i8* @malloc(i64 32) #7
+  %24 = bitcast i8* %23 to %struct.Matrix*
+  store %struct.Matrix* %24, %struct.Matrix** %6, align 8
+  %25 = load %struct.Matrix*, %struct.Matrix** %6, align 8
+  %26 = icmp ne %struct.Matrix* %25, null
+  br i1 %26, label %28, label %27
+
+27:                                               ; preds = %22
+  call void @setErrorMessage(i8* getelementptr inbounds ([43 x i8], [43 x i8]* @.str.18, i64 0, i64 0))
+  store %struct.Matrix* null, %struct.Matrix** %3, align 8
+  br label %111
+
+28:                                               ; preds = %22
+  %29 = load i32, i32* %4, align 4
+  %30 = load %struct.Matrix*, %struct.Matrix** %6, align 8
+  %31 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %30, i32 0, i32 1
+  store i32 %29, i32* %31, align 8
+  %32 = load i32, i32* %5, align 4
+  %33 = load %struct.Matrix*, %struct.Matrix** %6, align 8
+  %34 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %33, i32 0, i32 2
+  store i32 %32, i32* %34, align 4
+  %35 = load i32, i32* %4, align 4
+  %36 = load i32, i32* %5, align 4
+  %37 = icmp eq i32 %35, %36
+  %38 = zext i1 %37 to i32
+  %39 = load %struct.Matrix*, %struct.Matrix** %6, align 8
+  %40 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %39, i32 0, i32 3
+  store i32 %38, i32* %40, align 8
+  %41 = load %struct.Matrix*, %struct.Matrix** %6, align 8
+  %42 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %41, i32 0, i32 4
+  store double 0.000000e+00, double* %42, align 8
+  %43 = load i32, i32* %4, align 4
+  %44 = sext i32 %43 to i64
+  %45 = mul i64 %44, 8
+  %46 = call noalias i8* @malloc(i64 %45) #7
+  %47 = bitcast i8* %46 to i32**
+  %48 = load %struct.Matrix*, %struct.Matrix** %6, align 8
+  %49 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %48, i32 0, i32 0
+  store i32** %47, i32*** %49, align 8
+  %50 = load %struct.Matrix*, %struct.Matrix** %6, align 8
+  %51 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %50, i32 0, i32 0
+  %52 = load i32**, i32*** %51, align 8
+  %53 = icmp ne i32** %52, null
+  br i1 %53, label %57, label %54
+
+54:                                               ; preds = %28
+  %55 = load %struct.Matrix*, %struct.Matrix** %6, align 8
+  %56 = bitcast %struct.Matrix* %55 to i8*
+  call void @free(i8* %56) #7
+  call void @setErrorMessage(i8* getelementptr inbounds ([41 x i8], [41 x i8]* @.str.19, i64 0, i64 0))
+  store %struct.Matrix* null, %struct.Matrix** %3, align 8
+  br label %111
+
+57:                                               ; preds = %28
+  store i32 0, i32* %7, align 4
+  br label %58
+
+58:                                               ; preds = %106, %57
+  %59 = load i32, i32* %7, align 4
+  %60 = load i32, i32* %4, align 4
+  %61 = icmp slt i32 %59, %60
+  br i1 %61, label %62, label %109
+
+62:                                               ; preds = %58
+  %63 = load i32, i32* %5, align 4
+  %64 = sext i32 %63 to i64
+  %65 = call noalias i8* @calloc(i64 %64, i64 4) #7
+  %66 = bitcast i8* %65 to i32*
+  %67 = load %struct.Matrix*, %struct.Matrix** %6, align 8
+  %68 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %67, i32 0, i32 0
+  %69 = load i32**, i32*** %68, align 8
+  %70 = load i32, i32* %7, align 4
+  %71 = sext i32 %70 to i64
+  %72 = getelementptr inbounds i32*, i32** %69, i64 %71
+  store i32* %66, i32** %72, align 8
+  %73 = load %struct.Matrix*, %struct.Matrix** %6, align 8
+  %74 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %73, i32 0, i32 0
+  %75 = load i32**, i32*** %74, align 8
+  %76 = load i32, i32* %7, align 4
+  %77 = sext i32 %76 to i64
+  %78 = getelementptr inbounds i32*, i32** %75, i64 %77
+  %79 = load i32*, i32** %78, align 8
+  %80 = icmp ne i32* %79, null
+  br i1 %80, label %105, label %81
+
+81:                                               ; preds = %62
+  store i32 0, i32* %8, align 4
+  br label %82
+
+82:                                               ; preds = %95, %81
+  %83 = load i32, i32* %8, align 4
+  %84 = load i32, i32* %7, align 4
+  %85 = icmp slt i32 %83, %84
+  br i1 %85, label %86, label %98
+
+86:                                               ; preds = %82
+  %87 = load %struct.Matrix*, %struct.Matrix** %6, align 8
+  %88 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %87, i32 0, i32 0
+  %89 = load i32**, i32*** %88, align 8
+  %90 = load i32, i32* %8, align 4
+  %91 = sext i32 %90 to i64
+  %92 = getelementptr inbounds i32*, i32** %89, i64 %91
+  %93 = load i32*, i32** %92, align 8
+  %94 = bitcast i32* %93 to i8*
+  call void @free(i8* %94) #7
+  br label %95
+
+95:                                               ; preds = %86
+  %96 = load i32, i32* %8, align 4
+  %97 = add nsw i32 %96, 1
+  store i32 %97, i32* %8, align 4
+  br label %82
+
+98:                                               ; preds = %82
+  %99 = load %struct.Matrix*, %struct.Matrix** %6, align 8
+  %100 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %99, i32 0, i32 0
+  %101 = load i32**, i32*** %100, align 8
+  %102 = bitcast i32** %101 to i8*
+  call void @free(i8* %102) #7
+  %103 = load %struct.Matrix*, %struct.Matrix** %6, align 8
+  %104 = bitcast %struct.Matrix* %103 to i8*
+  call void @free(i8* %104) #7
+  call void @setErrorMessage(i8* getelementptr inbounds ([44 x i8], [44 x i8]* @.str.20, i64 0, i64 0))
+  store %struct.Matrix* null, %struct.Matrix** %3, align 8
+  br label %111
+
+105:                                              ; preds = %62
+  br label %106
+
+106:                                              ; preds = %105
+  %107 = load i32, i32* %7, align 4
+  %108 = add nsw i32 %107, 1
+  store i32 %108, i32* %7, align 4
+  br label %58
+
+109:                                              ; preds = %58
+  %110 = load %struct.Matrix*, %struct.Matrix** %6, align 8
+  store %struct.Matrix* %110, %struct.Matrix** %3, align 8
+  br label %111
+
+111:                                              ; preds = %109, %98, %54, %27, %21, %14
+  %112 = load %struct.Matrix*, %struct.Matrix** %3, align 8
+  ret %struct.Matrix* %112
+}
+
+; Function Attrs: nounwind
+declare dso_local noalias i8* @calloc(i64, i64) #1
+
+; Function Attrs: noinline nounwind optnone uwtable
+define dso_local %struct.Matrix* @multiplyMatrices(%struct.Matrix* %0, %struct.Matrix* %1) #0 {
+  %3 = alloca %struct.Matrix*, align 8
+  %4 = alloca %struct.Matrix*, align 8
+  %5 = alloca %struct.Matrix*, align 8
+  %6 = alloca %struct.Matrix*, align 8
+  %7 = alloca i64, align 8
+  %8 = alloca i32, align 4
+  %9 = alloca i32, align 4
+  %10 = alloca i64, align 8
+  %11 = alloca i32, align 4
+  %12 = alloca i64, align 8
+  %13 = alloca i32, align 4
+  store %struct.Matrix* %0, %struct.Matrix** %4, align 8
+  store %struct.Matrix* %1, %struct.Matrix** %5, align 8
+  %14 = load %struct.Matrix*, %struct.Matrix** %4, align 8
+  %15 = icmp ne %struct.Matrix* %14, null
+  br i1 %15, label %16, label %19
+
+16:                                               ; preds = %2
+  %17 = load %struct.Matrix*, %struct.Matrix** %5, align 8
+  %18 = icmp ne %struct.Matrix* %17, null
+  br i1 %18, label %20, label %19
+
+19:                                               ; preds = %16, %2
+  call void @setErrorMessage(i8* getelementptr inbounds ([20 x i8], [20 x i8]* @.str.21, i64 0, i64 0))
+  store %struct.Matrix* null, %struct.Matrix** %3, align 8
+  br label %209
+
+20:                                               ; preds = %16
+  %21 = load %struct.Matrix*, %struct.Matrix** %4, align 8
+  %22 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %21, i32 0, i32 0
+  %23 = load i32**, i32*** %22, align 8
+  %24 = icmp ne i32** %23, null
+  br i1 %24, label %25, label %30
+
+25:                                               ; preds = %20
+  %26 = load %struct.Matrix*, %struct.Matrix** %5, align 8
+  %27 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %26, i32 0, i32 0
+  %28 = load i32**, i32*** %27, align 8
+  %29 = icmp ne i32** %28, null
+  br i1 %29, label %31, label %30
+
+30:                                               ; preds = %25, %20
+  call void @setErrorMessage(i8* getelementptr inbounds ([20 x i8], [20 x i8]* @.str.22, i64 0, i64 0))
+  store %struct.Matrix* null, %struct.Matrix** %3, align 8
+  br label %209
+
+31:                                               ; preds = %25
+  %32 = load %struct.Matrix*, %struct.Matrix** %4, align 8
+  %33 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %32, i32 0, i32 2
+  %34 = load i32, i32* %33, align 4
+  %35 = load %struct.Matrix*, %struct.Matrix** %5, align 8
+  %36 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %35, i32 0, i32 1
+  %37 = load i32, i32* %36, align 8
+  %38 = icmp ne i32 %34, %37
+  br i1 %38, label %39, label %40
+
+39:                                               ; preds = %31
+  call void @setErrorMessage(i8* getelementptr inbounds ([45 x i8], [45 x i8]* @.str.23, i64 0, i64 0))
+  store %struct.Matrix* null, %struct.Matrix** %3, align 8
+  br label %209
+
+40:                                               ; preds = %31
+  %41 = load %struct.Matrix*, %struct.Matrix** %4, align 8
+  %42 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %41, i32 0, i32 2
+  %43 = load i32, i32* %42, align 4
+  %44 = icmp sgt i32 %43, 100
+  br i1 %44, label %50, label %45
+
+45:                                               ; preds = %40
+  %46 = load %struct.Matrix*, %struct.Matrix** %5, align 8
+  %47 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %46, i32 0, i32 1
+  %48 = load i32, i32* %47, align 8
+  %49 = icmp sgt i32 %48, 100
+  br i1 %49, label %50, label %51
+
+50:                                               ; preds = %45, %40
+  call void @setErrorMessage(i8* getelementptr inbounds ([46 x i8], [46 x i8]* @.str.17, i64 0, i64 0))
+  store %struct.Matrix* null, %struct.Matrix** %3, align 8
+  br label %209
+
+51:                                               ; preds = %45
+  %52 = load %struct.Matrix*, %struct.Matrix** %4, align 8
+  %53 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %52, i32 0, i32 1
+  %54 = load i32, i32* %53, align 8
+  %55 = load %struct.Matrix*, %struct.Matrix** %5, align 8
+  %56 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %55, i32 0, i32 2
+  %57 = load i32, i32* %56, align 4
+  %58 = call %struct.Matrix* @createMatrix(i32 %54, i32 %57)
+  store %struct.Matrix* %58, %struct.Matrix** %6, align 8
+  %59 = load %struct.Matrix*, %struct.Matrix** %6, align 8
+  %60 = icmp ne %struct.Matrix* %59, null
+  br i1 %60, label %62, label %61
+
+61:                                               ; preds = %51
+  store %struct.Matrix* null, %struct.Matrix** %3, align 8
+  br label %209
+
+62:                                               ; preds = %51
+  store i64 0, i64* %7, align 8
+  store i32 0, i32* %8, align 4
+  br label %63
+
+63:                                               ; preds = %194, %62
+  %64 = load i32, i32* %8, align 4
+  %65 = load %struct.Matrix*, %struct.Matrix** %4, align 8
+  %66 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %65, i32 0, i32 1
+  %67 = load i32, i32* %66, align 8
+  %68 = icmp slt i32 %64, %67
+  br i1 %68, label %69, label %197
+
+69:                                               ; preds = %63
+  store i32 0, i32* %9, align 4
+  br label %70
+
+70:                                               ; preds = %190, %69
+  %71 = load i32, i32* %9, align 4
+  %72 = load %struct.Matrix*, %struct.Matrix** %5, align 8
+  %73 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %72, i32 0, i32 2
+  %74 = load i32, i32* %73, align 4
+  %75 = icmp slt i32 %71, %74
+  br i1 %75, label %76, label %193
+
+76:                                               ; preds = %70
+  store i64 0, i64* %10, align 8
+  store i32 0, i32* %11, align 4
+  br label %77
+
+77:                                               ; preds = %144, %76
+  %78 = load i32, i32* %11, align 4
+  %79 = load %struct.Matrix*, %struct.Matrix** %4, align 8
+  %80 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %79, i32 0, i32 2
+  %81 = load i32, i32* %80, align 4
+  %82 = icmp slt i32 %78, %81
+  br i1 %82, label %83, label %147
+
+83:                                               ; preds = %77
+  %84 = load %struct.Matrix*, %struct.Matrix** %4, align 8
+  %85 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %84, i32 0, i32 0
+  %86 = load i32**, i32*** %85, align 8
+  %87 = load i32, i32* %8, align 4
+  %88 = sext i32 %87 to i64
+  %89 = getelementptr inbounds i32*, i32** %86, i64 %88
+  %90 = load i32*, i32** %89, align 8
+  %91 = load i32, i32* %11, align 4
+  %92 = sext i32 %91 to i64
+  %93 = getelementptr inbounds i32, i32* %90, i64 %92
+  %94 = load i32, i32* %93, align 4
+  %95 = sext i32 %94 to i64
+  %96 = load %struct.Matrix*, %struct.Matrix** %5, align 8
+  %97 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %96, i32 0, i32 0
+  %98 = load i32**, i32*** %97, align 8
+  %99 = load i32, i32* %11, align 4
+  %100 = sext i32 %99 to i64
+  %101 = getelementptr inbounds i32*, i32** %98, i64 %100
+  %102 = load i32*, i32** %101, align 8
+  %103 = load i32, i32* %9, align 4
+  %104 = sext i32 %103 to i64
+  %105 = getelementptr inbounds i32, i32* %102, i64 %104
+  %106 = load i32, i32* %105, align 4
+  %107 = sext i32 %106 to i64
+  %108 = mul nsw i64 %95, %107
+  store i64 %108, i64* %12, align 8
+  %109 = load i64, i64* %12, align 8
+  %110 = load i64, i64* %10, align 8
+  %111 = add nsw i64 %110, %109
+  store i64 %111, i64* %10, align 8
+  %112 = load i64, i64* %10, align 8
+  %113 = icmp sgt i64 %112, 2147483647
+  br i1 %113, label %117, label %114
+
+114:                                              ; preds = %83
+  %115 = load i64, i64* %10, align 8
+  %116 = icmp slt i64 %115, -2147483648
+  br i1 %116, label %117, label %143
+
+117:                                              ; preds = %114, %83
+  call void @setErrorMessage(i8* getelementptr inbounds ([42 x i8], [42 x i8]* @.str.24, i64 0, i64 0))
+  store i32 0, i32* %13, align 4
+  br label %118
+
+118:                                              ; preds = %133, %117
+  %119 = load i32, i32* %13, align 4
+  %120 = load %struct.Matrix*, %struct.Matrix** %6, align 8
+  %121 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %120, i32 0, i32 1
+  %122 = load i32, i32* %121, align 8
+  %123 = icmp slt i32 %119, %122
+  br i1 %123, label %124, label %136
+
+124:                                              ; preds = %118
+  %125 = load %struct.Matrix*, %struct.Matrix** %6, align 8
+  %126 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %125, i32 0, i32 0
+  %127 = load i32**, i32*** %126, align 8
+  %128 = load i32, i32* %13, align 4
+  %129 = sext i32 %128 to i64
+  %130 = getelementptr inbounds i32*, i32** %127, i64 %129
+  %131 = load i32*, i32** %130, align 8
+  %132 = bitcast i32* %131 to i8*
+  call void @free(i8* %132) #7
+  br label %133
+
+133:                                              ; preds = %124
+  %134 = load i32, i32* %13, align 4
+  %135 = add nsw i32 %134, 1
+  store i32 %135, i32* %13, align 4
+  br label %118
+
+136:                                              ; preds = %118
+  %137 = load %struct.Matrix*, %struct.Matrix** %6, align 8
+  %138 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %137, i32 0, i32 0
+  %139 = load i32**, i32*** %138, align 8
+  %140 = bitcast i32** %139 to i8*
+  call void @free(i8* %140) #7
+  %141 = load %struct.Matrix*, %struct.Matrix** %6, align 8
+  %142 = bitcast %struct.Matrix* %141 to i8*
+  call void @free(i8* %142) #7
+  store %struct.Matrix* null, %struct.Matrix** %3, align 8
+  br label %209
+
+143:                                              ; preds = %114
+  br label %144
+
+144:                                              ; preds = %143
+  %145 = load i32, i32* %11, align 4
+  %146 = add nsw i32 %145, 1
+  store i32 %146, i32* %11, align 4
+  br label %77
+
+147:                                              ; preds = %77
+  %148 = load i64, i64* %10, align 8
+  %149 = trunc i64 %148 to i32
+  %150 = load %struct.Matrix*, %struct.Matrix** %6, align 8
+  %151 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %150, i32 0, i32 0
+  %152 = load i32**, i32*** %151, align 8
+  %153 = load i32, i32* %8, align 4
+  %154 = sext i32 %153 to i64
+  %155 = getelementptr inbounds i32*, i32** %152, i64 %154
+  %156 = load i32*, i32** %155, align 8
+  %157 = load i32, i32* %9, align 4
+  %158 = sext i32 %157 to i64
+  %159 = getelementptr inbounds i32, i32* %156, i64 %158
+  store i32 %149, i32* %159, align 4
+  %160 = load %struct.Matrix*, %struct.Matrix** %6, align 8
+  %161 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %160, i32 0, i32 0
+  %162 = load i32**, i32*** %161, align 8
+  %163 = load i32, i32* %8, align 4
+  %164 = sext i32 %163 to i64
+  %165 = getelementptr inbounds i32*, i32** %162, i64 %164
+  %166 = load i32*, i32** %165, align 8
+  %167 = load i32, i32* %9, align 4
+  %168 = sext i32 %167 to i64
+  %169 = getelementptr inbounds i32, i32* %166, i64 %168
+  %170 = load i32, i32* %169, align 4
+  %171 = call i32 @abs(i32 %170) #8
+  %172 = sext i32 %171 to i64
+  %173 = load i64, i64* %7, align 8
+  %174 = icmp sgt i64 %172, %173
+  br i1 %174, label %175, label %189
+
+175:                                              ; preds = %147
+  %176 = load %struct.Matrix*, %struct.Matrix** %6, align 8
+  %177 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %176, i32 0, i32 0
+  %178 = load i32**, i32*** %177, align 8
+  %179 = load i32, i32* %8, align 4
+  %180 = sext i32 %179 to i64
+  %181 = getelementptr inbounds i32*, i32** %178, i64 %180
+  %182 = load i32*, i32** %181, align 8
+  %183 = load i32, i32* %9, align 4
+  %184 = sext i32 %183 to i64
+  %185 = getelementptr inbounds i32, i32* %182, i64 %184
+  %186 = load i32, i32* %185, align 4
+  %187 = call i32 @abs(i32 %186) #8
+  %188 = sext i32 %187 to i64
+  store i64 %188, i64* %7, align 8
+  br label %189
+
+189:                                              ; preds = %175, %147
+  br label %190
+
+190:                                              ; preds = %189
+  %191 = load i32, i32* %9, align 4
+  %192 = add nsw i32 %191, 1
+  store i32 %192, i32* %9, align 4
+  br label %70
+
+193:                                              ; preds = %70
+  br label %194
+
+194:                                              ; preds = %193
+  %195 = load i32, i32* %8, align 4
+  %196 = add nsw i32 %195, 1
+  store i32 %196, i32* %8, align 4
+  br label %63
+
+197:                                              ; preds = %63
+  %198 = load %struct.Matrix*, %struct.Matrix** %6, align 8
+  %199 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %198, i32 0, i32 1
+  %200 = load i32, i32* %199, align 8
+  %201 = load %struct.Matrix*, %struct.Matrix** %6, align 8
+  %202 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %201, i32 0, i32 2
+  %203 = load i32, i32* %202, align 4
+  %204 = icmp eq i32 %200, %203
+  %205 = zext i1 %204 to i32
+  %206 = load %struct.Matrix*, %struct.Matrix** %6, align 8
+  %207 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %206, i32 0, i32 3
+  store i32 %205, i32* %207, align 8
+  %208 = load %struct.Matrix*, %struct.Matrix** %6, align 8
+  store %struct.Matrix* %208, %struct.Matrix** %3, align 8
+  br label %209
+
+209:                                              ; preds = %197, %136, %61, %50, %39, %30, %19
+  %210 = load %struct.Matrix*, %struct.Matrix** %3, align 8
+  ret %struct.Matrix* %210
+}
+
+; Function Attrs: nounwind readnone
+declare dso_local i32 @abs(i32) #3
+
+; Function Attrs: noinline nounwind optnone uwtable
+define dso_local %struct.Node* @insertNode(%struct.Node* %0, i32 %1) #0 {
+  %3 = alloca %struct.Node*, align 8
+  %4 = alloca %struct.Node*, align 8
+  %5 = alloca i32, align 4
+  %6 = alloca %struct.Node*, align 8
+  %7 = alloca %struct.Node*, align 8
+  %8 = alloca %struct.Node*, align 8
+  %9 = alloca i32, align 4
+  store %struct.Node* %0, %struct.Node** %4, align 8
+  store i32 %1, i32* %5, align 4
+  %10 = call noalias i8* @malloc(i64 32) #7
+  %11 = bitcast i8* %10 to %struct.Node*
+  store %struct.Node* %11, %struct.Node** %6, align 8
+  %12 = load %struct.Node*, %struct.Node** %6, align 8
+  %13 = icmp ne %struct.Node* %12, null
+  br i1 %13, label %16, label %14
+
+14:                                               ; preds = %2
+  call void @setErrorMessage(i8* getelementptr inbounds ([38 x i8], [38 x i8]* @.str.25, i64 0, i64 0))
+  %15 = load %struct.Node*, %struct.Node** %4, align 8
+  store %struct.Node* %15, %struct.Node** %3, align 8
+  br label %92
+
+16:                                               ; preds = %2
+  %17 = load i32, i32* %5, align 4
+  %18 = load %struct.Node*, %struct.Node** %6, align 8
+  %19 = getelementptr inbounds %struct.Node, %struct.Node* %18, i32 0, i32 0
+  store i32 %17, i32* %19, align 8
+  %20 = load %struct.Node*, %struct.Node** %6, align 8
+  %21 = getelementptr inbounds %struct.Node, %struct.Node* %20, i32 0, i32 1
+  store %struct.Node* null, %struct.Node** %21, align 8
+  %22 = load %struct.Node*, %struct.Node** %6, align 8
+  %23 = getelementptr inbounds %struct.Node, %struct.Node* %22, i32 0, i32 2
+  store %struct.Node* null, %struct.Node** %23, align 8
+  %24 = load %struct.Node*, %struct.Node** %6, align 8
+  %25 = getelementptr inbounds %struct.Node, %struct.Node* %24, i32 0, i32 3
+  store i32 0, i32* %25, align 8
+  %26 = load %struct.Node*, %struct.Node** %4, align 8
+  %27 = icmp ne %struct.Node* %26, null
+  br i1 %27, label %32, label %28
+
+28:                                               ; preds = %16
+  %29 = load %struct.Node*, %struct.Node** %6, align 8
+  %30 = getelementptr inbounds %struct.Node, %struct.Node* %29, i32 0, i32 4
+  store i32 0, i32* %30, align 4
+  store i32 0, i32* @insertNode.maxDepth, align 4
+  %31 = load %struct.Node*, %struct.Node** %6, align 8
+  store %struct.Node* %31, %struct.Node** %3, align 8
+  br label %92
+
+32:                                               ; preds = %16
+  %33 = load %struct.Node*, %struct.Node** %4, align 8
+  store %struct.Node* %33, %struct.Node** %7, align 8
+  store %struct.Node* null, %struct.Node** %8, align 8
+  store i32 0, i32* %9, align 4
+  br label %34
+
+34:                                               ; preds = %58, %32
+  %35 = load %struct.Node*, %struct.Node** %7, align 8
+  %36 = icmp ne %struct.Node* %35, null
+  br i1 %36, label %37, label %43
+
+37:                                               ; preds = %34
+  %38 = load %struct.Node*, %struct.Node** %7, align 8
+  %39 = getelementptr inbounds %struct.Node, %struct.Node* %38, i32 0, i32 0
+  %40 = load i32, i32* %39, align 8
+  %41 = load i32, i32* %5, align 4
+  %42 = icmp slt i32 %40, %41
+  br label %43
+
+43:                                               ; preds = %37, %34
+  %44 = phi i1 [ false, %34 ], [ %42, %37 ]
+  br i1 %44, label %45, label %59
+
+45:                                               ; preds = %43
+  %46 = load %struct.Node*, %struct.Node** %7, align 8
+  store %struct.Node* %46, %struct.Node** %8, align 8
+  %47 = load %struct.Node*, %struct.Node** %7, align 8
+  %48 = getelementptr inbounds %struct.Node, %struct.Node* %47, i32 0, i32 1
+  %49 = load %struct.Node*, %struct.Node** %48, align 8
+  store %struct.Node* %49, %struct.Node** %7, align 8
+  %50 = load i32, i32* %9, align 4
+  %51 = add nsw i32 %50, 1
+  store i32 %51, i32* %9, align 4
+  %52 = load i32, i32* %9, align 4
+  %53 = icmp sgt i32 %52, 1000
+  br i1 %53, label %54, label %58
+
+54:                                               ; preds = %45
+  call void @setErrorMessage(i8* getelementptr inbounds ([34 x i8], [34 x i8]* @.str.26, i64 0, i64 0))
+  %55 = load %struct.Node*, %struct.Node** %6, align 8
+  %56 = bitcast %struct.Node* %55 to i8*
+  call void @free(i8* %56) #7
+  %57 = load %struct.Node*, %struct.Node** %4, align 8
+  store %struct.Node* %57, %struct.Node** %3, align 8
+  br label %92
+
+58:                                               ; preds = %45
+  br label %34
+
+59:                                               ; preds = %43
+  %60 = load i32, i32* %9, align 4
+  %61 = load i32, i32* @insertNode.maxDepth, align 4
+  %62 = icmp sgt i32 %60, %61
+  br i1 %62, label %63, label %65
+
+63:                                               ; preds = %59
+  %64 = load i32, i32* %9, align 4
+  store i32 %64, i32* @insertNode.maxDepth, align 4
+  br label %65
+
+65:                                               ; preds = %63, %59
+  %66 = load i32, i32* %9, align 4
+  %67 = load %struct.Node*, %struct.Node** %6, align 8
+  %68 = getelementptr inbounds %struct.Node, %struct.Node* %67, i32 0, i32 4
+  store i32 %66, i32* %68, align 4
+  %69 = load %struct.Node*, %struct.Node** %7, align 8
+  %70 = load %struct.Node*, %struct.Node** %6, align 8
+  %71 = getelementptr inbounds %struct.Node, %struct.Node* %70, i32 0, i32 1
+  store %struct.Node* %69, %struct.Node** %71, align 8
+  %72 = load %struct.Node*, %struct.Node** %8, align 8
+  %73 = icmp ne %struct.Node* %72, null
+  br i1 %73, label %74, label %81
+
+74:                                               ; preds = %65
+  %75 = load %struct.Node*, %struct.Node** %6, align 8
+  %76 = load %struct.Node*, %struct.Node** %8, align 8
+  %77 = getelementptr inbounds %struct.Node, %struct.Node* %76, i32 0, i32 1
+  store %struct.Node* %75, %struct.Node** %77, align 8
+  %78 = load %struct.Node*, %struct.Node** %8, align 8
+  %79 = load %struct.Node*, %struct.Node** %6, align 8
+  %80 = getelementptr inbounds %struct.Node, %struct.Node* %79, i32 0, i32 2
+  store %struct.Node* %78, %struct.Node** %80, align 8
+  br label %83
+
+81:                                               ; preds = %65
+  %82 = load %struct.Node*, %struct.Node** %6, align 8
+  store %struct.Node* %82, %struct.Node** %3, align 8
+  br label %92
+
+83:                                               ; preds = %74
+  %84 = load %struct.Node*, %struct.Node** %7, align 8
+  %85 = icmp ne %struct.Node* %84, null
+  br i1 %85, label %86, label %90
+
+86:                                               ; preds = %83
+  %87 = load %struct.Node*, %struct.Node** %6, align 8
+  %88 = load %struct.Node*, %struct.Node** %7, align 8
+  %89 = getelementptr inbounds %struct.Node, %struct.Node* %88, i32 0, i32 2
+  store %struct.Node* %87, %struct.Node** %89, align 8
+  br label %90
+
+90:                                               ; preds = %86, %83
+  %91 = load %struct.Node*, %struct.Node** %4, align 8
+  store %struct.Node* %91, %struct.Node** %3, align 8
+  br label %92
+
+92:                                               ; preds = %90, %81, %54, %28, %14
+  %93 = load %struct.Node*, %struct.Node** %3, align 8
+  ret %struct.Node* %93
+}
+
+; Function Attrs: noinline nounwind optnone uwtable
+define dso_local void @performSimpleCalculations() #0 {
+  %1 = alloca i32, align 4
+  store i32 100, i32* %1, align 4
+  %2 = load i32, i32* %1, align 4
+  %3 = icmp sgt i32 %2, 50
+  br i1 %3, label %4, label %9
+
+4:                                                ; preds = %0
+  %5 = load i32, i32* %1, align 4
+  %6 = mul nsw i32 %5, 2
+  %7 = load i32, i32* @calculationResult, align 4
+  %8 = add nsw i32 %7, %6
+  store i32 %8, i32* @calculationResult, align 4
+  br label %14
+
+9:                                                ; preds = %0
+  %10 = load i32, i32* %1, align 4
+  %11 = sdiv i32 %10, 2
+  %12 = load i32, i32* @calculationResult, align 4
+  %13 = add nsw i32 %12, %11
+  store i32 %13, i32* @calculationResult, align 4
+  br label %14
+
+14:                                               ; preds = %9, %4
+  %15 = load i32, i32* %1, align 4
+  %16 = srem i32 %15, 3
+  %17 = icmp eq i32 %16, 0
+  br i1 %17, label %18, label %21
+
+18:                                               ; preds = %14
+  %19 = load i32, i32* @calculationResult, align 4
+  %20 = mul nsw i32 %19, 3
+  store i32 %20, i32* @calculationResult, align 4
+  br label %24
+
+21:                                               ; preds = %14
+  %22 = load i32, i32* @calculationResult, align 4
+  %23 = add nsw i32 %22, 3
+  store i32 %23, i32* @calculationResult, align 4
+  br label %24
+
+24:                                               ; preds = %21, %18
+  %25 = load i32, i32* @calculationResult, align 4
+  %26 = icmp sge i32 %25, 150
+  br i1 %26, label %27, label %33
+
+27:                                               ; preds = %24
+  %28 = load i32, i32* @calculationResult, align 4
+  %29 = icmp sle i32 %28, 300
+  br i1 %29, label %30, label %33
+
+30:                                               ; preds = %27
+  %31 = load i32, i32* @calculationResult, align 4
+  %32 = sub nsw i32 %31, 50
+  store i32 %32, i32* @calculationResult, align 4
+  br label %36
+
+33:                                               ; preds = %27, %24
+  %34 = load i32, i32* @calculationResult, align 4
+  %35 = add nsw i32 %34, 50
+  store i32 %35, i32* @calculationResult, align 4
+  br label %36
+
+36:                                               ; preds = %33, %30
+  %37 = load i32, i32* @calculationResult, align 4
+  %38 = srem i32 %37, 2
+  %39 = icmp eq i32 %38, 0
+  br i1 %39, label %40, label %43
+
+40:                                               ; preds = %36
+  %41 = load i32, i32* @calculationResult, align 4
+  %42 = sdiv i32 %41, 2
+  store i32 %42, i32* @calculationResult, align 4
+  br label %46
+
+43:                                               ; preds = %36
+  %44 = load i32, i32* @calculationResult, align 4
+  %45 = mul nsw i32 %44, 2
+  store i32 %45, i32* @calculationResult, align 4
+  br label %46
+
+46:                                               ; preds = %43, %40
+  %47 = load i32, i32* @calculationResult, align 4
+  %48 = srem i32 %47, 10
+  %49 = icmp slt i32 %48, 5
+  br i1 %49, label %50, label %53
+
+50:                                               ; preds = %46
+  %51 = load i32, i32* @calculationResult, align 4
+  %52 = add nsw i32 %51, 5
+  store i32 %52, i32* @calculationResult, align 4
+  br label %56
+
+53:                                               ; preds = %46
+  %54 = load i32, i32* @calculationResult, align 4
+  %55 = sub nsw i32 %54, 5
+  store i32 %55, i32* @calculationResult, align 4
+  br label %56
+
+56:                                               ; preds = %53, %50
+  %57 = load i32, i32* @calculationResult, align 4
+  %58 = icmp sgt i32 %57, 1000
+  br i1 %58, label %59, label %60
+
+59:                                               ; preds = %56
+  store i32 1000, i32* @calculationResult, align 4
+  br label %63
+
+60:                                               ; preds = %56
+  %61 = load i32, i32* @calculationResult, align 4
+  %62 = add nsw i32 %61, 10
+  store i32 %62, i32* @calculationResult, align 4
+  br label %63
+
+63:                                               ; preds = %60, %59
+  %64 = load i32, i32* @calculationResult, align 4
+  %65 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([30 x i8], [30 x i8]* @.str.27, i64 0, i64 0), i32 %64)
+  ret void
+}
+
+declare dso_local i32 @printf(i8*, ...) #2
+
+; Function Attrs: noinline nounwind optnone uwtable
+define dso_local i32 @projectA_main() #0 {
+  %1 = alloca i32, align 4
+  %2 = alloca %struct.DynamicArray*, align 8
+  %3 = alloca i32, align 4
+  %4 = alloca %struct.Matrix*, align 8
+  %5 = alloca %struct.Matrix*, align 8
+  %6 = alloca i32, align 4
+  %7 = alloca i32, align 4
+  %8 = alloca %struct.Matrix*, align 8
+  %9 = alloca i32, align 4
+  %10 = alloca %struct.Node*, align 8
+  %11 = alloca i32, align 4
+  %12 = alloca i32, align 4
+  %13 = alloca %struct.Node*, align 8
+  %14 = alloca %struct.Node*, align 8
+  %15 = alloca i32, align 4
+  %16 = alloca %struct.Node*, align 8
+  %17 = alloca i32, align 4
+  %18 = alloca i32, align 4
+  %19 = alloca %struct.Node*, align 8
+  %20 = call i64 @time(i64* null) #7
+  %21 = trunc i64 %20 to i32
+  call void @srand(i32 %21) #7
+  %22 = call %struct.DynamicArray* @createDynamicArray(i32 10)
+  store %struct.DynamicArray* %22, %struct.DynamicArray** %2, align 8
+  %23 = load %struct.DynamicArray*, %struct.DynamicArray** %2, align 8
+  %24 = icmp ne %struct.DynamicArray* %23, null
+  br i1 %24, label %28, label %25
+
+25:                                               ; preds = %0
+  %26 = call i8* @getErrorMessage()
+  %27 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.28, i64 0, i64 0), i8* %26)
+  store i32 -1, i32* %1, align 4
+  br label %322
+
+28:                                               ; preds = %0
+  store i32 0, i32* %3, align 4
+  br label %29
+
+29:                                               ; preds = %42, %28
+  %30 = load i32, i32* %3, align 4
+  %31 = icmp slt i32 %30, 15
+  br i1 %31, label %32, label %45
+
+32:                                               ; preds = %29
+  %33 = load %struct.DynamicArray*, %struct.DynamicArray** %2, align 8
+  %34 = call i32 @rand() #7
+  %35 = srem i32 %34, 100
+  call void @pushBack(%struct.DynamicArray* %33, i32 %35)
+  %36 = load i8*, i8** @globalErrorMessage, align 8
+  %37 = icmp ne i8* %36, null
+  br i1 %37, label %38, label %41
+
+38:                                               ; preds = %32
+  %39 = call i8* @getErrorMessage()
+  %40 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([29 x i8], [29 x i8]* @.str.29, i64 0, i64 0), i8* %39)
+  br label %45
+
+41:                                               ; preds = %32
+  br label %42
+
+42:                                               ; preds = %41
+  %43 = load i32, i32* %3, align 4
+  %44 = add nsw i32 %43, 1
+  store i32 %44, i32* %3, align 4
+  br label %29
+
+45:                                               ; preds = %38, %29
+  %46 = call %struct.Matrix* @createMatrix(i32 3, i32 3)
+  store %struct.Matrix* %46, %struct.Matrix** %4, align 8
+  %47 = call %struct.Matrix* @createMatrix(i32 3, i32 3)
+  store %struct.Matrix* %47, %struct.Matrix** %5, align 8
+  %48 = load %struct.Matrix*, %struct.Matrix** %4, align 8
+  %49 = icmp ne %struct.Matrix* %48, null
+  br i1 %49, label %50, label %53
+
+50:                                               ; preds = %45
+  %51 = load %struct.Matrix*, %struct.Matrix** %5, align 8
+  %52 = icmp ne %struct.Matrix* %51, null
+  br i1 %52, label %74, label %53
+
+53:                                               ; preds = %50, %45
+  %54 = call i8* @getErrorMessage()
+  %55 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.28, i64 0, i64 0), i8* %54)
+  %56 = load %struct.Matrix*, %struct.Matrix** %4, align 8
+  %57 = icmp ne %struct.Matrix* %56, null
+  br i1 %57, label %58, label %61
+
+58:                                               ; preds = %53
+  %59 = load %struct.Matrix*, %struct.Matrix** %4, align 8
+  %60 = bitcast %struct.Matrix* %59 to i8*
+  call void @free(i8* %60) #7
+  br label %61
+
+61:                                               ; preds = %58, %53
+  %62 = load %struct.Matrix*, %struct.Matrix** %5, align 8
+  %63 = icmp ne %struct.Matrix* %62, null
+  br i1 %63, label %64, label %67
+
+64:                                               ; preds = %61
+  %65 = load %struct.Matrix*, %struct.Matrix** %5, align 8
+  %66 = bitcast %struct.Matrix* %65 to i8*
+  call void @free(i8* %66) #7
+  br label %67
+
+67:                                               ; preds = %64, %61
+  %68 = load %struct.DynamicArray*, %struct.DynamicArray** %2, align 8
+  %69 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %68, i32 0, i32 0
+  %70 = load i32*, i32** %69, align 8
+  %71 = bitcast i32* %70 to i8*
+  call void @free(i8* %71) #7
+  %72 = load %struct.DynamicArray*, %struct.DynamicArray** %2, align 8
+  %73 = bitcast %struct.DynamicArray* %72 to i8*
+  call void @free(i8* %73) #7
+  store i32 -1, i32* %1, align 4
+  br label %322
+
+74:                                               ; preds = %50
+  store i32 0, i32* %6, align 4
+  br label %75
+
+75:                                               ; preds = %111, %74
+  %76 = load i32, i32* %6, align 4
+  %77 = icmp slt i32 %76, 3
+  br i1 %77, label %78, label %114
+
+78:                                               ; preds = %75
+  store i32 0, i32* %7, align 4
+  br label %79
+
+79:                                               ; preds = %107, %78
+  %80 = load i32, i32* %7, align 4
+  %81 = icmp slt i32 %80, 3
+  br i1 %81, label %82, label %110
+
+82:                                               ; preds = %79
+  %83 = call i32 @rand() #7
+  %84 = srem i32 %83, 10
+  %85 = load %struct.Matrix*, %struct.Matrix** %4, align 8
+  %86 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %85, i32 0, i32 0
+  %87 = load i32**, i32*** %86, align 8
+  %88 = load i32, i32* %6, align 4
+  %89 = sext i32 %88 to i64
+  %90 = getelementptr inbounds i32*, i32** %87, i64 %89
+  %91 = load i32*, i32** %90, align 8
+  %92 = load i32, i32* %7, align 4
+  %93 = sext i32 %92 to i64
+  %94 = getelementptr inbounds i32, i32* %91, i64 %93
+  store i32 %84, i32* %94, align 4
+  %95 = call i32 @rand() #7
+  %96 = srem i32 %95, 10
+  %97 = load %struct.Matrix*, %struct.Matrix** %5, align 8
+  %98 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %97, i32 0, i32 0
+  %99 = load i32**, i32*** %98, align 8
+  %100 = load i32, i32* %6, align 4
+  %101 = sext i32 %100 to i64
+  %102 = getelementptr inbounds i32*, i32** %99, i64 %101
+  %103 = load i32*, i32** %102, align 8
+  %104 = load i32, i32* %7, align 4
+  %105 = sext i32 %104 to i64
+  %106 = getelementptr inbounds i32, i32* %103, i64 %105
+  store i32 %96, i32* %106, align 4
+  br label %107
+
+107:                                              ; preds = %82
+  %108 = load i32, i32* %7, align 4
+  %109 = add nsw i32 %108, 1
+  store i32 %109, i32* %7, align 4
+  br label %79
+
+110:                                              ; preds = %79
+  br label %111
+
+111:                                              ; preds = %110
+  %112 = load i32, i32* %6, align 4
+  %113 = add nsw i32 %112, 1
+  store i32 %113, i32* %6, align 4
+  br label %75
+
+114:                                              ; preds = %75
+  %115 = load %struct.Matrix*, %struct.Matrix** %4, align 8
+  %116 = load %struct.Matrix*, %struct.Matrix** %5, align 8
+  %117 = call %struct.Matrix* @multiplyMatrices(%struct.Matrix* %115, %struct.Matrix* %116)
+  store %struct.Matrix* %117, %struct.Matrix** %8, align 8
+  %118 = load %struct.Matrix*, %struct.Matrix** %8, align 8
+  %119 = icmp ne %struct.Matrix* %118, null
+  br i1 %119, label %168, label %120
+
+120:                                              ; preds = %114
+  %121 = call i8* @getErrorMessage()
+  %122 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.28, i64 0, i64 0), i8* %121)
+  store i32 0, i32* %9, align 4
+  br label %123
+
+123:                                              ; preds = %146, %120
+  %124 = load i32, i32* %9, align 4
+  %125 = load %struct.Matrix*, %struct.Matrix** %4, align 8
+  %126 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %125, i32 0, i32 1
+  %127 = load i32, i32* %126, align 8
+  %128 = icmp slt i32 %124, %127
+  br i1 %128, label %129, label %149
+
+129:                                              ; preds = %123
+  %130 = load %struct.Matrix*, %struct.Matrix** %4, align 8
+  %131 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %130, i32 0, i32 0
+  %132 = load i32**, i32*** %131, align 8
+  %133 = load i32, i32* %9, align 4
+  %134 = sext i32 %133 to i64
+  %135 = getelementptr inbounds i32*, i32** %132, i64 %134
+  %136 = load i32*, i32** %135, align 8
+  %137 = bitcast i32* %136 to i8*
+  call void @free(i8* %137) #7
+  %138 = load %struct.Matrix*, %struct.Matrix** %5, align 8
+  %139 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %138, i32 0, i32 0
+  %140 = load i32**, i32*** %139, align 8
+  %141 = load i32, i32* %9, align 4
+  %142 = sext i32 %141 to i64
+  %143 = getelementptr inbounds i32*, i32** %140, i64 %142
+  %144 = load i32*, i32** %143, align 8
+  %145 = bitcast i32* %144 to i8*
+  call void @free(i8* %145) #7
+  br label %146
+
+146:                                              ; preds = %129
+  %147 = load i32, i32* %9, align 4
+  %148 = add nsw i32 %147, 1
+  store i32 %148, i32* %9, align 4
+  br label %123
+
+149:                                              ; preds = %123
+  %150 = load %struct.Matrix*, %struct.Matrix** %4, align 8
+  %151 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %150, i32 0, i32 0
+  %152 = load i32**, i32*** %151, align 8
+  %153 = bitcast i32** %152 to i8*
+  call void @free(i8* %153) #7
+  %154 = load %struct.Matrix*, %struct.Matrix** %5, align 8
+  %155 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %154, i32 0, i32 0
+  %156 = load i32**, i32*** %155, align 8
+  %157 = bitcast i32** %156 to i8*
+  call void @free(i8* %157) #7
+  %158 = load %struct.Matrix*, %struct.Matrix** %4, align 8
+  %159 = bitcast %struct.Matrix* %158 to i8*
+  call void @free(i8* %159) #7
+  %160 = load %struct.Matrix*, %struct.Matrix** %5, align 8
+  %161 = bitcast %struct.Matrix* %160 to i8*
+  call void @free(i8* %161) #7
+  %162 = load %struct.DynamicArray*, %struct.DynamicArray** %2, align 8
+  %163 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %162, i32 0, i32 0
+  %164 = load i32*, i32** %163, align 8
+  %165 = bitcast i32* %164 to i8*
+  call void @free(i8* %165) #7
+  %166 = load %struct.DynamicArray*, %struct.DynamicArray** %2, align 8
+  %167 = bitcast %struct.DynamicArray* %166 to i8*
+  call void @free(i8* %167) #7
+  store i32 -1, i32* %1, align 4
+  br label %322
+
+168:                                              ; preds = %114
+  store %struct.Node* null, %struct.Node** %10, align 8
+  store i32 0, i32* %11, align 4
+  br label %169
+
+169:                                              ; preds = %183, %168
+  %170 = load i32, i32* %11, align 4
+  %171 = icmp slt i32 %170, 5
+  br i1 %171, label %172, label %186
+
+172:                                              ; preds = %169
+  %173 = load %struct.Node*, %struct.Node** %10, align 8
+  %174 = call i32 @rand() #7
+  %175 = srem i32 %174, 50
+  %176 = call %struct.Node* @insertNode(%struct.Node* %173, i32 %175)
+  store %struct.Node* %176, %struct.Node** %10, align 8
+  %177 = load i8*, i8** @globalErrorMessage, align 8
+  %178 = icmp ne i8* %177, null
+  br i1 %178, label %179, label %182
+
+179:                                              ; preds = %172
+  %180 = call i8* @getErrorMessage()
+  %181 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([33 x i8], [33 x i8]* @.str.30, i64 0, i64 0), i8* %180)
+  br label %186
+
+182:                                              ; preds = %172
+  br label %183
+
+183:                                              ; preds = %182
+  %184 = load i32, i32* %11, align 4
+  %185 = add nsw i32 %184, 1
+  store i32 %185, i32* %11, align 4
+  br label %169
+
+186:                                              ; preds = %179, %169
+  %187 = load %struct.DynamicArray*, %struct.DynamicArray** %2, align 8
+  %188 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %187, i32 0, i32 0
+  %189 = load i32*, i32** %188, align 8
+  %190 = bitcast i32* %189 to i8*
+  call void @free(i8* %190) #7
+  %191 = load %struct.DynamicArray*, %struct.DynamicArray** %2, align 8
+  %192 = bitcast %struct.DynamicArray* %191 to i8*
+  call void @free(i8* %192) #7
+  store i32 0, i32* %12, align 4
+  br label %193
+
+193:                                              ; preds = %224, %186
+  %194 = load i32, i32* %12, align 4
+  %195 = load %struct.Matrix*, %struct.Matrix** %4, align 8
+  %196 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %195, i32 0, i32 1
+  %197 = load i32, i32* %196, align 8
+  %198 = icmp slt i32 %194, %197
+  br i1 %198, label %199, label %227
+
+199:                                              ; preds = %193
+  %200 = load %struct.Matrix*, %struct.Matrix** %4, align 8
+  %201 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %200, i32 0, i32 0
+  %202 = load i32**, i32*** %201, align 8
+  %203 = load i32, i32* %12, align 4
+  %204 = sext i32 %203 to i64
+  %205 = getelementptr inbounds i32*, i32** %202, i64 %204
+  %206 = load i32*, i32** %205, align 8
+  %207 = bitcast i32* %206 to i8*
+  call void @free(i8* %207) #7
+  %208 = load %struct.Matrix*, %struct.Matrix** %5, align 8
+  %209 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %208, i32 0, i32 0
+  %210 = load i32**, i32*** %209, align 8
+  %211 = load i32, i32* %12, align 4
+  %212 = sext i32 %211 to i64
+  %213 = getelementptr inbounds i32*, i32** %210, i64 %212
+  %214 = load i32*, i32** %213, align 8
+  %215 = bitcast i32* %214 to i8*
+  call void @free(i8* %215) #7
+  %216 = load %struct.Matrix*, %struct.Matrix** %8, align 8
+  %217 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %216, i32 0, i32 0
+  %218 = load i32**, i32*** %217, align 8
+  %219 = load i32, i32* %12, align 4
+  %220 = sext i32 %219 to i64
+  %221 = getelementptr inbounds i32*, i32** %218, i64 %220
+  %222 = load i32*, i32** %221, align 8
+  %223 = bitcast i32* %222 to i8*
+  call void @free(i8* %223) #7
+  br label %224
+
+224:                                              ; preds = %199
+  %225 = load i32, i32* %12, align 4
+  %226 = add nsw i32 %225, 1
+  store i32 %226, i32* %12, align 4
+  br label %193
+
+227:                                              ; preds = %193
+  %228 = load %struct.Matrix*, %struct.Matrix** %4, align 8
+  %229 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %228, i32 0, i32 0
+  %230 = load i32**, i32*** %229, align 8
+  %231 = bitcast i32** %230 to i8*
+  call void @free(i8* %231) #7
+  %232 = load %struct.Matrix*, %struct.Matrix** %5, align 8
+  %233 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %232, i32 0, i32 0
+  %234 = load i32**, i32*** %233, align 8
+  %235 = bitcast i32** %234 to i8*
+  call void @free(i8* %235) #7
+  %236 = load %struct.Matrix*, %struct.Matrix** %8, align 8
+  %237 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %236, i32 0, i32 0
+  %238 = load i32**, i32*** %237, align 8
+  %239 = bitcast i32** %238 to i8*
+  call void @free(i8* %239) #7
+  %240 = load %struct.Matrix*, %struct.Matrix** %4, align 8
+  %241 = bitcast %struct.Matrix* %240 to i8*
+  call void @free(i8* %241) #7
+  %242 = load %struct.Matrix*, %struct.Matrix** %5, align 8
+  %243 = bitcast %struct.Matrix* %242 to i8*
+  call void @free(i8* %243) #7
+  %244 = load %struct.Matrix*, %struct.Matrix** %8, align 8
+  %245 = bitcast %struct.Matrix* %244 to i8*
+  call void @free(i8* %245) #7
+  %246 = load %struct.Node*, %struct.Node** %10, align 8
+  %247 = icmp ne %struct.Node* %246, null
+  br i1 %247, label %248, label %316
+
+248:                                              ; preds = %227
+  %249 = load %struct.Node*, %struct.Node** %10, align 8
+  store %struct.Node* %249, %struct.Node** %13, align 8
+  %250 = load %struct.Node*, %struct.Node** %10, align 8
+  store %struct.Node* %250, %struct.Node** %14, align 8
+  store i32 0, i32* %15, align 4
+  br label %251
+
+251:                                              ; preds = %274, %248
+  %252 = load %struct.Node*, %struct.Node** %14, align 8
+  %253 = icmp ne %struct.Node* %252, null
+  br i1 %253, label %254, label %259
+
+254:                                              ; preds = %251
+  %255 = load %struct.Node*, %struct.Node** %14, align 8
+  %256 = getelementptr inbounds %struct.Node, %struct.Node* %255, i32 0, i32 1
+  %257 = load %struct.Node*, %struct.Node** %256, align 8
+  %258 = icmp ne %struct.Node* %257, null
+  br label %259
+
+259:                                              ; preds = %254, %251
+  %260 = phi i1 [ false, %251 ], [ %258, %254 ]
+  br i1 %260, label %261, label %275
+
+261:                                              ; preds = %259
+  %262 = load %struct.Node*, %struct.Node** %13, align 8
+  %263 = getelementptr inbounds %struct.Node, %struct.Node* %262, i32 0, i32 1
+  %264 = load %struct.Node*, %struct.Node** %263, align 8
+  store %struct.Node* %264, %struct.Node** %13, align 8
+  %265 = load %struct.Node*, %struct.Node** %14, align 8
+  %266 = getelementptr inbounds %struct.Node, %struct.Node* %265, i32 0, i32 1
+  %267 = load %struct.Node*, %struct.Node** %266, align 8
+  %268 = getelementptr inbounds %struct.Node, %struct.Node* %267, i32 0, i32 1
+  %269 = load %struct.Node*, %struct.Node** %268, align 8
+  store %struct.Node* %269, %struct.Node** %14, align 8
+  %270 = load %struct.Node*, %struct.Node** %13, align 8
+  %271 = load %struct.Node*, %struct.Node** %14, align 8
+  %272 = icmp eq %struct.Node* %270, %271
+  br i1 %272, label %273, label %274
+
+273:                                              ; preds = %261
+  store i32 1, i32* %15, align 4
+  br label %275
+
+274:                                              ; preds = %261
+  br label %251
+
+275:                                              ; preds = %273, %259
+  %276 = load i32, i32* %15, align 4
+  %277 = icmp ne i32 %276, 0
+  br i1 %277, label %278, label %304
+
+278:                                              ; preds = %275
+  call void @setErrorMessage(i8* getelementptr inbounds ([43 x i8], [43 x i8]* @.str.31, i64 0, i64 0))
+  %279 = load %struct.Node*, %struct.Node** %10, align 8
+  store %struct.Node* %279, %struct.Node** %16, align 8
+  store i32 1000, i32* %17, align 4
+  store i32 0, i32* %18, align 4
+  br label %280
+
+280:                                              ; preds = %295, %278
+  %281 = load %struct.Node*, %struct.Node** %16, align 8
+  %282 = icmp ne %struct.Node* %281, null
+  br i1 %282, label %283, label %287
+
+283:                                              ; preds = %280
+  %284 = load i32, i32* %18, align 4
+  %285 = load i32, i32* %17, align 4
+  %286 = icmp slt i32 %284, %285
+  br label %287
+
+287:                                              ; preds = %283, %280
+  %288 = phi i1 [ false, %280 ], [ %286, %283 ]
+  br i1 %288, label %289, label %303
+
+289:                                              ; preds = %287
+  %290 = load %struct.Node*, %struct.Node** %16, align 8
+  %291 = getelementptr inbounds %struct.Node, %struct.Node* %290, i32 0, i32 3
+  %292 = load i32, i32* %291, align 8
+  %293 = icmp ne i32 %292, 0
+  br i1 %293, label %294, label %295
+
+294:                                              ; preds = %289
+  br label %303
+
+295:                                              ; preds = %289
+  %296 = load %struct.Node*, %struct.Node** %16, align 8
+  %297 = getelementptr inbounds %struct.Node, %struct.Node* %296, i32 0, i32 3
+  store i32 1, i32* %297, align 8
+  %298 = load %struct.Node*, %struct.Node** %16, align 8
+  %299 = getelementptr inbounds %struct.Node, %struct.Node* %298, i32 0, i32 1
+  %300 = load %struct.Node*, %struct.Node** %299, align 8
+  store %struct.Node* %300, %struct.Node** %16, align 8
+  %301 = load i32, i32* %18, align 4
+  %302 = add nsw i32 %301, 1
+  store i32 %302, i32* %18, align 4
+  br label %280
+
+303:                                              ; preds = %294, %287
+  br label %304
+
+304:                                              ; preds = %303, %275
+  br label %305
+
+305:                                              ; preds = %308, %304
+  %306 = load %struct.Node*, %struct.Node** %10, align 8
+  %307 = icmp ne %struct.Node* %306, null
+  br i1 %307, label %308, label %315
+
+308:                                              ; preds = %305
+  %309 = load %struct.Node*, %struct.Node** %10, align 8
+  store %struct.Node* %309, %struct.Node** %19, align 8
+  %310 = load %struct.Node*, %struct.Node** %10, align 8
+  %311 = getelementptr inbounds %struct.Node, %struct.Node* %310, i32 0, i32 1
+  %312 = load %struct.Node*, %struct.Node** %311, align 8
+  store %struct.Node* %312, %struct.Node** %10, align 8
+  %313 = load %struct.Node*, %struct.Node** %19, align 8
+  %314 = bitcast %struct.Node* %313 to i8*
+  call void @free(i8* %314) #7
+  br label %305
+
+315:                                              ; preds = %305
+  br label %316
+
+316:                                              ; preds = %315, %227
+  %317 = load i8*, i8** @globalErrorMessage, align 8
+  %318 = icmp ne i8* %317, null
+  br i1 %318, label %319, label %321
+
+319:                                              ; preds = %316
+  %320 = load i8*, i8** @globalErrorMessage, align 8
+  call void @free(i8* %320) #7
+  br label %321
+
+321:                                              ; preds = %319, %316
+  call void @performSimpleCalculations()
+  store i32 0, i32* %1, align 4
+  br label %322
+
+322:                                              ; preds = %321, %149, %67, %25
+  %323 = load i32, i32* %1, align 4
+  ret i32 %323
+}
+
+; Function Attrs: nounwind
+declare dso_local i64 @time(i64*) #1
+
+; Function Attrs: nounwind
+declare dso_local void @srand(i32) #1
+
+; Function Attrs: nounwind
+declare dso_local i32 @rand() #1
+
+; Function Attrs: noinline nounwind optnone uwtable
+define dso_local double @calculateDistance(%struct.Point* byval(%struct.Point) align 8 %0, %struct.Point* byval(%struct.Point) align 8 %1, i32* %2) #0 {
+  %4 = alloca double, align 8
+  %5 = alloca i32*, align 8
+  %6 = alloca double, align 8
+  %7 = alloca double, align 8
+  %8 = alloca double, align 8
+  store i32* %2, i32** %5, align 8
+  %9 = load i32*, i32** %5, align 8
+  store i32 0, i32* %9, align 4
+  %10 = getelementptr inbounds %struct.Point, %struct.Point* %0, i32 0, i32 3
+  %11 = load double, double* %10, align 8
+  %12 = fcmp ole double %11, 0.000000e+00
+  br i1 %12, label %17, label %13
+
+13:                                               ; preds = %3
+  %14 = getelementptr inbounds %struct.Point, %struct.Point* %1, i32 0, i32 3
+  %15 = load double, double* %14, align 8
+  %16 = fcmp ole double %15, 0.000000e+00
+  br i1 %16, label %17, label %19
+
+17:                                               ; preds = %13, %3
+  %18 = load i32*, i32** %5, align 8
+  store i32 1, i32* %18, align 4
+  call void @setErrorMessage(i8* getelementptr inbounds ([22 x i8], [22 x i8]* @.str.32, i64 0, i64 0))
+  store double -1.000000e+00, double* %4, align 8
+  br label %101
+
+19:                                               ; preds = %13
+  %20 = getelementptr inbounds %struct.Point, %struct.Point* %0, i32 0, i32 0
+  %21 = load i32, i32* %20, align 8
+  %22 = call i32 @abs(i32 %21) #8
+  %23 = icmp sgt i32 %22, 1000
+  br i1 %23, label %39, label %24
+
+24:                                               ; preds = %19
+  %25 = getelementptr inbounds %struct.Point, %struct.Point* %0, i32 0, i32 1
+  %26 = load i32, i32* %25, align 4
+  %27 = call i32 @abs(i32 %26) #8
+  %28 = icmp sgt i32 %27, 1000
+  br i1 %28, label %39, label %29
+
+29:                                               ; preds = %24
+  %30 = getelementptr inbounds %struct.Point, %struct.Point* %1, i32 0, i32 0
+  %31 = load i32, i32* %30, align 8
+  %32 = call i32 @abs(i32 %31) #8
+  %33 = icmp sgt i32 %32, 1000
+  br i1 %33, label %39, label %34
+
+34:                                               ; preds = %29
+  %35 = getelementptr inbounds %struct.Point, %struct.Point* %1, i32 0, i32 1
+  %36 = load i32, i32* %35, align 4
+  %37 = call i32 @abs(i32 %36) #8
+  %38 = icmp sgt i32 %37, 1000
+  br i1 %38, label %39, label %41
+
+39:                                               ; preds = %34, %29, %24, %19
+  %40 = load i32*, i32** %5, align 8
+  store i32 3, i32* %40, align 4
+  call void @setErrorMessage(i8* getelementptr inbounds ([31 x i8], [31 x i8]* @.str.33, i64 0, i64 0))
+  store double -1.000000e+00, double* %4, align 8
+  br label %101
+
+41:                                               ; preds = %34
+  %42 = getelementptr inbounds %struct.Point, %struct.Point* %1, i32 0, i32 0
+  %43 = load i32, i32* %42, align 8
+  %44 = getelementptr inbounds %struct.Point, %struct.Point* %0, i32 0, i32 0
+  %45 = load i32, i32* %44, align 8
+  %46 = sub nsw i32 %43, %45
+  %47 = sitofp i32 %46 to double
+  %48 = getelementptr inbounds %struct.Point, %struct.Point* %1, i32 0, i32 3
+  %49 = load double, double* %48, align 8
+  %50 = getelementptr inbounds %struct.Point, %struct.Point* %0, i32 0, i32 3
+  %51 = load double, double* %50, align 8
+  %52 = fdiv double %49, %51
+  %53 = call double @sqrt(double %52) #7
+  %54 = fmul double %47, %53
+  store double %54, double* %6, align 8
+  %55 = getelementptr inbounds %struct.Point, %struct.Point* %1, i32 0, i32 1
+  %56 = load i32, i32* %55, align 4
+  %57 = getelementptr inbounds %struct.Point, %struct.Point* %0, i32 0, i32 1
+  %58 = load i32, i32* %57, align 4
+  %59 = sub nsw i32 %56, %58
+  %60 = sitofp i32 %59 to double
+  %61 = getelementptr inbounds %struct.Point, %struct.Point* %1, i32 0, i32 3
+  %62 = load double, double* %61, align 8
+  %63 = getelementptr inbounds %struct.Point, %struct.Point* %0, i32 0, i32 3
+  %64 = load double, double* %63, align 8
+  %65 = fdiv double %62, %64
+  %66 = call double @sqrt(double %65) #7
+  %67 = fmul double %60, %66
+  store double %67, double* %7, align 8
+  %68 = load double, double* %6, align 8
+  %69 = call double @llvm.fabs.f64(double %68)
+  %70 = fcmp ogt double %69, 1.000000e+03
+  br i1 %70, label %75, label %71
+
+71:                                               ; preds = %41
+  %72 = load double, double* %7, align 8
+  %73 = call double @llvm.fabs.f64(double %72)
+  %74 = fcmp ogt double %73, 1.000000e+03
+  br i1 %74, label %75, label %77
+
+75:                                               ; preds = %71, %41
+  %76 = load i32*, i32** %5, align 8
+  store i32 5, i32* %76, align 4
+  call void @setErrorMessage(i8* getelementptr inbounds ([30 x i8], [30 x i8]* @.str.34, i64 0, i64 0))
+  store double -1.000000e+00, double* %4, align 8
+  br label %101
+
+77:                                               ; preds = %71
+  %78 = load double, double* %6, align 8
+  %79 = load double, double* %6, align 8
+  %80 = fmul double %78, %79
+  %81 = load double, double* %7, align 8
+  %82 = load double, double* %7, align 8
+  %83 = fmul double %81, %82
+  %84 = fadd double %80, %83
+  %85 = call double @sqrt(double %84) #7
+  store double %85, double* %8, align 8
+  %86 = load double, double* %8, align 8
+  %87 = fcmp uno double %86, %86
+  br i1 %87, label %97, label %88
+
+88:                                               ; preds = %77
+  %89 = load double, double* %8, align 8
+  %90 = call double @llvm.fabs.f64(double %89) #9
+  %91 = fcmp oeq double %90, 0x7FF0000000000000
+  %92 = bitcast double %89 to i64
+  %93 = icmp slt i64 %92, 0
+  %94 = select i1 %93, i32 -1, i32 1
+  %95 = select i1 %91, i32 %94, i32 0
+  %96 = icmp ne i32 %95, 0
+  br i1 %96, label %97, label %99
+
+97:                                               ; preds = %88, %77
+  %98 = load i32*, i32** %5, align 8
+  store i32 8, i32* %98, align 4
+  call void @setErrorMessage(i8* getelementptr inbounds ([36 x i8], [36 x i8]* @.str.35, i64 0, i64 0))
+  store double -1.000000e+00, double* %4, align 8
+  br label %101
+
+99:                                               ; preds = %88
+  %100 = load double, double* %8, align 8
+  store double %100, double* %4, align 8
+  br label %101
+
+101:                                              ; preds = %99, %97, %75, %39, %17
+  %102 = load double, double* %4, align 8
+  ret double %102
+}
+
+; Function Attrs: nounwind
+declare dso_local double @sqrt(double) #1
+
+; Function Attrs: nounwind readnone speculatable willreturn
+declare double @llvm.fabs.f64(double) #4
+
+; Function Attrs: noinline nounwind optnone uwtable
+define dso_local double @calculateCircleArea(%struct.Circle* byval(%struct.Circle) align 8 %0, i32* %1) #0 {
+  %3 = alloca double, align 8
+  %4 = alloca i32*, align 8
+  %5 = alloca double, align 8
+  store i32* %1, i32** %4, align 8
+  %6 = load i32*, i32** %4, align 8
+  store i32 0, i32* %6, align 4
+  %7 = getelementptr inbounds %struct.Circle, %struct.Circle* %0, i32 0, i32 2
+  %8 = load i32, i32* %7, align 8
+  %9 = icmp ne i32 %8, 0
+  br i1 %9, label %12, label %10
+
+10:                                               ; preds = %2
+  %11 = load i32*, i32** %4, align 8
+  store i32 1, i32* %11, align 4
+  call void @setErrorMessage(i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.36, i64 0, i64 0))
+  store double -1.000000e+00, double* %3, align 8
+  br label %85
+
+12:                                               ; preds = %2
+  %13 = getelementptr inbounds %struct.Circle, %struct.Circle* %0, i32 0, i32 1
+  %14 = load double, double* %13, align 8
+  %15 = fcmp ole double %14, 0.000000e+00
+  br i1 %15, label %16, label %18
+
+16:                                               ; preds = %12
+  %17 = load i32*, i32** %4, align 8
+  store i32 1, i32* %17, align 4
+  call void @setErrorMessage(i8* getelementptr inbounds ([22 x i8], [22 x i8]* @.str.37, i64 0, i64 0))
+  store double -1.000000e+00, double* %3, align 8
+  br label %85
+
+18:                                               ; preds = %12
+  %19 = getelementptr inbounds %struct.Circle, %struct.Circle* %0, i32 0, i32 1
+  %20 = load double, double* %19, align 8
+  %21 = fcmp ogt double %20, 1.000000e+03
+  br i1 %21, label %22, label %24
+
+22:                                               ; preds = %18
+  %23 = load i32*, i32** %4, align 8
+  store i32 3, i32* %23, align 4
+  call void @setErrorMessage(i8* getelementptr inbounds ([24 x i8], [24 x i8]* @.str.38, i64 0, i64 0))
+  store double -1.000000e+00, double* %3, align 8
+  br label %85
+
+24:                                               ; preds = %18
+  %25 = getelementptr inbounds %struct.Circle, %struct.Circle* %0, i32 0, i32 0
+  %26 = getelementptr inbounds %struct.Point, %struct.Point* %25, i32 0, i32 0
+  %27 = load i32, i32* %26, align 8
+  %28 = call i32 @abs(i32 %27) #8
+  %29 = icmp sgt i32 %28, 1000
+  br i1 %29, label %36, label %30
+
+30:                                               ; preds = %24
+  %31 = getelementptr inbounds %struct.Circle, %struct.Circle* %0, i32 0, i32 0
+  %32 = getelementptr inbounds %struct.Point, %struct.Point* %31, i32 0, i32 1
+  %33 = load i32, i32* %32, align 4
+  %34 = call i32 @abs(i32 %33) #8
+  %35 = icmp sgt i32 %34, 1000
+  br i1 %35, label %36, label %38
+
+36:                                               ; preds = %30, %24
+  %37 = load i32*, i32** %4, align 8
+  store i32 3, i32* %37, align 4
+  call void @setErrorMessage(i8* getelementptr inbounds ([45 x i8], [45 x i8]* @.str.39, i64 0, i64 0))
+  store double -1.000000e+00, double* %3, align 8
+  br label %85
+
+38:                                               ; preds = %30
+  %39 = getelementptr inbounds %struct.Circle, %struct.Circle* %0, i32 0, i32 1
+  %40 = load double, double* %39, align 8
+  %41 = fmul double 3.141590e+00, %40
+  %42 = getelementptr inbounds %struct.Circle, %struct.Circle* %0, i32 0, i32 1
+  %43 = load double, double* %42, align 8
+  %44 = fmul double %41, %43
+  store double %44, double* %5, align 8
+  %45 = load double, double* %5, align 8
+  %46 = fcmp uno double %45, %45
+  br i1 %46, label %56, label %47
+
+47:                                               ; preds = %38
+  %48 = load double, double* %5, align 8
+  %49 = call double @llvm.fabs.f64(double %48) #9
+  %50 = fcmp oeq double %49, 0x7FF0000000000000
+  %51 = bitcast double %48 to i64
+  %52 = icmp slt i64 %51, 0
+  %53 = select i1 %52, i32 -1, i32 1
+  %54 = select i1 %50, i32 %53, i32 0
+  %55 = icmp ne i32 %54, 0
+  br i1 %55, label %56, label %58
+
+56:                                               ; preds = %47, %38
+  %57 = load i32*, i32** %4, align 8
+  store i32 5, i32* %57, align 4
+  call void @setErrorMessage(i8* getelementptr inbounds ([26 x i8], [26 x i8]* @.str.40, i64 0, i64 0))
+  store double -1.000000e+00, double* %3, align 8
+  br label %85
+
+58:                                               ; preds = %47
+  %59 = getelementptr inbounds %struct.Circle, %struct.Circle* %0, i32 0, i32 3
+  %60 = getelementptr inbounds [256 x i8], [256 x i8]* %59, i64 0, i64 0
+  %61 = call i32 @strcmp(i8* %60, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.41, i64 0, i64 0)) #10
+  %62 = icmp eq i32 %61, 0
+  br i1 %62, label %63, label %65
+
+63:                                               ; preds = %58
+  %64 = load double, double* %5, align 8
+  store double %64, double* %3, align 8
+  br label %85
+
+65:                                               ; preds = %58
+  %66 = getelementptr inbounds %struct.Circle, %struct.Circle* %0, i32 0, i32 3
+  %67 = getelementptr inbounds [256 x i8], [256 x i8]* %66, i64 0, i64 0
+  %68 = call i32 @strcmp(i8* %67, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.42, i64 0, i64 0)) #10
+  %69 = icmp eq i32 %68, 0
+  br i1 %69, label %70, label %83
+
+70:                                               ; preds = %65
+  %71 = getelementptr inbounds %struct.Circle, %struct.Circle* %0, i32 0, i32 0
+  %72 = getelementptr inbounds %struct.Point, %struct.Point* %71, i32 0, i32 3
+  %73 = load double, double* %72, align 8
+  %74 = fcmp ole double %73, 0.000000e+00
+  br i1 %74, label %75, label %77
+
+75:                                               ; preds = %70
+  %76 = load i32*, i32** %4, align 8
+  store i32 1, i32* %76, align 4
+  call void @setErrorMessage(i8* getelementptr inbounds ([35 x i8], [35 x i8]* @.str.43, i64 0, i64 0))
+  store double -1.000000e+00, double* %3, align 8
+  br label %85
+
+77:                                               ; preds = %70
+  %78 = load double, double* %5, align 8
+  %79 = getelementptr inbounds %struct.Circle, %struct.Circle* %0, i32 0, i32 0
+  %80 = getelementptr inbounds %struct.Point, %struct.Point* %79, i32 0, i32 3
+  %81 = load double, double* %80, align 8
+  %82 = fmul double %78, %81
+  store double %82, double* %3, align 8
+  br label %85
+
+83:                                               ; preds = %65
+  %84 = load i32*, i32** %4, align 8
+  store i32 1, i32* %84, align 4
+  call void @setErrorMessage(i8* getelementptr inbounds ([20 x i8], [20 x i8]* @.str.44, i64 0, i64 0))
+  store double -1.000000e+00, double* %3, align 8
+  br label %85
+
+85:                                               ; preds = %83, %77, %75, %63, %56, %36, %22, %16, %10
+  %86 = load double, double* %3, align 8
+  ret double %86
+}
+
+; Function Attrs: nounwind readonly
+declare dso_local i32 @strcmp(i8*, i8*) #5
+
+; Function Attrs: noinline nounwind optnone uwtable
+define dso_local i32 @validateMatrix(%struct.Matrix* %0) #0 {
+  %2 = alloca i32, align 4
+  %3 = alloca %struct.Matrix*, align 8
+  %4 = alloca i32, align 4
+  store %struct.Matrix* %0, %struct.Matrix** %3, align 8
+  %5 = load %struct.Matrix*, %struct.Matrix** %3, align 8
+  %6 = icmp ne %struct.Matrix* %5, null
+  br i1 %6, label %8, label %7
+
+7:                                                ; preds = %1
+  call void @setErrorMessage(i8* getelementptr inbounds ([20 x i8], [20 x i8]* @.str.21, i64 0, i64 0))
+  store i32 7, i32* %2, align 4
+  br label %72
+
+8:                                                ; preds = %1
+  %9 = load %struct.Matrix*, %struct.Matrix** %3, align 8
+  %10 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %9, i32 0, i32 0
+  %11 = load i32**, i32*** %10, align 8
+  %12 = icmp ne i32** %11, null
+  br i1 %12, label %14, label %13
+
+13:                                               ; preds = %8
+  call void @setErrorMessage(i8* getelementptr inbounds ([17 x i8], [17 x i8]* @.str.45, i64 0, i64 0))
+  store i32 7, i32* %2, align 4
+  br label %72
+
+14:                                               ; preds = %8
+  %15 = load %struct.Matrix*, %struct.Matrix** %3, align 8
+  %16 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %15, i32 0, i32 1
+  %17 = load i32, i32* %16, align 8
+  %18 = icmp slt i32 %17, 1
+  br i1 %18, label %24, label %19
+
+19:                                               ; preds = %14
+  %20 = load %struct.Matrix*, %struct.Matrix** %3, align 8
+  %21 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %20, i32 0, i32 2
+  %22 = load i32, i32* %21, align 4
+  %23 = icmp slt i32 %22, 1
+  br i1 %23, label %24, label %25
+
+24:                                               ; preds = %19, %14
+  call void @setErrorMessage(i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.str.16, i64 0, i64 0))
+  store i32 1, i32* %2, align 4
+  br label %72
+
+25:                                               ; preds = %19
+  %26 = load %struct.Matrix*, %struct.Matrix** %3, align 8
+  %27 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %26, i32 0, i32 1
+  %28 = load i32, i32* %27, align 8
+  %29 = icmp sgt i32 %28, 100
+  br i1 %29, label %35, label %30
+
+30:                                               ; preds = %25
+  %31 = load %struct.Matrix*, %struct.Matrix** %3, align 8
+  %32 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %31, i32 0, i32 2
+  %33 = load i32, i32* %32, align 4
+  %34 = icmp sgt i32 %33, 100
+  br i1 %34, label %35, label %36
+
+35:                                               ; preds = %30, %25
+  call void @setErrorMessage(i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.str.46, i64 0, i64 0))
+  store i32 3, i32* %2, align 4
+  br label %72
+
+36:                                               ; preds = %30
+  store i32 0, i32* %4, align 4
+  br label %37
+
+37:                                               ; preds = %54, %36
+  %38 = load i32, i32* %4, align 4
+  %39 = load %struct.Matrix*, %struct.Matrix** %3, align 8
+  %40 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %39, i32 0, i32 1
+  %41 = load i32, i32* %40, align 8
+  %42 = icmp slt i32 %38, %41
+  br i1 %42, label %43, label %57
+
+43:                                               ; preds = %37
+  %44 = load %struct.Matrix*, %struct.Matrix** %3, align 8
+  %45 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %44, i32 0, i32 0
+  %46 = load i32**, i32*** %45, align 8
+  %47 = load i32, i32* %4, align 4
+  %48 = sext i32 %47 to i64
+  %49 = getelementptr inbounds i32*, i32** %46, i64 %48
+  %50 = load i32*, i32** %49, align 8
+  %51 = icmp ne i32* %50, null
+  br i1 %51, label %53, label %52
+
+52:                                               ; preds = %43
+  call void @setErrorMessage(i8* getelementptr inbounds ([27 x i8], [27 x i8]* @.str.47, i64 0, i64 0))
+  store i32 7, i32* %2, align 4
+  br label %72
+
+53:                                               ; preds = %43
+  br label %54
+
+54:                                               ; preds = %53
+  %55 = load i32, i32* %4, align 4
+  %56 = add nsw i32 %55, 1
+  store i32 %56, i32* %4, align 4
+  br label %37
+
+57:                                               ; preds = %37
+  %58 = load %struct.Matrix*, %struct.Matrix** %3, align 8
+  %59 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %58, i32 0, i32 1
+  %60 = load i32, i32* %59, align 8
+  %61 = load %struct.Matrix*, %struct.Matrix** %3, align 8
+  %62 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %61, i32 0, i32 2
+  %63 = load i32, i32* %62, align 4
+  %64 = icmp eq i32 %60, %63
+  %65 = zext i1 %64 to i32
+  %66 = load %struct.Matrix*, %struct.Matrix** %3, align 8
+  %67 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %66, i32 0, i32 3
+  %68 = load i32, i32* %67, align 8
+  %69 = icmp ne i32 %65, %68
+  br i1 %69, label %70, label %71
+
+70:                                               ; preds = %57
+  call void @setErrorMessage(i8* getelementptr inbounds ([32 x i8], [32 x i8]* @.str.48, i64 0, i64 0))
+  store i32 1, i32* %2, align 4
+  br label %72
+
+71:                                               ; preds = %57
+  store i32 0, i32* %2, align 4
+  br label %72
+
+72:                                               ; preds = %71, %70, %52, %35, %24, %13, %7
+  %73 = load i32, i32* %2, align 4
+  ret i32 %73
+}
+
+; Function Attrs: noinline nounwind optnone uwtable
+define dso_local void @removeDuplicates(%struct.DynamicArray* %0) #0 {
+  %2 = alloca %struct.DynamicArray*, align 8
+  %3 = alloca i32, align 4
+  %4 = alloca i32, align 4
+  %5 = alloca i32, align 4
+  store %struct.DynamicArray* %0, %struct.DynamicArray** %2, align 8
+  %6 = load %struct.DynamicArray*, %struct.DynamicArray** %2, align 8
+  %7 = icmp ne %struct.DynamicArray* %6, null
+  br i1 %7, label %8, label %13
+
+8:                                                ; preds = %1
+  %9 = load %struct.DynamicArray*, %struct.DynamicArray** %2, align 8
+  %10 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %9, i32 0, i32 0
+  %11 = load i32*, i32** %10, align 8
+  %12 = icmp ne i32* %11, null
+  br i1 %12, label %14, label %13
+
+13:                                               ; preds = %8, %1
+  call void @setErrorMessage(i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.49, i64 0, i64 0))
+  br label %81
+
+14:                                               ; preds = %8
+  %15 = load %struct.DynamicArray*, %struct.DynamicArray** %2, align 8
+  %16 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %15, i32 0, i32 1
+  %17 = load i32, i32* %16, align 8
+  %18 = icmp sle i32 %17, 1
+  br i1 %18, label %19, label %20
+
+19:                                               ; preds = %14
+  br label %81
+
+20:                                               ; preds = %14
+  store i32 0, i32* %3, align 4
+  %21 = load %struct.DynamicArray*, %struct.DynamicArray** %2, align 8
+  %22 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %21, i32 0, i32 0
+  %23 = load i32*, i32** %22, align 8
+  %24 = load %struct.DynamicArray*, %struct.DynamicArray** %2, align 8
+  %25 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %24, i32 0, i32 1
+  %26 = load i32, i32* %25, align 8
+  %27 = sub nsw i32 %26, 1
+  call void @quickSort(i32* %23, i32 0, i32 %27, i32* %3)
+  %28 = load i32, i32* %3, align 4
+  %29 = icmp ne i32 %28, 0
+  br i1 %29, label %30, label %31
+
+30:                                               ; preds = %20
+  br label %81
+
+31:                                               ; preds = %20
+  store i32 1, i32* %4, align 4
+  store i32 1, i32* %5, align 4
+  br label %32
+
+32:                                               ; preds = %72, %31
+  %33 = load i32, i32* %5, align 4
+  %34 = load %struct.DynamicArray*, %struct.DynamicArray** %2, align 8
+  %35 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %34, i32 0, i32 1
+  %36 = load i32, i32* %35, align 8
+  %37 = icmp slt i32 %33, %36
+  br i1 %37, label %38, label %75
+
+38:                                               ; preds = %32
+  %39 = load %struct.DynamicArray*, %struct.DynamicArray** %2, align 8
+  %40 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %39, i32 0, i32 0
+  %41 = load i32*, i32** %40, align 8
+  %42 = load i32, i32* %5, align 4
+  %43 = sext i32 %42 to i64
+  %44 = getelementptr inbounds i32, i32* %41, i64 %43
+  %45 = load i32, i32* %44, align 4
+  %46 = load %struct.DynamicArray*, %struct.DynamicArray** %2, align 8
+  %47 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %46, i32 0, i32 0
+  %48 = load i32*, i32** %47, align 8
+  %49 = load i32, i32* %5, align 4
+  %50 = sub nsw i32 %49, 1
+  %51 = sext i32 %50 to i64
+  %52 = getelementptr inbounds i32, i32* %48, i64 %51
+  %53 = load i32, i32* %52, align 4
+  %54 = icmp ne i32 %45, %53
+  br i1 %54, label %55, label %71
+
+55:                                               ; preds = %38
+  %56 = load %struct.DynamicArray*, %struct.DynamicArray** %2, align 8
+  %57 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %56, i32 0, i32 0
+  %58 = load i32*, i32** %57, align 8
+  %59 = load i32, i32* %5, align 4
+  %60 = sext i32 %59 to i64
+  %61 = getelementptr inbounds i32, i32* %58, i64 %60
+  %62 = load i32, i32* %61, align 4
+  %63 = load %struct.DynamicArray*, %struct.DynamicArray** %2, align 8
+  %64 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %63, i32 0, i32 0
+  %65 = load i32*, i32** %64, align 8
+  %66 = load i32, i32* %4, align 4
+  %67 = sext i32 %66 to i64
+  %68 = getelementptr inbounds i32, i32* %65, i64 %67
+  store i32 %62, i32* %68, align 4
+  %69 = load i32, i32* %4, align 4
+  %70 = add nsw i32 %69, 1
+  store i32 %70, i32* %4, align 4
+  br label %71
+
+71:                                               ; preds = %55, %38
+  br label %72
+
+72:                                               ; preds = %71
+  %73 = load i32, i32* %5, align 4
+  %74 = add nsw i32 %73, 1
+  store i32 %74, i32* %5, align 4
+  br label %32
+
+75:                                               ; preds = %32
+  %76 = load i32, i32* %4, align 4
+  %77 = load %struct.DynamicArray*, %struct.DynamicArray** %2, align 8
+  %78 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %77, i32 0, i32 1
+  store i32 %76, i32* %78, align 8
+  %79 = load %struct.DynamicArray*, %struct.DynamicArray** %2, align 8
+  %80 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %79, i32 0, i32 3
+  store i32 1, i32* %80, align 8
+  br label %81
+
+81:                                               ; preds = %75, %30, %19, %13
+  ret void
+}
+
+; Function Attrs: noinline nounwind optnone uwtable
+define dso_local %struct.Point* @findCentroid(%struct.Point* %0, i32 %1, i32* %2) #0 {
+  %4 = alloca %struct.Point*, align 8
+  %5 = alloca %struct.Point*, align 8
+  %6 = alloca i32, align 4
+  %7 = alloca i32*, align 8
+  %8 = alloca %struct.Point*, align 8
+  %9 = alloca double, align 8
+  %10 = alloca double, align 8
+  %11 = alloca double, align 8
+  %12 = alloca i32, align 4
+  store %struct.Point* %0, %struct.Point** %5, align 8
+  store i32 %1, i32* %6, align 4
+  store i32* %2, i32** %7, align 8
+  %13 = load i32*, i32** %7, align 8
+  store i32 0, i32* %13, align 4
+  %14 = load %struct.Point*, %struct.Point** %5, align 8
+  %15 = icmp ne %struct.Point* %14, null
+  br i1 %15, label %16, label %19
+
+16:                                               ; preds = %3
+  %17 = load i32, i32* %6, align 4
+  %18 = icmp sle i32 %17, 0
+  br i1 %18, label %19, label %21
+
+19:                                               ; preds = %16, %3
+  %20 = load i32*, i32** %7, align 8
+  store i32 1, i32* %20, align 4
+  call void @setErrorMessage(i8* getelementptr inbounds ([21 x i8], [21 x i8]* @.str.50, i64 0, i64 0))
+  store %struct.Point* null, %struct.Point** %4, align 8
+  br label %165
+
+21:                                               ; preds = %16
+  %22 = load i32, i32* %6, align 4
+  %23 = icmp sgt i32 %22, 1000
+  br i1 %23, label %24, label %26
+
+24:                                               ; preds = %21
+  %25 = load i32*, i32** %7, align 8
+  store i32 3, i32* %25, align 4
+  call void @setErrorMessage(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.51, i64 0, i64 0))
+  store %struct.Point* null, %struct.Point** %4, align 8
+  br label %165
+
+26:                                               ; preds = %21
+  %27 = call noalias i8* @malloc(i64 272) #7
+  %28 = bitcast i8* %27 to %struct.Point*
+  store %struct.Point* %28, %struct.Point** %8, align 8
+  %29 = load %struct.Point*, %struct.Point** %8, align 8
+  %30 = icmp ne %struct.Point* %29, null
+  br i1 %30, label %33, label %31
+
+31:                                               ; preds = %26
+  %32 = load i32*, i32** %7, align 8
+  store i32 2, i32* %32, align 4
+  call void @setErrorMessage(i8* getelementptr inbounds ([39 x i8], [39 x i8]* @.str.52, i64 0, i64 0))
+  store %struct.Point* null, %struct.Point** %4, align 8
+  br label %165
+
+33:                                               ; preds = %26
+  store double 0.000000e+00, double* %9, align 8
+  store double 0.000000e+00, double* %10, align 8
+  store double 0.000000e+00, double* %11, align 8
+  store i32 0, i32* %12, align 4
+  br label %34
+
+34:                                               ; preds = %131, %33
+  %35 = load i32, i32* %12, align 4
+  %36 = load i32, i32* %6, align 4
+  %37 = icmp slt i32 %35, %36
+  br i1 %37, label %38, label %134
+
+38:                                               ; preds = %34
+  %39 = load %struct.Point*, %struct.Point** %5, align 8
+  %40 = load i32, i32* %12, align 4
+  %41 = sext i32 %40 to i64
+  %42 = getelementptr inbounds %struct.Point, %struct.Point* %39, i64 %41
+  %43 = getelementptr inbounds %struct.Point, %struct.Point* %42, i32 0, i32 3
+  %44 = load double, double* %43, align 8
+  %45 = fcmp ole double %44, 0.000000e+00
+  br i1 %45, label %46, label %50
+
+46:                                               ; preds = %38
+  %47 = load i32*, i32** %7, align 8
+  store i32 1, i32* %47, align 4
+  call void @setErrorMessage(i8* getelementptr inbounds ([21 x i8], [21 x i8]* @.str.53, i64 0, i64 0))
+  %48 = load %struct.Point*, %struct.Point** %8, align 8
+  %49 = bitcast %struct.Point* %48 to i8*
+  call void @free(i8* %49) #7
+  store %struct.Point* null, %struct.Point** %4, align 8
+  br label %165
+
+50:                                               ; preds = %38
+  %51 = load %struct.Point*, %struct.Point** %5, align 8
+  %52 = load i32, i32* %12, align 4
+  %53 = sext i32 %52 to i64
+  %54 = getelementptr inbounds %struct.Point, %struct.Point* %51, i64 %53
+  %55 = getelementptr inbounds %struct.Point, %struct.Point* %54, i32 0, i32 3
+  %56 = load double, double* %55, align 8
+  %57 = load double, double* %9, align 8
+  %58 = fadd double %57, %56
+  store double %58, double* %9, align 8
+  %59 = load %struct.Point*, %struct.Point** %5, align 8
+  %60 = load i32, i32* %12, align 4
+  %61 = sext i32 %60 to i64
+  %62 = getelementptr inbounds %struct.Point, %struct.Point* %59, i64 %61
+  %63 = getelementptr inbounds %struct.Point, %struct.Point* %62, i32 0, i32 0
+  %64 = load i32, i32* %63, align 8
+  %65 = sitofp i32 %64 to double
+  %66 = load %struct.Point*, %struct.Point** %5, align 8
+  %67 = load i32, i32* %12, align 4
+  %68 = sext i32 %67 to i64
+  %69 = getelementptr inbounds %struct.Point, %struct.Point* %66, i64 %68
+  %70 = getelementptr inbounds %struct.Point, %struct.Point* %69, i32 0, i32 3
+  %71 = load double, double* %70, align 8
+  %72 = fmul double %65, %71
+  %73 = load double, double* %10, align 8
+  %74 = fadd double %73, %72
+  store double %74, double* %10, align 8
+  %75 = load %struct.Point*, %struct.Point** %5, align 8
+  %76 = load i32, i32* %12, align 4
+  %77 = sext i32 %76 to i64
+  %78 = getelementptr inbounds %struct.Point, %struct.Point* %75, i64 %77
+  %79 = getelementptr inbounds %struct.Point, %struct.Point* %78, i32 0, i32 1
+  %80 = load i32, i32* %79, align 4
+  %81 = sitofp i32 %80 to double
+  %82 = load %struct.Point*, %struct.Point** %5, align 8
+  %83 = load i32, i32* %12, align 4
+  %84 = sext i32 %83 to i64
+  %85 = getelementptr inbounds %struct.Point, %struct.Point* %82, i64 %84
+  %86 = getelementptr inbounds %struct.Point, %struct.Point* %85, i32 0, i32 3
+  %87 = load double, double* %86, align 8
+  %88 = fmul double %81, %87
+  %89 = load double, double* %11, align 8
+  %90 = fadd double %89, %88
+  store double %90, double* %11, align 8
+  %91 = load double, double* %9, align 8
+  %92 = fcmp uno double %91, %91
+  br i1 %92, label %126, label %93
+
+93:                                               ; preds = %50
+  %94 = load double, double* %10, align 8
+  %95 = fcmp uno double %94, %94
+  br i1 %95, label %126, label %96
+
+96:                                               ; preds = %93
+  %97 = load double, double* %11, align 8
+  %98 = fcmp uno double %97, %97
+  br i1 %98, label %126, label %99
+
+99:                                               ; preds = %96
+  %100 = load double, double* %9, align 8
+  %101 = call double @llvm.fabs.f64(double %100) #9
+  %102 = fcmp oeq double %101, 0x7FF0000000000000
+  %103 = bitcast double %100 to i64
+  %104 = icmp slt i64 %103, 0
+  %105 = select i1 %104, i32 -1, i32 1
+  %106 = select i1 %102, i32 %105, i32 0
+  %107 = icmp ne i32 %106, 0
+  br i1 %107, label %126, label %108
+
+108:                                              ; preds = %99
+  %109 = load double, double* %10, align 8
+  %110 = call double @llvm.fabs.f64(double %109) #9
+  %111 = fcmp oeq double %110, 0x7FF0000000000000
+  %112 = bitcast double %109 to i64
+  %113 = icmp slt i64 %112, 0
+  %114 = select i1 %113, i32 -1, i32 1
+  %115 = select i1 %111, i32 %114, i32 0
+  %116 = icmp ne i32 %115, 0
+  br i1 %116, label %126, label %117
+
+117:                                              ; preds = %108
+  %118 = load double, double* %11, align 8
+  %119 = call double @llvm.fabs.f64(double %118) #9
+  %120 = fcmp oeq double %119, 0x7FF0000000000000
+  %121 = bitcast double %118 to i64
+  %122 = icmp slt i64 %121, 0
+  %123 = select i1 %122, i32 -1, i32 1
+  %124 = select i1 %120, i32 %123, i32 0
+  %125 = icmp ne i32 %124, 0
+  br i1 %125, label %126, label %130
+
+126:                                              ; preds = %117, %108, %99, %96, %93, %50
+  %127 = load i32*, i32** %7, align 8
+  store i32 5, i32* %127, align 4
+  call void @setErrorMessage(i8* getelementptr inbounds ([30 x i8], [30 x i8]* @.str.54, i64 0, i64 0))
+  %128 = load %struct.Point*, %struct.Point** %8, align 8
+  %129 = bitcast %struct.Point* %128 to i8*
+  call void @free(i8* %129) #7
+  store %struct.Point* null, %struct.Point** %4, align 8
+  br label %165
+
+130:                                              ; preds = %117
+  br label %131
+
+131:                                              ; preds = %130
+  %132 = load i32, i32* %12, align 4
+  %133 = add nsw i32 %132, 1
+  store i32 %133, i32* %12, align 4
+  br label %34
+
+134:                                              ; preds = %34
+  %135 = load double, double* %9, align 8
+  %136 = fcmp oeq double %135, 0.000000e+00
+  br i1 %136, label %137, label %141
+
+137:                                              ; preds = %134
+  %138 = load i32*, i32** %7, align 8
+  store i32 1, i32* %138, align 4
+  call void @setErrorMessage(i8* getelementptr inbounds ([21 x i8], [21 x i8]* @.str.55, i64 0, i64 0))
+  %139 = load %struct.Point*, %struct.Point** %8, align 8
+  %140 = bitcast %struct.Point* %139 to i8*
+  call void @free(i8* %140) #7
+  store %struct.Point* null, %struct.Point** %4, align 8
+  br label %165
+
+141:                                              ; preds = %134
+  %142 = load double, double* %10, align 8
+  %143 = load double, double* %9, align 8
+  %144 = fdiv double %142, %143
+  %145 = fptosi double %144 to i32
+  %146 = load %struct.Point*, %struct.Point** %8, align 8
+  %147 = getelementptr inbounds %struct.Point, %struct.Point* %146, i32 0, i32 0
+  store i32 %145, i32* %147, align 8
+  %148 = load double, double* %11, align 8
+  %149 = load double, double* %9, align 8
+  %150 = fdiv double %148, %149
+  %151 = fptosi double %150 to i32
+  %152 = load %struct.Point*, %struct.Point** %8, align 8
+  %153 = getelementptr inbounds %struct.Point, %struct.Point* %152, i32 0, i32 1
+  store i32 %151, i32* %153, align 4
+  %154 = load double, double* %9, align 8
+  %155 = load i32, i32* %6, align 4
+  %156 = sitofp i32 %155 to double
+  %157 = fdiv double %154, %156
+  %158 = load %struct.Point*, %struct.Point** %8, align 8
+  %159 = getelementptr inbounds %struct.Point, %struct.Point* %158, i32 0, i32 3
+  store double %157, double* %159, align 8
+  %160 = load %struct.Point*, %struct.Point** %8, align 8
+  %161 = getelementptr inbounds %struct.Point, %struct.Point* %160, i32 0, i32 2
+  %162 = getelementptr inbounds [256 x i8], [256 x i8]* %161, i64 0, i64 0
+  %163 = call i8* @strcpy(i8* %162, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.56, i64 0, i64 0)) #7
+  %164 = load %struct.Point*, %struct.Point** %8, align 8
+  store %struct.Point* %164, %struct.Point** %4, align 8
+  br label %165
+
+165:                                              ; preds = %141, %137, %126, %46, %31, %24, %19
+  %166 = load %struct.Point*, %struct.Point** %4, align 8
+  ret %struct.Point* %166
+}
+
+; Function Attrs: nounwind
+declare dso_local i8* @strcpy(i8*, i8*) #1
+
+; Function Attrs: noinline nounwind optnone uwtable
+define dso_local void @reverseString(i8* %0) #0 {
+  %2 = alloca i8*, align 8
+  %3 = alloca i32, align 4
+  %4 = alloca i32, align 4
+  %5 = alloca i8, align 1
+  store i8* %0, i8** %2, align 8
+  %6 = load i8*, i8** %2, align 8
+  %7 = call i64 @strlen(i8* %6) #10
+  %8 = trunc i64 %7 to i32
+  store i32 %8, i32* %3, align 4
+  store i32 0, i32* %4, align 4
+  br label %9
+
+9:                                                ; preds = %40, %1
+  %10 = load i32, i32* %4, align 4
+  %11 = load i32, i32* %3, align 4
+  %12 = sdiv i32 %11, 2
+  %13 = icmp slt i32 %10, %12
+  br i1 %13, label %14, label %43
+
+14:                                               ; preds = %9
+  %15 = load i8*, i8** %2, align 8
+  %16 = load i32, i32* %4, align 4
+  %17 = sext i32 %16 to i64
+  %18 = getelementptr inbounds i8, i8* %15, i64 %17
+  %19 = load i8, i8* %18, align 1
+  store i8 %19, i8* %5, align 1
+  %20 = load i8*, i8** %2, align 8
+  %21 = load i32, i32* %3, align 4
+  %22 = sub nsw i32 %21, 1
+  %23 = load i32, i32* %4, align 4
+  %24 = sub nsw i32 %22, %23
+  %25 = sext i32 %24 to i64
+  %26 = getelementptr inbounds i8, i8* %20, i64 %25
+  %27 = load i8, i8* %26, align 1
+  %28 = load i8*, i8** %2, align 8
+  %29 = load i32, i32* %4, align 4
+  %30 = sext i32 %29 to i64
+  %31 = getelementptr inbounds i8, i8* %28, i64 %30
+  store i8 %27, i8* %31, align 1
+  %32 = load i8, i8* %5, align 1
+  %33 = load i8*, i8** %2, align 8
+  %34 = load i32, i32* %3, align 4
+  %35 = sub nsw i32 %34, 1
+  %36 = load i32, i32* %4, align 4
+  %37 = sub nsw i32 %35, %36
+  %38 = sext i32 %37 to i64
+  %39 = getelementptr inbounds i8, i8* %33, i64 %38
+  store i8 %32, i8* %39, align 1
+  br label %40
+
+40:                                               ; preds = %14
+  %41 = load i32, i32* %4, align 4
+  %42 = add nsw i32 %41, 1
+  store i32 %42, i32* %4, align 4
+  br label %9
+
+43:                                               ; preds = %9
+  ret void
+}
+
+; Function Attrs: nounwind readonly
+declare dso_local i64 @strlen(i8*) #5
+
+; Function Attrs: noinline nounwind optnone uwtable
+define dso_local i32 @longestIncreasingSubsequence(i32* %0, i32 %1) #0 {
+  %3 = alloca i32*, align 8
+  %4 = alloca i32, align 4
+  %5 = alloca [100 x i32], align 16
+  %6 = alloca i32, align 4
+  %7 = alloca i32, align 4
+  %8 = alloca i32, align 4
+  %9 = alloca i32, align 4
+  %10 = alloca i32, align 4
+  store i32* %0, i32** %3, align 8
+  store i32 %1, i32* %4, align 4
+  store i32 0, i32* %6, align 4
+  br label %11
+
+11:                                               ; preds = %19, %2
+  %12 = load i32, i32* %6, align 4
+  %13 = load i32, i32* %4, align 4
+  %14 = icmp slt i32 %12, %13
+  br i1 %14, label %15, label %22
+
+15:                                               ; preds = %11
+  %16 = load i32, i32* %6, align 4
+  %17 = sext i32 %16 to i64
+  %18 = getelementptr inbounds [100 x i32], [100 x i32]* %5, i64 0, i64 %17
+  store i32 1, i32* %18, align 4
+  br label %19
+
+19:                                               ; preds = %15
+  %20 = load i32, i32* %6, align 4
+  %21 = add nsw i32 %20, 1
+  store i32 %21, i32* %6, align 4
+  br label %11
+
+22:                                               ; preds = %11
+  store i32 1, i32* %7, align 4
+  br label %23
+
+23:                                               ; preds = %69, %22
+  %24 = load i32, i32* %7, align 4
+  %25 = load i32, i32* %4, align 4
+  %26 = icmp slt i32 %24, %25
+  br i1 %26, label %27, label %72
+
+27:                                               ; preds = %23
+  store i32 0, i32* %8, align 4
+  br label %28
+
+28:                                               ; preds = %65, %27
+  %29 = load i32, i32* %8, align 4
+  %30 = load i32, i32* %7, align 4
+  %31 = icmp slt i32 %29, %30
+  br i1 %31, label %32, label %68
+
+32:                                               ; preds = %28
+  %33 = load i32*, i32** %3, align 8
+  %34 = load i32, i32* %7, align 4
+  %35 = sext i32 %34 to i64
+  %36 = getelementptr inbounds i32, i32* %33, i64 %35
+  %37 = load i32, i32* %36, align 4
+  %38 = load i32*, i32** %3, align 8
+  %39 = load i32, i32* %8, align 4
+  %40 = sext i32 %39 to i64
+  %41 = getelementptr inbounds i32, i32* %38, i64 %40
+  %42 = load i32, i32* %41, align 4
+  %43 = icmp sgt i32 %37, %42
+  br i1 %43, label %44, label %64
+
+44:                                               ; preds = %32
+  %45 = load i32, i32* %7, align 4
+  %46 = sext i32 %45 to i64
+  %47 = getelementptr inbounds [100 x i32], [100 x i32]* %5, i64 0, i64 %46
+  %48 = load i32, i32* %47, align 4
+  %49 = load i32, i32* %8, align 4
+  %50 = sext i32 %49 to i64
+  %51 = getelementptr inbounds [100 x i32], [100 x i32]* %5, i64 0, i64 %50
+  %52 = load i32, i32* %51, align 4
+  %53 = add nsw i32 %52, 1
+  %54 = icmp slt i32 %48, %53
+  br i1 %54, label %55, label %64
+
+55:                                               ; preds = %44
+  %56 = load i32, i32* %8, align 4
+  %57 = sext i32 %56 to i64
+  %58 = getelementptr inbounds [100 x i32], [100 x i32]* %5, i64 0, i64 %57
+  %59 = load i32, i32* %58, align 4
+  %60 = add nsw i32 %59, 1
+  %61 = load i32, i32* %7, align 4
+  %62 = sext i32 %61 to i64
+  %63 = getelementptr inbounds [100 x i32], [100 x i32]* %5, i64 0, i64 %62
+  store i32 %60, i32* %63, align 4
+  br label %64
+
+64:                                               ; preds = %55, %44, %32
+  br label %65
+
+65:                                               ; preds = %64
+  %66 = load i32, i32* %8, align 4
+  %67 = add nsw i32 %66, 1
+  store i32 %67, i32* %8, align 4
+  br label %28
+
+68:                                               ; preds = %28
+  br label %69
+
+69:                                               ; preds = %68
+  %70 = load i32, i32* %7, align 4
+  %71 = add nsw i32 %70, 1
+  store i32 %71, i32* %7, align 4
+  br label %23
+
+72:                                               ; preds = %23
+  store i32 0, i32* %9, align 4
+  store i32 0, i32* %10, align 4
+  br label %73
+
+73:                                               ; preds = %90, %72
+  %74 = load i32, i32* %10, align 4
+  %75 = load i32, i32* %4, align 4
+  %76 = icmp slt i32 %74, %75
+  br i1 %76, label %77, label %93
+
+77:                                               ; preds = %73
+  %78 = load i32, i32* %9, align 4
+  %79 = load i32, i32* %10, align 4
+  %80 = sext i32 %79 to i64
+  %81 = getelementptr inbounds [100 x i32], [100 x i32]* %5, i64 0, i64 %80
+  %82 = load i32, i32* %81, align 4
+  %83 = icmp slt i32 %78, %82
+  br i1 %83, label %84, label %89
+
+84:                                               ; preds = %77
+  %85 = load i32, i32* %10, align 4
+  %86 = sext i32 %85 to i64
+  %87 = getelementptr inbounds [100 x i32], [100 x i32]* %5, i64 0, i64 %86
+  %88 = load i32, i32* %87, align 4
+  store i32 %88, i32* %9, align 4
+  br label %89
+
+89:                                               ; preds = %84, %77
+  br label %90
+
+90:                                               ; preds = %89
+  %91 = load i32, i32* %10, align 4
+  %92 = add nsw i32 %91, 1
+  store i32 %92, i32* %10, align 4
+  br label %73
+
+93:                                               ; preds = %73
+  %94 = load i32, i32* %9, align 4
+  ret i32 %94
+}
+
+; Function Attrs: noinline nounwind optnone uwtable
+define dso_local i32 @testPoints(i32 %0) #0 {
+  %2 = alloca i32, align 4
+  %3 = alloca i32, align 4
+  %4 = alloca i32, align 4
+  %5 = alloca i32, align 4
+  store i32 %0, i32* %3, align 4
+  store i32 0, i32* %4, align 4
+  store i32 1, i32* %5, align 4
+  br label %6
+
+6:                                                ; preds = %16, %1
+  %7 = load i32, i32* %5, align 4
+  %8 = icmp slt i32 %7, 5
+  br i1 %8, label %9, label %19
+
+9:                                                ; preds = %6
+  %10 = load i32, i32* %4, align 4
+  %11 = add nsw i32 %10, 1
+  store i32 %11, i32* %4, align 4
+  %12 = load i32, i32* %3, align 4
+  %13 = icmp sgt i32 %12, 2
+  br i1 %13, label %14, label %15
+
+14:                                               ; preds = %9
+  store i32 23, i32* %2, align 4
+  br label %21
+
+15:                                               ; preds = %9
+  br label %16
+
+16:                                               ; preds = %15
+  %17 = load i32, i32* %5, align 4
+  %18 = add nsw i32 %17, 1
+  store i32 %18, i32* %5, align 4
+  br label %6
+
+19:                                               ; preds = %6
+  %20 = load i32, i32* %4, align 4
+  store i32 %20, i32* %2, align 4
+  br label %21
+
+21:                                               ; preds = %19, %14
+  %22 = load i32, i32* %2, align 4
+  ret i32 %22
+}
+
+; Function Attrs: noinline nounwind optnone uwtable
+define dso_local i32 @countSetBits(i32 %0) #0 {
+  %2 = alloca i32, align 4
+  %3 = alloca i32, align 4
+  store i32 %0, i32* %2, align 4
+  store i32 0, i32* %3, align 4
+  br label %4
+
+4:                                                ; preds = %7, %1
+  %5 = load i32, i32* %2, align 4
+  %6 = icmp ne i32 %5, 0
+  br i1 %6, label %7, label %14
+
+7:                                                ; preds = %4
+  %8 = load i32, i32* %2, align 4
+  %9 = and i32 %8, 1
+  %10 = load i32, i32* %3, align 4
+  %11 = add nsw i32 %10, %9
+  store i32 %11, i32* %3, align 4
+  %12 = load i32, i32* %2, align 4
+  %13 = ashr i32 %12, 1
+  store i32 %13, i32* %2, align 4
+  br label %4
+
+14:                                               ; preds = %4
+  %15 = load i32, i32* %3, align 4
+  ret i32 %15
+}
+
+; Function Attrs: noinline nounwind optnone uwtable
+define dso_local i32 @memoizedFib(i32 %0) #0 {
+  %2 = alloca i32, align 4
+  %3 = alloca i32, align 4
+  store i32 %0, i32* %3, align 4
+  %4 = load i32, i32* %3, align 4
+  %5 = sext i32 %4 to i64
+  %6 = getelementptr inbounds [100 x i32], [100 x i32]* @cache, i64 0, i64 %5
+  %7 = load i32, i32* %6, align 4
+  %8 = icmp ne i32 %7, -1
+  br i1 %8, label %9, label %14
+
+9:                                                ; preds = %1
+  %10 = load i32, i32* %3, align 4
+  %11 = sext i32 %10 to i64
+  %12 = getelementptr inbounds [100 x i32], [100 x i32]* @cache, i64 0, i64 %11
+  %13 = load i32, i32* %12, align 4
+  store i32 %13, i32* %2, align 4
+  br label %34
+
+14:                                               ; preds = %1
+  %15 = load i32, i32* %3, align 4
+  %16 = icmp sle i32 %15, 1
+  br i1 %16, label %17, label %19
+
+17:                                               ; preds = %14
+  %18 = load i32, i32* %3, align 4
+  store i32 %18, i32* %2, align 4
+  br label %34
+
+19:                                               ; preds = %14
+  %20 = load i32, i32* %3, align 4
+  %21 = sub nsw i32 %20, 1
+  %22 = call i32 @memoizedFib(i32 %21)
+  %23 = load i32, i32* %3, align 4
+  %24 = sub nsw i32 %23, 2
+  %25 = call i32 @memoizedFib(i32 %24)
+  %26 = add nsw i32 %22, %25
+  %27 = load i32, i32* %3, align 4
+  %28 = sext i32 %27 to i64
+  %29 = getelementptr inbounds [100 x i32], [100 x i32]* @cache, i64 0, i64 %28
+  store i32 %26, i32* %29, align 4
+  %30 = load i32, i32* %3, align 4
+  %31 = sext i32 %30 to i64
+  %32 = getelementptr inbounds [100 x i32], [100 x i32]* @cache, i64 0, i64 %31
+  %33 = load i32, i32* %32, align 4
+  store i32 %33, i32* %2, align 4
+  br label %34
+
+34:                                               ; preds = %19, %17, %9
+  %35 = load i32, i32* %2, align 4
+  ret i32 %35
+}
+
+; Function Attrs: noinline nounwind optnone uwtable
+define dso_local i32 @processMatrix([100 x i32]* %0, i32 %1) #0 {
+  %3 = alloca [100 x i32]*, align 8
+  %4 = alloca i32, align 4
+  %5 = alloca i32, align 4
+  %6 = alloca i32, align 4
+  %7 = alloca i32, align 4
+  store [100 x i32]* %0, [100 x i32]** %3, align 8
+  store i32 %1, i32* %4, align 4
+  store i32 0, i32* %5, align 4
+  store i32 0, i32* %6, align 4
+  br label %8
+
+8:                                                ; preds = %77, %2
+  %9 = load i32, i32* %6, align 4
+  %10 = load i32, i32* %4, align 4
+  %11 = icmp slt i32 %9, %10
+  br i1 %11, label %12, label %80
+
+12:                                               ; preds = %8
+  store i32 0, i32* %7, align 4
+  br label %13
+
+13:                                               ; preds = %73, %12
+  %14 = load i32, i32* %7, align 4
+  %15 = load i32, i32* %4, align 4
+  %16 = icmp slt i32 %14, %15
+  br i1 %16, label %17, label %76
+
+17:                                               ; preds = %13
+  %18 = load i32, i32* %6, align 4
+  %19 = load i32, i32* %7, align 4
+  %20 = icmp eq i32 %18, %19
+  br i1 %20, label %21, label %55
+
+21:                                               ; preds = %17
+  %22 = load [100 x i32]*, [100 x i32]** %3, align 8
+  %23 = load i32, i32* %6, align 4
+  %24 = sext i32 %23 to i64
+  %25 = getelementptr inbounds [100 x i32], [100 x i32]* %22, i64 %24
+  %26 = load i32, i32* %7, align 4
+  %27 = sext i32 %26 to i64
+  %28 = getelementptr inbounds [100 x i32], [100 x i32]* %25, i64 0, i64 %27
+  %29 = load i32, i32* %28, align 4
+  %30 = srem i32 %29, 2
+  %31 = icmp eq i32 %30, 0
+  br i1 %31, label %32, label %43
+
+32:                                               ; preds = %21
+  %33 = load [100 x i32]*, [100 x i32]** %3, align 8
+  %34 = load i32, i32* %6, align 4
+  %35 = sext i32 %34 to i64
+  %36 = getelementptr inbounds [100 x i32], [100 x i32]* %33, i64 %35
+  %37 = load i32, i32* %7, align 4
+  %38 = sext i32 %37 to i64
+  %39 = getelementptr inbounds [100 x i32], [100 x i32]* %36, i64 0, i64 %38
+  %40 = load i32, i32* %39, align 4
+  %41 = load i32, i32* %5, align 4
+  %42 = add nsw i32 %41, %40
+  store i32 %42, i32* %5, align 4
+  br label %54
+
+43:                                               ; preds = %21
+  %44 = load [100 x i32]*, [100 x i32]** %3, align 8
+  %45 = load i32, i32* %6, align 4
+  %46 = sext i32 %45 to i64
+  %47 = getelementptr inbounds [100 x i32], [100 x i32]* %44, i64 %46
+  %48 = load i32, i32* %7, align 4
+  %49 = sext i32 %48 to i64
+  %50 = getelementptr inbounds [100 x i32], [100 x i32]* %47, i64 0, i64 %49
+  %51 = load i32, i32* %50, align 4
+  %52 = load i32, i32* %5, align 4
+  %53 = sub nsw i32 %52, %51
+  store i32 %53, i32* %5, align 4
+  br label %54
+
+54:                                               ; preds = %43, %32
+  br label %72
+
+55:                                               ; preds = %17
+  %56 = load i32, i32* %6, align 4
+  %57 = load i32, i32* %7, align 4
+  %58 = icmp slt i32 %56, %57
+  br i1 %58, label %59, label %71
+
+59:                                               ; preds = %55
+  %60 = load [100 x i32]*, [100 x i32]** %3, align 8
+  %61 = load i32, i32* %6, align 4
+  %62 = sext i32 %61 to i64
+  %63 = getelementptr inbounds [100 x i32], [100 x i32]* %60, i64 %62
+  %64 = load i32, i32* %7, align 4
+  %65 = sext i32 %64 to i64
+  %66 = getelementptr inbounds [100 x i32], [100 x i32]* %63, i64 0, i64 %65
+  %67 = load i32, i32* %66, align 4
+  %68 = call i32 @countSetBits(i32 %67)
+  %69 = load i32, i32* %5, align 4
+  %70 = add nsw i32 %69, %68
+  store i32 %70, i32* %5, align 4
+  br label %71
+
+71:                                               ; preds = %59, %55
+  br label %72
+
+72:                                               ; preds = %71, %54
+  br label %73
+
+73:                                               ; preds = %72
+  %74 = load i32, i32* %7, align 4
+  %75 = add nsw i32 %74, 1
+  store i32 %75, i32* %7, align 4
+  br label %13
+
+76:                                               ; preds = %13
+  br label %77
+
+77:                                               ; preds = %76
+  %78 = load i32, i32* %6, align 4
+  %79 = add nsw i32 %78, 1
+  store i32 %79, i32* %6, align 4
+  br label %8
+
+80:                                               ; preds = %8
+  %81 = load i32, i32* %5, align 4
+  ret i32 %81
+}
+
+; Function Attrs: noinline nounwind optnone uwtable
+define dso_local i32 @projectB_main() #0 {
+  %1 = alloca [14 x i8], align 1
+  %2 = alloca [8 x i32], align 16
+  %3 = alloca i32, align 4
+  %4 = alloca i32, align 4
+  %5 = alloca [100 x [100 x i32]], align 16
+  %6 = alloca i32, align 4
+  %7 = alloca i32, align 4
+  %8 = alloca i32, align 4
+  %9 = call i32 @testPoints(i32 5)
+  call void @llvm.memset.p0i8.i64(i8* align 16 bitcast ([100 x i32]* @cache to i8*), i8 -1, i64 400, i1 false)
+  %10 = bitcast [14 x i8]* %1 to i8*
+  call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 1 %10, i8* align 1 getelementptr inbounds ([14 x i8], [14 x i8]* @__const.projectB_main.str, i32 0, i32 0), i64 14, i1 false)
+  %11 = getelementptr inbounds [14 x i8], [14 x i8]* %1, i64 0, i64 0
+  call void @reverseString(i8* %11)
+  %12 = bitcast [8 x i32]* %2 to i8*
+  call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 16 %12, i8* align 16 bitcast ([8 x i32]* @__const.projectB_main.arr to i8*), i64 32, i1 false)
+  store i32 8, i32* %3, align 4
+  %13 = getelementptr inbounds [8 x i32], [8 x i32]* %2, i64 0, i64 0
+  %14 = load i32, i32* %3, align 4
+  %15 = call i32 @longestIncreasingSubsequence(i32* %13, i32 %14)
+  store i32 %15, i32* %4, align 4
+  %16 = bitcast [100 x [100 x i32]]* %5 to i8*
+  call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 16 %16, i8* align 16 bitcast (<{ <{ i32, i32, i32, [97 x i32] }>, <{ i32, i32, i32, [97 x i32] }>, <{ i32, i32, i32, [97 x i32] }>, [97 x <{ i32, i32, i32, [97 x i32] }>] }>* @__const.projectB_main.matrix to i8*), i64 40000, i1 false)
+  %17 = getelementptr inbounds [100 x [100 x i32]], [100 x [100 x i32]]* %5, i64 0, i64 0
+  %18 = call i32 @processMatrix([100 x i32]* %17, i32 3)
+  store i32 %18, i32* %6, align 4
+  store i32 0, i32* %7, align 4
+  br label %19
+
+19:                                               ; preds = %24, %0
+  %20 = load i32, i32* %7, align 4
+  %21 = call i32 @memoizedFib(i32 %20)
+  %22 = load i32, i32* %7, align 4
+  %23 = add nsw i32 %22, 1
+  store i32 %23, i32* %7, align 4
+  br label %24
+
+24:                                               ; preds = %19
+  %25 = load i32, i32* %7, align 4
+  %26 = icmp slt i32 %25, 10
+  br i1 %26, label %19, label %27
+
+27:                                               ; preds = %24
+  %28 = load i32, i32* %4, align 4
+  %29 = icmp sgt i32 %28, 5
+  br i1 %29, label %30, label %40
+
+30:                                               ; preds = %27
+  %31 = load i32, i32* %6, align 4
+  %32 = icmp sgt i32 %31, 0
+  br i1 %32, label %33, label %36
+
+33:                                               ; preds = %30
+  %34 = load i32, i32* %4, align 4
+  %35 = call i32 @memoizedFib(i32 %34)
+  store i32 %35, i32* %8, align 4
+  br label %39
+
+36:                                               ; preds = %30
+  %37 = load i32, i32* %6, align 4
+  %38 = call i32 @countSetBits(i32 %37)
+  store i32 %38, i32* %8, align 4
+  br label %39
+
+39:                                               ; preds = %36, %33
+  br label %47
+
+40:                                               ; preds = %27
+  %41 = getelementptr inbounds [14 x i8], [14 x i8]* %1, i64 0, i64 0
+  %42 = call i64 @strlen(i8* %41) #10
+  %43 = load i32, i32* %6, align 4
+  %44 = sext i32 %43 to i64
+  %45 = add i64 %42, %44
+  %46 = trunc i64 %45 to i32
+  store i32 %46, i32* %8, align 4
+  br label %47
+
+47:                                               ; preds = %40, %39
+  %48 = load i32, i32* %8, align 4
+  ret i32 %48
+}
+
+; Function Attrs: argmemonly nounwind willreturn
+declare void @llvm.memset.p0i8.i64(i8* nocapture writeonly, i8, i64, i1 immarg) #6
+
+; Function Attrs: argmemonly nounwind willreturn
+declare void @llvm.memcpy.p0i8.p0i8.i64(i8* noalias nocapture writeonly, i8* noalias nocapture readonly, i64, i1 immarg) #6
+
+attributes #0 = { noinline nounwind optnone uwtable "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "frame-pointer"="all" "less-precise-fpmad"="false" "min-legal-vector-width"="0" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }
+attributes #1 = { nounwind "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "frame-pointer"="all" "less-precise-fpmad"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }
+attributes #2 = { "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "frame-pointer"="all" "less-precise-fpmad"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }
+attributes #3 = { nounwind readnone "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "frame-pointer"="all" "less-precise-fpmad"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }
+attributes #4 = { nounwind readnone speculatable willreturn }
+attributes #5 = { nounwind readonly "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "frame-pointer"="all" "less-precise-fpmad"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }
+attributes #6 = { argmemonly nounwind willreturn }
+attributes #7 = { nounwind }
+attributes #8 = { nounwind readnone }
+attributes #9 = { readnone }
+attributes #10 = { nounwind readonly }
+
+!llvm.ident = !{!0, !0}
+!llvm.module.flags = !{!1}
+
+!0 = !{!"clang version 10.0.0-4ubuntu1 "}
+!1 = !{i32 1, !"wchar_size", i32 4}

BIN
combine_output/projectA.bc


+ 3008 - 0
combine_output/projectA.ll

@@ -0,0 +1,3008 @@
+; ModuleID = 'data/projectA.c'
+source_filename = "data/projectA.c"
+target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-pc-linux-gnu"
+
+%struct._IO_FILE = type { i32, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, %struct._IO_marker*, %struct._IO_FILE*, i32, i32, i64, i16, i8, [1 x i8], i8*, i64, %struct._IO_codecvt*, %struct._IO_wide_data*, %struct._IO_FILE*, i8*, i64, i32, [20 x i8] }
+%struct._IO_marker = type opaque
+%struct._IO_codecvt = type opaque
+%struct._IO_wide_data = type opaque
+%struct.DynamicArray = type { i32*, i32, i32, i32, i32 }
+%struct.Matrix = type { i32**, i32, i32, i32, double }
+%struct.Node = type { i32, %struct.Node*, %struct.Node*, i32, i32 }
+%struct.Point = type { i32, i32, [256 x i8], double }
+%struct.Circle = type { %struct.Point, double, i32, [256 x i8] }
+
+@globalCounter = dso_local global i32 0, align 4
+@globalErrorMessage = dso_local global i8* null, align 8
+@recursionDepth = dso_local global i32 0, align 4
+@.str = private unnamed_addr constant [9 x i8] c"No error\00", align 1
+@stderr = external dso_local global %struct._IO_FILE*, align 8
+@.str.1 = private unnamed_addr constant [55 x i8] c"Critical: Failed to allocate memory for error message\0A\00", align 1
+@.str.2 = private unnamed_addr constant [33 x i8] c"Maximum recursion depth exceeded\00", align 1
+@.str.3 = private unnamed_addr constant [29 x i8] c"Factorial of negative number\00", align 1
+@.str.4 = private unnamed_addr constant [36 x i8] c"Input too large, potential overflow\00", align 1
+@.str.5 = private unnamed_addr constant [31 x i8] c"Factorial calculation overflow\00", align 1
+@.str.6 = private unnamed_addr constant [25 x i8] c"Invalid initial capacity\00", align 1
+@.str.7 = private unnamed_addr constant [46 x i8] c"Initial capacity exceeds maximum allowed size\00", align 1
+@.str.8 = private unnamed_addr constant [49 x i8] c"Memory allocation failed for DynamicArray struct\00", align 1
+@.str.9 = private unnamed_addr constant [35 x i8] c"Memory allocation failed for array\00", align 1
+@.str.10 = private unnamed_addr constant [19 x i8] c"Null array pointer\00", align 1
+@.str.11 = private unnamed_addr constant [25 x i8] c"Array size limit reached\00", align 1
+@.str.12 = private unnamed_addr constant [27 x i8] c"Memory reallocation failed\00", align 1
+@.str.13 = private unnamed_addr constant [46 x i8] c"Maximum recursion depth exceeded in quickSort\00", align 1
+@.str.14 = private unnamed_addr constant [32 x i8] c"Null array pointer in quickSort\00", align 1
+@.str.15 = private unnamed_addr constant [39 x i8] c"Array index out of bounds in quickSort\00", align 1
+@.str.16 = private unnamed_addr constant [28 x i8] c"Matrix dimensions too small\00", align 1
+@.str.17 = private unnamed_addr constant [46 x i8] c"Matrix dimensions exceed maximum allowed size\00", align 1
+@.str.18 = private unnamed_addr constant [43 x i8] c"Memory allocation failed for matrix struct\00", align 1
+@.str.19 = private unnamed_addr constant [41 x i8] c"Memory allocation failed for matrix rows\00", align 1
+@.str.20 = private unnamed_addr constant [44 x i8] c"Memory allocation failed for matrix columns\00", align 1
+@.str.21 = private unnamed_addr constant [20 x i8] c"Null matrix pointer\00", align 1
+@.str.22 = private unnamed_addr constant [20 x i8] c"Invalid matrix data\00", align 1
+@.str.23 = private unnamed_addr constant [45 x i8] c"Invalid matrix dimensions for multiplication\00", align 1
+@.str.24 = private unnamed_addr constant [42 x i8] c"Integer overflow in matrix multiplication\00", align 1
+@insertNode.maxDepth = internal global i32 0, align 4
+@.str.25 = private unnamed_addr constant [38 x i8] c"Memory allocation failed for new node\00", align 1
+@.str.26 = private unnamed_addr constant [34 x i8] c"List exceeds maximum allowed size\00", align 1
+@calculationResult = internal global i32 0, align 4
+@.str.27 = private unnamed_addr constant [30 x i8] c"Final calculation result: %d\0A\00", align 1
+@.str.28 = private unnamed_addr constant [11 x i8] c"Error: %s\0A\00", align 1
+@.str.29 = private unnamed_addr constant [29 x i8] c"Error during array push: %s\0A\00", align 1
+@.str.30 = private unnamed_addr constant [33 x i8] c"Error during list insertion: %s\0A\00", align 1
+@.str.31 = private unnamed_addr constant [43 x i8] c"Circular reference detected in linked list\00", align 1
+@.str.32 = private unnamed_addr constant [22 x i8] c"Invalid point weights\00", align 1
+@.str.33 = private unnamed_addr constant [31 x i8] c"Coordinates out of valid range\00", align 1
+@.str.34 = private unnamed_addr constant [30 x i8] c"Distance calculation overflow\00", align 1
+@.str.35 = private unnamed_addr constant [36 x i8] c"Invalid distance calculation result\00", align 1
+@.str.36 = private unnamed_addr constant [15 x i8] c"Invalid circle\00", align 1
+@.str.37 = private unnamed_addr constant [22 x i8] c"Invalid circle radius\00", align 1
+@.str.38 = private unnamed_addr constant [24 x i8] c"Circle radius too large\00", align 1
+@.str.39 = private unnamed_addr constant [45 x i8] c"Circle center coordinates out of valid range\00", align 1
+@.str.40 = private unnamed_addr constant [26 x i8] c"Area calculation overflow\00", align 1
+@.str.41 = private unnamed_addr constant [9 x i8] c"standard\00", align 1
+@.str.42 = private unnamed_addr constant [9 x i8] c"weighted\00", align 1
+@.str.43 = private unnamed_addr constant [35 x i8] c"Invalid weight for weighted circle\00", align 1
+@.str.44 = private unnamed_addr constant [20 x i8] c"Unknown circle type\00", align 1
+@.str.45 = private unnamed_addr constant [17 x i8] c"Null matrix data\00", align 1
+@.str.46 = private unnamed_addr constant [28 x i8] c"Matrix dimensions too large\00", align 1
+@.str.47 = private unnamed_addr constant [27 x i8] c"Invalid matrix row pointer\00", align 1
+@.str.48 = private unnamed_addr constant [32 x i8] c"Inconsistent square matrix flag\00", align 1
+@.str.49 = private unnamed_addr constant [14 x i8] c"Invalid array\00", align 1
+@.str.50 = private unnamed_addr constant [21 x i8] c"Invalid points array\00", align 1
+@.str.51 = private unnamed_addr constant [16 x i8] c"Too many points\00", align 1
+@.str.52 = private unnamed_addr constant [39 x i8] c"Failed to allocate memory for centroid\00", align 1
+@.str.53 = private unnamed_addr constant [21 x i8] c"Invalid point weight\00", align 1
+@.str.54 = private unnamed_addr constant [30 x i8] c"Centroid calculation overflow\00", align 1
+@.str.55 = private unnamed_addr constant [21 x i8] c"Total weight is zero\00", align 1
+@.str.56 = private unnamed_addr constant [9 x i8] c"Centroid\00", align 1
+
+; Function Attrs: noinline nounwind optnone uwtable
+define dso_local i8* @getErrorMessage() #0 {
+  %1 = load i8*, i8** @globalErrorMessage, align 8
+  %2 = icmp ne i8* %1, null
+  br i1 %2, label %3, label %5
+
+3:                                                ; preds = %0
+  %4 = load i8*, i8** @globalErrorMessage, align 8
+  br label %6
+
+5:                                                ; preds = %0
+  br label %6
+
+6:                                                ; preds = %5, %3
+  %7 = phi i8* [ %4, %3 ], [ getelementptr inbounds ([9 x i8], [9 x i8]* @.str, i64 0, i64 0), %5 ]
+  ret i8* %7
+}
+
+; Function Attrs: noinline nounwind optnone uwtable
+define dso_local void @setErrorMessage(i8* %0) #0 {
+  %2 = alloca i8*, align 8
+  store i8* %0, i8** %2, align 8
+  %3 = load i8*, i8** @globalErrorMessage, align 8
+  %4 = icmp ne i8* %3, null
+  br i1 %4, label %5, label %7
+
+5:                                                ; preds = %1
+  %6 = load i8*, i8** @globalErrorMessage, align 8
+  call void @free(i8* %6) #6
+  br label %7
+
+7:                                                ; preds = %5, %1
+  %8 = load i8*, i8** %2, align 8
+  %9 = icmp ne i8* %8, null
+  br i1 %9, label %10, label %19
+
+10:                                               ; preds = %7
+  %11 = load i8*, i8** %2, align 8
+  %12 = call noalias i8* @strdup(i8* %11) #6
+  store i8* %12, i8** @globalErrorMessage, align 8
+  %13 = load i8*, i8** @globalErrorMessage, align 8
+  %14 = icmp eq i8* %13, null
+  br i1 %14, label %15, label %18
+
+15:                                               ; preds = %10
+  %16 = load %struct._IO_FILE*, %struct._IO_FILE** @stderr, align 8
+  %17 = call i32 (%struct._IO_FILE*, i8*, ...) @fprintf(%struct._IO_FILE* %16, i8* getelementptr inbounds ([55 x i8], [55 x i8]* @.str.1, i64 0, i64 0))
+  br label %18
+
+18:                                               ; preds = %15, %10
+  br label %20
+
+19:                                               ; preds = %7
+  store i8* null, i8** @globalErrorMessage, align 8
+  br label %20
+
+20:                                               ; preds = %19, %18
+  ret void
+}
+
+; Function Attrs: nounwind
+declare dso_local void @free(i8*) #1
+
+; Function Attrs: nounwind
+declare dso_local noalias i8* @strdup(i8*) #1
+
+declare dso_local i32 @fprintf(%struct._IO_FILE*, i8*, ...) #2
+
+; Function Attrs: noinline nounwind optnone uwtable
+define dso_local i32 @factorial(i32 %0) #0 {
+  %2 = alloca i32, align 4
+  %3 = alloca i32, align 4
+  %4 = alloca i32, align 4
+  %5 = alloca i32, align 4
+  store i32 %0, i32* %3, align 4
+  %6 = load i32, i32* @recursionDepth, align 4
+  %7 = add nsw i32 %6, 1
+  store i32 %7, i32* @recursionDepth, align 4
+  %8 = icmp sgt i32 %7, 1000
+  br i1 %8, label %9, label %12
+
+9:                                                ; preds = %1
+  call void @setErrorMessage(i8* getelementptr inbounds ([33 x i8], [33 x i8]* @.str.2, i64 0, i64 0))
+  %10 = load i32, i32* @recursionDepth, align 4
+  %11 = add nsw i32 %10, -1
+  store i32 %11, i32* @recursionDepth, align 4
+  store i32 -1, i32* %2, align 4
+  br label %53
+
+12:                                               ; preds = %1
+  %13 = load i32, i32* %3, align 4
+  %14 = icmp slt i32 %13, 0
+  br i1 %14, label %15, label %18
+
+15:                                               ; preds = %12
+  call void @setErrorMessage(i8* getelementptr inbounds ([29 x i8], [29 x i8]* @.str.3, i64 0, i64 0))
+  %16 = load i32, i32* @recursionDepth, align 4
+  %17 = add nsw i32 %16, -1
+  store i32 %17, i32* @recursionDepth, align 4
+  store i32 -1, i32* %2, align 4
+  br label %53
+
+18:                                               ; preds = %12
+  %19 = load i32, i32* %3, align 4
+  %20 = icmp sgt i32 %19, 20
+  br i1 %20, label %21, label %24
+
+21:                                               ; preds = %18
+  call void @setErrorMessage(i8* getelementptr inbounds ([36 x i8], [36 x i8]* @.str.4, i64 0, i64 0))
+  %22 = load i32, i32* @recursionDepth, align 4
+  %23 = add nsw i32 %22, -1
+  store i32 %23, i32* @recursionDepth, align 4
+  store i32 -1, i32* %2, align 4
+  br label %53
+
+24:                                               ; preds = %18
+  %25 = load i32, i32* %3, align 4
+  %26 = icmp sle i32 %25, 1
+  br i1 %26, label %27, label %28
+
+27:                                               ; preds = %24
+  store i32 1, i32* %4, align 4
+  br label %49
+
+28:                                               ; preds = %24
+  %29 = load i32, i32* %3, align 4
+  %30 = sub nsw i32 %29, 1
+  %31 = call i32 @factorial(i32 %30)
+  store i32 %31, i32* %5, align 4
+  %32 = load i32, i32* %5, align 4
+  %33 = icmp eq i32 %32, -1
+  br i1 %33, label %34, label %37
+
+34:                                               ; preds = %28
+  %35 = load i32, i32* @recursionDepth, align 4
+  %36 = add nsw i32 %35, -1
+  store i32 %36, i32* @recursionDepth, align 4
+  store i32 -1, i32* %2, align 4
+  br label %53
+
+37:                                               ; preds = %28
+  %38 = load i32, i32* %5, align 4
+  %39 = load i32, i32* %3, align 4
+  %40 = sdiv i32 2147483647, %39
+  %41 = icmp sgt i32 %38, %40
+  br i1 %41, label %42, label %45
+
+42:                                               ; preds = %37
+  call void @setErrorMessage(i8* getelementptr inbounds ([31 x i8], [31 x i8]* @.str.5, i64 0, i64 0))
+  %43 = load i32, i32* @recursionDepth, align 4
+  %44 = add nsw i32 %43, -1
+  store i32 %44, i32* @recursionDepth, align 4
+  store i32 -1, i32* %2, align 4
+  br label %53
+
+45:                                               ; preds = %37
+  %46 = load i32, i32* %3, align 4
+  %47 = load i32, i32* %5, align 4
+  %48 = mul nsw i32 %46, %47
+  store i32 %48, i32* %4, align 4
+  br label %49
+
+49:                                               ; preds = %45, %27
+  %50 = load i32, i32* @recursionDepth, align 4
+  %51 = add nsw i32 %50, -1
+  store i32 %51, i32* @recursionDepth, align 4
+  %52 = load i32, i32* %4, align 4
+  store i32 %52, i32* %2, align 4
+  br label %53
+
+53:                                               ; preds = %49, %42, %34, %21, %15, %9
+  %54 = load i32, i32* %2, align 4
+  ret i32 %54
+}
+
+; Function Attrs: noinline nounwind optnone uwtable
+define dso_local %struct.DynamicArray* @createDynamicArray(i32 %0) #0 {
+  %2 = alloca %struct.DynamicArray*, align 8
+  %3 = alloca i32, align 4
+  %4 = alloca %struct.DynamicArray*, align 8
+  store i32 %0, i32* %3, align 4
+  %5 = load i32, i32* %3, align 4
+  %6 = icmp sle i32 %5, 0
+  br i1 %6, label %7, label %8
+
+7:                                                ; preds = %1
+  call void @setErrorMessage(i8* getelementptr inbounds ([25 x i8], [25 x i8]* @.str.6, i64 0, i64 0))
+  store %struct.DynamicArray* null, %struct.DynamicArray** %2, align 8
+  br label %44
+
+8:                                                ; preds = %1
+  %9 = load i32, i32* %3, align 4
+  %10 = icmp sgt i32 %9, 1000
+  br i1 %10, label %11, label %12
+
+11:                                               ; preds = %8
+  call void @setErrorMessage(i8* getelementptr inbounds ([46 x i8], [46 x i8]* @.str.7, i64 0, i64 0))
+  store %struct.DynamicArray* null, %struct.DynamicArray** %2, align 8
+  br label %44
+
+12:                                               ; preds = %8
+  %13 = call noalias i8* @malloc(i64 24) #6
+  %14 = bitcast i8* %13 to %struct.DynamicArray*
+  store %struct.DynamicArray* %14, %struct.DynamicArray** %4, align 8
+  %15 = load %struct.DynamicArray*, %struct.DynamicArray** %4, align 8
+  %16 = icmp ne %struct.DynamicArray* %15, null
+  br i1 %16, label %18, label %17
+
+17:                                               ; preds = %12
+  call void @setErrorMessage(i8* getelementptr inbounds ([49 x i8], [49 x i8]* @.str.8, i64 0, i64 0))
+  store %struct.DynamicArray* null, %struct.DynamicArray** %2, align 8
+  br label %44
+
+18:                                               ; preds = %12
+  %19 = load i32, i32* %3, align 4
+  %20 = sext i32 %19 to i64
+  %21 = mul i64 4, %20
+  %22 = call noalias i8* @malloc(i64 %21) #6
+  %23 = bitcast i8* %22 to i32*
+  %24 = load %struct.DynamicArray*, %struct.DynamicArray** %4, align 8
+  %25 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %24, i32 0, i32 0
+  store i32* %23, i32** %25, align 8
+  %26 = load %struct.DynamicArray*, %struct.DynamicArray** %4, align 8
+  %27 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %26, i32 0, i32 0
+  %28 = load i32*, i32** %27, align 8
+  %29 = icmp ne i32* %28, null
+  br i1 %29, label %33, label %30
+
+30:                                               ; preds = %18
+  %31 = load %struct.DynamicArray*, %struct.DynamicArray** %4, align 8
+  %32 = bitcast %struct.DynamicArray* %31 to i8*
+  call void @free(i8* %32) #6
+  call void @setErrorMessage(i8* getelementptr inbounds ([35 x i8], [35 x i8]* @.str.9, i64 0, i64 0))
+  store %struct.DynamicArray* null, %struct.DynamicArray** %2, align 8
+  br label %44
+
+33:                                               ; preds = %18
+  %34 = load %struct.DynamicArray*, %struct.DynamicArray** %4, align 8
+  %35 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %34, i32 0, i32 1
+  store i32 0, i32* %35, align 8
+  %36 = load i32, i32* %3, align 4
+  %37 = load %struct.DynamicArray*, %struct.DynamicArray** %4, align 8
+  %38 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %37, i32 0, i32 2
+  store i32 %36, i32* %38, align 4
+  %39 = load %struct.DynamicArray*, %struct.DynamicArray** %4, align 8
+  %40 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %39, i32 0, i32 3
+  store i32 1, i32* %40, align 8
+  %41 = load %struct.DynamicArray*, %struct.DynamicArray** %4, align 8
+  %42 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %41, i32 0, i32 4
+  store i32 0, i32* %42, align 4
+  %43 = load %struct.DynamicArray*, %struct.DynamicArray** %4, align 8
+  store %struct.DynamicArray* %43, %struct.DynamicArray** %2, align 8
+  br label %44
+
+44:                                               ; preds = %33, %30, %17, %11, %7
+  %45 = load %struct.DynamicArray*, %struct.DynamicArray** %2, align 8
+  ret %struct.DynamicArray* %45
+}
+
+; Function Attrs: nounwind
+declare dso_local noalias i8* @malloc(i64) #1
+
+; Function Attrs: noinline nounwind optnone uwtable
+define dso_local void @pushBack(%struct.DynamicArray* %0, i32 %1) #0 {
+  %3 = alloca %struct.DynamicArray*, align 8
+  %4 = alloca i32, align 4
+  %5 = alloca i32, align 4
+  %6 = alloca i32*, align 8
+  store %struct.DynamicArray* %0, %struct.DynamicArray** %3, align 8
+  store i32 %1, i32* %4, align 4
+  %7 = load %struct.DynamicArray*, %struct.DynamicArray** %3, align 8
+  %8 = icmp ne %struct.DynamicArray* %7, null
+  br i1 %8, label %10, label %9
+
+9:                                                ; preds = %2
+  call void @setErrorMessage(i8* getelementptr inbounds ([19 x i8], [19 x i8]* @.str.10, i64 0, i64 0))
+  br label %91
+
+10:                                               ; preds = %2
+  %11 = load %struct.DynamicArray*, %struct.DynamicArray** %3, align 8
+  %12 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %11, i32 0, i32 1
+  %13 = load i32, i32* %12, align 8
+  %14 = icmp sge i32 %13, 1000
+  br i1 %14, label %15, label %16
+
+15:                                               ; preds = %10
+  call void @setErrorMessage(i8* getelementptr inbounds ([25 x i8], [25 x i8]* @.str.11, i64 0, i64 0))
+  br label %91
+
+16:                                               ; preds = %10
+  %17 = load %struct.DynamicArray*, %struct.DynamicArray** %3, align 8
+  %18 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %17, i32 0, i32 1
+  %19 = load i32, i32* %18, align 8
+  %20 = load %struct.DynamicArray*, %struct.DynamicArray** %3, align 8
+  %21 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %20, i32 0, i32 2
+  %22 = load i32, i32* %21, align 4
+  %23 = icmp sge i32 %19, %22
+  br i1 %23, label %24, label %52
+
+24:                                               ; preds = %16
+  %25 = load %struct.DynamicArray*, %struct.DynamicArray** %3, align 8
+  %26 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %25, i32 0, i32 2
+  %27 = load i32, i32* %26, align 4
+  %28 = mul nsw i32 %27, 2
+  store i32 %28, i32* %5, align 4
+  %29 = load i32, i32* %5, align 4
+  %30 = icmp sgt i32 %29, 1000
+  br i1 %30, label %31, label %32
+
+31:                                               ; preds = %24
+  store i32 1000, i32* %5, align 4
+  br label %32
+
+32:                                               ; preds = %31, %24
+  %33 = load %struct.DynamicArray*, %struct.DynamicArray** %3, align 8
+  %34 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %33, i32 0, i32 0
+  %35 = load i32*, i32** %34, align 8
+  %36 = bitcast i32* %35 to i8*
+  %37 = load i32, i32* %5, align 4
+  %38 = sext i32 %37 to i64
+  %39 = mul i64 4, %38
+  %40 = call i8* @realloc(i8* %36, i64 %39) #6
+  %41 = bitcast i8* %40 to i32*
+  store i32* %41, i32** %6, align 8
+  %42 = load i32*, i32** %6, align 8
+  %43 = icmp ne i32* %42, null
+  br i1 %43, label %45, label %44
+
+44:                                               ; preds = %32
+  call void @setErrorMessage(i8* getelementptr inbounds ([27 x i8], [27 x i8]* @.str.12, i64 0, i64 0))
+  br label %91
+
+45:                                               ; preds = %32
+  %46 = load i32*, i32** %6, align 8
+  %47 = load %struct.DynamicArray*, %struct.DynamicArray** %3, align 8
+  %48 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %47, i32 0, i32 0
+  store i32* %46, i32** %48, align 8
+  %49 = load i32, i32* %5, align 4
+  %50 = load %struct.DynamicArray*, %struct.DynamicArray** %3, align 8
+  %51 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %50, i32 0, i32 2
+  store i32 %49, i32* %51, align 4
+  br label %52
+
+52:                                               ; preds = %45, %16
+  %53 = load %struct.DynamicArray*, %struct.DynamicArray** %3, align 8
+  %54 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %53, i32 0, i32 3
+  %55 = load i32, i32* %54, align 8
+  %56 = icmp ne i32 %55, 0
+  br i1 %56, label %57, label %78
+
+57:                                               ; preds = %52
+  %58 = load %struct.DynamicArray*, %struct.DynamicArray** %3, align 8
+  %59 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %58, i32 0, i32 1
+  %60 = load i32, i32* %59, align 8
+  %61 = icmp sgt i32 %60, 0
+  br i1 %61, label %62, label %78
+
+62:                                               ; preds = %57
+  %63 = load i32, i32* %4, align 4
+  %64 = load %struct.DynamicArray*, %struct.DynamicArray** %3, align 8
+  %65 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %64, i32 0, i32 0
+  %66 = load i32*, i32** %65, align 8
+  %67 = load %struct.DynamicArray*, %struct.DynamicArray** %3, align 8
+  %68 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %67, i32 0, i32 1
+  %69 = load i32, i32* %68, align 8
+  %70 = sub nsw i32 %69, 1
+  %71 = sext i32 %70 to i64
+  %72 = getelementptr inbounds i32, i32* %66, i64 %71
+  %73 = load i32, i32* %72, align 4
+  %74 = icmp slt i32 %63, %73
+  br i1 %74, label %75, label %78
+
+75:                                               ; preds = %62
+  %76 = load %struct.DynamicArray*, %struct.DynamicArray** %3, align 8
+  %77 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %76, i32 0, i32 3
+  store i32 0, i32* %77, align 8
+  br label %78
+
+78:                                               ; preds = %75, %62, %57, %52
+  %79 = load i32, i32* %4, align 4
+  %80 = load %struct.DynamicArray*, %struct.DynamicArray** %3, align 8
+  %81 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %80, i32 0, i32 0
+  %82 = load i32*, i32** %81, align 8
+  %83 = load %struct.DynamicArray*, %struct.DynamicArray** %3, align 8
+  %84 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %83, i32 0, i32 1
+  %85 = load i32, i32* %84, align 8
+  %86 = add nsw i32 %85, 1
+  store i32 %86, i32* %84, align 8
+  %87 = sext i32 %85 to i64
+  %88 = getelementptr inbounds i32, i32* %82, i64 %87
+  store i32 %79, i32* %88, align 4
+  %89 = load %struct.DynamicArray*, %struct.DynamicArray** %3, align 8
+  %90 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %89, i32 0, i32 4
+  store i32 1, i32* %90, align 4
+  br label %91
+
+91:                                               ; preds = %78, %44, %15, %9
+  ret void
+}
+
+; Function Attrs: nounwind
+declare dso_local i8* @realloc(i8*, i64) #1
+
+; Function Attrs: noinline nounwind optnone uwtable
+define dso_local void @quickSort(i32* %0, i32 %1, i32 %2, i32* %3) #0 {
+  %5 = alloca i32*, align 8
+  %6 = alloca i32, align 4
+  %7 = alloca i32, align 4
+  %8 = alloca i32*, align 8
+  %9 = alloca i32, align 4
+  %10 = alloca i32, align 4
+  %11 = alloca i32, align 4
+  %12 = alloca i32, align 4
+  %13 = alloca i32, align 4
+  %14 = alloca i32, align 4
+  store i32* %0, i32** %5, align 8
+  store i32 %1, i32* %6, align 4
+  store i32 %2, i32* %7, align 4
+  store i32* %3, i32** %8, align 8
+  %15 = load i32, i32* @recursionDepth, align 4
+  %16 = add nsw i32 %15, 1
+  store i32 %16, i32* @recursionDepth, align 4
+  %17 = icmp sgt i32 %16, 1000
+  br i1 %17, label %18, label %22
+
+18:                                               ; preds = %4
+  call void @setErrorMessage(i8* getelementptr inbounds ([46 x i8], [46 x i8]* @.str.13, i64 0, i64 0))
+  %19 = load i32*, i32** %8, align 8
+  store i32 1, i32* %19, align 4
+  %20 = load i32, i32* @recursionDepth, align 4
+  %21 = add nsw i32 %20, -1
+  store i32 %21, i32* @recursionDepth, align 4
+  br label %247
+
+22:                                               ; preds = %4
+  %23 = load i32*, i32** %5, align 8
+  %24 = icmp ne i32* %23, null
+  br i1 %24, label %29, label %25
+
+25:                                               ; preds = %22
+  call void @setErrorMessage(i8* getelementptr inbounds ([32 x i8], [32 x i8]* @.str.14, i64 0, i64 0))
+  %26 = load i32*, i32** %8, align 8
+  store i32 1, i32* %26, align 4
+  %27 = load i32, i32* @recursionDepth, align 4
+  %28 = add nsw i32 %27, -1
+  store i32 %28, i32* @recursionDepth, align 4
+  br label %247
+
+29:                                               ; preds = %22
+  %30 = load i32, i32* %6, align 4
+  %31 = icmp slt i32 %30, 0
+  br i1 %31, label %41, label %32
+
+32:                                               ; preds = %29
+  %33 = load i32, i32* %7, align 4
+  %34 = icmp slt i32 %33, 0
+  br i1 %34, label %41, label %35
+
+35:                                               ; preds = %32
+  %36 = load i32, i32* %6, align 4
+  %37 = icmp sge i32 %36, 1000
+  br i1 %37, label %41, label %38
+
+38:                                               ; preds = %35
+  %39 = load i32, i32* %7, align 4
+  %40 = icmp sge i32 %39, 1000
+  br i1 %40, label %41, label %45
+
+41:                                               ; preds = %38, %35, %32, %29
+  call void @setErrorMessage(i8* getelementptr inbounds ([39 x i8], [39 x i8]* @.str.15, i64 0, i64 0))
+  %42 = load i32*, i32** %8, align 8
+  store i32 1, i32* %42, align 4
+  %43 = load i32, i32* @recursionDepth, align 4
+  %44 = add nsw i32 %43, -1
+  store i32 %44, i32* @recursionDepth, align 4
+  br label %247
+
+45:                                               ; preds = %38
+  %46 = load i32, i32* %6, align 4
+  %47 = load i32, i32* %7, align 4
+  %48 = icmp slt i32 %46, %47
+  br i1 %48, label %49, label %244
+
+49:                                               ; preds = %45
+  %50 = load i32, i32* %6, align 4
+  %51 = load i32, i32* %7, align 4
+  %52 = load i32, i32* %6, align 4
+  %53 = sub nsw i32 %51, %52
+  %54 = sdiv i32 %53, 2
+  %55 = add nsw i32 %50, %54
+  store i32 %55, i32* %9, align 4
+  %56 = load i32*, i32** %5, align 8
+  %57 = load i32, i32* %6, align 4
+  %58 = sext i32 %57 to i64
+  %59 = getelementptr inbounds i32, i32* %56, i64 %58
+  %60 = load i32, i32* %59, align 4
+  %61 = load i32*, i32** %5, align 8
+  %62 = load i32, i32* %9, align 4
+  %63 = sext i32 %62 to i64
+  %64 = getelementptr inbounds i32, i32* %61, i64 %63
+  %65 = load i32, i32* %64, align 4
+  %66 = icmp sle i32 %60, %65
+  br i1 %66, label %67, label %99
+
+67:                                               ; preds = %49
+  %68 = load i32*, i32** %5, align 8
+  %69 = load i32, i32* %9, align 4
+  %70 = sext i32 %69 to i64
+  %71 = getelementptr inbounds i32, i32* %68, i64 %70
+  %72 = load i32, i32* %71, align 4
+  %73 = load i32*, i32** %5, align 8
+  %74 = load i32, i32* %7, align 4
+  %75 = sext i32 %74 to i64
+  %76 = getelementptr inbounds i32, i32* %73, i64 %75
+  %77 = load i32, i32* %76, align 4
+  %78 = icmp sle i32 %72, %77
+  br i1 %78, label %79, label %81
+
+79:                                               ; preds = %67
+  %80 = load i32, i32* %9, align 4
+  store i32 %80, i32* %10, align 4
+  br label %98
+
+81:                                               ; preds = %67
+  %82 = load i32*, i32** %5, align 8
+  %83 = load i32, i32* %6, align 4
+  %84 = sext i32 %83 to i64
+  %85 = getelementptr inbounds i32, i32* %82, i64 %84
+  %86 = load i32, i32* %85, align 4
+  %87 = load i32*, i32** %5, align 8
+  %88 = load i32, i32* %7, align 4
+  %89 = sext i32 %88 to i64
+  %90 = getelementptr inbounds i32, i32* %87, i64 %89
+  %91 = load i32, i32* %90, align 4
+  %92 = icmp sle i32 %86, %91
+  br i1 %92, label %93, label %95
+
+93:                                               ; preds = %81
+  %94 = load i32, i32* %7, align 4
+  store i32 %94, i32* %10, align 4
+  br label %97
+
+95:                                               ; preds = %81
+  %96 = load i32, i32* %6, align 4
+  store i32 %96, i32* %10, align 4
+  br label %97
+
+97:                                               ; preds = %95, %93
+  br label %98
+
+98:                                               ; preds = %97, %79
+  br label %131
+
+99:                                               ; preds = %49
+  %100 = load i32*, i32** %5, align 8
+  %101 = load i32, i32* %6, align 4
+  %102 = sext i32 %101 to i64
+  %103 = getelementptr inbounds i32, i32* %100, i64 %102
+  %104 = load i32, i32* %103, align 4
+  %105 = load i32*, i32** %5, align 8
+  %106 = load i32, i32* %7, align 4
+  %107 = sext i32 %106 to i64
+  %108 = getelementptr inbounds i32, i32* %105, i64 %107
+  %109 = load i32, i32* %108, align 4
+  %110 = icmp sle i32 %104, %109
+  br i1 %110, label %111, label %113
+
+111:                                              ; preds = %99
+  %112 = load i32, i32* %6, align 4
+  store i32 %112, i32* %10, align 4
+  br label %130
+
+113:                                              ; preds = %99
+  %114 = load i32*, i32** %5, align 8
+  %115 = load i32, i32* %9, align 4
+  %116 = sext i32 %115 to i64
+  %117 = getelementptr inbounds i32, i32* %114, i64 %116
+  %118 = load i32, i32* %117, align 4
+  %119 = load i32*, i32** %5, align 8
+  %120 = load i32, i32* %7, align 4
+  %121 = sext i32 %120 to i64
+  %122 = getelementptr inbounds i32, i32* %119, i64 %121
+  %123 = load i32, i32* %122, align 4
+  %124 = icmp sle i32 %118, %123
+  br i1 %124, label %125, label %127
+
+125:                                              ; preds = %113
+  %126 = load i32, i32* %7, align 4
+  store i32 %126, i32* %10, align 4
+  br label %129
+
+127:                                              ; preds = %113
+  %128 = load i32, i32* %9, align 4
+  store i32 %128, i32* %10, align 4
+  br label %129
+
+129:                                              ; preds = %127, %125
+  br label %130
+
+130:                                              ; preds = %129, %111
+  br label %131
+
+131:                                              ; preds = %130, %98
+  %132 = load i32*, i32** %5, align 8
+  %133 = load i32, i32* %7, align 4
+  %134 = sext i32 %133 to i64
+  %135 = getelementptr inbounds i32, i32* %132, i64 %134
+  %136 = load i32, i32* %135, align 4
+  store i32 %136, i32* %11, align 4
+  %137 = load i32*, i32** %5, align 8
+  %138 = load i32, i32* %10, align 4
+  %139 = sext i32 %138 to i64
+  %140 = getelementptr inbounds i32, i32* %137, i64 %139
+  %141 = load i32, i32* %140, align 4
+  %142 = load i32*, i32** %5, align 8
+  %143 = load i32, i32* %7, align 4
+  %144 = sext i32 %143 to i64
+  %145 = getelementptr inbounds i32, i32* %142, i64 %144
+  store i32 %141, i32* %145, align 4
+  %146 = load i32, i32* %11, align 4
+  %147 = load i32*, i32** %5, align 8
+  %148 = load i32, i32* %10, align 4
+  %149 = sext i32 %148 to i64
+  %150 = getelementptr inbounds i32, i32* %147, i64 %149
+  store i32 %146, i32* %150, align 4
+  %151 = load i32*, i32** %5, align 8
+  %152 = load i32, i32* %7, align 4
+  %153 = sext i32 %152 to i64
+  %154 = getelementptr inbounds i32, i32* %151, i64 %153
+  %155 = load i32, i32* %154, align 4
+  store i32 %155, i32* %12, align 4
+  %156 = load i32, i32* %6, align 4
+  %157 = sub nsw i32 %156, 1
+  store i32 %157, i32* %13, align 4
+  %158 = load i32, i32* %6, align 4
+  store i32 %158, i32* %14, align 4
+  br label %159
+
+159:                                              ; preds = %196, %131
+  %160 = load i32, i32* %14, align 4
+  %161 = load i32, i32* %7, align 4
+  %162 = icmp slt i32 %160, %161
+  br i1 %162, label %163, label %199
+
+163:                                              ; preds = %159
+  %164 = load i32*, i32** %5, align 8
+  %165 = load i32, i32* %14, align 4
+  %166 = sext i32 %165 to i64
+  %167 = getelementptr inbounds i32, i32* %164, i64 %166
+  %168 = load i32, i32* %167, align 4
+  %169 = load i32, i32* %12, align 4
+  %170 = icmp sle i32 %168, %169
+  br i1 %170, label %171, label %195
+
+171:                                              ; preds = %163
+  %172 = load i32, i32* %13, align 4
+  %173 = add nsw i32 %172, 1
+  store i32 %173, i32* %13, align 4
+  %174 = load i32*, i32** %5, align 8
+  %175 = load i32, i32* %13, align 4
+  %176 = sext i32 %175 to i64
+  %177 = getelementptr inbounds i32, i32* %174, i64 %176
+  %178 = load i32, i32* %177, align 4
+  store i32 %178, i32* %11, align 4
+  %179 = load i32*, i32** %5, align 8
+  %180 = load i32, i32* %14, align 4
+  %181 = sext i32 %180 to i64
+  %182 = getelementptr inbounds i32, i32* %179, i64 %181
+  %183 = load i32, i32* %182, align 4
+  %184 = load i32*, i32** %5, align 8
+  %185 = load i32, i32* %13, align 4
+  %186 = sext i32 %185 to i64
+  %187 = getelementptr inbounds i32, i32* %184, i64 %186
+  store i32 %183, i32* %187, align 4
+  %188 = load i32, i32* %11, align 4
+  %189 = load i32*, i32** %5, align 8
+  %190 = load i32, i32* %14, align 4
+  %191 = sext i32 %190 to i64
+  %192 = getelementptr inbounds i32, i32* %189, i64 %191
+  store i32 %188, i32* %192, align 4
+  %193 = load i32, i32* @globalCounter, align 4
+  %194 = add nsw i32 %193, 1
+  store i32 %194, i32* @globalCounter, align 4
+  br label %195
+
+195:                                              ; preds = %171, %163
+  br label %196
+
+196:                                              ; preds = %195
+  %197 = load i32, i32* %14, align 4
+  %198 = add nsw i32 %197, 1
+  store i32 %198, i32* %14, align 4
+  br label %159
+
+199:                                              ; preds = %159
+  %200 = load i32*, i32** %5, align 8
+  %201 = load i32, i32* %13, align 4
+  %202 = add nsw i32 %201, 1
+  %203 = sext i32 %202 to i64
+  %204 = getelementptr inbounds i32, i32* %200, i64 %203
+  %205 = load i32, i32* %204, align 4
+  store i32 %205, i32* %11, align 4
+  %206 = load i32*, i32** %5, align 8
+  %207 = load i32, i32* %7, align 4
+  %208 = sext i32 %207 to i64
+  %209 = getelementptr inbounds i32, i32* %206, i64 %208
+  %210 = load i32, i32* %209, align 4
+  %211 = load i32*, i32** %5, align 8
+  %212 = load i32, i32* %13, align 4
+  %213 = add nsw i32 %212, 1
+  %214 = sext i32 %213 to i64
+  %215 = getelementptr inbounds i32, i32* %211, i64 %214
+  store i32 %210, i32* %215, align 4
+  %216 = load i32, i32* %11, align 4
+  %217 = load i32*, i32** %5, align 8
+  %218 = load i32, i32* %7, align 4
+  %219 = sext i32 %218 to i64
+  %220 = getelementptr inbounds i32, i32* %217, i64 %219
+  store i32 %216, i32* %220, align 4
+  %221 = load i32*, i32** %5, align 8
+  %222 = load i32, i32* %6, align 4
+  %223 = load i32, i32* %13, align 4
+  %224 = load i32*, i32** %8, align 8
+  call void @quickSort(i32* %221, i32 %222, i32 %223, i32* %224)
+  %225 = load i32*, i32** %8, align 8
+  %226 = load i32, i32* %225, align 4
+  %227 = icmp ne i32 %226, 0
+  br i1 %227, label %228, label %231
+
+228:                                              ; preds = %199
+  %229 = load i32, i32* @recursionDepth, align 4
+  %230 = add nsw i32 %229, -1
+  store i32 %230, i32* @recursionDepth, align 4
+  br label %247
+
+231:                                              ; preds = %199
+  %232 = load i32*, i32** %5, align 8
+  %233 = load i32, i32* %13, align 4
+  %234 = add nsw i32 %233, 2
+  %235 = load i32, i32* %7, align 4
+  %236 = load i32*, i32** %8, align 8
+  call void @quickSort(i32* %232, i32 %234, i32 %235, i32* %236)
+  %237 = load i32*, i32** %8, align 8
+  %238 = load i32, i32* %237, align 4
+  %239 = icmp ne i32 %238, 0
+  br i1 %239, label %240, label %243
+
+240:                                              ; preds = %231
+  %241 = load i32, i32* @recursionDepth, align 4
+  %242 = add nsw i32 %241, -1
+  store i32 %242, i32* @recursionDepth, align 4
+  br label %247
+
+243:                                              ; preds = %231
+  br label %244
+
+244:                                              ; preds = %243, %45
+  %245 = load i32, i32* @recursionDepth, align 4
+  %246 = add nsw i32 %245, -1
+  store i32 %246, i32* @recursionDepth, align 4
+  br label %247
+
+247:                                              ; preds = %244, %240, %228, %41, %25, %18
+  ret void
+}
+
+; Function Attrs: noinline nounwind optnone uwtable
+define dso_local %struct.Matrix* @createMatrix(i32 %0, i32 %1) #0 {
+  %3 = alloca %struct.Matrix*, align 8
+  %4 = alloca i32, align 4
+  %5 = alloca i32, align 4
+  %6 = alloca %struct.Matrix*, align 8
+  %7 = alloca i32, align 4
+  %8 = alloca i32, align 4
+  store i32 %0, i32* %4, align 4
+  store i32 %1, i32* %5, align 4
+  %9 = load i32, i32* %4, align 4
+  %10 = icmp slt i32 %9, 1
+  br i1 %10, label %14, label %11
+
+11:                                               ; preds = %2
+  %12 = load i32, i32* %5, align 4
+  %13 = icmp slt i32 %12, 1
+  br i1 %13, label %14, label %15
+
+14:                                               ; preds = %11, %2
+  call void @setErrorMessage(i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.str.16, i64 0, i64 0))
+  store %struct.Matrix* null, %struct.Matrix** %3, align 8
+  br label %111
+
+15:                                               ; preds = %11
+  %16 = load i32, i32* %4, align 4
+  %17 = icmp sgt i32 %16, 100
+  br i1 %17, label %21, label %18
+
+18:                                               ; preds = %15
+  %19 = load i32, i32* %5, align 4
+  %20 = icmp sgt i32 %19, 100
+  br i1 %20, label %21, label %22
+
+21:                                               ; preds = %18, %15
+  call void @setErrorMessage(i8* getelementptr inbounds ([46 x i8], [46 x i8]* @.str.17, i64 0, i64 0))
+  store %struct.Matrix* null, %struct.Matrix** %3, align 8
+  br label %111
+
+22:                                               ; preds = %18
+  %23 = call noalias i8* @malloc(i64 32) #6
+  %24 = bitcast i8* %23 to %struct.Matrix*
+  store %struct.Matrix* %24, %struct.Matrix** %6, align 8
+  %25 = load %struct.Matrix*, %struct.Matrix** %6, align 8
+  %26 = icmp ne %struct.Matrix* %25, null
+  br i1 %26, label %28, label %27
+
+27:                                               ; preds = %22
+  call void @setErrorMessage(i8* getelementptr inbounds ([43 x i8], [43 x i8]* @.str.18, i64 0, i64 0))
+  store %struct.Matrix* null, %struct.Matrix** %3, align 8
+  br label %111
+
+28:                                               ; preds = %22
+  %29 = load i32, i32* %4, align 4
+  %30 = load %struct.Matrix*, %struct.Matrix** %6, align 8
+  %31 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %30, i32 0, i32 1
+  store i32 %29, i32* %31, align 8
+  %32 = load i32, i32* %5, align 4
+  %33 = load %struct.Matrix*, %struct.Matrix** %6, align 8
+  %34 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %33, i32 0, i32 2
+  store i32 %32, i32* %34, align 4
+  %35 = load i32, i32* %4, align 4
+  %36 = load i32, i32* %5, align 4
+  %37 = icmp eq i32 %35, %36
+  %38 = zext i1 %37 to i32
+  %39 = load %struct.Matrix*, %struct.Matrix** %6, align 8
+  %40 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %39, i32 0, i32 3
+  store i32 %38, i32* %40, align 8
+  %41 = load %struct.Matrix*, %struct.Matrix** %6, align 8
+  %42 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %41, i32 0, i32 4
+  store double 0.000000e+00, double* %42, align 8
+  %43 = load i32, i32* %4, align 4
+  %44 = sext i32 %43 to i64
+  %45 = mul i64 %44, 8
+  %46 = call noalias i8* @malloc(i64 %45) #6
+  %47 = bitcast i8* %46 to i32**
+  %48 = load %struct.Matrix*, %struct.Matrix** %6, align 8
+  %49 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %48, i32 0, i32 0
+  store i32** %47, i32*** %49, align 8
+  %50 = load %struct.Matrix*, %struct.Matrix** %6, align 8
+  %51 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %50, i32 0, i32 0
+  %52 = load i32**, i32*** %51, align 8
+  %53 = icmp ne i32** %52, null
+  br i1 %53, label %57, label %54
+
+54:                                               ; preds = %28
+  %55 = load %struct.Matrix*, %struct.Matrix** %6, align 8
+  %56 = bitcast %struct.Matrix* %55 to i8*
+  call void @free(i8* %56) #6
+  call void @setErrorMessage(i8* getelementptr inbounds ([41 x i8], [41 x i8]* @.str.19, i64 0, i64 0))
+  store %struct.Matrix* null, %struct.Matrix** %3, align 8
+  br label %111
+
+57:                                               ; preds = %28
+  store i32 0, i32* %7, align 4
+  br label %58
+
+58:                                               ; preds = %106, %57
+  %59 = load i32, i32* %7, align 4
+  %60 = load i32, i32* %4, align 4
+  %61 = icmp slt i32 %59, %60
+  br i1 %61, label %62, label %109
+
+62:                                               ; preds = %58
+  %63 = load i32, i32* %5, align 4
+  %64 = sext i32 %63 to i64
+  %65 = call noalias i8* @calloc(i64 %64, i64 4) #6
+  %66 = bitcast i8* %65 to i32*
+  %67 = load %struct.Matrix*, %struct.Matrix** %6, align 8
+  %68 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %67, i32 0, i32 0
+  %69 = load i32**, i32*** %68, align 8
+  %70 = load i32, i32* %7, align 4
+  %71 = sext i32 %70 to i64
+  %72 = getelementptr inbounds i32*, i32** %69, i64 %71
+  store i32* %66, i32** %72, align 8
+  %73 = load %struct.Matrix*, %struct.Matrix** %6, align 8
+  %74 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %73, i32 0, i32 0
+  %75 = load i32**, i32*** %74, align 8
+  %76 = load i32, i32* %7, align 4
+  %77 = sext i32 %76 to i64
+  %78 = getelementptr inbounds i32*, i32** %75, i64 %77
+  %79 = load i32*, i32** %78, align 8
+  %80 = icmp ne i32* %79, null
+  br i1 %80, label %105, label %81
+
+81:                                               ; preds = %62
+  store i32 0, i32* %8, align 4
+  br label %82
+
+82:                                               ; preds = %95, %81
+  %83 = load i32, i32* %8, align 4
+  %84 = load i32, i32* %7, align 4
+  %85 = icmp slt i32 %83, %84
+  br i1 %85, label %86, label %98
+
+86:                                               ; preds = %82
+  %87 = load %struct.Matrix*, %struct.Matrix** %6, align 8
+  %88 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %87, i32 0, i32 0
+  %89 = load i32**, i32*** %88, align 8
+  %90 = load i32, i32* %8, align 4
+  %91 = sext i32 %90 to i64
+  %92 = getelementptr inbounds i32*, i32** %89, i64 %91
+  %93 = load i32*, i32** %92, align 8
+  %94 = bitcast i32* %93 to i8*
+  call void @free(i8* %94) #6
+  br label %95
+
+95:                                               ; preds = %86
+  %96 = load i32, i32* %8, align 4
+  %97 = add nsw i32 %96, 1
+  store i32 %97, i32* %8, align 4
+  br label %82
+
+98:                                               ; preds = %82
+  %99 = load %struct.Matrix*, %struct.Matrix** %6, align 8
+  %100 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %99, i32 0, i32 0
+  %101 = load i32**, i32*** %100, align 8
+  %102 = bitcast i32** %101 to i8*
+  call void @free(i8* %102) #6
+  %103 = load %struct.Matrix*, %struct.Matrix** %6, align 8
+  %104 = bitcast %struct.Matrix* %103 to i8*
+  call void @free(i8* %104) #6
+  call void @setErrorMessage(i8* getelementptr inbounds ([44 x i8], [44 x i8]* @.str.20, i64 0, i64 0))
+  store %struct.Matrix* null, %struct.Matrix** %3, align 8
+  br label %111
+
+105:                                              ; preds = %62
+  br label %106
+
+106:                                              ; preds = %105
+  %107 = load i32, i32* %7, align 4
+  %108 = add nsw i32 %107, 1
+  store i32 %108, i32* %7, align 4
+  br label %58
+
+109:                                              ; preds = %58
+  %110 = load %struct.Matrix*, %struct.Matrix** %6, align 8
+  store %struct.Matrix* %110, %struct.Matrix** %3, align 8
+  br label %111
+
+111:                                              ; preds = %109, %98, %54, %27, %21, %14
+  %112 = load %struct.Matrix*, %struct.Matrix** %3, align 8
+  ret %struct.Matrix* %112
+}
+
+; Function Attrs: nounwind
+declare dso_local noalias i8* @calloc(i64, i64) #1
+
+; Function Attrs: noinline nounwind optnone uwtable
+define dso_local %struct.Matrix* @multiplyMatrices(%struct.Matrix* %0, %struct.Matrix* %1) #0 {
+  %3 = alloca %struct.Matrix*, align 8
+  %4 = alloca %struct.Matrix*, align 8
+  %5 = alloca %struct.Matrix*, align 8
+  %6 = alloca %struct.Matrix*, align 8
+  %7 = alloca i64, align 8
+  %8 = alloca i32, align 4
+  %9 = alloca i32, align 4
+  %10 = alloca i64, align 8
+  %11 = alloca i32, align 4
+  %12 = alloca i64, align 8
+  %13 = alloca i32, align 4
+  store %struct.Matrix* %0, %struct.Matrix** %4, align 8
+  store %struct.Matrix* %1, %struct.Matrix** %5, align 8
+  %14 = load %struct.Matrix*, %struct.Matrix** %4, align 8
+  %15 = icmp ne %struct.Matrix* %14, null
+  br i1 %15, label %16, label %19
+
+16:                                               ; preds = %2
+  %17 = load %struct.Matrix*, %struct.Matrix** %5, align 8
+  %18 = icmp ne %struct.Matrix* %17, null
+  br i1 %18, label %20, label %19
+
+19:                                               ; preds = %16, %2
+  call void @setErrorMessage(i8* getelementptr inbounds ([20 x i8], [20 x i8]* @.str.21, i64 0, i64 0))
+  store %struct.Matrix* null, %struct.Matrix** %3, align 8
+  br label %209
+
+20:                                               ; preds = %16
+  %21 = load %struct.Matrix*, %struct.Matrix** %4, align 8
+  %22 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %21, i32 0, i32 0
+  %23 = load i32**, i32*** %22, align 8
+  %24 = icmp ne i32** %23, null
+  br i1 %24, label %25, label %30
+
+25:                                               ; preds = %20
+  %26 = load %struct.Matrix*, %struct.Matrix** %5, align 8
+  %27 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %26, i32 0, i32 0
+  %28 = load i32**, i32*** %27, align 8
+  %29 = icmp ne i32** %28, null
+  br i1 %29, label %31, label %30
+
+30:                                               ; preds = %25, %20
+  call void @setErrorMessage(i8* getelementptr inbounds ([20 x i8], [20 x i8]* @.str.22, i64 0, i64 0))
+  store %struct.Matrix* null, %struct.Matrix** %3, align 8
+  br label %209
+
+31:                                               ; preds = %25
+  %32 = load %struct.Matrix*, %struct.Matrix** %4, align 8
+  %33 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %32, i32 0, i32 2
+  %34 = load i32, i32* %33, align 4
+  %35 = load %struct.Matrix*, %struct.Matrix** %5, align 8
+  %36 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %35, i32 0, i32 1
+  %37 = load i32, i32* %36, align 8
+  %38 = icmp ne i32 %34, %37
+  br i1 %38, label %39, label %40
+
+39:                                               ; preds = %31
+  call void @setErrorMessage(i8* getelementptr inbounds ([45 x i8], [45 x i8]* @.str.23, i64 0, i64 0))
+  store %struct.Matrix* null, %struct.Matrix** %3, align 8
+  br label %209
+
+40:                                               ; preds = %31
+  %41 = load %struct.Matrix*, %struct.Matrix** %4, align 8
+  %42 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %41, i32 0, i32 2
+  %43 = load i32, i32* %42, align 4
+  %44 = icmp sgt i32 %43, 100
+  br i1 %44, label %50, label %45
+
+45:                                               ; preds = %40
+  %46 = load %struct.Matrix*, %struct.Matrix** %5, align 8
+  %47 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %46, i32 0, i32 1
+  %48 = load i32, i32* %47, align 8
+  %49 = icmp sgt i32 %48, 100
+  br i1 %49, label %50, label %51
+
+50:                                               ; preds = %45, %40
+  call void @setErrorMessage(i8* getelementptr inbounds ([46 x i8], [46 x i8]* @.str.17, i64 0, i64 0))
+  store %struct.Matrix* null, %struct.Matrix** %3, align 8
+  br label %209
+
+51:                                               ; preds = %45
+  %52 = load %struct.Matrix*, %struct.Matrix** %4, align 8
+  %53 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %52, i32 0, i32 1
+  %54 = load i32, i32* %53, align 8
+  %55 = load %struct.Matrix*, %struct.Matrix** %5, align 8
+  %56 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %55, i32 0, i32 2
+  %57 = load i32, i32* %56, align 4
+  %58 = call %struct.Matrix* @createMatrix(i32 %54, i32 %57)
+  store %struct.Matrix* %58, %struct.Matrix** %6, align 8
+  %59 = load %struct.Matrix*, %struct.Matrix** %6, align 8
+  %60 = icmp ne %struct.Matrix* %59, null
+  br i1 %60, label %62, label %61
+
+61:                                               ; preds = %51
+  store %struct.Matrix* null, %struct.Matrix** %3, align 8
+  br label %209
+
+62:                                               ; preds = %51
+  store i64 0, i64* %7, align 8
+  store i32 0, i32* %8, align 4
+  br label %63
+
+63:                                               ; preds = %194, %62
+  %64 = load i32, i32* %8, align 4
+  %65 = load %struct.Matrix*, %struct.Matrix** %4, align 8
+  %66 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %65, i32 0, i32 1
+  %67 = load i32, i32* %66, align 8
+  %68 = icmp slt i32 %64, %67
+  br i1 %68, label %69, label %197
+
+69:                                               ; preds = %63
+  store i32 0, i32* %9, align 4
+  br label %70
+
+70:                                               ; preds = %190, %69
+  %71 = load i32, i32* %9, align 4
+  %72 = load %struct.Matrix*, %struct.Matrix** %5, align 8
+  %73 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %72, i32 0, i32 2
+  %74 = load i32, i32* %73, align 4
+  %75 = icmp slt i32 %71, %74
+  br i1 %75, label %76, label %193
+
+76:                                               ; preds = %70
+  store i64 0, i64* %10, align 8
+  store i32 0, i32* %11, align 4
+  br label %77
+
+77:                                               ; preds = %144, %76
+  %78 = load i32, i32* %11, align 4
+  %79 = load %struct.Matrix*, %struct.Matrix** %4, align 8
+  %80 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %79, i32 0, i32 2
+  %81 = load i32, i32* %80, align 4
+  %82 = icmp slt i32 %78, %81
+  br i1 %82, label %83, label %147
+
+83:                                               ; preds = %77
+  %84 = load %struct.Matrix*, %struct.Matrix** %4, align 8
+  %85 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %84, i32 0, i32 0
+  %86 = load i32**, i32*** %85, align 8
+  %87 = load i32, i32* %8, align 4
+  %88 = sext i32 %87 to i64
+  %89 = getelementptr inbounds i32*, i32** %86, i64 %88
+  %90 = load i32*, i32** %89, align 8
+  %91 = load i32, i32* %11, align 4
+  %92 = sext i32 %91 to i64
+  %93 = getelementptr inbounds i32, i32* %90, i64 %92
+  %94 = load i32, i32* %93, align 4
+  %95 = sext i32 %94 to i64
+  %96 = load %struct.Matrix*, %struct.Matrix** %5, align 8
+  %97 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %96, i32 0, i32 0
+  %98 = load i32**, i32*** %97, align 8
+  %99 = load i32, i32* %11, align 4
+  %100 = sext i32 %99 to i64
+  %101 = getelementptr inbounds i32*, i32** %98, i64 %100
+  %102 = load i32*, i32** %101, align 8
+  %103 = load i32, i32* %9, align 4
+  %104 = sext i32 %103 to i64
+  %105 = getelementptr inbounds i32, i32* %102, i64 %104
+  %106 = load i32, i32* %105, align 4
+  %107 = sext i32 %106 to i64
+  %108 = mul nsw i64 %95, %107
+  store i64 %108, i64* %12, align 8
+  %109 = load i64, i64* %12, align 8
+  %110 = load i64, i64* %10, align 8
+  %111 = add nsw i64 %110, %109
+  store i64 %111, i64* %10, align 8
+  %112 = load i64, i64* %10, align 8
+  %113 = icmp sgt i64 %112, 2147483647
+  br i1 %113, label %117, label %114
+
+114:                                              ; preds = %83
+  %115 = load i64, i64* %10, align 8
+  %116 = icmp slt i64 %115, -2147483648
+  br i1 %116, label %117, label %143
+
+117:                                              ; preds = %114, %83
+  call void @setErrorMessage(i8* getelementptr inbounds ([42 x i8], [42 x i8]* @.str.24, i64 0, i64 0))
+  store i32 0, i32* %13, align 4
+  br label %118
+
+118:                                              ; preds = %133, %117
+  %119 = load i32, i32* %13, align 4
+  %120 = load %struct.Matrix*, %struct.Matrix** %6, align 8
+  %121 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %120, i32 0, i32 1
+  %122 = load i32, i32* %121, align 8
+  %123 = icmp slt i32 %119, %122
+  br i1 %123, label %124, label %136
+
+124:                                              ; preds = %118
+  %125 = load %struct.Matrix*, %struct.Matrix** %6, align 8
+  %126 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %125, i32 0, i32 0
+  %127 = load i32**, i32*** %126, align 8
+  %128 = load i32, i32* %13, align 4
+  %129 = sext i32 %128 to i64
+  %130 = getelementptr inbounds i32*, i32** %127, i64 %129
+  %131 = load i32*, i32** %130, align 8
+  %132 = bitcast i32* %131 to i8*
+  call void @free(i8* %132) #6
+  br label %133
+
+133:                                              ; preds = %124
+  %134 = load i32, i32* %13, align 4
+  %135 = add nsw i32 %134, 1
+  store i32 %135, i32* %13, align 4
+  br label %118
+
+136:                                              ; preds = %118
+  %137 = load %struct.Matrix*, %struct.Matrix** %6, align 8
+  %138 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %137, i32 0, i32 0
+  %139 = load i32**, i32*** %138, align 8
+  %140 = bitcast i32** %139 to i8*
+  call void @free(i8* %140) #6
+  %141 = load %struct.Matrix*, %struct.Matrix** %6, align 8
+  %142 = bitcast %struct.Matrix* %141 to i8*
+  call void @free(i8* %142) #6
+  store %struct.Matrix* null, %struct.Matrix** %3, align 8
+  br label %209
+
+143:                                              ; preds = %114
+  br label %144
+
+144:                                              ; preds = %143
+  %145 = load i32, i32* %11, align 4
+  %146 = add nsw i32 %145, 1
+  store i32 %146, i32* %11, align 4
+  br label %77
+
+147:                                              ; preds = %77
+  %148 = load i64, i64* %10, align 8
+  %149 = trunc i64 %148 to i32
+  %150 = load %struct.Matrix*, %struct.Matrix** %6, align 8
+  %151 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %150, i32 0, i32 0
+  %152 = load i32**, i32*** %151, align 8
+  %153 = load i32, i32* %8, align 4
+  %154 = sext i32 %153 to i64
+  %155 = getelementptr inbounds i32*, i32** %152, i64 %154
+  %156 = load i32*, i32** %155, align 8
+  %157 = load i32, i32* %9, align 4
+  %158 = sext i32 %157 to i64
+  %159 = getelementptr inbounds i32, i32* %156, i64 %158
+  store i32 %149, i32* %159, align 4
+  %160 = load %struct.Matrix*, %struct.Matrix** %6, align 8
+  %161 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %160, i32 0, i32 0
+  %162 = load i32**, i32*** %161, align 8
+  %163 = load i32, i32* %8, align 4
+  %164 = sext i32 %163 to i64
+  %165 = getelementptr inbounds i32*, i32** %162, i64 %164
+  %166 = load i32*, i32** %165, align 8
+  %167 = load i32, i32* %9, align 4
+  %168 = sext i32 %167 to i64
+  %169 = getelementptr inbounds i32, i32* %166, i64 %168
+  %170 = load i32, i32* %169, align 4
+  %171 = call i32 @abs(i32 %170) #7
+  %172 = sext i32 %171 to i64
+  %173 = load i64, i64* %7, align 8
+  %174 = icmp sgt i64 %172, %173
+  br i1 %174, label %175, label %189
+
+175:                                              ; preds = %147
+  %176 = load %struct.Matrix*, %struct.Matrix** %6, align 8
+  %177 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %176, i32 0, i32 0
+  %178 = load i32**, i32*** %177, align 8
+  %179 = load i32, i32* %8, align 4
+  %180 = sext i32 %179 to i64
+  %181 = getelementptr inbounds i32*, i32** %178, i64 %180
+  %182 = load i32*, i32** %181, align 8
+  %183 = load i32, i32* %9, align 4
+  %184 = sext i32 %183 to i64
+  %185 = getelementptr inbounds i32, i32* %182, i64 %184
+  %186 = load i32, i32* %185, align 4
+  %187 = call i32 @abs(i32 %186) #7
+  %188 = sext i32 %187 to i64
+  store i64 %188, i64* %7, align 8
+  br label %189
+
+189:                                              ; preds = %175, %147
+  br label %190
+
+190:                                              ; preds = %189
+  %191 = load i32, i32* %9, align 4
+  %192 = add nsw i32 %191, 1
+  store i32 %192, i32* %9, align 4
+  br label %70
+
+193:                                              ; preds = %70
+  br label %194
+
+194:                                              ; preds = %193
+  %195 = load i32, i32* %8, align 4
+  %196 = add nsw i32 %195, 1
+  store i32 %196, i32* %8, align 4
+  br label %63
+
+197:                                              ; preds = %63
+  %198 = load %struct.Matrix*, %struct.Matrix** %6, align 8
+  %199 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %198, i32 0, i32 1
+  %200 = load i32, i32* %199, align 8
+  %201 = load %struct.Matrix*, %struct.Matrix** %6, align 8
+  %202 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %201, i32 0, i32 2
+  %203 = load i32, i32* %202, align 4
+  %204 = icmp eq i32 %200, %203
+  %205 = zext i1 %204 to i32
+  %206 = load %struct.Matrix*, %struct.Matrix** %6, align 8
+  %207 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %206, i32 0, i32 3
+  store i32 %205, i32* %207, align 8
+  %208 = load %struct.Matrix*, %struct.Matrix** %6, align 8
+  store %struct.Matrix* %208, %struct.Matrix** %3, align 8
+  br label %209
+
+209:                                              ; preds = %197, %136, %61, %50, %39, %30, %19
+  %210 = load %struct.Matrix*, %struct.Matrix** %3, align 8
+  ret %struct.Matrix* %210
+}
+
+; Function Attrs: nounwind readnone
+declare dso_local i32 @abs(i32) #3
+
+; Function Attrs: noinline nounwind optnone uwtable
+define dso_local %struct.Node* @insertNode(%struct.Node* %0, i32 %1) #0 {
+  %3 = alloca %struct.Node*, align 8
+  %4 = alloca %struct.Node*, align 8
+  %5 = alloca i32, align 4
+  %6 = alloca %struct.Node*, align 8
+  %7 = alloca %struct.Node*, align 8
+  %8 = alloca %struct.Node*, align 8
+  %9 = alloca i32, align 4
+  store %struct.Node* %0, %struct.Node** %4, align 8
+  store i32 %1, i32* %5, align 4
+  %10 = call noalias i8* @malloc(i64 32) #6
+  %11 = bitcast i8* %10 to %struct.Node*
+  store %struct.Node* %11, %struct.Node** %6, align 8
+  %12 = load %struct.Node*, %struct.Node** %6, align 8
+  %13 = icmp ne %struct.Node* %12, null
+  br i1 %13, label %16, label %14
+
+14:                                               ; preds = %2
+  call void @setErrorMessage(i8* getelementptr inbounds ([38 x i8], [38 x i8]* @.str.25, i64 0, i64 0))
+  %15 = load %struct.Node*, %struct.Node** %4, align 8
+  store %struct.Node* %15, %struct.Node** %3, align 8
+  br label %92
+
+16:                                               ; preds = %2
+  %17 = load i32, i32* %5, align 4
+  %18 = load %struct.Node*, %struct.Node** %6, align 8
+  %19 = getelementptr inbounds %struct.Node, %struct.Node* %18, i32 0, i32 0
+  store i32 %17, i32* %19, align 8
+  %20 = load %struct.Node*, %struct.Node** %6, align 8
+  %21 = getelementptr inbounds %struct.Node, %struct.Node* %20, i32 0, i32 1
+  store %struct.Node* null, %struct.Node** %21, align 8
+  %22 = load %struct.Node*, %struct.Node** %6, align 8
+  %23 = getelementptr inbounds %struct.Node, %struct.Node* %22, i32 0, i32 2
+  store %struct.Node* null, %struct.Node** %23, align 8
+  %24 = load %struct.Node*, %struct.Node** %6, align 8
+  %25 = getelementptr inbounds %struct.Node, %struct.Node* %24, i32 0, i32 3
+  store i32 0, i32* %25, align 8
+  %26 = load %struct.Node*, %struct.Node** %4, align 8
+  %27 = icmp ne %struct.Node* %26, null
+  br i1 %27, label %32, label %28
+
+28:                                               ; preds = %16
+  %29 = load %struct.Node*, %struct.Node** %6, align 8
+  %30 = getelementptr inbounds %struct.Node, %struct.Node* %29, i32 0, i32 4
+  store i32 0, i32* %30, align 4
+  store i32 0, i32* @insertNode.maxDepth, align 4
+  %31 = load %struct.Node*, %struct.Node** %6, align 8
+  store %struct.Node* %31, %struct.Node** %3, align 8
+  br label %92
+
+32:                                               ; preds = %16
+  %33 = load %struct.Node*, %struct.Node** %4, align 8
+  store %struct.Node* %33, %struct.Node** %7, align 8
+  store %struct.Node* null, %struct.Node** %8, align 8
+  store i32 0, i32* %9, align 4
+  br label %34
+
+34:                                               ; preds = %58, %32
+  %35 = load %struct.Node*, %struct.Node** %7, align 8
+  %36 = icmp ne %struct.Node* %35, null
+  br i1 %36, label %37, label %43
+
+37:                                               ; preds = %34
+  %38 = load %struct.Node*, %struct.Node** %7, align 8
+  %39 = getelementptr inbounds %struct.Node, %struct.Node* %38, i32 0, i32 0
+  %40 = load i32, i32* %39, align 8
+  %41 = load i32, i32* %5, align 4
+  %42 = icmp slt i32 %40, %41
+  br label %43
+
+43:                                               ; preds = %37, %34
+  %44 = phi i1 [ false, %34 ], [ %42, %37 ]
+  br i1 %44, label %45, label %59
+
+45:                                               ; preds = %43
+  %46 = load %struct.Node*, %struct.Node** %7, align 8
+  store %struct.Node* %46, %struct.Node** %8, align 8
+  %47 = load %struct.Node*, %struct.Node** %7, align 8
+  %48 = getelementptr inbounds %struct.Node, %struct.Node* %47, i32 0, i32 1
+  %49 = load %struct.Node*, %struct.Node** %48, align 8
+  store %struct.Node* %49, %struct.Node** %7, align 8
+  %50 = load i32, i32* %9, align 4
+  %51 = add nsw i32 %50, 1
+  store i32 %51, i32* %9, align 4
+  %52 = load i32, i32* %9, align 4
+  %53 = icmp sgt i32 %52, 1000
+  br i1 %53, label %54, label %58
+
+54:                                               ; preds = %45
+  call void @setErrorMessage(i8* getelementptr inbounds ([34 x i8], [34 x i8]* @.str.26, i64 0, i64 0))
+  %55 = load %struct.Node*, %struct.Node** %6, align 8
+  %56 = bitcast %struct.Node* %55 to i8*
+  call void @free(i8* %56) #6
+  %57 = load %struct.Node*, %struct.Node** %4, align 8
+  store %struct.Node* %57, %struct.Node** %3, align 8
+  br label %92
+
+58:                                               ; preds = %45
+  br label %34
+
+59:                                               ; preds = %43
+  %60 = load i32, i32* %9, align 4
+  %61 = load i32, i32* @insertNode.maxDepth, align 4
+  %62 = icmp sgt i32 %60, %61
+  br i1 %62, label %63, label %65
+
+63:                                               ; preds = %59
+  %64 = load i32, i32* %9, align 4
+  store i32 %64, i32* @insertNode.maxDepth, align 4
+  br label %65
+
+65:                                               ; preds = %63, %59
+  %66 = load i32, i32* %9, align 4
+  %67 = load %struct.Node*, %struct.Node** %6, align 8
+  %68 = getelementptr inbounds %struct.Node, %struct.Node* %67, i32 0, i32 4
+  store i32 %66, i32* %68, align 4
+  %69 = load %struct.Node*, %struct.Node** %7, align 8
+  %70 = load %struct.Node*, %struct.Node** %6, align 8
+  %71 = getelementptr inbounds %struct.Node, %struct.Node* %70, i32 0, i32 1
+  store %struct.Node* %69, %struct.Node** %71, align 8
+  %72 = load %struct.Node*, %struct.Node** %8, align 8
+  %73 = icmp ne %struct.Node* %72, null
+  br i1 %73, label %74, label %81
+
+74:                                               ; preds = %65
+  %75 = load %struct.Node*, %struct.Node** %6, align 8
+  %76 = load %struct.Node*, %struct.Node** %8, align 8
+  %77 = getelementptr inbounds %struct.Node, %struct.Node* %76, i32 0, i32 1
+  store %struct.Node* %75, %struct.Node** %77, align 8
+  %78 = load %struct.Node*, %struct.Node** %8, align 8
+  %79 = load %struct.Node*, %struct.Node** %6, align 8
+  %80 = getelementptr inbounds %struct.Node, %struct.Node* %79, i32 0, i32 2
+  store %struct.Node* %78, %struct.Node** %80, align 8
+  br label %83
+
+81:                                               ; preds = %65
+  %82 = load %struct.Node*, %struct.Node** %6, align 8
+  store %struct.Node* %82, %struct.Node** %3, align 8
+  br label %92
+
+83:                                               ; preds = %74
+  %84 = load %struct.Node*, %struct.Node** %7, align 8
+  %85 = icmp ne %struct.Node* %84, null
+  br i1 %85, label %86, label %90
+
+86:                                               ; preds = %83
+  %87 = load %struct.Node*, %struct.Node** %6, align 8
+  %88 = load %struct.Node*, %struct.Node** %7, align 8
+  %89 = getelementptr inbounds %struct.Node, %struct.Node* %88, i32 0, i32 2
+  store %struct.Node* %87, %struct.Node** %89, align 8
+  br label %90
+
+90:                                               ; preds = %86, %83
+  %91 = load %struct.Node*, %struct.Node** %4, align 8
+  store %struct.Node* %91, %struct.Node** %3, align 8
+  br label %92
+
+92:                                               ; preds = %90, %81, %54, %28, %14
+  %93 = load %struct.Node*, %struct.Node** %3, align 8
+  ret %struct.Node* %93
+}
+
+; Function Attrs: noinline nounwind optnone uwtable
+define dso_local void @performSimpleCalculations() #0 {
+  %1 = alloca i32, align 4
+  store i32 100, i32* %1, align 4
+  %2 = load i32, i32* %1, align 4
+  %3 = icmp sgt i32 %2, 50
+  br i1 %3, label %4, label %9
+
+4:                                                ; preds = %0
+  %5 = load i32, i32* %1, align 4
+  %6 = mul nsw i32 %5, 2
+  %7 = load i32, i32* @calculationResult, align 4
+  %8 = add nsw i32 %7, %6
+  store i32 %8, i32* @calculationResult, align 4
+  br label %14
+
+9:                                                ; preds = %0
+  %10 = load i32, i32* %1, align 4
+  %11 = sdiv i32 %10, 2
+  %12 = load i32, i32* @calculationResult, align 4
+  %13 = add nsw i32 %12, %11
+  store i32 %13, i32* @calculationResult, align 4
+  br label %14
+
+14:                                               ; preds = %9, %4
+  %15 = load i32, i32* %1, align 4
+  %16 = srem i32 %15, 3
+  %17 = icmp eq i32 %16, 0
+  br i1 %17, label %18, label %21
+
+18:                                               ; preds = %14
+  %19 = load i32, i32* @calculationResult, align 4
+  %20 = mul nsw i32 %19, 3
+  store i32 %20, i32* @calculationResult, align 4
+  br label %24
+
+21:                                               ; preds = %14
+  %22 = load i32, i32* @calculationResult, align 4
+  %23 = add nsw i32 %22, 3
+  store i32 %23, i32* @calculationResult, align 4
+  br label %24
+
+24:                                               ; preds = %21, %18
+  %25 = load i32, i32* @calculationResult, align 4
+  %26 = icmp sge i32 %25, 150
+  br i1 %26, label %27, label %33
+
+27:                                               ; preds = %24
+  %28 = load i32, i32* @calculationResult, align 4
+  %29 = icmp sle i32 %28, 300
+  br i1 %29, label %30, label %33
+
+30:                                               ; preds = %27
+  %31 = load i32, i32* @calculationResult, align 4
+  %32 = sub nsw i32 %31, 50
+  store i32 %32, i32* @calculationResult, align 4
+  br label %36
+
+33:                                               ; preds = %27, %24
+  %34 = load i32, i32* @calculationResult, align 4
+  %35 = add nsw i32 %34, 50
+  store i32 %35, i32* @calculationResult, align 4
+  br label %36
+
+36:                                               ; preds = %33, %30
+  %37 = load i32, i32* @calculationResult, align 4
+  %38 = srem i32 %37, 2
+  %39 = icmp eq i32 %38, 0
+  br i1 %39, label %40, label %43
+
+40:                                               ; preds = %36
+  %41 = load i32, i32* @calculationResult, align 4
+  %42 = sdiv i32 %41, 2
+  store i32 %42, i32* @calculationResult, align 4
+  br label %46
+
+43:                                               ; preds = %36
+  %44 = load i32, i32* @calculationResult, align 4
+  %45 = mul nsw i32 %44, 2
+  store i32 %45, i32* @calculationResult, align 4
+  br label %46
+
+46:                                               ; preds = %43, %40
+  %47 = load i32, i32* @calculationResult, align 4
+  %48 = srem i32 %47, 10
+  %49 = icmp slt i32 %48, 5
+  br i1 %49, label %50, label %53
+
+50:                                               ; preds = %46
+  %51 = load i32, i32* @calculationResult, align 4
+  %52 = add nsw i32 %51, 5
+  store i32 %52, i32* @calculationResult, align 4
+  br label %56
+
+53:                                               ; preds = %46
+  %54 = load i32, i32* @calculationResult, align 4
+  %55 = sub nsw i32 %54, 5
+  store i32 %55, i32* @calculationResult, align 4
+  br label %56
+
+56:                                               ; preds = %53, %50
+  %57 = load i32, i32* @calculationResult, align 4
+  %58 = icmp sgt i32 %57, 1000
+  br i1 %58, label %59, label %60
+
+59:                                               ; preds = %56
+  store i32 1000, i32* @calculationResult, align 4
+  br label %63
+
+60:                                               ; preds = %56
+  %61 = load i32, i32* @calculationResult, align 4
+  %62 = add nsw i32 %61, 10
+  store i32 %62, i32* @calculationResult, align 4
+  br label %63
+
+63:                                               ; preds = %60, %59
+  %64 = load i32, i32* @calculationResult, align 4
+  %65 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([30 x i8], [30 x i8]* @.str.27, i64 0, i64 0), i32 %64)
+  ret void
+}
+
+declare dso_local i32 @printf(i8*, ...) #2
+
+; Function Attrs: noinline nounwind optnone uwtable
+define dso_local i32 @projectA_main() #0 {
+  %1 = alloca i32, align 4
+  %2 = alloca %struct.DynamicArray*, align 8
+  %3 = alloca i32, align 4
+  %4 = alloca %struct.Matrix*, align 8
+  %5 = alloca %struct.Matrix*, align 8
+  %6 = alloca i32, align 4
+  %7 = alloca i32, align 4
+  %8 = alloca %struct.Matrix*, align 8
+  %9 = alloca i32, align 4
+  %10 = alloca %struct.Node*, align 8
+  %11 = alloca i32, align 4
+  %12 = alloca i32, align 4
+  %13 = alloca %struct.Node*, align 8
+  %14 = alloca %struct.Node*, align 8
+  %15 = alloca i32, align 4
+  %16 = alloca %struct.Node*, align 8
+  %17 = alloca i32, align 4
+  %18 = alloca i32, align 4
+  %19 = alloca %struct.Node*, align 8
+  %20 = call i64 @time(i64* null) #6
+  %21 = trunc i64 %20 to i32
+  call void @srand(i32 %21) #6
+  %22 = call %struct.DynamicArray* @createDynamicArray(i32 10)
+  store %struct.DynamicArray* %22, %struct.DynamicArray** %2, align 8
+  %23 = load %struct.DynamicArray*, %struct.DynamicArray** %2, align 8
+  %24 = icmp ne %struct.DynamicArray* %23, null
+  br i1 %24, label %28, label %25
+
+25:                                               ; preds = %0
+  %26 = call i8* @getErrorMessage()
+  %27 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.28, i64 0, i64 0), i8* %26)
+  store i32 -1, i32* %1, align 4
+  br label %322
+
+28:                                               ; preds = %0
+  store i32 0, i32* %3, align 4
+  br label %29
+
+29:                                               ; preds = %42, %28
+  %30 = load i32, i32* %3, align 4
+  %31 = icmp slt i32 %30, 15
+  br i1 %31, label %32, label %45
+
+32:                                               ; preds = %29
+  %33 = load %struct.DynamicArray*, %struct.DynamicArray** %2, align 8
+  %34 = call i32 @rand() #6
+  %35 = srem i32 %34, 100
+  call void @pushBack(%struct.DynamicArray* %33, i32 %35)
+  %36 = load i8*, i8** @globalErrorMessage, align 8
+  %37 = icmp ne i8* %36, null
+  br i1 %37, label %38, label %41
+
+38:                                               ; preds = %32
+  %39 = call i8* @getErrorMessage()
+  %40 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([29 x i8], [29 x i8]* @.str.29, i64 0, i64 0), i8* %39)
+  br label %45
+
+41:                                               ; preds = %32
+  br label %42
+
+42:                                               ; preds = %41
+  %43 = load i32, i32* %3, align 4
+  %44 = add nsw i32 %43, 1
+  store i32 %44, i32* %3, align 4
+  br label %29
+
+45:                                               ; preds = %38, %29
+  %46 = call %struct.Matrix* @createMatrix(i32 3, i32 3)
+  store %struct.Matrix* %46, %struct.Matrix** %4, align 8
+  %47 = call %struct.Matrix* @createMatrix(i32 3, i32 3)
+  store %struct.Matrix* %47, %struct.Matrix** %5, align 8
+  %48 = load %struct.Matrix*, %struct.Matrix** %4, align 8
+  %49 = icmp ne %struct.Matrix* %48, null
+  br i1 %49, label %50, label %53
+
+50:                                               ; preds = %45
+  %51 = load %struct.Matrix*, %struct.Matrix** %5, align 8
+  %52 = icmp ne %struct.Matrix* %51, null
+  br i1 %52, label %74, label %53
+
+53:                                               ; preds = %50, %45
+  %54 = call i8* @getErrorMessage()
+  %55 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.28, i64 0, i64 0), i8* %54)
+  %56 = load %struct.Matrix*, %struct.Matrix** %4, align 8
+  %57 = icmp ne %struct.Matrix* %56, null
+  br i1 %57, label %58, label %61
+
+58:                                               ; preds = %53
+  %59 = load %struct.Matrix*, %struct.Matrix** %4, align 8
+  %60 = bitcast %struct.Matrix* %59 to i8*
+  call void @free(i8* %60) #6
+  br label %61
+
+61:                                               ; preds = %58, %53
+  %62 = load %struct.Matrix*, %struct.Matrix** %5, align 8
+  %63 = icmp ne %struct.Matrix* %62, null
+  br i1 %63, label %64, label %67
+
+64:                                               ; preds = %61
+  %65 = load %struct.Matrix*, %struct.Matrix** %5, align 8
+  %66 = bitcast %struct.Matrix* %65 to i8*
+  call void @free(i8* %66) #6
+  br label %67
+
+67:                                               ; preds = %64, %61
+  %68 = load %struct.DynamicArray*, %struct.DynamicArray** %2, align 8
+  %69 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %68, i32 0, i32 0
+  %70 = load i32*, i32** %69, align 8
+  %71 = bitcast i32* %70 to i8*
+  call void @free(i8* %71) #6
+  %72 = load %struct.DynamicArray*, %struct.DynamicArray** %2, align 8
+  %73 = bitcast %struct.DynamicArray* %72 to i8*
+  call void @free(i8* %73) #6
+  store i32 -1, i32* %1, align 4
+  br label %322
+
+74:                                               ; preds = %50
+  store i32 0, i32* %6, align 4
+  br label %75
+
+75:                                               ; preds = %111, %74
+  %76 = load i32, i32* %6, align 4
+  %77 = icmp slt i32 %76, 3
+  br i1 %77, label %78, label %114
+
+78:                                               ; preds = %75
+  store i32 0, i32* %7, align 4
+  br label %79
+
+79:                                               ; preds = %107, %78
+  %80 = load i32, i32* %7, align 4
+  %81 = icmp slt i32 %80, 3
+  br i1 %81, label %82, label %110
+
+82:                                               ; preds = %79
+  %83 = call i32 @rand() #6
+  %84 = srem i32 %83, 10
+  %85 = load %struct.Matrix*, %struct.Matrix** %4, align 8
+  %86 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %85, i32 0, i32 0
+  %87 = load i32**, i32*** %86, align 8
+  %88 = load i32, i32* %6, align 4
+  %89 = sext i32 %88 to i64
+  %90 = getelementptr inbounds i32*, i32** %87, i64 %89
+  %91 = load i32*, i32** %90, align 8
+  %92 = load i32, i32* %7, align 4
+  %93 = sext i32 %92 to i64
+  %94 = getelementptr inbounds i32, i32* %91, i64 %93
+  store i32 %84, i32* %94, align 4
+  %95 = call i32 @rand() #6
+  %96 = srem i32 %95, 10
+  %97 = load %struct.Matrix*, %struct.Matrix** %5, align 8
+  %98 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %97, i32 0, i32 0
+  %99 = load i32**, i32*** %98, align 8
+  %100 = load i32, i32* %6, align 4
+  %101 = sext i32 %100 to i64
+  %102 = getelementptr inbounds i32*, i32** %99, i64 %101
+  %103 = load i32*, i32** %102, align 8
+  %104 = load i32, i32* %7, align 4
+  %105 = sext i32 %104 to i64
+  %106 = getelementptr inbounds i32, i32* %103, i64 %105
+  store i32 %96, i32* %106, align 4
+  br label %107
+
+107:                                              ; preds = %82
+  %108 = load i32, i32* %7, align 4
+  %109 = add nsw i32 %108, 1
+  store i32 %109, i32* %7, align 4
+  br label %79
+
+110:                                              ; preds = %79
+  br label %111
+
+111:                                              ; preds = %110
+  %112 = load i32, i32* %6, align 4
+  %113 = add nsw i32 %112, 1
+  store i32 %113, i32* %6, align 4
+  br label %75
+
+114:                                              ; preds = %75
+  %115 = load %struct.Matrix*, %struct.Matrix** %4, align 8
+  %116 = load %struct.Matrix*, %struct.Matrix** %5, align 8
+  %117 = call %struct.Matrix* @multiplyMatrices(%struct.Matrix* %115, %struct.Matrix* %116)
+  store %struct.Matrix* %117, %struct.Matrix** %8, align 8
+  %118 = load %struct.Matrix*, %struct.Matrix** %8, align 8
+  %119 = icmp ne %struct.Matrix* %118, null
+  br i1 %119, label %168, label %120
+
+120:                                              ; preds = %114
+  %121 = call i8* @getErrorMessage()
+  %122 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.28, i64 0, i64 0), i8* %121)
+  store i32 0, i32* %9, align 4
+  br label %123
+
+123:                                              ; preds = %146, %120
+  %124 = load i32, i32* %9, align 4
+  %125 = load %struct.Matrix*, %struct.Matrix** %4, align 8
+  %126 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %125, i32 0, i32 1
+  %127 = load i32, i32* %126, align 8
+  %128 = icmp slt i32 %124, %127
+  br i1 %128, label %129, label %149
+
+129:                                              ; preds = %123
+  %130 = load %struct.Matrix*, %struct.Matrix** %4, align 8
+  %131 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %130, i32 0, i32 0
+  %132 = load i32**, i32*** %131, align 8
+  %133 = load i32, i32* %9, align 4
+  %134 = sext i32 %133 to i64
+  %135 = getelementptr inbounds i32*, i32** %132, i64 %134
+  %136 = load i32*, i32** %135, align 8
+  %137 = bitcast i32* %136 to i8*
+  call void @free(i8* %137) #6
+  %138 = load %struct.Matrix*, %struct.Matrix** %5, align 8
+  %139 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %138, i32 0, i32 0
+  %140 = load i32**, i32*** %139, align 8
+  %141 = load i32, i32* %9, align 4
+  %142 = sext i32 %141 to i64
+  %143 = getelementptr inbounds i32*, i32** %140, i64 %142
+  %144 = load i32*, i32** %143, align 8
+  %145 = bitcast i32* %144 to i8*
+  call void @free(i8* %145) #6
+  br label %146
+
+146:                                              ; preds = %129
+  %147 = load i32, i32* %9, align 4
+  %148 = add nsw i32 %147, 1
+  store i32 %148, i32* %9, align 4
+  br label %123
+
+149:                                              ; preds = %123
+  %150 = load %struct.Matrix*, %struct.Matrix** %4, align 8
+  %151 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %150, i32 0, i32 0
+  %152 = load i32**, i32*** %151, align 8
+  %153 = bitcast i32** %152 to i8*
+  call void @free(i8* %153) #6
+  %154 = load %struct.Matrix*, %struct.Matrix** %5, align 8
+  %155 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %154, i32 0, i32 0
+  %156 = load i32**, i32*** %155, align 8
+  %157 = bitcast i32** %156 to i8*
+  call void @free(i8* %157) #6
+  %158 = load %struct.Matrix*, %struct.Matrix** %4, align 8
+  %159 = bitcast %struct.Matrix* %158 to i8*
+  call void @free(i8* %159) #6
+  %160 = load %struct.Matrix*, %struct.Matrix** %5, align 8
+  %161 = bitcast %struct.Matrix* %160 to i8*
+  call void @free(i8* %161) #6
+  %162 = load %struct.DynamicArray*, %struct.DynamicArray** %2, align 8
+  %163 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %162, i32 0, i32 0
+  %164 = load i32*, i32** %163, align 8
+  %165 = bitcast i32* %164 to i8*
+  call void @free(i8* %165) #6
+  %166 = load %struct.DynamicArray*, %struct.DynamicArray** %2, align 8
+  %167 = bitcast %struct.DynamicArray* %166 to i8*
+  call void @free(i8* %167) #6
+  store i32 -1, i32* %1, align 4
+  br label %322
+
+168:                                              ; preds = %114
+  store %struct.Node* null, %struct.Node** %10, align 8
+  store i32 0, i32* %11, align 4
+  br label %169
+
+169:                                              ; preds = %183, %168
+  %170 = load i32, i32* %11, align 4
+  %171 = icmp slt i32 %170, 5
+  br i1 %171, label %172, label %186
+
+172:                                              ; preds = %169
+  %173 = load %struct.Node*, %struct.Node** %10, align 8
+  %174 = call i32 @rand() #6
+  %175 = srem i32 %174, 50
+  %176 = call %struct.Node* @insertNode(%struct.Node* %173, i32 %175)
+  store %struct.Node* %176, %struct.Node** %10, align 8
+  %177 = load i8*, i8** @globalErrorMessage, align 8
+  %178 = icmp ne i8* %177, null
+  br i1 %178, label %179, label %182
+
+179:                                              ; preds = %172
+  %180 = call i8* @getErrorMessage()
+  %181 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([33 x i8], [33 x i8]* @.str.30, i64 0, i64 0), i8* %180)
+  br label %186
+
+182:                                              ; preds = %172
+  br label %183
+
+183:                                              ; preds = %182
+  %184 = load i32, i32* %11, align 4
+  %185 = add nsw i32 %184, 1
+  store i32 %185, i32* %11, align 4
+  br label %169
+
+186:                                              ; preds = %179, %169
+  %187 = load %struct.DynamicArray*, %struct.DynamicArray** %2, align 8
+  %188 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %187, i32 0, i32 0
+  %189 = load i32*, i32** %188, align 8
+  %190 = bitcast i32* %189 to i8*
+  call void @free(i8* %190) #6
+  %191 = load %struct.DynamicArray*, %struct.DynamicArray** %2, align 8
+  %192 = bitcast %struct.DynamicArray* %191 to i8*
+  call void @free(i8* %192) #6
+  store i32 0, i32* %12, align 4
+  br label %193
+
+193:                                              ; preds = %224, %186
+  %194 = load i32, i32* %12, align 4
+  %195 = load %struct.Matrix*, %struct.Matrix** %4, align 8
+  %196 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %195, i32 0, i32 1
+  %197 = load i32, i32* %196, align 8
+  %198 = icmp slt i32 %194, %197
+  br i1 %198, label %199, label %227
+
+199:                                              ; preds = %193
+  %200 = load %struct.Matrix*, %struct.Matrix** %4, align 8
+  %201 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %200, i32 0, i32 0
+  %202 = load i32**, i32*** %201, align 8
+  %203 = load i32, i32* %12, align 4
+  %204 = sext i32 %203 to i64
+  %205 = getelementptr inbounds i32*, i32** %202, i64 %204
+  %206 = load i32*, i32** %205, align 8
+  %207 = bitcast i32* %206 to i8*
+  call void @free(i8* %207) #6
+  %208 = load %struct.Matrix*, %struct.Matrix** %5, align 8
+  %209 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %208, i32 0, i32 0
+  %210 = load i32**, i32*** %209, align 8
+  %211 = load i32, i32* %12, align 4
+  %212 = sext i32 %211 to i64
+  %213 = getelementptr inbounds i32*, i32** %210, i64 %212
+  %214 = load i32*, i32** %213, align 8
+  %215 = bitcast i32* %214 to i8*
+  call void @free(i8* %215) #6
+  %216 = load %struct.Matrix*, %struct.Matrix** %8, align 8
+  %217 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %216, i32 0, i32 0
+  %218 = load i32**, i32*** %217, align 8
+  %219 = load i32, i32* %12, align 4
+  %220 = sext i32 %219 to i64
+  %221 = getelementptr inbounds i32*, i32** %218, i64 %220
+  %222 = load i32*, i32** %221, align 8
+  %223 = bitcast i32* %222 to i8*
+  call void @free(i8* %223) #6
+  br label %224
+
+224:                                              ; preds = %199
+  %225 = load i32, i32* %12, align 4
+  %226 = add nsw i32 %225, 1
+  store i32 %226, i32* %12, align 4
+  br label %193
+
+227:                                              ; preds = %193
+  %228 = load %struct.Matrix*, %struct.Matrix** %4, align 8
+  %229 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %228, i32 0, i32 0
+  %230 = load i32**, i32*** %229, align 8
+  %231 = bitcast i32** %230 to i8*
+  call void @free(i8* %231) #6
+  %232 = load %struct.Matrix*, %struct.Matrix** %5, align 8
+  %233 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %232, i32 0, i32 0
+  %234 = load i32**, i32*** %233, align 8
+  %235 = bitcast i32** %234 to i8*
+  call void @free(i8* %235) #6
+  %236 = load %struct.Matrix*, %struct.Matrix** %8, align 8
+  %237 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %236, i32 0, i32 0
+  %238 = load i32**, i32*** %237, align 8
+  %239 = bitcast i32** %238 to i8*
+  call void @free(i8* %239) #6
+  %240 = load %struct.Matrix*, %struct.Matrix** %4, align 8
+  %241 = bitcast %struct.Matrix* %240 to i8*
+  call void @free(i8* %241) #6
+  %242 = load %struct.Matrix*, %struct.Matrix** %5, align 8
+  %243 = bitcast %struct.Matrix* %242 to i8*
+  call void @free(i8* %243) #6
+  %244 = load %struct.Matrix*, %struct.Matrix** %8, align 8
+  %245 = bitcast %struct.Matrix* %244 to i8*
+  call void @free(i8* %245) #6
+  %246 = load %struct.Node*, %struct.Node** %10, align 8
+  %247 = icmp ne %struct.Node* %246, null
+  br i1 %247, label %248, label %316
+
+248:                                              ; preds = %227
+  %249 = load %struct.Node*, %struct.Node** %10, align 8
+  store %struct.Node* %249, %struct.Node** %13, align 8
+  %250 = load %struct.Node*, %struct.Node** %10, align 8
+  store %struct.Node* %250, %struct.Node** %14, align 8
+  store i32 0, i32* %15, align 4
+  br label %251
+
+251:                                              ; preds = %274, %248
+  %252 = load %struct.Node*, %struct.Node** %14, align 8
+  %253 = icmp ne %struct.Node* %252, null
+  br i1 %253, label %254, label %259
+
+254:                                              ; preds = %251
+  %255 = load %struct.Node*, %struct.Node** %14, align 8
+  %256 = getelementptr inbounds %struct.Node, %struct.Node* %255, i32 0, i32 1
+  %257 = load %struct.Node*, %struct.Node** %256, align 8
+  %258 = icmp ne %struct.Node* %257, null
+  br label %259
+
+259:                                              ; preds = %254, %251
+  %260 = phi i1 [ false, %251 ], [ %258, %254 ]
+  br i1 %260, label %261, label %275
+
+261:                                              ; preds = %259
+  %262 = load %struct.Node*, %struct.Node** %13, align 8
+  %263 = getelementptr inbounds %struct.Node, %struct.Node* %262, i32 0, i32 1
+  %264 = load %struct.Node*, %struct.Node** %263, align 8
+  store %struct.Node* %264, %struct.Node** %13, align 8
+  %265 = load %struct.Node*, %struct.Node** %14, align 8
+  %266 = getelementptr inbounds %struct.Node, %struct.Node* %265, i32 0, i32 1
+  %267 = load %struct.Node*, %struct.Node** %266, align 8
+  %268 = getelementptr inbounds %struct.Node, %struct.Node* %267, i32 0, i32 1
+  %269 = load %struct.Node*, %struct.Node** %268, align 8
+  store %struct.Node* %269, %struct.Node** %14, align 8
+  %270 = load %struct.Node*, %struct.Node** %13, align 8
+  %271 = load %struct.Node*, %struct.Node** %14, align 8
+  %272 = icmp eq %struct.Node* %270, %271
+  br i1 %272, label %273, label %274
+
+273:                                              ; preds = %261
+  store i32 1, i32* %15, align 4
+  br label %275
+
+274:                                              ; preds = %261
+  br label %251
+
+275:                                              ; preds = %273, %259
+  %276 = load i32, i32* %15, align 4
+  %277 = icmp ne i32 %276, 0
+  br i1 %277, label %278, label %304
+
+278:                                              ; preds = %275
+  call void @setErrorMessage(i8* getelementptr inbounds ([43 x i8], [43 x i8]* @.str.31, i64 0, i64 0))
+  %279 = load %struct.Node*, %struct.Node** %10, align 8
+  store %struct.Node* %279, %struct.Node** %16, align 8
+  store i32 1000, i32* %17, align 4
+  store i32 0, i32* %18, align 4
+  br label %280
+
+280:                                              ; preds = %295, %278
+  %281 = load %struct.Node*, %struct.Node** %16, align 8
+  %282 = icmp ne %struct.Node* %281, null
+  br i1 %282, label %283, label %287
+
+283:                                              ; preds = %280
+  %284 = load i32, i32* %18, align 4
+  %285 = load i32, i32* %17, align 4
+  %286 = icmp slt i32 %284, %285
+  br label %287
+
+287:                                              ; preds = %283, %280
+  %288 = phi i1 [ false, %280 ], [ %286, %283 ]
+  br i1 %288, label %289, label %303
+
+289:                                              ; preds = %287
+  %290 = load %struct.Node*, %struct.Node** %16, align 8
+  %291 = getelementptr inbounds %struct.Node, %struct.Node* %290, i32 0, i32 3
+  %292 = load i32, i32* %291, align 8
+  %293 = icmp ne i32 %292, 0
+  br i1 %293, label %294, label %295
+
+294:                                              ; preds = %289
+  br label %303
+
+295:                                              ; preds = %289
+  %296 = load %struct.Node*, %struct.Node** %16, align 8
+  %297 = getelementptr inbounds %struct.Node, %struct.Node* %296, i32 0, i32 3
+  store i32 1, i32* %297, align 8
+  %298 = load %struct.Node*, %struct.Node** %16, align 8
+  %299 = getelementptr inbounds %struct.Node, %struct.Node* %298, i32 0, i32 1
+  %300 = load %struct.Node*, %struct.Node** %299, align 8
+  store %struct.Node* %300, %struct.Node** %16, align 8
+  %301 = load i32, i32* %18, align 4
+  %302 = add nsw i32 %301, 1
+  store i32 %302, i32* %18, align 4
+  br label %280
+
+303:                                              ; preds = %294, %287
+  br label %304
+
+304:                                              ; preds = %303, %275
+  br label %305
+
+305:                                              ; preds = %308, %304
+  %306 = load %struct.Node*, %struct.Node** %10, align 8
+  %307 = icmp ne %struct.Node* %306, null
+  br i1 %307, label %308, label %315
+
+308:                                              ; preds = %305
+  %309 = load %struct.Node*, %struct.Node** %10, align 8
+  store %struct.Node* %309, %struct.Node** %19, align 8
+  %310 = load %struct.Node*, %struct.Node** %10, align 8
+  %311 = getelementptr inbounds %struct.Node, %struct.Node* %310, i32 0, i32 1
+  %312 = load %struct.Node*, %struct.Node** %311, align 8
+  store %struct.Node* %312, %struct.Node** %10, align 8
+  %313 = load %struct.Node*, %struct.Node** %19, align 8
+  %314 = bitcast %struct.Node* %313 to i8*
+  call void @free(i8* %314) #6
+  br label %305
+
+315:                                              ; preds = %305
+  br label %316
+
+316:                                              ; preds = %315, %227
+  %317 = load i8*, i8** @globalErrorMessage, align 8
+  %318 = icmp ne i8* %317, null
+  br i1 %318, label %319, label %321
+
+319:                                              ; preds = %316
+  %320 = load i8*, i8** @globalErrorMessage, align 8
+  call void @free(i8* %320) #6
+  br label %321
+
+321:                                              ; preds = %319, %316
+  call void @performSimpleCalculations()
+  store i32 0, i32* %1, align 4
+  br label %322
+
+322:                                              ; preds = %321, %149, %67, %25
+  %323 = load i32, i32* %1, align 4
+  ret i32 %323
+}
+
+; Function Attrs: nounwind
+declare dso_local void @srand(i32) #1
+
+; Function Attrs: nounwind
+declare dso_local i64 @time(i64*) #1
+
+; Function Attrs: nounwind
+declare dso_local i32 @rand() #1
+
+; Function Attrs: noinline nounwind optnone uwtable
+define dso_local double @calculateDistance(%struct.Point* byval(%struct.Point) align 8 %0, %struct.Point* byval(%struct.Point) align 8 %1, i32* %2) #0 {
+  %4 = alloca double, align 8
+  %5 = alloca i32*, align 8
+  %6 = alloca double, align 8
+  %7 = alloca double, align 8
+  %8 = alloca double, align 8
+  store i32* %2, i32** %5, align 8
+  %9 = load i32*, i32** %5, align 8
+  store i32 0, i32* %9, align 4
+  %10 = getelementptr inbounds %struct.Point, %struct.Point* %0, i32 0, i32 3
+  %11 = load double, double* %10, align 8
+  %12 = fcmp ole double %11, 0.000000e+00
+  br i1 %12, label %17, label %13
+
+13:                                               ; preds = %3
+  %14 = getelementptr inbounds %struct.Point, %struct.Point* %1, i32 0, i32 3
+  %15 = load double, double* %14, align 8
+  %16 = fcmp ole double %15, 0.000000e+00
+  br i1 %16, label %17, label %19
+
+17:                                               ; preds = %13, %3
+  %18 = load i32*, i32** %5, align 8
+  store i32 1, i32* %18, align 4
+  call void @setErrorMessage(i8* getelementptr inbounds ([22 x i8], [22 x i8]* @.str.32, i64 0, i64 0))
+  store double -1.000000e+00, double* %4, align 8
+  br label %101
+
+19:                                               ; preds = %13
+  %20 = getelementptr inbounds %struct.Point, %struct.Point* %0, i32 0, i32 0
+  %21 = load i32, i32* %20, align 8
+  %22 = call i32 @abs(i32 %21) #7
+  %23 = icmp sgt i32 %22, 1000
+  br i1 %23, label %39, label %24
+
+24:                                               ; preds = %19
+  %25 = getelementptr inbounds %struct.Point, %struct.Point* %0, i32 0, i32 1
+  %26 = load i32, i32* %25, align 4
+  %27 = call i32 @abs(i32 %26) #7
+  %28 = icmp sgt i32 %27, 1000
+  br i1 %28, label %39, label %29
+
+29:                                               ; preds = %24
+  %30 = getelementptr inbounds %struct.Point, %struct.Point* %1, i32 0, i32 0
+  %31 = load i32, i32* %30, align 8
+  %32 = call i32 @abs(i32 %31) #7
+  %33 = icmp sgt i32 %32, 1000
+  br i1 %33, label %39, label %34
+
+34:                                               ; preds = %29
+  %35 = getelementptr inbounds %struct.Point, %struct.Point* %1, i32 0, i32 1
+  %36 = load i32, i32* %35, align 4
+  %37 = call i32 @abs(i32 %36) #7
+  %38 = icmp sgt i32 %37, 1000
+  br i1 %38, label %39, label %41
+
+39:                                               ; preds = %34, %29, %24, %19
+  %40 = load i32*, i32** %5, align 8
+  store i32 3, i32* %40, align 4
+  call void @setErrorMessage(i8* getelementptr inbounds ([31 x i8], [31 x i8]* @.str.33, i64 0, i64 0))
+  store double -1.000000e+00, double* %4, align 8
+  br label %101
+
+41:                                               ; preds = %34
+  %42 = getelementptr inbounds %struct.Point, %struct.Point* %1, i32 0, i32 0
+  %43 = load i32, i32* %42, align 8
+  %44 = getelementptr inbounds %struct.Point, %struct.Point* %0, i32 0, i32 0
+  %45 = load i32, i32* %44, align 8
+  %46 = sub nsw i32 %43, %45
+  %47 = sitofp i32 %46 to double
+  %48 = getelementptr inbounds %struct.Point, %struct.Point* %1, i32 0, i32 3
+  %49 = load double, double* %48, align 8
+  %50 = getelementptr inbounds %struct.Point, %struct.Point* %0, i32 0, i32 3
+  %51 = load double, double* %50, align 8
+  %52 = fdiv double %49, %51
+  %53 = call double @sqrt(double %52) #6
+  %54 = fmul double %47, %53
+  store double %54, double* %6, align 8
+  %55 = getelementptr inbounds %struct.Point, %struct.Point* %1, i32 0, i32 1
+  %56 = load i32, i32* %55, align 4
+  %57 = getelementptr inbounds %struct.Point, %struct.Point* %0, i32 0, i32 1
+  %58 = load i32, i32* %57, align 4
+  %59 = sub nsw i32 %56, %58
+  %60 = sitofp i32 %59 to double
+  %61 = getelementptr inbounds %struct.Point, %struct.Point* %1, i32 0, i32 3
+  %62 = load double, double* %61, align 8
+  %63 = getelementptr inbounds %struct.Point, %struct.Point* %0, i32 0, i32 3
+  %64 = load double, double* %63, align 8
+  %65 = fdiv double %62, %64
+  %66 = call double @sqrt(double %65) #6
+  %67 = fmul double %60, %66
+  store double %67, double* %7, align 8
+  %68 = load double, double* %6, align 8
+  %69 = call double @llvm.fabs.f64(double %68)
+  %70 = fcmp ogt double %69, 1.000000e+03
+  br i1 %70, label %75, label %71
+
+71:                                               ; preds = %41
+  %72 = load double, double* %7, align 8
+  %73 = call double @llvm.fabs.f64(double %72)
+  %74 = fcmp ogt double %73, 1.000000e+03
+  br i1 %74, label %75, label %77
+
+75:                                               ; preds = %71, %41
+  %76 = load i32*, i32** %5, align 8
+  store i32 5, i32* %76, align 4
+  call void @setErrorMessage(i8* getelementptr inbounds ([30 x i8], [30 x i8]* @.str.34, i64 0, i64 0))
+  store double -1.000000e+00, double* %4, align 8
+  br label %101
+
+77:                                               ; preds = %71
+  %78 = load double, double* %6, align 8
+  %79 = load double, double* %6, align 8
+  %80 = fmul double %78, %79
+  %81 = load double, double* %7, align 8
+  %82 = load double, double* %7, align 8
+  %83 = fmul double %81, %82
+  %84 = fadd double %80, %83
+  %85 = call double @sqrt(double %84) #6
+  store double %85, double* %8, align 8
+  %86 = load double, double* %8, align 8
+  %87 = fcmp uno double %86, %86
+  br i1 %87, label %97, label %88
+
+88:                                               ; preds = %77
+  %89 = load double, double* %8, align 8
+  %90 = call double @llvm.fabs.f64(double %89) #8
+  %91 = fcmp oeq double %90, 0x7FF0000000000000
+  %92 = bitcast double %89 to i64
+  %93 = icmp slt i64 %92, 0
+  %94 = select i1 %93, i32 -1, i32 1
+  %95 = select i1 %91, i32 %94, i32 0
+  %96 = icmp ne i32 %95, 0
+  br i1 %96, label %97, label %99
+
+97:                                               ; preds = %88, %77
+  %98 = load i32*, i32** %5, align 8
+  store i32 8, i32* %98, align 4
+  call void @setErrorMessage(i8* getelementptr inbounds ([36 x i8], [36 x i8]* @.str.35, i64 0, i64 0))
+  store double -1.000000e+00, double* %4, align 8
+  br label %101
+
+99:                                               ; preds = %88
+  %100 = load double, double* %8, align 8
+  store double %100, double* %4, align 8
+  br label %101
+
+101:                                              ; preds = %99, %97, %75, %39, %17
+  %102 = load double, double* %4, align 8
+  ret double %102
+}
+
+; Function Attrs: nounwind
+declare dso_local double @sqrt(double) #1
+
+; Function Attrs: nounwind readnone speculatable willreturn
+declare double @llvm.fabs.f64(double) #4
+
+; Function Attrs: noinline nounwind optnone uwtable
+define dso_local double @calculateCircleArea(%struct.Circle* byval(%struct.Circle) align 8 %0, i32* %1) #0 {
+  %3 = alloca double, align 8
+  %4 = alloca i32*, align 8
+  %5 = alloca double, align 8
+  store i32* %1, i32** %4, align 8
+  %6 = load i32*, i32** %4, align 8
+  store i32 0, i32* %6, align 4
+  %7 = getelementptr inbounds %struct.Circle, %struct.Circle* %0, i32 0, i32 2
+  %8 = load i32, i32* %7, align 8
+  %9 = icmp ne i32 %8, 0
+  br i1 %9, label %12, label %10
+
+10:                                               ; preds = %2
+  %11 = load i32*, i32** %4, align 8
+  store i32 1, i32* %11, align 4
+  call void @setErrorMessage(i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.36, i64 0, i64 0))
+  store double -1.000000e+00, double* %3, align 8
+  br label %85
+
+12:                                               ; preds = %2
+  %13 = getelementptr inbounds %struct.Circle, %struct.Circle* %0, i32 0, i32 1
+  %14 = load double, double* %13, align 8
+  %15 = fcmp ole double %14, 0.000000e+00
+  br i1 %15, label %16, label %18
+
+16:                                               ; preds = %12
+  %17 = load i32*, i32** %4, align 8
+  store i32 1, i32* %17, align 4
+  call void @setErrorMessage(i8* getelementptr inbounds ([22 x i8], [22 x i8]* @.str.37, i64 0, i64 0))
+  store double -1.000000e+00, double* %3, align 8
+  br label %85
+
+18:                                               ; preds = %12
+  %19 = getelementptr inbounds %struct.Circle, %struct.Circle* %0, i32 0, i32 1
+  %20 = load double, double* %19, align 8
+  %21 = fcmp ogt double %20, 1.000000e+03
+  br i1 %21, label %22, label %24
+
+22:                                               ; preds = %18
+  %23 = load i32*, i32** %4, align 8
+  store i32 3, i32* %23, align 4
+  call void @setErrorMessage(i8* getelementptr inbounds ([24 x i8], [24 x i8]* @.str.38, i64 0, i64 0))
+  store double -1.000000e+00, double* %3, align 8
+  br label %85
+
+24:                                               ; preds = %18
+  %25 = getelementptr inbounds %struct.Circle, %struct.Circle* %0, i32 0, i32 0
+  %26 = getelementptr inbounds %struct.Point, %struct.Point* %25, i32 0, i32 0
+  %27 = load i32, i32* %26, align 8
+  %28 = call i32 @abs(i32 %27) #7
+  %29 = icmp sgt i32 %28, 1000
+  br i1 %29, label %36, label %30
+
+30:                                               ; preds = %24
+  %31 = getelementptr inbounds %struct.Circle, %struct.Circle* %0, i32 0, i32 0
+  %32 = getelementptr inbounds %struct.Point, %struct.Point* %31, i32 0, i32 1
+  %33 = load i32, i32* %32, align 4
+  %34 = call i32 @abs(i32 %33) #7
+  %35 = icmp sgt i32 %34, 1000
+  br i1 %35, label %36, label %38
+
+36:                                               ; preds = %30, %24
+  %37 = load i32*, i32** %4, align 8
+  store i32 3, i32* %37, align 4
+  call void @setErrorMessage(i8* getelementptr inbounds ([45 x i8], [45 x i8]* @.str.39, i64 0, i64 0))
+  store double -1.000000e+00, double* %3, align 8
+  br label %85
+
+38:                                               ; preds = %30
+  %39 = getelementptr inbounds %struct.Circle, %struct.Circle* %0, i32 0, i32 1
+  %40 = load double, double* %39, align 8
+  %41 = fmul double 3.141590e+00, %40
+  %42 = getelementptr inbounds %struct.Circle, %struct.Circle* %0, i32 0, i32 1
+  %43 = load double, double* %42, align 8
+  %44 = fmul double %41, %43
+  store double %44, double* %5, align 8
+  %45 = load double, double* %5, align 8
+  %46 = fcmp uno double %45, %45
+  br i1 %46, label %56, label %47
+
+47:                                               ; preds = %38
+  %48 = load double, double* %5, align 8
+  %49 = call double @llvm.fabs.f64(double %48) #8
+  %50 = fcmp oeq double %49, 0x7FF0000000000000
+  %51 = bitcast double %48 to i64
+  %52 = icmp slt i64 %51, 0
+  %53 = select i1 %52, i32 -1, i32 1
+  %54 = select i1 %50, i32 %53, i32 0
+  %55 = icmp ne i32 %54, 0
+  br i1 %55, label %56, label %58
+
+56:                                               ; preds = %47, %38
+  %57 = load i32*, i32** %4, align 8
+  store i32 5, i32* %57, align 4
+  call void @setErrorMessage(i8* getelementptr inbounds ([26 x i8], [26 x i8]* @.str.40, i64 0, i64 0))
+  store double -1.000000e+00, double* %3, align 8
+  br label %85
+
+58:                                               ; preds = %47
+  %59 = getelementptr inbounds %struct.Circle, %struct.Circle* %0, i32 0, i32 3
+  %60 = getelementptr inbounds [256 x i8], [256 x i8]* %59, i64 0, i64 0
+  %61 = call i32 @strcmp(i8* %60, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.41, i64 0, i64 0)) #9
+  %62 = icmp eq i32 %61, 0
+  br i1 %62, label %63, label %65
+
+63:                                               ; preds = %58
+  %64 = load double, double* %5, align 8
+  store double %64, double* %3, align 8
+  br label %85
+
+65:                                               ; preds = %58
+  %66 = getelementptr inbounds %struct.Circle, %struct.Circle* %0, i32 0, i32 3
+  %67 = getelementptr inbounds [256 x i8], [256 x i8]* %66, i64 0, i64 0
+  %68 = call i32 @strcmp(i8* %67, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.42, i64 0, i64 0)) #9
+  %69 = icmp eq i32 %68, 0
+  br i1 %69, label %70, label %83
+
+70:                                               ; preds = %65
+  %71 = getelementptr inbounds %struct.Circle, %struct.Circle* %0, i32 0, i32 0
+  %72 = getelementptr inbounds %struct.Point, %struct.Point* %71, i32 0, i32 3
+  %73 = load double, double* %72, align 8
+  %74 = fcmp ole double %73, 0.000000e+00
+  br i1 %74, label %75, label %77
+
+75:                                               ; preds = %70
+  %76 = load i32*, i32** %4, align 8
+  store i32 1, i32* %76, align 4
+  call void @setErrorMessage(i8* getelementptr inbounds ([35 x i8], [35 x i8]* @.str.43, i64 0, i64 0))
+  store double -1.000000e+00, double* %3, align 8
+  br label %85
+
+77:                                               ; preds = %70
+  %78 = load double, double* %5, align 8
+  %79 = getelementptr inbounds %struct.Circle, %struct.Circle* %0, i32 0, i32 0
+  %80 = getelementptr inbounds %struct.Point, %struct.Point* %79, i32 0, i32 3
+  %81 = load double, double* %80, align 8
+  %82 = fmul double %78, %81
+  store double %82, double* %3, align 8
+  br label %85
+
+83:                                               ; preds = %65
+  %84 = load i32*, i32** %4, align 8
+  store i32 1, i32* %84, align 4
+  call void @setErrorMessage(i8* getelementptr inbounds ([20 x i8], [20 x i8]* @.str.44, i64 0, i64 0))
+  store double -1.000000e+00, double* %3, align 8
+  br label %85
+
+85:                                               ; preds = %83, %77, %75, %63, %56, %36, %22, %16, %10
+  %86 = load double, double* %3, align 8
+  ret double %86
+}
+
+; Function Attrs: nounwind readonly
+declare dso_local i32 @strcmp(i8*, i8*) #5
+
+; Function Attrs: noinline nounwind optnone uwtable
+define dso_local i32 @validateMatrix(%struct.Matrix* %0) #0 {
+  %2 = alloca i32, align 4
+  %3 = alloca %struct.Matrix*, align 8
+  %4 = alloca i32, align 4
+  store %struct.Matrix* %0, %struct.Matrix** %3, align 8
+  %5 = load %struct.Matrix*, %struct.Matrix** %3, align 8
+  %6 = icmp ne %struct.Matrix* %5, null
+  br i1 %6, label %8, label %7
+
+7:                                                ; preds = %1
+  call void @setErrorMessage(i8* getelementptr inbounds ([20 x i8], [20 x i8]* @.str.21, i64 0, i64 0))
+  store i32 7, i32* %2, align 4
+  br label %72
+
+8:                                                ; preds = %1
+  %9 = load %struct.Matrix*, %struct.Matrix** %3, align 8
+  %10 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %9, i32 0, i32 0
+  %11 = load i32**, i32*** %10, align 8
+  %12 = icmp ne i32** %11, null
+  br i1 %12, label %14, label %13
+
+13:                                               ; preds = %8
+  call void @setErrorMessage(i8* getelementptr inbounds ([17 x i8], [17 x i8]* @.str.45, i64 0, i64 0))
+  store i32 7, i32* %2, align 4
+  br label %72
+
+14:                                               ; preds = %8
+  %15 = load %struct.Matrix*, %struct.Matrix** %3, align 8
+  %16 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %15, i32 0, i32 1
+  %17 = load i32, i32* %16, align 8
+  %18 = icmp slt i32 %17, 1
+  br i1 %18, label %24, label %19
+
+19:                                               ; preds = %14
+  %20 = load %struct.Matrix*, %struct.Matrix** %3, align 8
+  %21 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %20, i32 0, i32 2
+  %22 = load i32, i32* %21, align 4
+  %23 = icmp slt i32 %22, 1
+  br i1 %23, label %24, label %25
+
+24:                                               ; preds = %19, %14
+  call void @setErrorMessage(i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.str.16, i64 0, i64 0))
+  store i32 1, i32* %2, align 4
+  br label %72
+
+25:                                               ; preds = %19
+  %26 = load %struct.Matrix*, %struct.Matrix** %3, align 8
+  %27 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %26, i32 0, i32 1
+  %28 = load i32, i32* %27, align 8
+  %29 = icmp sgt i32 %28, 100
+  br i1 %29, label %35, label %30
+
+30:                                               ; preds = %25
+  %31 = load %struct.Matrix*, %struct.Matrix** %3, align 8
+  %32 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %31, i32 0, i32 2
+  %33 = load i32, i32* %32, align 4
+  %34 = icmp sgt i32 %33, 100
+  br i1 %34, label %35, label %36
+
+35:                                               ; preds = %30, %25
+  call void @setErrorMessage(i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.str.46, i64 0, i64 0))
+  store i32 3, i32* %2, align 4
+  br label %72
+
+36:                                               ; preds = %30
+  store i32 0, i32* %4, align 4
+  br label %37
+
+37:                                               ; preds = %54, %36
+  %38 = load i32, i32* %4, align 4
+  %39 = load %struct.Matrix*, %struct.Matrix** %3, align 8
+  %40 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %39, i32 0, i32 1
+  %41 = load i32, i32* %40, align 8
+  %42 = icmp slt i32 %38, %41
+  br i1 %42, label %43, label %57
+
+43:                                               ; preds = %37
+  %44 = load %struct.Matrix*, %struct.Matrix** %3, align 8
+  %45 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %44, i32 0, i32 0
+  %46 = load i32**, i32*** %45, align 8
+  %47 = load i32, i32* %4, align 4
+  %48 = sext i32 %47 to i64
+  %49 = getelementptr inbounds i32*, i32** %46, i64 %48
+  %50 = load i32*, i32** %49, align 8
+  %51 = icmp ne i32* %50, null
+  br i1 %51, label %53, label %52
+
+52:                                               ; preds = %43
+  call void @setErrorMessage(i8* getelementptr inbounds ([27 x i8], [27 x i8]* @.str.47, i64 0, i64 0))
+  store i32 7, i32* %2, align 4
+  br label %72
+
+53:                                               ; preds = %43
+  br label %54
+
+54:                                               ; preds = %53
+  %55 = load i32, i32* %4, align 4
+  %56 = add nsw i32 %55, 1
+  store i32 %56, i32* %4, align 4
+  br label %37
+
+57:                                               ; preds = %37
+  %58 = load %struct.Matrix*, %struct.Matrix** %3, align 8
+  %59 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %58, i32 0, i32 1
+  %60 = load i32, i32* %59, align 8
+  %61 = load %struct.Matrix*, %struct.Matrix** %3, align 8
+  %62 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %61, i32 0, i32 2
+  %63 = load i32, i32* %62, align 4
+  %64 = icmp eq i32 %60, %63
+  %65 = zext i1 %64 to i32
+  %66 = load %struct.Matrix*, %struct.Matrix** %3, align 8
+  %67 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %66, i32 0, i32 3
+  %68 = load i32, i32* %67, align 8
+  %69 = icmp ne i32 %65, %68
+  br i1 %69, label %70, label %71
+
+70:                                               ; preds = %57
+  call void @setErrorMessage(i8* getelementptr inbounds ([32 x i8], [32 x i8]* @.str.48, i64 0, i64 0))
+  store i32 1, i32* %2, align 4
+  br label %72
+
+71:                                               ; preds = %57
+  store i32 0, i32* %2, align 4
+  br label %72
+
+72:                                               ; preds = %71, %70, %52, %35, %24, %13, %7
+  %73 = load i32, i32* %2, align 4
+  ret i32 %73
+}
+
+; Function Attrs: noinline nounwind optnone uwtable
+define dso_local void @removeDuplicates(%struct.DynamicArray* %0) #0 {
+  %2 = alloca %struct.DynamicArray*, align 8
+  %3 = alloca i32, align 4
+  %4 = alloca i32, align 4
+  %5 = alloca i32, align 4
+  store %struct.DynamicArray* %0, %struct.DynamicArray** %2, align 8
+  %6 = load %struct.DynamicArray*, %struct.DynamicArray** %2, align 8
+  %7 = icmp ne %struct.DynamicArray* %6, null
+  br i1 %7, label %8, label %13
+
+8:                                                ; preds = %1
+  %9 = load %struct.DynamicArray*, %struct.DynamicArray** %2, align 8
+  %10 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %9, i32 0, i32 0
+  %11 = load i32*, i32** %10, align 8
+  %12 = icmp ne i32* %11, null
+  br i1 %12, label %14, label %13
+
+13:                                               ; preds = %8, %1
+  call void @setErrorMessage(i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.49, i64 0, i64 0))
+  br label %81
+
+14:                                               ; preds = %8
+  %15 = load %struct.DynamicArray*, %struct.DynamicArray** %2, align 8
+  %16 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %15, i32 0, i32 1
+  %17 = load i32, i32* %16, align 8
+  %18 = icmp sle i32 %17, 1
+  br i1 %18, label %19, label %20
+
+19:                                               ; preds = %14
+  br label %81
+
+20:                                               ; preds = %14
+  store i32 0, i32* %3, align 4
+  %21 = load %struct.DynamicArray*, %struct.DynamicArray** %2, align 8
+  %22 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %21, i32 0, i32 0
+  %23 = load i32*, i32** %22, align 8
+  %24 = load %struct.DynamicArray*, %struct.DynamicArray** %2, align 8
+  %25 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %24, i32 0, i32 1
+  %26 = load i32, i32* %25, align 8
+  %27 = sub nsw i32 %26, 1
+  call void @quickSort(i32* %23, i32 0, i32 %27, i32* %3)
+  %28 = load i32, i32* %3, align 4
+  %29 = icmp ne i32 %28, 0
+  br i1 %29, label %30, label %31
+
+30:                                               ; preds = %20
+  br label %81
+
+31:                                               ; preds = %20
+  store i32 1, i32* %4, align 4
+  store i32 1, i32* %5, align 4
+  br label %32
+
+32:                                               ; preds = %72, %31
+  %33 = load i32, i32* %5, align 4
+  %34 = load %struct.DynamicArray*, %struct.DynamicArray** %2, align 8
+  %35 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %34, i32 0, i32 1
+  %36 = load i32, i32* %35, align 8
+  %37 = icmp slt i32 %33, %36
+  br i1 %37, label %38, label %75
+
+38:                                               ; preds = %32
+  %39 = load %struct.DynamicArray*, %struct.DynamicArray** %2, align 8
+  %40 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %39, i32 0, i32 0
+  %41 = load i32*, i32** %40, align 8
+  %42 = load i32, i32* %5, align 4
+  %43 = sext i32 %42 to i64
+  %44 = getelementptr inbounds i32, i32* %41, i64 %43
+  %45 = load i32, i32* %44, align 4
+  %46 = load %struct.DynamicArray*, %struct.DynamicArray** %2, align 8
+  %47 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %46, i32 0, i32 0
+  %48 = load i32*, i32** %47, align 8
+  %49 = load i32, i32* %5, align 4
+  %50 = sub nsw i32 %49, 1
+  %51 = sext i32 %50 to i64
+  %52 = getelementptr inbounds i32, i32* %48, i64 %51
+  %53 = load i32, i32* %52, align 4
+  %54 = icmp ne i32 %45, %53
+  br i1 %54, label %55, label %71
+
+55:                                               ; preds = %38
+  %56 = load %struct.DynamicArray*, %struct.DynamicArray** %2, align 8
+  %57 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %56, i32 0, i32 0
+  %58 = load i32*, i32** %57, align 8
+  %59 = load i32, i32* %5, align 4
+  %60 = sext i32 %59 to i64
+  %61 = getelementptr inbounds i32, i32* %58, i64 %60
+  %62 = load i32, i32* %61, align 4
+  %63 = load %struct.DynamicArray*, %struct.DynamicArray** %2, align 8
+  %64 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %63, i32 0, i32 0
+  %65 = load i32*, i32** %64, align 8
+  %66 = load i32, i32* %4, align 4
+  %67 = sext i32 %66 to i64
+  %68 = getelementptr inbounds i32, i32* %65, i64 %67
+  store i32 %62, i32* %68, align 4
+  %69 = load i32, i32* %4, align 4
+  %70 = add nsw i32 %69, 1
+  store i32 %70, i32* %4, align 4
+  br label %71
+
+71:                                               ; preds = %55, %38
+  br label %72
+
+72:                                               ; preds = %71
+  %73 = load i32, i32* %5, align 4
+  %74 = add nsw i32 %73, 1
+  store i32 %74, i32* %5, align 4
+  br label %32
+
+75:                                               ; preds = %32
+  %76 = load i32, i32* %4, align 4
+  %77 = load %struct.DynamicArray*, %struct.DynamicArray** %2, align 8
+  %78 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %77, i32 0, i32 1
+  store i32 %76, i32* %78, align 8
+  %79 = load %struct.DynamicArray*, %struct.DynamicArray** %2, align 8
+  %80 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %79, i32 0, i32 3
+  store i32 1, i32* %80, align 8
+  br label %81
+
+81:                                               ; preds = %75, %30, %19, %13
+  ret void
+}
+
+; Function Attrs: noinline nounwind optnone uwtable
+define dso_local %struct.Point* @findCentroid(%struct.Point* %0, i32 %1, i32* %2) #0 {
+  %4 = alloca %struct.Point*, align 8
+  %5 = alloca %struct.Point*, align 8
+  %6 = alloca i32, align 4
+  %7 = alloca i32*, align 8
+  %8 = alloca %struct.Point*, align 8
+  %9 = alloca double, align 8
+  %10 = alloca double, align 8
+  %11 = alloca double, align 8
+  %12 = alloca i32, align 4
+  store %struct.Point* %0, %struct.Point** %5, align 8
+  store i32 %1, i32* %6, align 4
+  store i32* %2, i32** %7, align 8
+  %13 = load i32*, i32** %7, align 8
+  store i32 0, i32* %13, align 4
+  %14 = load %struct.Point*, %struct.Point** %5, align 8
+  %15 = icmp ne %struct.Point* %14, null
+  br i1 %15, label %16, label %19
+
+16:                                               ; preds = %3
+  %17 = load i32, i32* %6, align 4
+  %18 = icmp sle i32 %17, 0
+  br i1 %18, label %19, label %21
+
+19:                                               ; preds = %16, %3
+  %20 = load i32*, i32** %7, align 8
+  store i32 1, i32* %20, align 4
+  call void @setErrorMessage(i8* getelementptr inbounds ([21 x i8], [21 x i8]* @.str.50, i64 0, i64 0))
+  store %struct.Point* null, %struct.Point** %4, align 8
+  br label %165
+
+21:                                               ; preds = %16
+  %22 = load i32, i32* %6, align 4
+  %23 = icmp sgt i32 %22, 1000
+  br i1 %23, label %24, label %26
+
+24:                                               ; preds = %21
+  %25 = load i32*, i32** %7, align 8
+  store i32 3, i32* %25, align 4
+  call void @setErrorMessage(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.51, i64 0, i64 0))
+  store %struct.Point* null, %struct.Point** %4, align 8
+  br label %165
+
+26:                                               ; preds = %21
+  %27 = call noalias i8* @malloc(i64 272) #6
+  %28 = bitcast i8* %27 to %struct.Point*
+  store %struct.Point* %28, %struct.Point** %8, align 8
+  %29 = load %struct.Point*, %struct.Point** %8, align 8
+  %30 = icmp ne %struct.Point* %29, null
+  br i1 %30, label %33, label %31
+
+31:                                               ; preds = %26
+  %32 = load i32*, i32** %7, align 8
+  store i32 2, i32* %32, align 4
+  call void @setErrorMessage(i8* getelementptr inbounds ([39 x i8], [39 x i8]* @.str.52, i64 0, i64 0))
+  store %struct.Point* null, %struct.Point** %4, align 8
+  br label %165
+
+33:                                               ; preds = %26
+  store double 0.000000e+00, double* %9, align 8
+  store double 0.000000e+00, double* %10, align 8
+  store double 0.000000e+00, double* %11, align 8
+  store i32 0, i32* %12, align 4
+  br label %34
+
+34:                                               ; preds = %131, %33
+  %35 = load i32, i32* %12, align 4
+  %36 = load i32, i32* %6, align 4
+  %37 = icmp slt i32 %35, %36
+  br i1 %37, label %38, label %134
+
+38:                                               ; preds = %34
+  %39 = load %struct.Point*, %struct.Point** %5, align 8
+  %40 = load i32, i32* %12, align 4
+  %41 = sext i32 %40 to i64
+  %42 = getelementptr inbounds %struct.Point, %struct.Point* %39, i64 %41
+  %43 = getelementptr inbounds %struct.Point, %struct.Point* %42, i32 0, i32 3
+  %44 = load double, double* %43, align 8
+  %45 = fcmp ole double %44, 0.000000e+00
+  br i1 %45, label %46, label %50
+
+46:                                               ; preds = %38
+  %47 = load i32*, i32** %7, align 8
+  store i32 1, i32* %47, align 4
+  call void @setErrorMessage(i8* getelementptr inbounds ([21 x i8], [21 x i8]* @.str.53, i64 0, i64 0))
+  %48 = load %struct.Point*, %struct.Point** %8, align 8
+  %49 = bitcast %struct.Point* %48 to i8*
+  call void @free(i8* %49) #6
+  store %struct.Point* null, %struct.Point** %4, align 8
+  br label %165
+
+50:                                               ; preds = %38
+  %51 = load %struct.Point*, %struct.Point** %5, align 8
+  %52 = load i32, i32* %12, align 4
+  %53 = sext i32 %52 to i64
+  %54 = getelementptr inbounds %struct.Point, %struct.Point* %51, i64 %53
+  %55 = getelementptr inbounds %struct.Point, %struct.Point* %54, i32 0, i32 3
+  %56 = load double, double* %55, align 8
+  %57 = load double, double* %9, align 8
+  %58 = fadd double %57, %56
+  store double %58, double* %9, align 8
+  %59 = load %struct.Point*, %struct.Point** %5, align 8
+  %60 = load i32, i32* %12, align 4
+  %61 = sext i32 %60 to i64
+  %62 = getelementptr inbounds %struct.Point, %struct.Point* %59, i64 %61
+  %63 = getelementptr inbounds %struct.Point, %struct.Point* %62, i32 0, i32 0
+  %64 = load i32, i32* %63, align 8
+  %65 = sitofp i32 %64 to double
+  %66 = load %struct.Point*, %struct.Point** %5, align 8
+  %67 = load i32, i32* %12, align 4
+  %68 = sext i32 %67 to i64
+  %69 = getelementptr inbounds %struct.Point, %struct.Point* %66, i64 %68
+  %70 = getelementptr inbounds %struct.Point, %struct.Point* %69, i32 0, i32 3
+  %71 = load double, double* %70, align 8
+  %72 = fmul double %65, %71
+  %73 = load double, double* %10, align 8
+  %74 = fadd double %73, %72
+  store double %74, double* %10, align 8
+  %75 = load %struct.Point*, %struct.Point** %5, align 8
+  %76 = load i32, i32* %12, align 4
+  %77 = sext i32 %76 to i64
+  %78 = getelementptr inbounds %struct.Point, %struct.Point* %75, i64 %77
+  %79 = getelementptr inbounds %struct.Point, %struct.Point* %78, i32 0, i32 1
+  %80 = load i32, i32* %79, align 4
+  %81 = sitofp i32 %80 to double
+  %82 = load %struct.Point*, %struct.Point** %5, align 8
+  %83 = load i32, i32* %12, align 4
+  %84 = sext i32 %83 to i64
+  %85 = getelementptr inbounds %struct.Point, %struct.Point* %82, i64 %84
+  %86 = getelementptr inbounds %struct.Point, %struct.Point* %85, i32 0, i32 3
+  %87 = load double, double* %86, align 8
+  %88 = fmul double %81, %87
+  %89 = load double, double* %11, align 8
+  %90 = fadd double %89, %88
+  store double %90, double* %11, align 8
+  %91 = load double, double* %9, align 8
+  %92 = fcmp uno double %91, %91
+  br i1 %92, label %126, label %93
+
+93:                                               ; preds = %50
+  %94 = load double, double* %10, align 8
+  %95 = fcmp uno double %94, %94
+  br i1 %95, label %126, label %96
+
+96:                                               ; preds = %93
+  %97 = load double, double* %11, align 8
+  %98 = fcmp uno double %97, %97
+  br i1 %98, label %126, label %99
+
+99:                                               ; preds = %96
+  %100 = load double, double* %9, align 8
+  %101 = call double @llvm.fabs.f64(double %100) #8
+  %102 = fcmp oeq double %101, 0x7FF0000000000000
+  %103 = bitcast double %100 to i64
+  %104 = icmp slt i64 %103, 0
+  %105 = select i1 %104, i32 -1, i32 1
+  %106 = select i1 %102, i32 %105, i32 0
+  %107 = icmp ne i32 %106, 0
+  br i1 %107, label %126, label %108
+
+108:                                              ; preds = %99
+  %109 = load double, double* %10, align 8
+  %110 = call double @llvm.fabs.f64(double %109) #8
+  %111 = fcmp oeq double %110, 0x7FF0000000000000
+  %112 = bitcast double %109 to i64
+  %113 = icmp slt i64 %112, 0
+  %114 = select i1 %113, i32 -1, i32 1
+  %115 = select i1 %111, i32 %114, i32 0
+  %116 = icmp ne i32 %115, 0
+  br i1 %116, label %126, label %117
+
+117:                                              ; preds = %108
+  %118 = load double, double* %11, align 8
+  %119 = call double @llvm.fabs.f64(double %118) #8
+  %120 = fcmp oeq double %119, 0x7FF0000000000000
+  %121 = bitcast double %118 to i64
+  %122 = icmp slt i64 %121, 0
+  %123 = select i1 %122, i32 -1, i32 1
+  %124 = select i1 %120, i32 %123, i32 0
+  %125 = icmp ne i32 %124, 0
+  br i1 %125, label %126, label %130
+
+126:                                              ; preds = %117, %108, %99, %96, %93, %50
+  %127 = load i32*, i32** %7, align 8
+  store i32 5, i32* %127, align 4
+  call void @setErrorMessage(i8* getelementptr inbounds ([30 x i8], [30 x i8]* @.str.54, i64 0, i64 0))
+  %128 = load %struct.Point*, %struct.Point** %8, align 8
+  %129 = bitcast %struct.Point* %128 to i8*
+  call void @free(i8* %129) #6
+  store %struct.Point* null, %struct.Point** %4, align 8
+  br label %165
+
+130:                                              ; preds = %117
+  br label %131
+
+131:                                              ; preds = %130
+  %132 = load i32, i32* %12, align 4
+  %133 = add nsw i32 %132, 1
+  store i32 %133, i32* %12, align 4
+  br label %34
+
+134:                                              ; preds = %34
+  %135 = load double, double* %9, align 8
+  %136 = fcmp oeq double %135, 0.000000e+00
+  br i1 %136, label %137, label %141
+
+137:                                              ; preds = %134
+  %138 = load i32*, i32** %7, align 8
+  store i32 1, i32* %138, align 4
+  call void @setErrorMessage(i8* getelementptr inbounds ([21 x i8], [21 x i8]* @.str.55, i64 0, i64 0))
+  %139 = load %struct.Point*, %struct.Point** %8, align 8
+  %140 = bitcast %struct.Point* %139 to i8*
+  call void @free(i8* %140) #6
+  store %struct.Point* null, %struct.Point** %4, align 8
+  br label %165
+
+141:                                              ; preds = %134
+  %142 = load double, double* %10, align 8
+  %143 = load double, double* %9, align 8
+  %144 = fdiv double %142, %143
+  %145 = fptosi double %144 to i32
+  %146 = load %struct.Point*, %struct.Point** %8, align 8
+  %147 = getelementptr inbounds %struct.Point, %struct.Point* %146, i32 0, i32 0
+  store i32 %145, i32* %147, align 8
+  %148 = load double, double* %11, align 8
+  %149 = load double, double* %9, align 8
+  %150 = fdiv double %148, %149
+  %151 = fptosi double %150 to i32
+  %152 = load %struct.Point*, %struct.Point** %8, align 8
+  %153 = getelementptr inbounds %struct.Point, %struct.Point* %152, i32 0, i32 1
+  store i32 %151, i32* %153, align 4
+  %154 = load double, double* %9, align 8
+  %155 = load i32, i32* %6, align 4
+  %156 = sitofp i32 %155 to double
+  %157 = fdiv double %154, %156
+  %158 = load %struct.Point*, %struct.Point** %8, align 8
+  %159 = getelementptr inbounds %struct.Point, %struct.Point* %158, i32 0, i32 3
+  store double %157, double* %159, align 8
+  %160 = load %struct.Point*, %struct.Point** %8, align 8
+  %161 = getelementptr inbounds %struct.Point, %struct.Point* %160, i32 0, i32 2
+  %162 = getelementptr inbounds [256 x i8], [256 x i8]* %161, i64 0, i64 0
+  %163 = call i8* @strcpy(i8* %162, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.56, i64 0, i64 0)) #6
+  %164 = load %struct.Point*, %struct.Point** %8, align 8
+  store %struct.Point* %164, %struct.Point** %4, align 8
+  br label %165
+
+165:                                              ; preds = %141, %137, %126, %46, %31, %24, %19
+  %166 = load %struct.Point*, %struct.Point** %4, align 8
+  ret %struct.Point* %166
+}
+
+; Function Attrs: nounwind
+declare dso_local i8* @strcpy(i8*, i8*) #1
+
+attributes #0 = { noinline nounwind optnone uwtable "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "frame-pointer"="all" "less-precise-fpmad"="false" "min-legal-vector-width"="0" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }
+attributes #1 = { nounwind "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "frame-pointer"="all" "less-precise-fpmad"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }
+attributes #2 = { "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "frame-pointer"="all" "less-precise-fpmad"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }
+attributes #3 = { nounwind readnone "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "frame-pointer"="all" "less-precise-fpmad"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }
+attributes #4 = { nounwind readnone speculatable willreturn }
+attributes #5 = { nounwind readonly "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "frame-pointer"="all" "less-precise-fpmad"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }
+attributes #6 = { nounwind }
+attributes #7 = { nounwind readnone }
+attributes #8 = { readnone }
+attributes #9 = { nounwind readonly }
+
+!llvm.module.flags = !{!0}
+!llvm.ident = !{!1}
+
+!0 = !{i32 1, !"wchar_size", i32 4}
+!1 = !{!"clang version 10.0.0-4ubuntu1 "}

BIN
combine_output/projectB.bc


+ 584 - 0
combine_output/projectB.ll

@@ -0,0 +1,584 @@
+; ModuleID = 'data/projectB.c'
+source_filename = "data/projectB.c"
+target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-pc-linux-gnu"
+
+@cache = internal global [100 x i32] zeroinitializer, align 16
+@__const.projectB_main.str = private unnamed_addr constant [14 x i8] c"Hello, World!\00", align 1
+@__const.projectB_main.arr = private unnamed_addr constant [8 x i32] [i32 10, i32 22, i32 9, i32 33, i32 21, i32 50, i32 41, i32 60], align 16
+@__const.projectB_main.matrix = private unnamed_addr constant <{ <{ i32, i32, i32, [97 x i32] }>, <{ i32, i32, i32, [97 x i32] }>, <{ i32, i32, i32, [97 x i32] }>, [97 x <{ i32, i32, i32, [97 x i32] }>] }> <{ <{ i32, i32, i32, [97 x i32] }> <{ i32 1, i32 2, i32 3, [97 x i32] zeroinitializer }>, <{ i32, i32, i32, [97 x i32] }> <{ i32 4, i32 5, i32 6, [97 x i32] zeroinitializer }>, <{ i32, i32, i32, [97 x i32] }> <{ i32 7, i32 8, i32 9, [97 x i32] zeroinitializer }>, [97 x <{ i32, i32, i32, [97 x i32] }>] zeroinitializer }>, align 16
+
+; Function Attrs: noinline nounwind optnone uwtable
+define dso_local void @reverseString(i8* %0) #0 {
+  %2 = alloca i8*, align 8
+  %3 = alloca i32, align 4
+  %4 = alloca i32, align 4
+  %5 = alloca i8, align 1
+  store i8* %0, i8** %2, align 8
+  %6 = load i8*, i8** %2, align 8
+  %7 = call i64 @strlen(i8* %6) #3
+  %8 = trunc i64 %7 to i32
+  store i32 %8, i32* %3, align 4
+  store i32 0, i32* %4, align 4
+  br label %9
+
+9:                                                ; preds = %40, %1
+  %10 = load i32, i32* %4, align 4
+  %11 = load i32, i32* %3, align 4
+  %12 = sdiv i32 %11, 2
+  %13 = icmp slt i32 %10, %12
+  br i1 %13, label %14, label %43
+
+14:                                               ; preds = %9
+  %15 = load i8*, i8** %2, align 8
+  %16 = load i32, i32* %4, align 4
+  %17 = sext i32 %16 to i64
+  %18 = getelementptr inbounds i8, i8* %15, i64 %17
+  %19 = load i8, i8* %18, align 1
+  store i8 %19, i8* %5, align 1
+  %20 = load i8*, i8** %2, align 8
+  %21 = load i32, i32* %3, align 4
+  %22 = sub nsw i32 %21, 1
+  %23 = load i32, i32* %4, align 4
+  %24 = sub nsw i32 %22, %23
+  %25 = sext i32 %24 to i64
+  %26 = getelementptr inbounds i8, i8* %20, i64 %25
+  %27 = load i8, i8* %26, align 1
+  %28 = load i8*, i8** %2, align 8
+  %29 = load i32, i32* %4, align 4
+  %30 = sext i32 %29 to i64
+  %31 = getelementptr inbounds i8, i8* %28, i64 %30
+  store i8 %27, i8* %31, align 1
+  %32 = load i8, i8* %5, align 1
+  %33 = load i8*, i8** %2, align 8
+  %34 = load i32, i32* %3, align 4
+  %35 = sub nsw i32 %34, 1
+  %36 = load i32, i32* %4, align 4
+  %37 = sub nsw i32 %35, %36
+  %38 = sext i32 %37 to i64
+  %39 = getelementptr inbounds i8, i8* %33, i64 %38
+  store i8 %32, i8* %39, align 1
+  br label %40
+
+40:                                               ; preds = %14
+  %41 = load i32, i32* %4, align 4
+  %42 = add nsw i32 %41, 1
+  store i32 %42, i32* %4, align 4
+  br label %9
+
+43:                                               ; preds = %9
+  ret void
+}
+
+; Function Attrs: nounwind readonly
+declare dso_local i64 @strlen(i8*) #1
+
+; Function Attrs: noinline nounwind optnone uwtable
+define dso_local i32 @longestIncreasingSubsequence(i32* %0, i32 %1) #0 {
+  %3 = alloca i32*, align 8
+  %4 = alloca i32, align 4
+  %5 = alloca [100 x i32], align 16
+  %6 = alloca i32, align 4
+  %7 = alloca i32, align 4
+  %8 = alloca i32, align 4
+  %9 = alloca i32, align 4
+  %10 = alloca i32, align 4
+  store i32* %0, i32** %3, align 8
+  store i32 %1, i32* %4, align 4
+  store i32 0, i32* %6, align 4
+  br label %11
+
+11:                                               ; preds = %19, %2
+  %12 = load i32, i32* %6, align 4
+  %13 = load i32, i32* %4, align 4
+  %14 = icmp slt i32 %12, %13
+  br i1 %14, label %15, label %22
+
+15:                                               ; preds = %11
+  %16 = load i32, i32* %6, align 4
+  %17 = sext i32 %16 to i64
+  %18 = getelementptr inbounds [100 x i32], [100 x i32]* %5, i64 0, i64 %17
+  store i32 1, i32* %18, align 4
+  br label %19
+
+19:                                               ; preds = %15
+  %20 = load i32, i32* %6, align 4
+  %21 = add nsw i32 %20, 1
+  store i32 %21, i32* %6, align 4
+  br label %11
+
+22:                                               ; preds = %11
+  store i32 1, i32* %7, align 4
+  br label %23
+
+23:                                               ; preds = %69, %22
+  %24 = load i32, i32* %7, align 4
+  %25 = load i32, i32* %4, align 4
+  %26 = icmp slt i32 %24, %25
+  br i1 %26, label %27, label %72
+
+27:                                               ; preds = %23
+  store i32 0, i32* %8, align 4
+  br label %28
+
+28:                                               ; preds = %65, %27
+  %29 = load i32, i32* %8, align 4
+  %30 = load i32, i32* %7, align 4
+  %31 = icmp slt i32 %29, %30
+  br i1 %31, label %32, label %68
+
+32:                                               ; preds = %28
+  %33 = load i32*, i32** %3, align 8
+  %34 = load i32, i32* %7, align 4
+  %35 = sext i32 %34 to i64
+  %36 = getelementptr inbounds i32, i32* %33, i64 %35
+  %37 = load i32, i32* %36, align 4
+  %38 = load i32*, i32** %3, align 8
+  %39 = load i32, i32* %8, align 4
+  %40 = sext i32 %39 to i64
+  %41 = getelementptr inbounds i32, i32* %38, i64 %40
+  %42 = load i32, i32* %41, align 4
+  %43 = icmp sgt i32 %37, %42
+  br i1 %43, label %44, label %64
+
+44:                                               ; preds = %32
+  %45 = load i32, i32* %7, align 4
+  %46 = sext i32 %45 to i64
+  %47 = getelementptr inbounds [100 x i32], [100 x i32]* %5, i64 0, i64 %46
+  %48 = load i32, i32* %47, align 4
+  %49 = load i32, i32* %8, align 4
+  %50 = sext i32 %49 to i64
+  %51 = getelementptr inbounds [100 x i32], [100 x i32]* %5, i64 0, i64 %50
+  %52 = load i32, i32* %51, align 4
+  %53 = add nsw i32 %52, 1
+  %54 = icmp slt i32 %48, %53
+  br i1 %54, label %55, label %64
+
+55:                                               ; preds = %44
+  %56 = load i32, i32* %8, align 4
+  %57 = sext i32 %56 to i64
+  %58 = getelementptr inbounds [100 x i32], [100 x i32]* %5, i64 0, i64 %57
+  %59 = load i32, i32* %58, align 4
+  %60 = add nsw i32 %59, 1
+  %61 = load i32, i32* %7, align 4
+  %62 = sext i32 %61 to i64
+  %63 = getelementptr inbounds [100 x i32], [100 x i32]* %5, i64 0, i64 %62
+  store i32 %60, i32* %63, align 4
+  br label %64
+
+64:                                               ; preds = %55, %44, %32
+  br label %65
+
+65:                                               ; preds = %64
+  %66 = load i32, i32* %8, align 4
+  %67 = add nsw i32 %66, 1
+  store i32 %67, i32* %8, align 4
+  br label %28
+
+68:                                               ; preds = %28
+  br label %69
+
+69:                                               ; preds = %68
+  %70 = load i32, i32* %7, align 4
+  %71 = add nsw i32 %70, 1
+  store i32 %71, i32* %7, align 4
+  br label %23
+
+72:                                               ; preds = %23
+  store i32 0, i32* %9, align 4
+  store i32 0, i32* %10, align 4
+  br label %73
+
+73:                                               ; preds = %90, %72
+  %74 = load i32, i32* %10, align 4
+  %75 = load i32, i32* %4, align 4
+  %76 = icmp slt i32 %74, %75
+  br i1 %76, label %77, label %93
+
+77:                                               ; preds = %73
+  %78 = load i32, i32* %9, align 4
+  %79 = load i32, i32* %10, align 4
+  %80 = sext i32 %79 to i64
+  %81 = getelementptr inbounds [100 x i32], [100 x i32]* %5, i64 0, i64 %80
+  %82 = load i32, i32* %81, align 4
+  %83 = icmp slt i32 %78, %82
+  br i1 %83, label %84, label %89
+
+84:                                               ; preds = %77
+  %85 = load i32, i32* %10, align 4
+  %86 = sext i32 %85 to i64
+  %87 = getelementptr inbounds [100 x i32], [100 x i32]* %5, i64 0, i64 %86
+  %88 = load i32, i32* %87, align 4
+  store i32 %88, i32* %9, align 4
+  br label %89
+
+89:                                               ; preds = %84, %77
+  br label %90
+
+90:                                               ; preds = %89
+  %91 = load i32, i32* %10, align 4
+  %92 = add nsw i32 %91, 1
+  store i32 %92, i32* %10, align 4
+  br label %73
+
+93:                                               ; preds = %73
+  %94 = load i32, i32* %9, align 4
+  ret i32 %94
+}
+
+; Function Attrs: noinline nounwind optnone uwtable
+define dso_local i32 @testPoints(i32 %0) #0 {
+  %2 = alloca i32, align 4
+  %3 = alloca i32, align 4
+  %4 = alloca i32, align 4
+  %5 = alloca i32, align 4
+  store i32 %0, i32* %3, align 4
+  store i32 0, i32* %4, align 4
+  store i32 1, i32* %5, align 4
+  br label %6
+
+6:                                                ; preds = %16, %1
+  %7 = load i32, i32* %5, align 4
+  %8 = icmp slt i32 %7, 5
+  br i1 %8, label %9, label %19
+
+9:                                                ; preds = %6
+  %10 = load i32, i32* %4, align 4
+  %11 = add nsw i32 %10, 1
+  store i32 %11, i32* %4, align 4
+  %12 = load i32, i32* %3, align 4
+  %13 = icmp sgt i32 %12, 2
+  br i1 %13, label %14, label %15
+
+14:                                               ; preds = %9
+  store i32 23, i32* %2, align 4
+  br label %21
+
+15:                                               ; preds = %9
+  br label %16
+
+16:                                               ; preds = %15
+  %17 = load i32, i32* %5, align 4
+  %18 = add nsw i32 %17, 1
+  store i32 %18, i32* %5, align 4
+  br label %6
+
+19:                                               ; preds = %6
+  %20 = load i32, i32* %4, align 4
+  store i32 %20, i32* %2, align 4
+  br label %21
+
+21:                                               ; preds = %19, %14
+  %22 = load i32, i32* %2, align 4
+  ret i32 %22
+}
+
+; Function Attrs: noinline nounwind optnone uwtable
+define dso_local i32 @countSetBits(i32 %0) #0 {
+  %2 = alloca i32, align 4
+  %3 = alloca i32, align 4
+  store i32 %0, i32* %2, align 4
+  store i32 0, i32* %3, align 4
+  br label %4
+
+4:                                                ; preds = %7, %1
+  %5 = load i32, i32* %2, align 4
+  %6 = icmp ne i32 %5, 0
+  br i1 %6, label %7, label %14
+
+7:                                                ; preds = %4
+  %8 = load i32, i32* %2, align 4
+  %9 = and i32 %8, 1
+  %10 = load i32, i32* %3, align 4
+  %11 = add nsw i32 %10, %9
+  store i32 %11, i32* %3, align 4
+  %12 = load i32, i32* %2, align 4
+  %13 = ashr i32 %12, 1
+  store i32 %13, i32* %2, align 4
+  br label %4
+
+14:                                               ; preds = %4
+  %15 = load i32, i32* %3, align 4
+  ret i32 %15
+}
+
+; Function Attrs: noinline nounwind optnone uwtable
+define dso_local i32 @memoizedFib(i32 %0) #0 {
+  %2 = alloca i32, align 4
+  %3 = alloca i32, align 4
+  store i32 %0, i32* %3, align 4
+  %4 = load i32, i32* %3, align 4
+  %5 = sext i32 %4 to i64
+  %6 = getelementptr inbounds [100 x i32], [100 x i32]* @cache, i64 0, i64 %5
+  %7 = load i32, i32* %6, align 4
+  %8 = icmp ne i32 %7, -1
+  br i1 %8, label %9, label %14
+
+9:                                                ; preds = %1
+  %10 = load i32, i32* %3, align 4
+  %11 = sext i32 %10 to i64
+  %12 = getelementptr inbounds [100 x i32], [100 x i32]* @cache, i64 0, i64 %11
+  %13 = load i32, i32* %12, align 4
+  store i32 %13, i32* %2, align 4
+  br label %34
+
+14:                                               ; preds = %1
+  %15 = load i32, i32* %3, align 4
+  %16 = icmp sle i32 %15, 1
+  br i1 %16, label %17, label %19
+
+17:                                               ; preds = %14
+  %18 = load i32, i32* %3, align 4
+  store i32 %18, i32* %2, align 4
+  br label %34
+
+19:                                               ; preds = %14
+  %20 = load i32, i32* %3, align 4
+  %21 = sub nsw i32 %20, 1
+  %22 = call i32 @memoizedFib(i32 %21)
+  %23 = load i32, i32* %3, align 4
+  %24 = sub nsw i32 %23, 2
+  %25 = call i32 @memoizedFib(i32 %24)
+  %26 = add nsw i32 %22, %25
+  %27 = load i32, i32* %3, align 4
+  %28 = sext i32 %27 to i64
+  %29 = getelementptr inbounds [100 x i32], [100 x i32]* @cache, i64 0, i64 %28
+  store i32 %26, i32* %29, align 4
+  %30 = load i32, i32* %3, align 4
+  %31 = sext i32 %30 to i64
+  %32 = getelementptr inbounds [100 x i32], [100 x i32]* @cache, i64 0, i64 %31
+  %33 = load i32, i32* %32, align 4
+  store i32 %33, i32* %2, align 4
+  br label %34
+
+34:                                               ; preds = %19, %17, %9
+  %35 = load i32, i32* %2, align 4
+  ret i32 %35
+}
+
+; Function Attrs: noinline nounwind optnone uwtable
+define dso_local i32 @processMatrix([100 x i32]* %0, i32 %1) #0 {
+  %3 = alloca [100 x i32]*, align 8
+  %4 = alloca i32, align 4
+  %5 = alloca i32, align 4
+  %6 = alloca i32, align 4
+  %7 = alloca i32, align 4
+  store [100 x i32]* %0, [100 x i32]** %3, align 8
+  store i32 %1, i32* %4, align 4
+  store i32 0, i32* %5, align 4
+  store i32 0, i32* %6, align 4
+  br label %8
+
+8:                                                ; preds = %77, %2
+  %9 = load i32, i32* %6, align 4
+  %10 = load i32, i32* %4, align 4
+  %11 = icmp slt i32 %9, %10
+  br i1 %11, label %12, label %80
+
+12:                                               ; preds = %8
+  store i32 0, i32* %7, align 4
+  br label %13
+
+13:                                               ; preds = %73, %12
+  %14 = load i32, i32* %7, align 4
+  %15 = load i32, i32* %4, align 4
+  %16 = icmp slt i32 %14, %15
+  br i1 %16, label %17, label %76
+
+17:                                               ; preds = %13
+  %18 = load i32, i32* %6, align 4
+  %19 = load i32, i32* %7, align 4
+  %20 = icmp eq i32 %18, %19
+  br i1 %20, label %21, label %55
+
+21:                                               ; preds = %17
+  %22 = load [100 x i32]*, [100 x i32]** %3, align 8
+  %23 = load i32, i32* %6, align 4
+  %24 = sext i32 %23 to i64
+  %25 = getelementptr inbounds [100 x i32], [100 x i32]* %22, i64 %24
+  %26 = load i32, i32* %7, align 4
+  %27 = sext i32 %26 to i64
+  %28 = getelementptr inbounds [100 x i32], [100 x i32]* %25, i64 0, i64 %27
+  %29 = load i32, i32* %28, align 4
+  %30 = srem i32 %29, 2
+  %31 = icmp eq i32 %30, 0
+  br i1 %31, label %32, label %43
+
+32:                                               ; preds = %21
+  %33 = load [100 x i32]*, [100 x i32]** %3, align 8
+  %34 = load i32, i32* %6, align 4
+  %35 = sext i32 %34 to i64
+  %36 = getelementptr inbounds [100 x i32], [100 x i32]* %33, i64 %35
+  %37 = load i32, i32* %7, align 4
+  %38 = sext i32 %37 to i64
+  %39 = getelementptr inbounds [100 x i32], [100 x i32]* %36, i64 0, i64 %38
+  %40 = load i32, i32* %39, align 4
+  %41 = load i32, i32* %5, align 4
+  %42 = add nsw i32 %41, %40
+  store i32 %42, i32* %5, align 4
+  br label %54
+
+43:                                               ; preds = %21
+  %44 = load [100 x i32]*, [100 x i32]** %3, align 8
+  %45 = load i32, i32* %6, align 4
+  %46 = sext i32 %45 to i64
+  %47 = getelementptr inbounds [100 x i32], [100 x i32]* %44, i64 %46
+  %48 = load i32, i32* %7, align 4
+  %49 = sext i32 %48 to i64
+  %50 = getelementptr inbounds [100 x i32], [100 x i32]* %47, i64 0, i64 %49
+  %51 = load i32, i32* %50, align 4
+  %52 = load i32, i32* %5, align 4
+  %53 = sub nsw i32 %52, %51
+  store i32 %53, i32* %5, align 4
+  br label %54
+
+54:                                               ; preds = %43, %32
+  br label %72
+
+55:                                               ; preds = %17
+  %56 = load i32, i32* %6, align 4
+  %57 = load i32, i32* %7, align 4
+  %58 = icmp slt i32 %56, %57
+  br i1 %58, label %59, label %71
+
+59:                                               ; preds = %55
+  %60 = load [100 x i32]*, [100 x i32]** %3, align 8
+  %61 = load i32, i32* %6, align 4
+  %62 = sext i32 %61 to i64
+  %63 = getelementptr inbounds [100 x i32], [100 x i32]* %60, i64 %62
+  %64 = load i32, i32* %7, align 4
+  %65 = sext i32 %64 to i64
+  %66 = getelementptr inbounds [100 x i32], [100 x i32]* %63, i64 0, i64 %65
+  %67 = load i32, i32* %66, align 4
+  %68 = call i32 @countSetBits(i32 %67)
+  %69 = load i32, i32* %5, align 4
+  %70 = add nsw i32 %69, %68
+  store i32 %70, i32* %5, align 4
+  br label %71
+
+71:                                               ; preds = %59, %55
+  br label %72
+
+72:                                               ; preds = %71, %54
+  br label %73
+
+73:                                               ; preds = %72
+  %74 = load i32, i32* %7, align 4
+  %75 = add nsw i32 %74, 1
+  store i32 %75, i32* %7, align 4
+  br label %13
+
+76:                                               ; preds = %13
+  br label %77
+
+77:                                               ; preds = %76
+  %78 = load i32, i32* %6, align 4
+  %79 = add nsw i32 %78, 1
+  store i32 %79, i32* %6, align 4
+  br label %8
+
+80:                                               ; preds = %8
+  %81 = load i32, i32* %5, align 4
+  ret i32 %81
+}
+
+; Function Attrs: noinline nounwind optnone uwtable
+define dso_local i32 @projectB_main() #0 {
+  %1 = alloca [14 x i8], align 1
+  %2 = alloca [8 x i32], align 16
+  %3 = alloca i32, align 4
+  %4 = alloca i32, align 4
+  %5 = alloca [100 x [100 x i32]], align 16
+  %6 = alloca i32, align 4
+  %7 = alloca i32, align 4
+  %8 = alloca i32, align 4
+  %9 = call i32 @testPoints(i32 5)
+  call void @llvm.memset.p0i8.i64(i8* align 16 bitcast ([100 x i32]* @cache to i8*), i8 -1, i64 400, i1 false)
+  %10 = bitcast [14 x i8]* %1 to i8*
+  call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 1 %10, i8* align 1 getelementptr inbounds ([14 x i8], [14 x i8]* @__const.projectB_main.str, i32 0, i32 0), i64 14, i1 false)
+  %11 = getelementptr inbounds [14 x i8], [14 x i8]* %1, i64 0, i64 0
+  call void @reverseString(i8* %11)
+  %12 = bitcast [8 x i32]* %2 to i8*
+  call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 16 %12, i8* align 16 bitcast ([8 x i32]* @__const.projectB_main.arr to i8*), i64 32, i1 false)
+  store i32 8, i32* %3, align 4
+  %13 = getelementptr inbounds [8 x i32], [8 x i32]* %2, i64 0, i64 0
+  %14 = load i32, i32* %3, align 4
+  %15 = call i32 @longestIncreasingSubsequence(i32* %13, i32 %14)
+  store i32 %15, i32* %4, align 4
+  %16 = bitcast [100 x [100 x i32]]* %5 to i8*
+  call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 16 %16, i8* align 16 bitcast (<{ <{ i32, i32, i32, [97 x i32] }>, <{ i32, i32, i32, [97 x i32] }>, <{ i32, i32, i32, [97 x i32] }>, [97 x <{ i32, i32, i32, [97 x i32] }>] }>* @__const.projectB_main.matrix to i8*), i64 40000, i1 false)
+  %17 = getelementptr inbounds [100 x [100 x i32]], [100 x [100 x i32]]* %5, i64 0, i64 0
+  %18 = call i32 @processMatrix([100 x i32]* %17, i32 3)
+  store i32 %18, i32* %6, align 4
+  store i32 0, i32* %7, align 4
+  br label %19
+
+19:                                               ; preds = %24, %0
+  %20 = load i32, i32* %7, align 4
+  %21 = call i32 @memoizedFib(i32 %20)
+  %22 = load i32, i32* %7, align 4
+  %23 = add nsw i32 %22, 1
+  store i32 %23, i32* %7, align 4
+  br label %24
+
+24:                                               ; preds = %19
+  %25 = load i32, i32* %7, align 4
+  %26 = icmp slt i32 %25, 10
+  br i1 %26, label %19, label %27
+
+27:                                               ; preds = %24
+  %28 = load i32, i32* %4, align 4
+  %29 = icmp sgt i32 %28, 5
+  br i1 %29, label %30, label %40
+
+30:                                               ; preds = %27
+  %31 = load i32, i32* %6, align 4
+  %32 = icmp sgt i32 %31, 0
+  br i1 %32, label %33, label %36
+
+33:                                               ; preds = %30
+  %34 = load i32, i32* %4, align 4
+  %35 = call i32 @memoizedFib(i32 %34)
+  store i32 %35, i32* %8, align 4
+  br label %39
+
+36:                                               ; preds = %30
+  %37 = load i32, i32* %6, align 4
+  %38 = call i32 @countSetBits(i32 %37)
+  store i32 %38, i32* %8, align 4
+  br label %39
+
+39:                                               ; preds = %36, %33
+  br label %47
+
+40:                                               ; preds = %27
+  %41 = getelementptr inbounds [14 x i8], [14 x i8]* %1, i64 0, i64 0
+  %42 = call i64 @strlen(i8* %41) #3
+  %43 = load i32, i32* %6, align 4
+  %44 = sext i32 %43 to i64
+  %45 = add i64 %42, %44
+  %46 = trunc i64 %45 to i32
+  store i32 %46, i32* %8, align 4
+  br label %47
+
+47:                                               ; preds = %40, %39
+  %48 = load i32, i32* %8, align 4
+  ret i32 %48
+}
+
+; Function Attrs: argmemonly nounwind willreturn
+declare void @llvm.memset.p0i8.i64(i8* nocapture writeonly, i8, i64, i1 immarg) #2
+
+; Function Attrs: argmemonly nounwind willreturn
+declare void @llvm.memcpy.p0i8.p0i8.i64(i8* noalias nocapture writeonly, i8* noalias nocapture readonly, i64, i1 immarg) #2
+
+attributes #0 = { noinline nounwind optnone uwtable "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "frame-pointer"="all" "less-precise-fpmad"="false" "min-legal-vector-width"="0" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }
+attributes #1 = { nounwind readonly "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "frame-pointer"="all" "less-precise-fpmad"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }
+attributes #2 = { argmemonly nounwind willreturn }
+attributes #3 = { nounwind readonly }
+
+!llvm.module.flags = !{!0}
+!llvm.ident = !{!1}
+
+!0 = !{i32 1, !"wchar_size", i32 4}
+!1 = !{!"clang version 10.0.0-4ubuntu1 "}

+ 1 - 0
data/aes-in-c

@@ -0,0 +1 @@
+Subproject commit 9a5dfb926703832f621c43f1ed9d1a5579e429a3

+ 864 - 0
data/projectA.c

@@ -0,0 +1,864 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+#include <time.h>
+#include <limits.h>
+
+#define MAX_ARRAY_SIZE 1000
+#define MAX_STRING_LENGTH 256
+#define PI 3.14159
+#define MIN_MATRIX_SIZE 1
+#define MAX_MATRIX_SIZE 100
+#define MAX_RECURSION_DEPTH 1000
+
+int globalCounter = 0;
+char* globalErrorMessage = NULL;
+int recursionDepth = 0;
+
+const char* getErrorMessage(void);
+void setErrorMessage(const char* message);
+
+typedef enum {
+    SUCCESS = 0,
+    ERROR_INVALID_INPUT,
+    ERROR_MEMORY_ALLOCATION,
+    ERROR_ARRAY_BOUNDS,
+    ERROR_DIVISION_BY_ZERO,
+    ERROR_OVERFLOW,
+    ERROR_RECURSION_LIMIT,
+    ERROR_NULL_POINTER,
+    ERROR_INVALID_OPERATION
+} ErrorCode;
+
+struct Point {
+    int x;
+    int y;
+    char label[MAX_STRING_LENGTH];
+    double weight;
+};
+
+struct Circle {
+    struct Point center;
+    double radius;
+    int valid;
+    char type[MAX_STRING_LENGTH];
+};
+
+struct Matrix {
+    int** data;
+    int rows;
+    int cols;
+    int isSquare;
+    double determinant;
+};
+
+typedef struct {
+    int* array;
+    int size;
+    int capacity;
+    int isSorted;
+    int lastOperation;
+} DynamicArray;
+
+typedef struct Node {
+    int data;
+    struct Node* next;
+    struct Node* prev;
+    int visited;
+    int depth;
+} Node;
+
+const char* getErrorMessage(void) {
+    return globalErrorMessage ? globalErrorMessage : "No error";
+}
+
+void setErrorMessage(const char* message) {
+    if (globalErrorMessage != NULL) {
+        free(globalErrorMessage);
+    }
+    if (message != NULL) {
+        globalErrorMessage = strdup(message);
+        if (globalErrorMessage == NULL) {
+            fprintf(stderr, "Critical: Failed to allocate memory for error message\n");
+        }
+    } else {
+        globalErrorMessage = NULL;
+    }
+}
+
+int factorial(int n) {
+    if (++recursionDepth > MAX_RECURSION_DEPTH) {
+        setErrorMessage("Maximum recursion depth exceeded");
+        recursionDepth--;
+        return -1;
+    }
+
+    if (n < 0) {
+        setErrorMessage("Factorial of negative number");
+        recursionDepth--;
+        return -1;
+    }
+
+    // Check for overflow using a rough approximation
+    if (n > 20) {
+        setErrorMessage("Input too large, potential overflow");
+        recursionDepth--;
+        return -1;
+    }
+
+    int result;
+    if (n <= 1) {
+        result = 1;
+    } else {
+        int temp = factorial(n - 1);
+        if (temp == -1) {
+            recursionDepth--;
+            return -1;
+        }
+        
+        // Check for multiplication overflow
+        if (temp > INT_MAX / n) {
+            setErrorMessage("Factorial calculation overflow");
+            recursionDepth--;
+            return -1;
+        }
+        
+        result = n * temp;
+    }
+
+    recursionDepth--;
+    return result;
+}
+
+DynamicArray* createDynamicArray(int initialCapacity) {
+    if (initialCapacity <= 0) {
+        setErrorMessage("Invalid initial capacity");
+        return NULL;
+    }
+
+    if (initialCapacity > MAX_ARRAY_SIZE) {
+        setErrorMessage("Initial capacity exceeds maximum allowed size");
+        return NULL;
+    }
+
+    DynamicArray* arr = (DynamicArray*)malloc(sizeof(DynamicArray));
+    if (!arr) {
+        setErrorMessage("Memory allocation failed for DynamicArray struct");
+        return NULL;
+    }
+
+    arr->array = (int*)malloc(sizeof(int) * initialCapacity);
+    if (!arr->array) {
+        free(arr);
+        setErrorMessage("Memory allocation failed for array");
+        return NULL;
+    }
+
+    arr->size = 0;
+    arr->capacity = initialCapacity;
+    arr->isSorted = 1;  // Empty array is considered sorted
+    arr->lastOperation = 0;
+
+    return arr;
+}
+
+void pushBack(DynamicArray* arr, int value) {
+    if (!arr) {
+        setErrorMessage("Null array pointer");
+        return;
+    }
+
+    if (arr->size >= MAX_ARRAY_SIZE) {
+        setErrorMessage("Array size limit reached");
+        return;
+    }
+
+    if (arr->size >= arr->capacity) {
+        int newCapacity = arr->capacity * 2;
+        if (newCapacity > MAX_ARRAY_SIZE) {
+            newCapacity = MAX_ARRAY_SIZE;
+        }
+
+        int* newArray = (int*)realloc(arr->array, sizeof(int) * newCapacity);
+        if (!newArray) {
+            setErrorMessage("Memory reallocation failed");
+            return;
+        }
+        arr->array = newArray;
+        arr->capacity = newCapacity;
+    }
+
+    // Check if this insert will break the sorted property
+    if (arr->isSorted && arr->size > 0 && value < arr->array[arr->size - 1]) {
+        arr->isSorted = 0;
+    }
+
+    arr->array[arr->size++] = value;
+    arr->lastOperation = 1; // Insert operation
+}
+
+void quickSort(int arr[], int left, int right, int* error) {
+    if (++recursionDepth > MAX_RECURSION_DEPTH) {
+        setErrorMessage("Maximum recursion depth exceeded in quickSort");
+        *error = 1;
+        recursionDepth--;
+        return;
+    }
+
+    if (!arr) {
+        setErrorMessage("Null array pointer in quickSort");
+        *error = 1;
+        recursionDepth--;
+        return;
+    }
+
+    if (left < 0 || right < 0 || left >= MAX_ARRAY_SIZE || right >= MAX_ARRAY_SIZE) {
+        setErrorMessage("Array index out of bounds in quickSort");
+        *error = 1;
+        recursionDepth--;
+        return;
+    }
+
+    if (left < right) {
+        // Choose pivot as median of three
+        int mid = left + (right - left) / 2;
+        int pivot_idx;
+        
+        if (arr[left] <= arr[mid]) {
+            if (arr[mid] <= arr[right]) {
+                pivot_idx = mid;
+            } else if (arr[left] <= arr[right]) {
+                pivot_idx = right;
+            } else {
+                pivot_idx = left;
+            }
+        } else {
+            if (arr[left] <= arr[right]) {
+                pivot_idx = left;
+            } else if (arr[mid] <= arr[right]) {
+                pivot_idx = right;
+            } else {
+                pivot_idx = mid;
+            }
+        }
+
+        // Swap pivot to end
+        int temp = arr[right];
+        arr[right] = arr[pivot_idx];
+        arr[pivot_idx] = temp;
+
+        int pivot = arr[right];
+        int i = left - 1;
+        
+        for (int j = left; j < right; j++) {
+            if (arr[j] <= pivot) {
+                i++;
+                temp = arr[i];
+                arr[i] = arr[j];
+                arr[j] = temp;
+                globalCounter++;
+            }
+        }
+
+        temp = arr[i + 1];
+        arr[i + 1] = arr[right];
+        arr[right] = temp;
+
+        // Check for errors in recursive calls
+        quickSort(arr, left, i, error);
+        if (*error) {
+            recursionDepth--;
+            return;
+        }
+
+        quickSort(arr, i + 2, right, error);
+        if (*error) {
+            recursionDepth--;
+            return;
+        }
+    }
+
+    recursionDepth--;
+}
+
+struct Matrix* createMatrix(int rows, int cols) {
+    if (rows < MIN_MATRIX_SIZE || cols < MIN_MATRIX_SIZE) {
+        setErrorMessage("Matrix dimensions too small");
+        return NULL;
+    }
+
+    if (rows > MAX_MATRIX_SIZE || cols > MAX_MATRIX_SIZE) {
+        setErrorMessage("Matrix dimensions exceed maximum allowed size");
+        return NULL;
+    }
+
+    struct Matrix* matrix = (struct Matrix*)malloc(sizeof(struct Matrix));
+    if (!matrix) {
+        setErrorMessage("Memory allocation failed for matrix struct");
+        return NULL;
+    }
+
+    matrix->rows = rows;
+    matrix->cols = cols;
+    matrix->isSquare = (rows == cols);
+    matrix->determinant = 0.0;
+    
+    matrix->data = (int**)malloc(rows * sizeof(int*));
+    if (!matrix->data) {
+        free(matrix);
+        setErrorMessage("Memory allocation failed for matrix rows");
+        return NULL;
+    }
+
+    for (int i = 0; i < rows; i++) {
+        matrix->data[i] = (int*)calloc(cols, sizeof(int));
+        if (!matrix->data[i]) {
+            for (int j = 0; j < i; j++) {
+                free(matrix->data[j]);
+            }
+            free(matrix->data);
+            free(matrix);
+            setErrorMessage("Memory allocation failed for matrix columns");
+            return NULL;
+        }
+    }
+
+    return matrix;
+}
+
+struct Matrix* multiplyMatrices(struct Matrix* m1, struct Matrix* m2) {
+    if (!m1 || !m2) {
+        setErrorMessage("Null matrix pointer");
+        return NULL;
+    }
+
+    if (!m1->data || !m2->data) {
+        setErrorMessage("Invalid matrix data");
+        return NULL;
+    }
+
+    if (m1->cols != m2->rows) {
+        setErrorMessage("Invalid matrix dimensions for multiplication");
+        return NULL;
+    }
+
+    if (m1->cols > MAX_MATRIX_SIZE || m2->rows > MAX_MATRIX_SIZE) {
+        setErrorMessage("Matrix dimensions exceed maximum allowed size");
+        return NULL;
+    }
+
+    struct Matrix* result = createMatrix(m1->rows, m2->cols);
+    if (!result) return NULL;
+
+    // Check for potential integer overflow in multiplication
+    long maxPossibleValue = 0;
+    for (int i = 0; i < m1->rows; i++) {
+        for (int j = 0; j < m2->cols; j++) {
+            long sum = 0;
+            for (int k = 0; k < m1->cols; k++) {
+                long prod = (long)m1->data[i][k] * m2->data[k][j];
+                sum += prod;
+                if (sum > INT_MAX || sum < INT_MIN) {
+                    setErrorMessage("Integer overflow in matrix multiplication");
+                    // Clean up
+                    for (int x = 0; x < result->rows; x++) {
+                        free(result->data[x]);
+                    }
+                    free(result->data);
+                    free(result);
+                    return NULL;
+                }
+            }
+            result->data[i][j] = (int)sum;
+            if (abs(result->data[i][j]) > maxPossibleValue) {
+                maxPossibleValue = abs(result->data[i][j]);
+            }
+        }
+    }
+
+    result->isSquare = (result->rows == result->cols);
+    return result;
+}
+
+Node* insertNode(Node* head, int data) {
+    static int maxDepth = 0;
+
+    Node* newNode = (Node*)malloc(sizeof(Node));
+    if (!newNode) {
+        setErrorMessage("Memory allocation failed for new node");
+        return head;
+    }
+
+    newNode->data = data;
+    newNode->next = NULL;
+    newNode->prev = NULL;
+    newNode->visited = 0;
+    
+    if (!head) {
+        newNode->depth = 0;
+        maxDepth = 0;
+        return newNode;
+    }
+
+    // Find the appropriate position to insert (keeping list sorted)
+    Node* current = head;
+    Node* prev = NULL;
+    int currentDepth = 0;
+
+    while (current && current->data < data) {
+        prev = current;
+        current = current->next;
+        currentDepth++;
+
+        if (currentDepth > MAX_ARRAY_SIZE) {
+            setErrorMessage("List exceeds maximum allowed size");
+            free(newNode);
+            return head;
+        }
+    }
+
+    // Update maxDepth if necessary
+    if (currentDepth > maxDepth) {
+        maxDepth = currentDepth;
+    }
+
+    // Insert the new node
+    newNode->depth = currentDepth;
+    newNode->next = current;
+    
+    if (prev) {
+        prev->next = newNode;
+        newNode->prev = prev;
+    } else {
+        return newNode; // New head
+    }
+
+    if (current) {
+        current->prev = newNode;
+    }
+
+    return head;
+}
+
+static int calculationResult = 0;
+
+void performSimpleCalculations() {
+    int tempValue = 100;  // 初始值
+    
+    // 第一个条件:检查是否大于50
+    if (tempValue > 50) {
+        calculationResult += tempValue * 2;
+    } else {
+        calculationResult += tempValue / 2;
+    }
+    
+    // 第二个条件:检查是否能被3整除
+    if (tempValue % 3 == 0) {
+        calculationResult *= 3;
+    } else {
+        calculationResult += 3;
+    }
+    
+    // 第三个条件:检查是否在特定范围内
+    if (calculationResult >= 150 && calculationResult <= 300) {
+        calculationResult -= 50;
+    } else {
+        calculationResult += 50;
+    }
+    
+    // 第四个条件:检查是否为偶数
+    if (calculationResult % 2 == 0) {
+        calculationResult /= 2;
+    } else {
+        calculationResult *= 2;
+    }
+    
+    // 第五个条件:检查个位数
+    if (calculationResult % 10 < 5) {
+        calculationResult += 5;
+    } else {
+        calculationResult -= 5;
+    }
+    
+    // 第六个条件:最终范围检查
+    if (calculationResult > 1000) {
+        calculationResult = 1000;
+    } else {
+        calculationResult += 10;
+    }
+    
+    // 打印最终结果
+    printf("Final calculation result: %d\n", calculationResult);
+}
+
+int main() {
+    srand(time(NULL));
+    
+    // Initialize dynamic array with error checking
+    DynamicArray* dynArr = createDynamicArray(10);
+    if (!dynArr) {
+        printf("Error: %s\n", getErrorMessage());
+        return -1;
+    }
+    
+    // Test array operations with boundary checks
+    for (int i = 0; i < 15; i++) {
+        pushBack(dynArr, rand() % 100);
+        if (globalErrorMessage) {
+            printf("Error during array push: %s\n", getErrorMessage());
+            break;
+        }
+    }
+    
+    // Matrix operations with error handling
+    struct Matrix* matrix1 = createMatrix(3, 3);
+    struct Matrix* matrix2 = createMatrix(3, 3);
+    if (!matrix1 || !matrix2) {
+        printf("Error: %s\n", getErrorMessage());
+        // Cleanup
+        if (matrix1) {
+            free(matrix1);
+        }
+        if (matrix2) {
+            free(matrix2);
+        }
+        free(dynArr->array);
+        free(dynArr);
+        return -1;
+    }
+    
+    // Initialize matrices with random data
+    for (int i = 0; i < 3; i++) {
+        for (int j = 0; j < 3; j++) {
+            matrix1->data[i][j] = rand() % 10;
+            matrix2->data[i][j] = rand() % 10;
+        }
+    }
+    
+    // Matrix multiplication with error checking
+    struct Matrix* result = multiplyMatrices(matrix1, matrix2);
+    if (!result) {
+        printf("Error: %s\n", getErrorMessage());
+        // Cleanup
+        for (int i = 0; i < matrix1->rows; i++) {
+            free(matrix1->data[i]);
+            free(matrix2->data[i]);
+        }
+        free(matrix1->data);
+        free(matrix2->data);
+        free(matrix1);
+        free(matrix2);
+        free(dynArr->array);
+        free(dynArr);
+        return -1;
+    }
+    
+    // Linked list operations with error handling
+    Node* head = NULL;
+    for (int i = 0; i < 5; i++) {
+        head = insertNode(head, rand() % 50);
+        if (globalErrorMessage) {
+            printf("Error during list insertion: %s\n", getErrorMessage());
+            break;
+        }
+    }
+    
+    // Memory cleanup
+    free(dynArr->array);
+    free(dynArr);
+    
+    for (int i = 0; i < matrix1->rows; i++) {
+        free(matrix1->data[i]);
+        free(matrix2->data[i]);
+        free(result->data[i]);
+    }
+    free(matrix1->data);
+    free(matrix2->data);
+    free(result->data);
+    free(matrix1);
+    free(matrix2);
+    free(result);
+    
+    // 增强的链表清理,包含循环检测
+    if (head) {
+        Node* slow = head;
+        Node* fast = head;
+        int hasLoop = 0;
+        
+        // Floyd's cycle detection
+        while (fast && fast->next) {
+            slow = slow->next;
+            fast = fast->next->next;
+            if (slow == fast) {
+                hasLoop = 1;
+                break;
+            }
+        }
+        
+        if (hasLoop) {
+            setErrorMessage("Circular reference detected in linked list");
+            // 特殊的循环链表清理
+            Node* current = head;
+            int maxNodes = 1000; // 防止无限循环
+            int nodeCount = 0;
+            
+            while (current && nodeCount < maxNodes) {
+                if (current->visited) {
+                    break;
+                }
+                current->visited = 1;
+                current = current->next;
+                nodeCount++;
+            }
+        }
+        
+        // 标准清理过程
+        while (head) {
+            Node* temp = head;
+            head = head->next;
+            free(temp);
+        }
+    }
+    
+    if (globalErrorMessage) {
+        free(globalErrorMessage);
+    }
+    performSimpleCalculations();
+    
+    return 0;
+}
+
+// 增强的几何计算函数
+double calculateDistance(struct Point p1, struct Point p2, ErrorCode* error) {
+    *error = SUCCESS;
+    
+    // 验证权重
+    if (p1.weight <= 0 || p2.weight <= 0) {
+        *error = ERROR_INVALID_INPUT;
+        setErrorMessage("Invalid point weights");
+        return -1.0;
+    }
+    
+    // 检查坐标范围
+    if (abs(p1.x) > MAX_ARRAY_SIZE || abs(p1.y) > MAX_ARRAY_SIZE || 
+        abs(p2.x) > MAX_ARRAY_SIZE || abs(p2.y) > MAX_ARRAY_SIZE) {
+        *error = ERROR_ARRAY_BOUNDS;
+        setErrorMessage("Coordinates out of valid range");
+        return -1.0;
+    }
+    
+    // 计算带权重的距离
+    double dx = (p2.x - p1.x) * sqrt(p2.weight / p1.weight);
+    double dy = (p2.y - p1.y) * sqrt(p2.weight / p1.weight);
+    
+    // 检查溢出
+    if (fabs(dx) > MAX_ARRAY_SIZE || fabs(dy) > MAX_ARRAY_SIZE) {
+        *error = ERROR_OVERFLOW;
+        setErrorMessage("Distance calculation overflow");
+        return -1.0;
+    }
+    
+    double distance = sqrt(dx*dx + dy*dy);
+    
+    // 验证结果
+    if (isnan(distance) || isinf(distance)) {
+        *error = ERROR_INVALID_OPERATION;
+        setErrorMessage("Invalid distance calculation result");
+        return -1.0;
+    }
+    
+    return distance;
+}
+
+double calculateCircleArea(struct Circle circle, ErrorCode* error) {
+    *error = SUCCESS;
+    
+    // 验证圆的有效性
+    if (!circle.valid) {
+        *error = ERROR_INVALID_INPUT;
+        setErrorMessage("Invalid circle");
+        return -1.0;
+    }
+    
+    // 验证半径
+    if (circle.radius <= 0) {
+        *error = ERROR_INVALID_INPUT;
+        setErrorMessage("Invalid circle radius");
+        return -1.0;
+    }
+    
+    // 检查半径是否过大
+    if (circle.radius > MAX_ARRAY_SIZE) {
+        *error = ERROR_ARRAY_BOUNDS;
+        setErrorMessage("Circle radius too large");
+        return -1.0;
+    }
+    
+    // 验证圆心坐标
+    if (abs(circle.center.x) > MAX_ARRAY_SIZE || abs(circle.center.y) > MAX_ARRAY_SIZE) {
+        *error = ERROR_ARRAY_BOUNDS;
+        setErrorMessage("Circle center coordinates out of valid range");
+        return -1.0;
+    }
+    
+    // 计算面积
+    double area = PI * circle.radius * circle.radius;
+    
+    // 检查结果
+    if (isnan(area) || isinf(area)) {
+        *error = ERROR_OVERFLOW;
+        setErrorMessage("Area calculation overflow");
+        return -1.0;
+    }
+    
+    // 验证圆的类型
+    if (strcmp(circle.type, "standard") == 0) {
+        return area;
+    } else if (strcmp(circle.type, "weighted") == 0) {
+        // 加权面积计算
+        if (circle.center.weight <= 0) {
+            *error = ERROR_INVALID_INPUT;
+            setErrorMessage("Invalid weight for weighted circle");
+            return -1.0;
+        }
+        return area * circle.center.weight;
+    } else {
+        *error = ERROR_INVALID_INPUT;
+        setErrorMessage("Unknown circle type");
+        return -1.0;
+    }
+}
+
+// 新增的矩阵验证函数
+ErrorCode validateMatrix(struct Matrix* matrix) {
+    if (!matrix) {
+        setErrorMessage("Null matrix pointer");
+        return ERROR_NULL_POINTER;
+    }
+    
+    if (!matrix->data) {
+        setErrorMessage("Null matrix data");
+        return ERROR_NULL_POINTER;
+    }
+    
+    if (matrix->rows < MIN_MATRIX_SIZE || matrix->cols < MIN_MATRIX_SIZE) {
+        setErrorMessage("Matrix dimensions too small");
+        return ERROR_INVALID_INPUT;
+    }
+    
+    if (matrix->rows > MAX_MATRIX_SIZE || matrix->cols > MAX_MATRIX_SIZE) {
+        setErrorMessage("Matrix dimensions too large");
+        return ERROR_ARRAY_BOUNDS;
+    }
+    
+    // 验证所有行的内存分配
+    for (int i = 0; i < matrix->rows; i++) {
+        if (!matrix->data[i]) {
+            setErrorMessage("Invalid matrix row pointer");
+            return ERROR_NULL_POINTER;
+        }
+    }
+    
+    // 验证矩阵是否为方阵的标志是否正确
+    if ((matrix->rows == matrix->cols) != matrix->isSquare) {
+        setErrorMessage("Inconsistent square matrix flag");
+        return ERROR_INVALID_INPUT;
+    }
+    
+    return SUCCESS;
+}
+
+// 新增的数组操作函数
+void removeDuplicates(DynamicArray* arr) {
+    if (!arr || !arr->array) {
+        setErrorMessage("Invalid array");
+        return;
+    }
+    
+    if (arr->size <= 1) {
+        return;
+    }
+    
+    // 先排序以优化去重过程
+    int error = 0;
+    quickSort(arr->array, 0, arr->size - 1, &error);
+    if (error) {
+        return;
+    }
+    
+    int writeIndex = 1;
+    for (int readIndex = 1; readIndex < arr->size; readIndex++) {
+        if (arr->array[readIndex] != arr->array[readIndex - 1]) {
+            arr->array[writeIndex] = arr->array[readIndex];
+            writeIndex++;
+        }
+    }
+    
+    arr->size = writeIndex;
+    arr->isSorted = 1;
+}
+
+// 新增的点集操作函数
+struct Point* findCentroid(struct Point* points, int count, ErrorCode* error) {
+    *error = SUCCESS;
+    
+    if (!points || count <= 0) {
+        *error = ERROR_INVALID_INPUT;
+        setErrorMessage("Invalid points array");
+        return NULL;
+    }
+    
+    if (count > MAX_ARRAY_SIZE) {
+        *error = ERROR_ARRAY_BOUNDS;
+        setErrorMessage("Too many points");
+        return NULL;
+    }
+    
+    struct Point* centroid = (struct Point*)malloc(sizeof(struct Point));
+    if (!centroid) {
+        *error = ERROR_MEMORY_ALLOCATION;
+        setErrorMessage("Failed to allocate memory for centroid");
+        return NULL;
+    }
+    
+    double totalWeight = 0;
+    double weightedX = 0;
+    double weightedY = 0;
+    
+    for (int i = 0; i < count; i++) {
+        if (points[i].weight <= 0) {
+            *error = ERROR_INVALID_INPUT;
+            setErrorMessage("Invalid point weight");
+            free(centroid);
+            return NULL;
+        }
+        
+        totalWeight += points[i].weight;
+        weightedX += points[i].x * points[i].weight;
+        weightedY += points[i].y * points[i].weight;
+        
+        // 检查累积计算是否溢出
+        if (isnan(totalWeight) || isnan(weightedX) || isnan(weightedY) ||
+            isinf(totalWeight) || isinf(weightedX) || isinf(weightedY)) {
+            *error = ERROR_OVERFLOW;
+            setErrorMessage("Centroid calculation overflow");
+            free(centroid);
+            return NULL;
+        }
+    }
+    
+    if (totalWeight == 0) {
+        *error = ERROR_INVALID_INPUT;
+        setErrorMessage("Total weight is zero");
+        free(centroid);
+        return NULL;
+    }
+    
+    centroid->x = (int)(weightedX / totalWeight);
+    centroid->y = (int)(weightedY / totalWeight);
+    centroid->weight = totalWeight / count;
+    strcpy(centroid->label, "Centroid");
+    
+    return centroid;
+}

+ 124 - 0
data/projectB.c

@@ -0,0 +1,124 @@
+#include <stdio.h>
+#include <string.h>
+
+// 全局常量
+#define MAX_SIZE 100
+static int cache[MAX_SIZE];
+
+// 字符串处理函数
+void reverseString(char* str) {
+    int length = strlen(str);
+    for(int i = 0; i < length/2; i++) {
+        char temp = str[i];
+        str[i] = str[length-1-i];
+        str[length-1-i] = temp;
+    }
+}
+
+// 动态规划函数
+int longestIncreasingSubsequence(int arr[], int size) {
+    int lis[MAX_SIZE];
+    for(int i = 0; i < size; i++)
+        lis[i] = 1;
+        
+    for(int i = 1; i < size; i++)
+        for(int j = 0; j < i; j++)
+            if(arr[i] > arr[j] && lis[i] < lis[j] + 1)
+                lis[i] = lis[j] + 1;
+                
+    int max = 0;
+    for(int i = 0; i < size; i++)
+        if(max < lis[i])
+            max = lis[i];
+            
+    return max;
+}
+
+int testPoints(int n) {
+    int count = 0;
+    for(int i = 1; i < 5; i++) {
+        count += 1;
+        if (n>2){
+            return 23;
+        }
+    }
+    return count;
+}
+
+// 位操作函数
+int countSetBits(int n) {
+    int count = 0;
+    while(n) {
+        count += n & 1;
+        n >>= 1;
+    }
+    return count;
+}
+
+// 记忆化递归
+int memoizedFib(int n) {
+    if(cache[n] != -1)
+        return cache[n];
+    if(n <= 1)
+        return n;
+    cache[n] = memoizedFib(n-1) + memoizedFib(n-2);
+    return cache[n];
+}
+
+// 嵌套循环和条件
+int processMatrix(int matrix[][MAX_SIZE], int n) {
+    int sum = 0;
+    for(int i = 0; i < n; i++) {
+        for(int j = 0; j < n; j++) {
+            if(i == j) {
+                if(matrix[i][j] % 2 == 0)
+                    sum += matrix[i][j];
+                else
+                    sum -= matrix[i][j];
+            } else if(i < j) {
+                sum += countSetBits(matrix[i][j]);
+            }
+        }
+    }
+    return sum;
+}
+
+int main() {
+    testPoints(5);
+    // 初始化缓存
+    memset(cache, -1, sizeof(cache));
+    
+    // 字符串处理
+    char str[] = "Hello, World!";
+    reverseString(str);
+    
+    // 动态规划
+    int arr[] = {10, 22, 9, 33, 21, 50, 41, 60};
+    int size = sizeof(arr)/sizeof(arr[0]);
+    int lis = longestIncreasingSubsequence(arr, size);
+    
+    // 矩阵处理
+    int matrix[MAX_SIZE][MAX_SIZE] = {{1,2,3},{4,5,6},{7,8,9}};
+    int matrixSum = processMatrix(matrix, 3);
+    
+    // do-while循环
+    int i = 0;
+    do {
+        memoizedFib(i);
+        i++;
+    } while(i < 10);
+    
+    // 复杂条件判断
+    int result;
+    if(lis > 5) {
+        if(matrixSum > 0) {
+            result = memoizedFib(lis);
+        } else {
+            result = countSetBits(matrixSum);
+        }
+    } else {
+        result = strlen(str) + matrixSum;
+    }
+    
+    return result;
+}

BIN
output/fused.ll


BIN
output/graph.ll


+ 168 - 0
output/log.txt

@@ -0,0 +1,168 @@
+[INFO][factorial][isTargetCode] Checking if function 'factorial' is target code
+[INFO][factorial][isTargetCode] Function 'factorial' project: Bunker, isTarget: false
+[INFO][bubbleSort][isTargetCode] Checking if function 'bubbleSort' is target code
+[INFO][bubbleSort][isTargetCode] Function 'bubbleSort' project: Bunker, isTarget: false
+[INFO][calculateDistance][isTargetCode] Checking if function 'calculateDistance' is target code
+[INFO][calculateDistance][isTargetCode] Function 'calculateDistance' project: Bunker, isTarget: false
+[INFO][fibonacci][isTargetCode] Checking if function 'fibonacci' is target code
+[INFO][fibonacci][isTargetCode] Function 'fibonacci' project: Bunker, isTarget: false
+[INFO][projectA_main][isTargetCode] Checking if function 'projectA_main' is target code
+[INFO][projectA_main][isTargetCode] Function 'projectA_main' project: Bunker, isTarget: false
+[INFO][reverseString][isTargetCode] Checking if function 'reverseString' is target code
+[INFO][reverseString][isTargetCode] Function 'reverseString' project: Target, isTarget: true
+[DEBUG][reverseString][checkCriticalPoint] Starting critical point check: %1
+[DEBUG][reverseString][checkCriticalPoint] Block  critical status: yes
+[DEBUG][reverseString][checkCriticalPoint] Starting critical point check: %9
+[DEBUG][reverseString][checkCriticalPoint] Block  critical status: yes
+[DEBUG][reverseString][checkCriticalPoint] Starting critical point check: %14
+[DEBUG][reverseString][checkCriticalPoint] Block  critical status: no
+[DEBUG][reverseString][checkCriticalPoint] Starting critical point check: %40
+[DEBUG][reverseString][checkCriticalPoint] Block  critical status: no
+[DEBUG][reverseString][checkCriticalPoint] Starting critical point check: %43
+[DEBUG][reverseString][checkCriticalPoint] Block  critical status: yes
+[INFO][longestIncreasingSubsequence][isTargetCode] Checking if function 'longestIncreasingSubsequence' is target code
+[INFO][longestIncreasingSubsequence][isTargetCode] Function 'longestIncreasingSubsequence' project: Target, isTarget: true
+[DEBUG][longestIncreasingSubsequence][checkCriticalPoint] Starting critical point check: %2
+[DEBUG][longestIncreasingSubsequence][checkCriticalPoint] Block  critical status: yes
+[DEBUG][longestIncreasingSubsequence][checkCriticalPoint] Starting critical point check: %11
+[DEBUG][longestIncreasingSubsequence][checkCriticalPoint] Block  critical status: yes
+[DEBUG][longestIncreasingSubsequence][checkCriticalPoint] Starting critical point check: %15
+[DEBUG][longestIncreasingSubsequence][checkCriticalPoint] Block  critical status: no
+[DEBUG][longestIncreasingSubsequence][checkCriticalPoint] Starting critical point check: %19
+[DEBUG][longestIncreasingSubsequence][checkCriticalPoint] Block  critical status: no
+[DEBUG][longestIncreasingSubsequence][checkCriticalPoint] Starting critical point check: %22
+[DEBUG][longestIncreasingSubsequence][checkCriticalPoint] Block  critical status: yes
+[DEBUG][longestIncreasingSubsequence][checkCriticalPoint] Starting critical point check: %23
+[DEBUG][longestIncreasingSubsequence][checkCriticalPoint] Block  critical status: yes
+[DEBUG][longestIncreasingSubsequence][checkCriticalPoint] Starting critical point check: %27
+[DEBUG][longestIncreasingSubsequence][checkCriticalPoint] Block  critical status: no
+[DEBUG][longestIncreasingSubsequence][checkCriticalPoint] Starting critical point check: %28
+[DEBUG][longestIncreasingSubsequence][checkCriticalPoint] Block  critical status: no
+[DEBUG][longestIncreasingSubsequence][checkCriticalPoint] Starting critical point check: %32
+[DEBUG][longestIncreasingSubsequence][checkCriticalPoint] Block  critical status: no
+[DEBUG][longestIncreasingSubsequence][checkCriticalPoint] Starting critical point check: %44
+[DEBUG][longestIncreasingSubsequence][checkCriticalPoint] Block  critical status: no
+[DEBUG][longestIncreasingSubsequence][checkCriticalPoint] Starting critical point check: %55
+[DEBUG][longestIncreasingSubsequence][checkCriticalPoint] Block  critical status: no
+[DEBUG][longestIncreasingSubsequence][checkCriticalPoint] Starting critical point check: %64
+[DEBUG][longestIncreasingSubsequence][checkCriticalPoint] Block  critical status: no
+[DEBUG][longestIncreasingSubsequence][checkCriticalPoint] Starting critical point check: %65
+[DEBUG][longestIncreasingSubsequence][checkCriticalPoint] Block  critical status: no
+[DEBUG][longestIncreasingSubsequence][checkCriticalPoint] Starting critical point check: %68
+[DEBUG][longestIncreasingSubsequence][checkCriticalPoint] Block  critical status: no
+[DEBUG][longestIncreasingSubsequence][checkCriticalPoint] Starting critical point check: %69
+[DEBUG][longestIncreasingSubsequence][checkCriticalPoint] Block  critical status: no
+[DEBUG][longestIncreasingSubsequence][checkCriticalPoint] Starting critical point check: %72
+[DEBUG][longestIncreasingSubsequence][checkCriticalPoint] Block  critical status: yes
+[DEBUG][longestIncreasingSubsequence][checkCriticalPoint] Starting critical point check: %73
+[DEBUG][longestIncreasingSubsequence][checkCriticalPoint] Block  critical status: yes
+[DEBUG][longestIncreasingSubsequence][checkCriticalPoint] Starting critical point check: %77
+[DEBUG][longestIncreasingSubsequence][checkCriticalPoint] Block  critical status: no
+[DEBUG][longestIncreasingSubsequence][checkCriticalPoint] Starting critical point check: %84
+[DEBUG][longestIncreasingSubsequence][checkCriticalPoint] Block  critical status: no
+[DEBUG][longestIncreasingSubsequence][checkCriticalPoint] Starting critical point check: %89
+[DEBUG][longestIncreasingSubsequence][checkCriticalPoint] Block  critical status: no
+[DEBUG][longestIncreasingSubsequence][checkCriticalPoint] Starting critical point check: %90
+[DEBUG][longestIncreasingSubsequence][checkCriticalPoint] Block  critical status: no
+[DEBUG][longestIncreasingSubsequence][checkCriticalPoint] Starting critical point check: %93
+[DEBUG][longestIncreasingSubsequence][checkCriticalPoint] Block  critical status: yes
+[INFO][testPoints][isTargetCode] Checking if function 'testPoints' is target code
+[INFO][testPoints][isTargetCode] Function 'testPoints' project: Target, isTarget: true
+[DEBUG][testPoints][checkCriticalPoint] Starting critical point check: %1
+[DEBUG][testPoints][checkCriticalPoint] Block  critical status: yes
+[DEBUG][testPoints][checkCriticalPoint] Starting critical point check: %6
+[DEBUG][testPoints][checkCriticalPoint] Block  critical status: yes
+[DEBUG][testPoints][checkCriticalPoint] Starting critical point check: %9
+[DEBUG][testPoints][checkCriticalPoint] Block  critical status: no
+[DEBUG][testPoints][checkCriticalPoint] Starting critical point check: %14
+[DEBUG][testPoints][checkCriticalPoint] Block  critical status: no
+[DEBUG][testPoints][checkCriticalPoint] Starting critical point check: %15
+[DEBUG][testPoints][checkCriticalPoint] Block  critical status: no
+[DEBUG][testPoints][checkCriticalPoint] Starting critical point check: %16
+[DEBUG][testPoints][checkCriticalPoint] Block  critical status: no
+[DEBUG][testPoints][checkCriticalPoint] Starting critical point check: %19
+[DEBUG][testPoints][checkCriticalPoint] Block  critical status: no
+[DEBUG][testPoints][checkCriticalPoint] Starting critical point check: %21
+[DEBUG][testPoints][checkCriticalPoint] Block  critical status: yes
+[INFO][countSetBits][isTargetCode] Checking if function 'countSetBits' is target code
+[INFO][countSetBits][isTargetCode] Function 'countSetBits' project: Target, isTarget: true
+[DEBUG][countSetBits][checkCriticalPoint] Starting critical point check: %1
+[DEBUG][countSetBits][checkCriticalPoint] Block  critical status: yes
+[DEBUG][countSetBits][checkCriticalPoint] Starting critical point check: %4
+[DEBUG][countSetBits][checkCriticalPoint] Block  critical status: yes
+[DEBUG][countSetBits][checkCriticalPoint] Starting critical point check: %7
+[DEBUG][countSetBits][checkCriticalPoint] Block  critical status: no
+[DEBUG][countSetBits][checkCriticalPoint] Starting critical point check: %14
+[DEBUG][countSetBits][checkCriticalPoint] Block  critical status: yes
+[INFO][memoizedFib][isTargetCode] Checking if function 'memoizedFib' is target code
+[INFO][memoizedFib][isTargetCode] Function 'memoizedFib' project: Target, isTarget: true
+[DEBUG][memoizedFib][checkCriticalPoint] Starting critical point check: %1
+[DEBUG][memoizedFib][checkCriticalPoint] Block  critical status: yes
+[DEBUG][memoizedFib][checkCriticalPoint] Starting critical point check: %9
+[DEBUG][memoizedFib][checkCriticalPoint] Block  critical status: no
+[DEBUG][memoizedFib][checkCriticalPoint] Starting critical point check: %14
+[DEBUG][memoizedFib][checkCriticalPoint] Block  critical status: no
+[DEBUG][memoizedFib][checkCriticalPoint] Starting critical point check: %17
+[DEBUG][memoizedFib][checkCriticalPoint] Block  critical status: no
+[DEBUG][memoizedFib][checkCriticalPoint] Starting critical point check: %19
+[DEBUG][memoizedFib][checkCriticalPoint] Block  critical status: no
+[DEBUG][memoizedFib][checkCriticalPoint] Starting critical point check: %34
+[DEBUG][memoizedFib][checkCriticalPoint] Block  critical status: yes
+[INFO][processMatrix][isTargetCode] Checking if function 'processMatrix' is target code
+[INFO][processMatrix][isTargetCode] Function 'processMatrix' project: Target, isTarget: true
+[DEBUG][processMatrix][checkCriticalPoint] Starting critical point check: %2
+[DEBUG][processMatrix][checkCriticalPoint] Block  critical status: yes
+[DEBUG][processMatrix][checkCriticalPoint] Starting critical point check: %8
+[DEBUG][processMatrix][checkCriticalPoint] Block  critical status: yes
+[DEBUG][processMatrix][checkCriticalPoint] Starting critical point check: %12
+[DEBUG][processMatrix][checkCriticalPoint] Block  critical status: no
+[DEBUG][processMatrix][checkCriticalPoint] Starting critical point check: %13
+[DEBUG][processMatrix][checkCriticalPoint] Block  critical status: no
+[DEBUG][processMatrix][checkCriticalPoint] Starting critical point check: %17
+[DEBUG][processMatrix][checkCriticalPoint] Block  critical status: no
+[DEBUG][processMatrix][checkCriticalPoint] Starting critical point check: %21
+[DEBUG][processMatrix][checkCriticalPoint] Block  critical status: no
+[DEBUG][processMatrix][checkCriticalPoint] Starting critical point check: %32
+[DEBUG][processMatrix][checkCriticalPoint] Block  critical status: no
+[DEBUG][processMatrix][checkCriticalPoint] Starting critical point check: %43
+[DEBUG][processMatrix][checkCriticalPoint] Block  critical status: no
+[DEBUG][processMatrix][checkCriticalPoint] Starting critical point check: %54
+[DEBUG][processMatrix][checkCriticalPoint] Block  critical status: no
+[DEBUG][processMatrix][checkCriticalPoint] Starting critical point check: %55
+[DEBUG][processMatrix][checkCriticalPoint] Block  critical status: no
+[DEBUG][processMatrix][checkCriticalPoint] Starting critical point check: %59
+[DEBUG][processMatrix][checkCriticalPoint] Block  critical status: no
+[DEBUG][processMatrix][checkCriticalPoint] Starting critical point check: %71
+[DEBUG][processMatrix][checkCriticalPoint] Block  critical status: no
+[DEBUG][processMatrix][checkCriticalPoint] Starting critical point check: %72
+[DEBUG][processMatrix][checkCriticalPoint] Block  critical status: no
+[DEBUG][processMatrix][checkCriticalPoint] Starting critical point check: %73
+[DEBUG][processMatrix][checkCriticalPoint] Block  critical status: no
+[DEBUG][processMatrix][checkCriticalPoint] Starting critical point check: %76
+[DEBUG][processMatrix][checkCriticalPoint] Block  critical status: no
+[DEBUG][processMatrix][checkCriticalPoint] Starting critical point check: %77
+[DEBUG][processMatrix][checkCriticalPoint] Block  critical status: no
+[DEBUG][processMatrix][checkCriticalPoint] Starting critical point check: %80
+[DEBUG][processMatrix][checkCriticalPoint] Block  critical status: yes
+[INFO][projectB_main][isTargetCode] Checking if function 'projectB_main' is target code
+[INFO][projectB_main][isTargetCode] Function 'projectB_main' project: Target, isTarget: true
+[DEBUG][projectB_main][checkCriticalPoint] Starting critical point check: %0
+[DEBUG][projectB_main][checkCriticalPoint] Block  critical status: yes
+[DEBUG][projectB_main][checkCriticalPoint] Starting critical point check: %19
+[DEBUG][projectB_main][checkCriticalPoint] Block  critical status: yes
+[DEBUG][projectB_main][checkCriticalPoint] Starting critical point check: %24
+[DEBUG][projectB_main][checkCriticalPoint] Block  critical status: yes
+[DEBUG][projectB_main][checkCriticalPoint] Starting critical point check: %27
+[DEBUG][projectB_main][checkCriticalPoint] Block  critical status: yes
+[DEBUG][projectB_main][checkCriticalPoint] Starting critical point check: %30
+[DEBUG][projectB_main][checkCriticalPoint] Block  critical status: no
+[DEBUG][projectB_main][checkCriticalPoint] Starting critical point check: %33
+[DEBUG][projectB_main][checkCriticalPoint] Block  critical status: no
+[DEBUG][projectB_main][checkCriticalPoint] Starting critical point check: %36
+[DEBUG][projectB_main][checkCriticalPoint] Block  critical status: no
+[DEBUG][projectB_main][checkCriticalPoint] Starting critical point check: %39
+[DEBUG][projectB_main][checkCriticalPoint] Block  critical status: no
+[DEBUG][projectB_main][checkCriticalPoint] Starting critical point check: %40
+[DEBUG][projectB_main][checkCriticalPoint] Block  critical status: no
+[DEBUG][projectB_main][checkCriticalPoint] Starting critical point check: %47
+[DEBUG][projectB_main][checkCriticalPoint] Block  critical status: yes

+ 38 - 0
output/log_graph.txt

@@ -0,0 +1,38 @@
+```mermaid
+graph TD
+    %% Target Project Call Graph
+    countSetBits["countSetBits\nDepth: 2"]:::target
+    longestIncreasingSubsequence["longestIncreasingSubsequence\nDepth: 2"]:::target
+    memoizedFib["memoizedFib\nDepth: 2"]:::target
+    processMatrix["processMatrix\nDepth: 2"]:::target
+    projectB_main["projectB_main\nDepth: 1"]:::target
+    reverseString["reverseString\nDepth: 2"]:::target
+    testPoints["testPoints\nDepth: 2"]:::target
+    memoizedFib --> memoizedFib
+    processMatrix --> countSetBits
+    projectB_main --> countSetBits
+    projectB_main --> longestIncreasingSubsequence
+    projectB_main --> memoizedFib
+    projectB_main --> processMatrix
+    projectB_main --> reverseString
+    projectB_main --> testPoints
+    classDef target fill:#f96,stroke:#333,stroke-width:4px
+```
+
+```mermaid
+graph TD
+    %% Cover Project Call Graph
+    bubbleSort["bubbleSort\nDepth: 0"]
+    calculateDistance["calculateDistance\nDepth: 0"]
+    factorial["factorial\nDepth: 0"]
+    fibonacci["fibonacci\nDepth: 0"]
+    projectA_main["projectA_main\nDepth: 0"]
+    factorial --> factorial
+    fibonacci --> fibonacci
+    projectA_main --> bubbleSort
+    projectA_main --> calculateDistance
+    projectA_main --> factorial
+    projectA_main --> fibonacci
+    classDef target fill:#f96,stroke:#333,stroke-width:4px
+```
+

+ 1329 - 0
output/log_module_fusion.txt

@@ -0,0 +1,1329 @@
+[INFO][runOnModule] Starting analysis for module: <stdin>
+[INFO][buildCallGraph] Building complete call graph
+```mermaid
+graph TD
+    %% Project Call Graph
+    calculateCircleArea["calculateCircleArea\nDepth: 3\nCritical Points: 2"]
+    calculateDistance["calculateDistance\nDepth: 3\nCritical Points: 2"]
+    countSetBits["countSetBits\nDepth: 2\nCritical Points: 3"]:::target
+    createDynamicArray["createDynamicArray\nDepth: 2\nCritical Points: 2"]
+    createMatrix["createMatrix\nDepth: 2\nCritical Points: 2"]
+    factorial["factorial\nDepth: 3\nCritical Points: 2"]
+    findCentroid["findCentroid\nDepth: 3\nCritical Points: 2"]
+    getErrorMessage["getErrorMessage\nDepth: 3\nCritical Points: 2"]
+    insertNode["insertNode\nDepth: 2\nCritical Points: 2"]
+    longestIncreasingSubsequence["longestIncreasingSubsequence\nDepth: 2\nCritical Points: 7"]:::target
+    memoizedFib["memoizedFib\nDepth: 2\nCritical Points: 2"]:::target
+    multiplyMatrices["multiplyMatrices\nDepth: 2\nCritical Points: 2"]
+    performSimpleCalculations["performSimpleCalculations\nDepth: 3\nCritical Points: 7"]
+    processMatrix["processMatrix\nDepth: 2\nCritical Points: 3"]:::target
+    projectA_main["projectA_main\nDepth: 2\nCritical Points: 2"]
+    projectB_main["projectB_main\nDepth: 1\nCritical Points: 5"]:::target
+    pushBack["pushBack\nDepth: 2\nCritical Points: 2"]
+    quickSort["quickSort\nDepth: 3\nCritical Points: 2"]
+    removeDuplicates["removeDuplicates\nDepth: 3\nCritical Points: 2"]
+    reverseString["reverseString\nDepth: 2\nCritical Points: 3"]:::target
+    setErrorMessage["setErrorMessage\nDepth: 2\nCritical Points: 3"]
+    testPoints["testPoints\nDepth: 2\nCritical Points: 3"]:::target
+    validateMatrix["validateMatrix\nDepth: 3\nCritical Points: 2"]
+    calculateCircleArea --> setErrorMessage
+    calculateDistance --> setErrorMessage
+    createDynamicArray --> setErrorMessage
+    createMatrix --> setErrorMessage
+    factorial --> factorial
+    factorial --> setErrorMessage
+    findCentroid --> setErrorMessage
+    insertNode --> setErrorMessage
+    memoizedFib --> memoizedFib
+    multiplyMatrices --> createMatrix
+    multiplyMatrices --> setErrorMessage
+    processMatrix --> countSetBits
+    projectA_main --> createDynamicArray
+    projectA_main --> createMatrix
+    projectA_main --> getErrorMessage
+    projectA_main --> insertNode
+    projectA_main --> multiplyMatrices
+    projectA_main --> performSimpleCalculations
+    projectA_main --> pushBack
+    projectA_main --> setErrorMessage
+    projectB_main --> countSetBits
+    projectB_main --> longestIncreasingSubsequence
+    projectB_main --> memoizedFib
+    projectB_main --> processMatrix
+    projectB_main --> reverseString
+    projectB_main --> testPoints
+    pushBack --> setErrorMessage
+    quickSort --> quickSort
+    quickSort --> setErrorMessage
+    removeDuplicates --> quickSort
+    removeDuplicates --> setErrorMessage
+    validateMatrix --> setErrorMessage
+    classDef target fill:#f96,stroke:#333,stroke-width:4px
+```
+
+```mermaid: getErrorMessage
+graph TD
+    0["Block 0:\n  %1 = load i8*, i8** @globalErrorMessage, align 8\n  %2 = icmp ne i8* %1, null\n  br i1 %2, label %3, label %5\n"]:::critical
+    0 -->|true| 3
+    0 -->|false| 5
+    3["Block 3:\n  %4 = load i8*, i8** @globalErrorMessage, align 8\n  br label %6\n"]
+    3 --> 6
+    5["Block 5:\n  br label %6\n"]
+    5 --> 6
+    6["Block 6:\n  %7 = phi i8* [ %4, %3 ], [ getelementptr inbo...\n  ret i8* %7\n"]:::critical
+    classDef critical fill:#f96,stroke:#333,stroke-width:4px
+```
+```mermaid: setErrorMessage
+graph TD
+    1["Block 1:\n  %2 = alloca i8*, align 8\n  store i8* %0, i8** %2, align 8\n  %3 = load i8*, i8** @globalErrorMessage, align 8\n  %4 = icmp ne i8* %3, null\n  br i1 %4, label %5, label %7\n"]:::critical
+    1 -->|true| 5
+    1 -->|false| 7
+    5["Block 5:\n  %6 = load i8*, i8** @globalErrorMessage, align 8\n  call void @free(i8* %6) #7\n  br label %7\n"]
+    5 --> 7
+    7["Block 7:\n  %8 = load i8*, i8** %2, align 8\n  %9 = icmp ne i8* %8, null\n  br i1 %9, label %10, label %19\n"]:::critical
+    7 -->|true| 10
+    7 -->|false| 19
+    10["Block 10:\n  %11 = load i8*, i8** %2, align 8\n  %12 = call noalias i8* @strdup(i8* %11) #7\n  store i8* %12, i8** @globalErrorMessage, align 8\n  %13 = load i8*, i8** @globalErrorMessage, ali...\n  %14 = icmp eq i8* %13, null\n  br i1 %14, label %15, label %18\n"]
+    10 -->|true| 15
+    10 -->|false| 18
+    15["Block 15:\n  %16 = load %struct._IO_FILE*, %struct._IO_FIL...\n  %17 = call i32 (%struct._IO_FILE*, i8*, ...) ...\n  br label %18\n"]
+    15 --> 18
+    18["Block 18:\n  br label %20\n"]
+    18 --> 20
+    19["Block 19:\n  store i8* null, i8** @globalErrorMessage, ali...\n  br label %20\n"]
+    19 --> 20
+    20["Block 20:\n  ret void\n"]:::critical
+    classDef critical fill:#f96,stroke:#333,stroke-width:4px
+```
+```mermaid: factorial
+graph TD
+    1["Block 1:\n  %2 = alloca i32, align 4\n  %3 = alloca i32, align 4\n  %4 = alloca i32, align 4\n  %5 = alloca i32, align 4\n  store i32 %0, i32* %3, align 4\n  %6 = load i32, i32* @recursionDepth, align 4\n  %7 = add nsw i32 %6, 1\n  store i32 %7, i32* @recursionDepth, align 4\n  %8 = icmp sgt i32 %7, 1000\n  br i1 %8, label %9, label %12\n"]:::critical
+    1 -->|true| 9
+    1 -->|false| 12
+    9["Block 9:\n  call void @setErrorMessage(i8* getelementptr ...\n  %10 = load i32, i32* @recursionDepth, align 4\n  %11 = add nsw i32 %10, -1\n  store i32 %11, i32* @recursionDepth, align 4\n  store i32 -1, i32* %2, align 4\n  br label %53\n"]
+    9 --> 53
+    12["Block 12:\n  %13 = load i32, i32* %3, align 4\n  %14 = icmp slt i32 %13, 0\n  br i1 %14, label %15, label %18\n"]
+    12 -->|true| 15
+    12 -->|false| 18
+    15["Block 15:\n  call void @setErrorMessage(i8* getelementptr ...\n  %16 = load i32, i32* @recursionDepth, align 4\n  %17 = add nsw i32 %16, -1\n  store i32 %17, i32* @recursionDepth, align 4\n  store i32 -1, i32* %2, align 4\n  br label %53\n"]
+    15 --> 53
+    18["Block 18:\n  %19 = load i32, i32* %3, align 4\n  %20 = icmp sgt i32 %19, 20\n  br i1 %20, label %21, label %24\n"]
+    18 -->|true| 21
+    18 -->|false| 24
+    21["Block 21:\n  call void @setErrorMessage(i8* getelementptr ...\n  %22 = load i32, i32* @recursionDepth, align 4\n  %23 = add nsw i32 %22, -1\n  store i32 %23, i32* @recursionDepth, align 4\n  store i32 -1, i32* %2, align 4\n  br label %53\n"]
+    21 --> 53
+    24["Block 24:\n  %25 = load i32, i32* %3, align 4\n  %26 = icmp sle i32 %25, 1\n  br i1 %26, label %27, label %28\n"]
+    24 -->|true| 27
+    24 -->|false| 28
+    27["Block 27:\n  store i32 1, i32* %4, align 4\n  br label %49\n"]
+    27 --> 49
+    28["Block 28:\n  %29 = load i32, i32* %3, align 4\n  %30 = sub nsw i32 %29, 1\n  %31 = call i32 @factorial(i32 %30)\n  store i32 %31, i32* %5, align 4\n  %32 = load i32, i32* %5, align 4\n  %33 = icmp eq i32 %32, -1\n  br i1 %33, label %34, label %37\n"]
+    28 -->|true| 34
+    28 -->|false| 37
+    34["Block 34:\n  %35 = load i32, i32* @recursionDepth, align 4\n  %36 = add nsw i32 %35, -1\n  store i32 %36, i32* @recursionDepth, align 4\n  store i32 -1, i32* %2, align 4\n  br label %53\n"]
+    34 --> 53
+    37["Block 37:\n  %38 = load i32, i32* %5, align 4\n  %39 = load i32, i32* %3, align 4\n  %40 = sdiv i32 2147483647, %39\n  %41 = icmp sgt i32 %38, %40\n  br i1 %41, label %42, label %45\n"]
+    37 -->|true| 42
+    37 -->|false| 45
+    42["Block 42:\n  call void @setErrorMessage(i8* getelementptr ...\n  %43 = load i32, i32* @recursionDepth, align 4\n  %44 = add nsw i32 %43, -1\n  store i32 %44, i32* @recursionDepth, align 4\n  store i32 -1, i32* %2, align 4\n  br label %53\n"]
+    42 --> 53
+    45["Block 45:\n  %46 = load i32, i32* %3, align 4\n  %47 = load i32, i32* %5, align 4\n  %48 = mul nsw i32 %46, %47\n  store i32 %48, i32* %4, align 4\n  br label %49\n"]
+    45 --> 49
+    49["Block 49:\n  %50 = load i32, i32* @recursionDepth, align 4\n  %51 = add nsw i32 %50, -1\n  store i32 %51, i32* @recursionDepth, align 4\n  %52 = load i32, i32* %4, align 4\n  store i32 %52, i32* %2, align 4\n  br label %53\n"]
+    49 --> 53
+    53["Block 53:\n  %54 = load i32, i32* %2, align 4\n  ret i32 %54\n"]:::critical
+    classDef critical fill:#f96,stroke:#333,stroke-width:4px
+```
+```mermaid: createDynamicArray
+graph TD
+    1["Block 1:\n  %2 = alloca %struct.DynamicArray*, align 8\n  %3 = alloca i32, align 4\n  %4 = alloca %struct.DynamicArray*, align 8\n  store i32 %0, i32* %3, align 4\n  %5 = load i32, i32* %3, align 4\n  %6 = icmp sle i32 %5, 0\n  br i1 %6, label %7, label %8\n"]:::critical
+    1 -->|true| 7
+    1 -->|false| 8
+    7["Block 7:\n  call void @setErrorMessage(i8* getelementptr ...\n  store %struct.DynamicArray* null, %struct.Dyn...\n  br label %44\n"]
+    7 --> 44
+    8["Block 8:\n  %9 = load i32, i32* %3, align 4\n  %10 = icmp sgt i32 %9, 1000\n  br i1 %10, label %11, label %12\n"]
+    8 -->|true| 11
+    8 -->|false| 12
+    11["Block 11:\n  call void @setErrorMessage(i8* getelementptr ...\n  store %struct.DynamicArray* null, %struct.Dyn...\n  br label %44\n"]
+    11 --> 44
+    12["Block 12:\n  %13 = call noalias i8* @malloc(i64 24) #7\n  %14 = bitcast i8* %13 to %struct.DynamicArray*\n  store %struct.DynamicArray* %14, %struct.Dyna...\n  %15 = load %struct.DynamicArray*, %struct.Dyn...\n  %16 = icmp ne %struct.DynamicArray* %15, null\n  br i1 %16, label %18, label %17\n"]
+    12 -->|true| 18
+    12 -->|false| 17
+    17["Block 17:\n  call void @setErrorMessage(i8* getelementptr ...\n  store %struct.DynamicArray* null, %struct.Dyn...\n  br label %44\n"]
+    17 --> 44
+    18["Block 18:\n  %19 = load i32, i32* %3, align 4\n  %20 = sext i32 %19 to i64\n  %21 = mul i64 4, %20\n  %22 = call noalias i8* @malloc(i64 %21) #7\n  %23 = bitcast i8* %22 to i32*\n  %24 = load %struct.DynamicArray*, %struct.Dyn...\n  %25 = getelementptr inbounds %struct.DynamicA...\n  store i32* %23, i32** %25, align 8\n  %26 = load %struct.DynamicArray*, %struct.Dyn...\n  %27 = getelementptr inbounds %struct.DynamicA...\n  %28 = load i32*, i32** %27, align 8\n  %29 = icmp ne i32* %28, null\n  br i1 %29, label %33, label %30\n"]
+    18 -->|true| 33
+    18 -->|false| 30
+    30["Block 30:\n  %31 = load %struct.DynamicArray*, %struct.Dyn...\n  %32 = bitcast %struct.DynamicArray* %31 to i8*\n  call void @free(i8* %32) #7\n  call void @setErrorMessage(i8* getelementptr ...\n  store %struct.DynamicArray* null, %struct.Dyn...\n  br label %44\n"]
+    30 --> 44
+    33["Block 33:\n  %34 = load %struct.DynamicArray*, %struct.Dyn...\n  %35 = getelementptr inbounds %struct.DynamicA...\n  store i32 0, i32* %35, align 8\n  %36 = load i32, i32* %3, align 4\n  %37 = load %struct.DynamicArray*, %struct.Dyn...\n  %38 = getelementptr inbounds %struct.DynamicA...\n  store i32 %36, i32* %38, align 4\n  %39 = load %struct.DynamicArray*, %struct.Dyn...\n  %40 = getelementptr inbounds %struct.DynamicA...\n  store i32 1, i32* %40, align 8\n  %41 = load %struct.DynamicArray*, %struct.Dyn...\n  %42 = getelementptr inbounds %struct.DynamicA...\n  store i32 0, i32* %42, align 4\n  %43 = load %struct.DynamicArray*, %struct.Dyn...\n  store %struct.DynamicArray* %43, %struct.Dyna...\n  br label %44\n"]
+    33 --> 44
+    44["Block 44:\n  %45 = load %struct.DynamicArray*, %struct.Dyn...\n  ret %struct.DynamicArray* %45\n"]:::critical
+    classDef critical fill:#f96,stroke:#333,stroke-width:4px
+```
+```mermaid: pushBack
+graph TD
+    2["Block 2:\n  %3 = alloca %struct.DynamicArray*, align 8\n  %4 = alloca i32, align 4\n  %5 = alloca i32, align 4\n  %6 = alloca i32*, align 8\n  store %struct.DynamicArray* %0, %struct.Dynam...\n  store i32 %1, i32* %4, align 4\n  %7 = load %struct.DynamicArray*, %struct.Dyna...\n  %8 = icmp ne %struct.DynamicArray* %7, null\n  br i1 %8, label %10, label %9\n"]:::critical
+    2 -->|true| 10
+    2 -->|false| 9
+    9["Block 9:\n  call void @setErrorMessage(i8* getelementptr ...\n  br label %91\n"]
+    9 --> 91
+    10["Block 10:\n  %11 = load %struct.DynamicArray*, %struct.Dyn...\n  %12 = getelementptr inbounds %struct.DynamicA...\n  %13 = load i32, i32* %12, align 8\n  %14 = icmp sge i32 %13, 1000\n  br i1 %14, label %15, label %16\n"]
+    10 -->|true| 15
+    10 -->|false| 16
+    15["Block 15:\n  call void @setErrorMessage(i8* getelementptr ...\n  br label %91\n"]
+    15 --> 91
+    16["Block 16:\n  %17 = load %struct.DynamicArray*, %struct.Dyn...\n  %18 = getelementptr inbounds %struct.DynamicA...\n  %19 = load i32, i32* %18, align 8\n  %20 = load %struct.DynamicArray*, %struct.Dyn...\n  %21 = getelementptr inbounds %struct.DynamicA...\n  %22 = load i32, i32* %21, align 4\n  %23 = icmp sge i32 %19, %22\n  br i1 %23, label %24, label %52\n"]
+    16 -->|true| 24
+    16 -->|false| 52
+    24["Block 24:\n  %25 = load %struct.DynamicArray*, %struct.Dyn...\n  %26 = getelementptr inbounds %struct.DynamicA...\n  %27 = load i32, i32* %26, align 4\n  %28 = mul nsw i32 %27, 2\n  store i32 %28, i32* %5, align 4\n  %29 = load i32, i32* %5, align 4\n  %30 = icmp sgt i32 %29, 1000\n  br i1 %30, label %31, label %32\n"]
+    24 -->|true| 31
+    24 -->|false| 32
+    31["Block 31:\n  store i32 1000, i32* %5, align 4\n  br label %32\n"]
+    31 --> 32
+    32["Block 32:\n  %33 = load %struct.DynamicArray*, %struct.Dyn...\n  %34 = getelementptr inbounds %struct.DynamicA...\n  %35 = load i32*, i32** %34, align 8\n  %36 = bitcast i32* %35 to i8*\n  %37 = load i32, i32* %5, align 4\n  %38 = sext i32 %37 to i64\n  %39 = mul i64 4, %38\n  %40 = call i8* @realloc(i8* %36, i64 %39) #7\n  %41 = bitcast i8* %40 to i32*\n  store i32* %41, i32** %6, align 8\n  %42 = load i32*, i32** %6, align 8\n  %43 = icmp ne i32* %42, null\n  br i1 %43, label %45, label %44\n"]
+    32 -->|true| 45
+    32 -->|false| 44
+    44["Block 44:\n  call void @setErrorMessage(i8* getelementptr ...\n  br label %91\n"]
+    44 --> 91
+    45["Block 45:\n  %46 = load i32*, i32** %6, align 8\n  %47 = load %struct.DynamicArray*, %struct.Dyn...\n  %48 = getelementptr inbounds %struct.DynamicA...\n  store i32* %46, i32** %48, align 8\n  %49 = load i32, i32* %5, align 4\n  %50 = load %struct.DynamicArray*, %struct.Dyn...\n  %51 = getelementptr inbounds %struct.DynamicA...\n  store i32 %49, i32* %51, align 4\n  br label %52\n"]
+    45 --> 52
+    52["Block 52:\n  %53 = load %struct.DynamicArray*, %struct.Dyn...\n  %54 = getelementptr inbounds %struct.DynamicA...\n  %55 = load i32, i32* %54, align 8\n  %56 = icmp ne i32 %55, 0\n  br i1 %56, label %57, label %78\n"]
+    52 -->|true| 57
+    52 -->|false| 78
+    57["Block 57:\n  %58 = load %struct.DynamicArray*, %struct.Dyn...\n  %59 = getelementptr inbounds %struct.DynamicA...\n  %60 = load i32, i32* %59, align 8\n  %61 = icmp sgt i32 %60, 0\n  br i1 %61, label %62, label %78\n"]
+    57 -->|true| 62
+    57 -->|false| 78
+    62["Block 62:\n  %63 = load i32, i32* %4, align 4\n  %64 = load %struct.DynamicArray*, %struct.Dyn...\n  %65 = getelementptr inbounds %struct.DynamicA...\n  %66 = load i32*, i32** %65, align 8\n  %67 = load %struct.DynamicArray*, %struct.Dyn...\n  %68 = getelementptr inbounds %struct.DynamicA...\n  %69 = load i32, i32* %68, align 8\n  %70 = sub nsw i32 %69, 1\n  %71 = sext i32 %70 to i64\n  %72 = getelementptr inbounds i32, i32* %66, i...\n  %73 = load i32, i32* %72, align 4\n  %74 = icmp slt i32 %63, %73\n  br i1 %74, label %75, label %78\n"]
+    62 -->|true| 75
+    62 -->|false| 78
+    75["Block 75:\n  %76 = load %struct.DynamicArray*, %struct.Dyn...\n  %77 = getelementptr inbounds %struct.DynamicA...\n  store i32 0, i32* %77, align 8\n  br label %78\n"]
+    75 --> 78
+    78["Block 78:\n  %79 = load i32, i32* %4, align 4\n  %80 = load %struct.DynamicArray*, %struct.Dyn...\n  %81 = getelementptr inbounds %struct.DynamicA...\n  %82 = load i32*, i32** %81, align 8\n  %83 = load %struct.DynamicArray*, %struct.Dyn...\n  %84 = getelementptr inbounds %struct.DynamicA...\n  %85 = load i32, i32* %84, align 8\n  %86 = add nsw i32 %85, 1\n  store i32 %86, i32* %84, align 8\n  %87 = sext i32 %85 to i64\n  %88 = getelementptr inbounds i32, i32* %82, i...\n  store i32 %79, i32* %88, align 4\n  %89 = load %struct.DynamicArray*, %struct.Dyn...\n  %90 = getelementptr inbounds %struct.DynamicA...\n  store i32 1, i32* %90, align 4\n  br label %91\n"]
+    78 --> 91
+    91["Block 91:\n  ret void\n"]:::critical
+    classDef critical fill:#f96,stroke:#333,stroke-width:4px
+```
+```mermaid: quickSort
+graph TD
+    4["Block 4:\n  %5 = alloca i32*, align 8\n  %6 = alloca i32, align 4\n  %7 = alloca i32, align 4\n  %8 = alloca i32*, align 8\n  %9 = alloca i32, align 4\n  %10 = alloca i32, align 4\n  %11 = alloca i32, align 4\n  %12 = alloca i32, align 4\n  %13 = alloca i32, align 4\n  %14 = alloca i32, align 4\n  store i32* %0, i32** %5, align 8\n  store i32 %1, i32* %6, align 4\n  store i32 %2, i32* %7, align 4\n  store i32* %3, i32** %8, align 8\n  %15 = load i32, i32* @recursionDepth, align 4\n  %16 = add nsw i32 %15, 1\n  store i32 %16, i32* @recursionDepth, align 4\n  %17 = icmp sgt i32 %16, 1000\n  br i1 %17, label %18, label %22\n"]:::critical
+    4 -->|true| 18
+    4 -->|false| 22
+    18["Block 18:\n  call void @setErrorMessage(i8* getelementptr ...\n  %19 = load i32*, i32** %8, align 8\n  store i32 1, i32* %19, align 4\n  %20 = load i32, i32* @recursionDepth, align 4\n  %21 = add nsw i32 %20, -1\n  store i32 %21, i32* @recursionDepth, align 4\n  br label %247\n"]
+    18 --> 247
+    22["Block 22:\n  %23 = load i32*, i32** %5, align 8\n  %24 = icmp ne i32* %23, null\n  br i1 %24, label %29, label %25\n"]
+    22 -->|true| 29
+    22 -->|false| 25
+    25["Block 25:\n  call void @setErrorMessage(i8* getelementptr ...\n  %26 = load i32*, i32** %8, align 8\n  store i32 1, i32* %26, align 4\n  %27 = load i32, i32* @recursionDepth, align 4\n  %28 = add nsw i32 %27, -1\n  store i32 %28, i32* @recursionDepth, align 4\n  br label %247\n"]
+    25 --> 247
+    29["Block 29:\n  %30 = load i32, i32* %6, align 4\n  %31 = icmp slt i32 %30, 0\n  br i1 %31, label %41, label %32\n"]
+    29 -->|true| 41
+    29 -->|false| 32
+    32["Block 32:\n  %33 = load i32, i32* %7, align 4\n  %34 = icmp slt i32 %33, 0\n  br i1 %34, label %41, label %35\n"]
+    32 -->|true| 41
+    32 -->|false| 35
+    35["Block 35:\n  %36 = load i32, i32* %6, align 4\n  %37 = icmp sge i32 %36, 1000\n  br i1 %37, label %41, label %38\n"]
+    35 -->|true| 41
+    35 -->|false| 38
+    38["Block 38:\n  %39 = load i32, i32* %7, align 4\n  %40 = icmp sge i32 %39, 1000\n  br i1 %40, label %41, label %45\n"]
+    38 -->|true| 41
+    38 -->|false| 45
+    41["Block 41:\n  call void @setErrorMessage(i8* getelementptr ...\n  %42 = load i32*, i32** %8, align 8\n  store i32 1, i32* %42, align 4\n  %43 = load i32, i32* @recursionDepth, align 4\n  %44 = add nsw i32 %43, -1\n  store i32 %44, i32* @recursionDepth, align 4\n  br label %247\n"]
+    41 --> 247
+    45["Block 45:\n  %46 = load i32, i32* %6, align 4\n  %47 = load i32, i32* %7, align 4\n  %48 = icmp slt i32 %46, %47\n  br i1 %48, label %49, label %244\n"]
+    45 -->|true| 49
+    45 -->|false| 244
+    49["Block 49:\n  %50 = load i32, i32* %6, align 4\n  %51 = load i32, i32* %7, align 4\n  %52 = load i32, i32* %6, align 4\n  %53 = sub nsw i32 %51, %52\n  %54 = sdiv i32 %53, 2\n  %55 = add nsw i32 %50, %54\n  store i32 %55, i32* %9, align 4\n  %56 = load i32*, i32** %5, align 8\n  %57 = load i32, i32* %6, align 4\n  %58 = sext i32 %57 to i64\n  %59 = getelementptr inbounds i32, i32* %56, i...\n  %60 = load i32, i32* %59, align 4\n  %61 = load i32*, i32** %5, align 8\n  %62 = load i32, i32* %9, align 4\n  %63 = sext i32 %62 to i64\n  %64 = getelementptr inbounds i32, i32* %61, i...\n  %65 = load i32, i32* %64, align 4\n  %66 = icmp sle i32 %60, %65\n  br i1 %66, label %67, label %99\n"]
+    49 -->|true| 67
+    49 -->|false| 99
+    67["Block 67:\n  %68 = load i32*, i32** %5, align 8\n  %69 = load i32, i32* %9, align 4\n  %70 = sext i32 %69 to i64\n  %71 = getelementptr inbounds i32, i32* %68, i...\n  %72 = load i32, i32* %71, align 4\n  %73 = load i32*, i32** %5, align 8\n  %74 = load i32, i32* %7, align 4\n  %75 = sext i32 %74 to i64\n  %76 = getelementptr inbounds i32, i32* %73, i...\n  %77 = load i32, i32* %76, align 4\n  %78 = icmp sle i32 %72, %77\n  br i1 %78, label %79, label %81\n"]
+    67 -->|true| 79
+    67 -->|false| 81
+    79["Block 79:\n  %80 = load i32, i32* %9, align 4\n  store i32 %80, i32* %10, align 4\n  br label %98\n"]
+    79 --> 98
+    81["Block 81:\n  %82 = load i32*, i32** %5, align 8\n  %83 = load i32, i32* %6, align 4\n  %84 = sext i32 %83 to i64\n  %85 = getelementptr inbounds i32, i32* %82, i...\n  %86 = load i32, i32* %85, align 4\n  %87 = load i32*, i32** %5, align 8\n  %88 = load i32, i32* %7, align 4\n  %89 = sext i32 %88 to i64\n  %90 = getelementptr inbounds i32, i32* %87, i...\n  %91 = load i32, i32* %90, align 4\n  %92 = icmp sle i32 %86, %91\n  br i1 %92, label %93, label %95\n"]
+    81 -->|true| 93
+    81 -->|false| 95
+    93["Block 93:\n  %94 = load i32, i32* %7, align 4\n  store i32 %94, i32* %10, align 4\n  br label %97\n"]
+    93 --> 97
+    95["Block 95:\n  %96 = load i32, i32* %6, align 4\n  store i32 %96, i32* %10, align 4\n  br label %97\n"]
+    95 --> 97
+    97["Block 97:\n  br label %98\n"]
+    97 --> 98
+    98["Block 98:\n  br label %131\n"]
+    98 --> 131
+    99["Block 99:\n  %100 = load i32*, i32** %5, align 8\n  %101 = load i32, i32* %6, align 4\n  %102 = sext i32 %101 to i64\n  %103 = getelementptr inbounds i32, i32* %100,...\n  %104 = load i32, i32* %103, align 4\n  %105 = load i32*, i32** %5, align 8\n  %106 = load i32, i32* %7, align 4\n  %107 = sext i32 %106 to i64\n  %108 = getelementptr inbounds i32, i32* %105,...\n  %109 = load i32, i32* %108, align 4\n  %110 = icmp sle i32 %104, %109\n  br i1 %110, label %111, label %113\n"]
+    99 -->|true| 111
+    99 -->|false| 113
+    111["Block 111:\n  %112 = load i32, i32* %6, align 4\n  store i32 %112, i32* %10, align 4\n  br label %130\n"]
+    111 --> 130
+    113["Block 113:\n  %114 = load i32*, i32** %5, align 8\n  %115 = load i32, i32* %9, align 4\n  %116 = sext i32 %115 to i64\n  %117 = getelementptr inbounds i32, i32* %114,...\n  %118 = load i32, i32* %117, align 4\n  %119 = load i32*, i32** %5, align 8\n  %120 = load i32, i32* %7, align 4\n  %121 = sext i32 %120 to i64\n  %122 = getelementptr inbounds i32, i32* %119,...\n  %123 = load i32, i32* %122, align 4\n  %124 = icmp sle i32 %118, %123\n  br i1 %124, label %125, label %127\n"]
+    113 -->|true| 125
+    113 -->|false| 127
+    125["Block 125:\n  %126 = load i32, i32* %7, align 4\n  store i32 %126, i32* %10, align 4\n  br label %129\n"]
+    125 --> 129
+    127["Block 127:\n  %128 = load i32, i32* %9, align 4\n  store i32 %128, i32* %10, align 4\n  br label %129\n"]
+    127 --> 129
+    129["Block 129:\n  br label %130\n"]
+    129 --> 130
+    130["Block 130:\n  br label %131\n"]
+    130 --> 131
+    131["Block 131:\n  %132 = load i32*, i32** %5, align 8\n  %133 = load i32, i32* %7, align 4\n  %134 = sext i32 %133 to i64\n  %135 = getelementptr inbounds i32, i32* %132,...\n  %136 = load i32, i32* %135, align 4\n  store i32 %136, i32* %11, align 4\n  %137 = load i32*, i32** %5, align 8\n  %138 = load i32, i32* %10, align 4\n  %139 = sext i32 %138 to i64\n  %140 = getelementptr inbounds i32, i32* %137,...\n  %141 = load i32, i32* %140, align 4\n  %142 = load i32*, i32** %5, align 8\n  %143 = load i32, i32* %7, align 4\n  %144 = sext i32 %143 to i64\n  %145 = getelementptr inbounds i32, i32* %142,...\n  store i32 %141, i32* %145, align 4\n  %146 = load i32, i32* %11, align 4\n  %147 = load i32*, i32** %5, align 8\n  %148 = load i32, i32* %10, align 4\n  %149 = sext i32 %148 to i64\n  %150 = getelementptr inbounds i32, i32* %147,...\n  store i32 %146, i32* %150, align 4\n  %151 = load i32*, i32** %5, align 8\n  %152 = load i32, i32* %7, align 4\n  %153 = sext i32 %152 to i64\n  %154 = getelementptr inbounds i32, i32* %151,...\n  %155 = load i32, i32* %154, align 4\n  store i32 %155, i32* %12, align 4\n  %156 = load i32, i32* %6, align 4\n  %157 = sub nsw i32 %156, 1\n  store i32 %157, i32* %13, align 4\n  %158 = load i32, i32* %6, align 4\n  store i32 %158, i32* %14, align 4\n  br label %159\n"]
+    131 --> 159
+    159["Block 159:\n  %160 = load i32, i32* %14, align 4\n  %161 = load i32, i32* %7, align 4\n  %162 = icmp slt i32 %160, %161\n  br i1 %162, label %163, label %199\n"]
+    159 -->|true| 163
+    159 -->|false| 199
+    163["Block 163:\n  %164 = load i32*, i32** %5, align 8\n  %165 = load i32, i32* %14, align 4\n  %166 = sext i32 %165 to i64\n  %167 = getelementptr inbounds i32, i32* %164,...\n  %168 = load i32, i32* %167, align 4\n  %169 = load i32, i32* %12, align 4\n  %170 = icmp sle i32 %168, %169\n  br i1 %170, label %171, label %195\n"]
+    163 -->|true| 171
+    163 -->|false| 195
+    171["Block 171:\n  %172 = load i32, i32* %13, align 4\n  %173 = add nsw i32 %172, 1\n  store i32 %173, i32* %13, align 4\n  %174 = load i32*, i32** %5, align 8\n  %175 = load i32, i32* %13, align 4\n  %176 = sext i32 %175 to i64\n  %177 = getelementptr inbounds i32, i32* %174,...\n  %178 = load i32, i32* %177, align 4\n  store i32 %178, i32* %11, align 4\n  %179 = load i32*, i32** %5, align 8\n  %180 = load i32, i32* %14, align 4\n  %181 = sext i32 %180 to i64\n  %182 = getelementptr inbounds i32, i32* %179,...\n  %183 = load i32, i32* %182, align 4\n  %184 = load i32*, i32** %5, align 8\n  %185 = load i32, i32* %13, align 4\n  %186 = sext i32 %185 to i64\n  %187 = getelementptr inbounds i32, i32* %184,...\n  store i32 %183, i32* %187, align 4\n  %188 = load i32, i32* %11, align 4\n  %189 = load i32*, i32** %5, align 8\n  %190 = load i32, i32* %14, align 4\n  %191 = sext i32 %190 to i64\n  %192 = getelementptr inbounds i32, i32* %189,...\n  store i32 %188, i32* %192, align 4\n  %193 = load i32, i32* @globalCounter, align 4\n  %194 = add nsw i32 %193, 1\n  store i32 %194, i32* @globalCounter, align 4\n  br label %195\n"]
+    171 --> 195
+    195["Block 195:\n  br label %196\n"]
+    195 --> 196
+    196["Block 196:\n  %197 = load i32, i32* %14, align 4\n  %198 = add nsw i32 %197, 1\n  store i32 %198, i32* %14, align 4\n  br label %159\n"]
+    196 --> 159
+    199["Block 199:\n  %200 = load i32*, i32** %5, align 8\n  %201 = load i32, i32* %13, align 4\n  %202 = add nsw i32 %201, 1\n  %203 = sext i32 %202 to i64\n  %204 = getelementptr inbounds i32, i32* %200,...\n  %205 = load i32, i32* %204, align 4\n  store i32 %205, i32* %11, align 4\n  %206 = load i32*, i32** %5, align 8\n  %207 = load i32, i32* %7, align 4\n  %208 = sext i32 %207 to i64\n  %209 = getelementptr inbounds i32, i32* %206,...\n  %210 = load i32, i32* %209, align 4\n  %211 = load i32*, i32** %5, align 8\n  %212 = load i32, i32* %13, align 4\n  %213 = add nsw i32 %212, 1\n  %214 = sext i32 %213 to i64\n  %215 = getelementptr inbounds i32, i32* %211,...\n  store i32 %210, i32* %215, align 4\n  %216 = load i32, i32* %11, align 4\n  %217 = load i32*, i32** %5, align 8\n  %218 = load i32, i32* %7, align 4\n  %219 = sext i32 %218 to i64\n  %220 = getelementptr inbounds i32, i32* %217,...\n  store i32 %216, i32* %220, align 4\n  %221 = load i32*, i32** %5, align 8\n  %222 = load i32, i32* %6, align 4\n  %223 = load i32, i32* %13, align 4\n  %224 = load i32*, i32** %8, align 8\n  call void @quickSort(i32* %221, i32 %222, i32...\n  %225 = load i32*, i32** %8, align 8\n  %226 = load i32, i32* %225, align 4\n  %227 = icmp ne i32 %226, 0\n  br i1 %227, label %228, label %231\n"]
+    199 -->|true| 228
+    199 -->|false| 231
+    228["Block 228:\n  %229 = load i32, i32* @recursionDepth, align 4\n  %230 = add nsw i32 %229, -1\n  store i32 %230, i32* @recursionDepth, align 4\n  br label %247\n"]
+    228 --> 247
+    231["Block 231:\n  %232 = load i32*, i32** %5, align 8\n  %233 = load i32, i32* %13, align 4\n  %234 = add nsw i32 %233, 2\n  %235 = load i32, i32* %7, align 4\n  %236 = load i32*, i32** %8, align 8\n  call void @quickSort(i32* %232, i32 %234, i32...\n  %237 = load i32*, i32** %8, align 8\n  %238 = load i32, i32* %237, align 4\n  %239 = icmp ne i32 %238, 0\n  br i1 %239, label %240, label %243\n"]
+    231 -->|true| 240
+    231 -->|false| 243
+    240["Block 240:\n  %241 = load i32, i32* @recursionDepth, align 4\n  %242 = add nsw i32 %241, -1\n  store i32 %242, i32* @recursionDepth, align 4\n  br label %247\n"]
+    240 --> 247
+    243["Block 243:\n  br label %244\n"]
+    243 --> 244
+    244["Block 244:\n  %245 = load i32, i32* @recursionDepth, align 4\n  %246 = add nsw i32 %245, -1\n  store i32 %246, i32* @recursionDepth, align 4\n  br label %247\n"]
+    244 --> 247
+    247["Block 247:\n  ret void\n"]:::critical
+    classDef critical fill:#f96,stroke:#333,stroke-width:4px
+```
+```mermaid: createMatrix
+graph TD
+    2["Block 2:\n  %3 = alloca %struct.Matrix*, align 8\n  %4 = alloca i32, align 4\n  %5 = alloca i32, align 4\n  %6 = alloca %struct.Matrix*, align 8\n  %7 = alloca i32, align 4\n  %8 = alloca i32, align 4\n  store i32 %0, i32* %4, align 4\n  store i32 %1, i32* %5, align 4\n  %9 = load i32, i32* %4, align 4\n  %10 = icmp slt i32 %9, 1\n  br i1 %10, label %14, label %11\n"]:::critical
+    2 -->|true| 14
+    2 -->|false| 11
+    11["Block 11:\n  %12 = load i32, i32* %5, align 4\n  %13 = icmp slt i32 %12, 1\n  br i1 %13, label %14, label %15\n"]
+    11 -->|true| 14
+    11 -->|false| 15
+    14["Block 14:\n  call void @setErrorMessage(i8* getelementptr ...\n  store %struct.Matrix* null, %struct.Matrix** ...\n  br label %111\n"]
+    14 --> 111
+    15["Block 15:\n  %16 = load i32, i32* %4, align 4\n  %17 = icmp sgt i32 %16, 100\n  br i1 %17, label %21, label %18\n"]
+    15 -->|true| 21
+    15 -->|false| 18
+    18["Block 18:\n  %19 = load i32, i32* %5, align 4\n  %20 = icmp sgt i32 %19, 100\n  br i1 %20, label %21, label %22\n"]
+    18 -->|true| 21
+    18 -->|false| 22
+    21["Block 21:\n  call void @setErrorMessage(i8* getelementptr ...\n  store %struct.Matrix* null, %struct.Matrix** ...\n  br label %111\n"]
+    21 --> 111
+    22["Block 22:\n  %23 = call noalias i8* @malloc(i64 32) #7\n  %24 = bitcast i8* %23 to %struct.Matrix*\n  store %struct.Matrix* %24, %struct.Matrix** %...\n  %25 = load %struct.Matrix*, %struct.Matrix** ...\n  %26 = icmp ne %struct.Matrix* %25, null\n  br i1 %26, label %28, label %27\n"]
+    22 -->|true| 28
+    22 -->|false| 27
+    27["Block 27:\n  call void @setErrorMessage(i8* getelementptr ...\n  store %struct.Matrix* null, %struct.Matrix** ...\n  br label %111\n"]
+    27 --> 111
+    28["Block 28:\n  %29 = load i32, i32* %4, align 4\n  %30 = load %struct.Matrix*, %struct.Matrix** ...\n  %31 = getelementptr inbounds %struct.Matrix, ...\n  store i32 %29, i32* %31, align 8\n  %32 = load i32, i32* %5, align 4\n  %33 = load %struct.Matrix*, %struct.Matrix** ...\n  %34 = getelementptr inbounds %struct.Matrix, ...\n  store i32 %32, i32* %34, align 4\n  %35 = load i32, i32* %4, align 4\n  %36 = load i32, i32* %5, align 4\n  %37 = icmp eq i32 %35, %36\n  %38 = zext i1 %37 to i32\n  %39 = load %struct.Matrix*, %struct.Matrix** ...\n  %40 = getelementptr inbounds %struct.Matrix, ...\n  store i32 %38, i32* %40, align 8\n  %41 = load %struct.Matrix*, %struct.Matrix** ...\n  %42 = getelementptr inbounds %struct.Matrix, ...\n  store double 0.000000e+00, double* %42, align 8\n  %43 = load i32, i32* %4, align 4\n  %44 = sext i32 %43 to i64\n  %45 = mul i64 %44, 8\n  %46 = call noalias i8* @malloc(i64 %45) #7\n  %47 = bitcast i8* %46 to i32**\n  %48 = load %struct.Matrix*, %struct.Matrix** ...\n  %49 = getelementptr inbounds %struct.Matrix, ...\n  store i32** %47, i32*** %49, align 8\n  %50 = load %struct.Matrix*, %struct.Matrix** ...\n  %51 = getelementptr inbounds %struct.Matrix, ...\n  %52 = load i32**, i32*** %51, align 8\n  %53 = icmp ne i32** %52, null\n  br i1 %53, label %57, label %54\n"]
+    28 -->|true| 57
+    28 -->|false| 54
+    54["Block 54:\n  %55 = load %struct.Matrix*, %struct.Matrix** ...\n  %56 = bitcast %struct.Matrix* %55 to i8*\n  call void @free(i8* %56) #7\n  call void @setErrorMessage(i8* getelementptr ...\n  store %struct.Matrix* null, %struct.Matrix** ...\n  br label %111\n"]
+    54 --> 111
+    57["Block 57:\n  store i32 0, i32* %7, align 4\n  br label %58\n"]
+    57 --> 58
+    58["Block 58:\n  %59 = load i32, i32* %7, align 4\n  %60 = load i32, i32* %4, align 4\n  %61 = icmp slt i32 %59, %60\n  br i1 %61, label %62, label %109\n"]
+    58 -->|true| 62
+    58 -->|false| 109
+    62["Block 62:\n  %63 = load i32, i32* %5, align 4\n  %64 = sext i32 %63 to i64\n  %65 = call noalias i8* @calloc(i64 %64, i64 4...\n  %66 = bitcast i8* %65 to i32*\n  %67 = load %struct.Matrix*, %struct.Matrix** ...\n  %68 = getelementptr inbounds %struct.Matrix, ...\n  %69 = load i32**, i32*** %68, align 8\n  %70 = load i32, i32* %7, align 4\n  %71 = sext i32 %70 to i64\n  %72 = getelementptr inbounds i32*, i32** %69,...\n  store i32* %66, i32** %72, align 8\n  %73 = load %struct.Matrix*, %struct.Matrix** ...\n  %74 = getelementptr inbounds %struct.Matrix, ...\n  %75 = load i32**, i32*** %74, align 8\n  %76 = load i32, i32* %7, align 4\n  %77 = sext i32 %76 to i64\n  %78 = getelementptr inbounds i32*, i32** %75,...\n  %79 = load i32*, i32** %78, align 8\n  %80 = icmp ne i32* %79, null\n  br i1 %80, label %105, label %81\n"]
+    62 -->|true| 105
+    62 -->|false| 81
+    81["Block 81:\n  store i32 0, i32* %8, align 4\n  br label %82\n"]
+    81 --> 82
+    82["Block 82:\n  %83 = load i32, i32* %8, align 4\n  %84 = load i32, i32* %7, align 4\n  %85 = icmp slt i32 %83, %84\n  br i1 %85, label %86, label %98\n"]
+    82 -->|true| 86
+    82 -->|false| 98
+    86["Block 86:\n  %87 = load %struct.Matrix*, %struct.Matrix** ...\n  %88 = getelementptr inbounds %struct.Matrix, ...\n  %89 = load i32**, i32*** %88, align 8\n  %90 = load i32, i32* %8, align 4\n  %91 = sext i32 %90 to i64\n  %92 = getelementptr inbounds i32*, i32** %89,...\n  %93 = load i32*, i32** %92, align 8\n  %94 = bitcast i32* %93 to i8*\n  call void @free(i8* %94) #7\n  br label %95\n"]
+    86 --> 95
+    95["Block 95:\n  %96 = load i32, i32* %8, align 4\n  %97 = add nsw i32 %96, 1\n  store i32 %97, i32* %8, align 4\n  br label %82\n"]
+    95 --> 82
+    98["Block 98:\n  %99 = load %struct.Matrix*, %struct.Matrix** ...\n  %100 = getelementptr inbounds %struct.Matrix,...\n  %101 = load i32**, i32*** %100, align 8\n  %102 = bitcast i32** %101 to i8*\n  call void @free(i8* %102) #7\n  %103 = load %struct.Matrix*, %struct.Matrix**...\n  %104 = bitcast %struct.Matrix* %103 to i8*\n  call void @free(i8* %104) #7\n  call void @setErrorMessage(i8* getelementptr ...\n  store %struct.Matrix* null, %struct.Matrix** ...\n  br label %111\n"]
+    98 --> 111
+    105["Block 105:\n  br label %106\n"]
+    105 --> 106
+    106["Block 106:\n  %107 = load i32, i32* %7, align 4\n  %108 = add nsw i32 %107, 1\n  store i32 %108, i32* %7, align 4\n  br label %58\n"]
+    106 --> 58
+    109["Block 109:\n  %110 = load %struct.Matrix*, %struct.Matrix**...\n  store %struct.Matrix* %110, %struct.Matrix** ...\n  br label %111\n"]
+    109 --> 111
+    111["Block 111:\n  %112 = load %struct.Matrix*, %struct.Matrix**...\n  ret %struct.Matrix* %112\n"]:::critical
+    classDef critical fill:#f96,stroke:#333,stroke-width:4px
+```
+```mermaid: multiplyMatrices
+graph TD
+    2["Block 2:\n  %3 = alloca %struct.Matrix*, align 8\n  %4 = alloca %struct.Matrix*, align 8\n  %5 = alloca %struct.Matrix*, align 8\n  %6 = alloca %struct.Matrix*, align 8\n  %7 = alloca i64, align 8\n  %8 = alloca i32, align 4\n  %9 = alloca i32, align 4\n  %10 = alloca i64, align 8\n  %11 = alloca i32, align 4\n  %12 = alloca i64, align 8\n  %13 = alloca i32, align 4\n  store %struct.Matrix* %0, %struct.Matrix** %4...\n  store %struct.Matrix* %1, %struct.Matrix** %5...\n  %14 = load %struct.Matrix*, %struct.Matrix** ...\n  %15 = icmp ne %struct.Matrix* %14, null\n  br i1 %15, label %16, label %19\n"]:::critical
+    2 -->|true| 16
+    2 -->|false| 19
+    16["Block 16:\n  %17 = load %struct.Matrix*, %struct.Matrix** ...\n  %18 = icmp ne %struct.Matrix* %17, null\n  br i1 %18, label %20, label %19\n"]
+    16 -->|true| 20
+    16 -->|false| 19
+    19["Block 19:\n  call void @setErrorMessage(i8* getelementptr ...\n  store %struct.Matrix* null, %struct.Matrix** ...\n  br label %209\n"]
+    19 --> 209
+    20["Block 20:\n  %21 = load %struct.Matrix*, %struct.Matrix** ...\n  %22 = getelementptr inbounds %struct.Matrix, ...\n  %23 = load i32**, i32*** %22, align 8\n  %24 = icmp ne i32** %23, null\n  br i1 %24, label %25, label %30\n"]
+    20 -->|true| 25
+    20 -->|false| 30
+    25["Block 25:\n  %26 = load %struct.Matrix*, %struct.Matrix** ...\n  %27 = getelementptr inbounds %struct.Matrix, ...\n  %28 = load i32**, i32*** %27, align 8\n  %29 = icmp ne i32** %28, null\n  br i1 %29, label %31, label %30\n"]
+    25 -->|true| 31
+    25 -->|false| 30
+    30["Block 30:\n  call void @setErrorMessage(i8* getelementptr ...\n  store %struct.Matrix* null, %struct.Matrix** ...\n  br label %209\n"]
+    30 --> 209
+    31["Block 31:\n  %32 = load %struct.Matrix*, %struct.Matrix** ...\n  %33 = getelementptr inbounds %struct.Matrix, ...\n  %34 = load i32, i32* %33, align 4\n  %35 = load %struct.Matrix*, %struct.Matrix** ...\n  %36 = getelementptr inbounds %struct.Matrix, ...\n  %37 = load i32, i32* %36, align 8\n  %38 = icmp ne i32 %34, %37\n  br i1 %38, label %39, label %40\n"]
+    31 -->|true| 39
+    31 -->|false| 40
+    39["Block 39:\n  call void @setErrorMessage(i8* getelementptr ...\n  store %struct.Matrix* null, %struct.Matrix** ...\n  br label %209\n"]
+    39 --> 209
+    40["Block 40:\n  %41 = load %struct.Matrix*, %struct.Matrix** ...\n  %42 = getelementptr inbounds %struct.Matrix, ...\n  %43 = load i32, i32* %42, align 4\n  %44 = icmp sgt i32 %43, 100\n  br i1 %44, label %50, label %45\n"]
+    40 -->|true| 50
+    40 -->|false| 45
+    45["Block 45:\n  %46 = load %struct.Matrix*, %struct.Matrix** ...\n  %47 = getelementptr inbounds %struct.Matrix, ...\n  %48 = load i32, i32* %47, align 8\n  %49 = icmp sgt i32 %48, 100\n  br i1 %49, label %50, label %51\n"]
+    45 -->|true| 50
+    45 -->|false| 51
+    50["Block 50:\n  call void @setErrorMessage(i8* getelementptr ...\n  store %struct.Matrix* null, %struct.Matrix** ...\n  br label %209\n"]
+    50 --> 209
+    51["Block 51:\n  %52 = load %struct.Matrix*, %struct.Matrix** ...\n  %53 = getelementptr inbounds %struct.Matrix, ...\n  %54 = load i32, i32* %53, align 8\n  %55 = load %struct.Matrix*, %struct.Matrix** ...\n  %56 = getelementptr inbounds %struct.Matrix, ...\n  %57 = load i32, i32* %56, align 4\n  %58 = call %struct.Matrix* @createMatrix(i32 ...\n  store %struct.Matrix* %58, %struct.Matrix** %...\n  %59 = load %struct.Matrix*, %struct.Matrix** ...\n  %60 = icmp ne %struct.Matrix* %59, null\n  br i1 %60, label %62, label %61\n"]
+    51 -->|true| 62
+    51 -->|false| 61
+    61["Block 61:\n  store %struct.Matrix* null, %struct.Matrix** ...\n  br label %209\n"]
+    61 --> 209
+    62["Block 62:\n  store i64 0, i64* %7, align 8\n  store i32 0, i32* %8, align 4\n  br label %63\n"]
+    62 --> 63
+    63["Block 63:\n  %64 = load i32, i32* %8, align 4\n  %65 = load %struct.Matrix*, %struct.Matrix** ...\n  %66 = getelementptr inbounds %struct.Matrix, ...\n  %67 = load i32, i32* %66, align 8\n  %68 = icmp slt i32 %64, %67\n  br i1 %68, label %69, label %197\n"]
+    63 -->|true| 69
+    63 -->|false| 197
+    69["Block 69:\n  store i32 0, i32* %9, align 4\n  br label %70\n"]
+    69 --> 70
+    70["Block 70:\n  %71 = load i32, i32* %9, align 4\n  %72 = load %struct.Matrix*, %struct.Matrix** ...\n  %73 = getelementptr inbounds %struct.Matrix, ...\n  %74 = load i32, i32* %73, align 4\n  %75 = icmp slt i32 %71, %74\n  br i1 %75, label %76, label %193\n"]
+    70 -->|true| 76
+    70 -->|false| 193
+    76["Block 76:\n  store i64 0, i64* %10, align 8\n  store i32 0, i32* %11, align 4\n  br label %77\n"]
+    76 --> 77
+    77["Block 77:\n  %78 = load i32, i32* %11, align 4\n  %79 = load %struct.Matrix*, %struct.Matrix** ...\n  %80 = getelementptr inbounds %struct.Matrix, ...\n  %81 = load i32, i32* %80, align 4\n  %82 = icmp slt i32 %78, %81\n  br i1 %82, label %83, label %147\n"]
+    77 -->|true| 83
+    77 -->|false| 147
+    83["Block 83:\n  %84 = load %struct.Matrix*, %struct.Matrix** ...\n  %85 = getelementptr inbounds %struct.Matrix, ...\n  %86 = load i32**, i32*** %85, align 8\n  %87 = load i32, i32* %8, align 4\n  %88 = sext i32 %87 to i64\n  %89 = getelementptr inbounds i32*, i32** %86,...\n  %90 = load i32*, i32** %89, align 8\n  %91 = load i32, i32* %11, align 4\n  %92 = sext i32 %91 to i64\n  %93 = getelementptr inbounds i32, i32* %90, i...\n  %94 = load i32, i32* %93, align 4\n  %95 = sext i32 %94 to i64\n  %96 = load %struct.Matrix*, %struct.Matrix** ...\n  %97 = getelementptr inbounds %struct.Matrix, ...\n  %98 = load i32**, i32*** %97, align 8\n  %99 = load i32, i32* %11, align 4\n  %100 = sext i32 %99 to i64\n  %101 = getelementptr inbounds i32*, i32** %98...\n  %102 = load i32*, i32** %101, align 8\n  %103 = load i32, i32* %9, align 4\n  %104 = sext i32 %103 to i64\n  %105 = getelementptr inbounds i32, i32* %102,...\n  %106 = load i32, i32* %105, align 4\n  %107 = sext i32 %106 to i64\n  %108 = mul nsw i64 %95, %107\n  store i64 %108, i64* %12, align 8\n  %109 = load i64, i64* %12, align 8\n  %110 = load i64, i64* %10, align 8\n  %111 = add nsw i64 %110, %109\n  store i64 %111, i64* %10, align 8\n  %112 = load i64, i64* %10, align 8\n  %113 = icmp sgt i64 %112, 2147483647\n  br i1 %113, label %117, label %114\n"]
+    83 -->|true| 117
+    83 -->|false| 114
+    114["Block 114:\n  %115 = load i64, i64* %10, align 8\n  %116 = icmp slt i64 %115, -2147483648\n  br i1 %116, label %117, label %143\n"]
+    114 -->|true| 117
+    114 -->|false| 143
+    117["Block 117:\n  call void @setErrorMessage(i8* getelementptr ...\n  store i32 0, i32* %13, align 4\n  br label %118\n"]
+    117 --> 118
+    118["Block 118:\n  %119 = load i32, i32* %13, align 4\n  %120 = load %struct.Matrix*, %struct.Matrix**...\n  %121 = getelementptr inbounds %struct.Matrix,...\n  %122 = load i32, i32* %121, align 8\n  %123 = icmp slt i32 %119, %122\n  br i1 %123, label %124, label %136\n"]
+    118 -->|true| 124
+    118 -->|false| 136
+    124["Block 124:\n  %125 = load %struct.Matrix*, %struct.Matrix**...\n  %126 = getelementptr inbounds %struct.Matrix,...\n  %127 = load i32**, i32*** %126, align 8\n  %128 = load i32, i32* %13, align 4\n  %129 = sext i32 %128 to i64\n  %130 = getelementptr inbounds i32*, i32** %12...\n  %131 = load i32*, i32** %130, align 8\n  %132 = bitcast i32* %131 to i8*\n  call void @free(i8* %132) #7\n  br label %133\n"]
+    124 --> 133
+    133["Block 133:\n  %134 = load i32, i32* %13, align 4\n  %135 = add nsw i32 %134, 1\n  store i32 %135, i32* %13, align 4\n  br label %118\n"]
+    133 --> 118
+    136["Block 136:\n  %137 = load %struct.Matrix*, %struct.Matrix**...\n  %138 = getelementptr inbounds %struct.Matrix,...\n  %139 = load i32**, i32*** %138, align 8\n  %140 = bitcast i32** %139 to i8*\n  call void @free(i8* %140) #7\n  %141 = load %struct.Matrix*, %struct.Matrix**...\n  %142 = bitcast %struct.Matrix* %141 to i8*\n  call void @free(i8* %142) #7\n  store %struct.Matrix* null, %struct.Matrix** ...\n  br label %209\n"]
+    136 --> 209
+    143["Block 143:\n  br label %144\n"]
+    143 --> 144
+    144["Block 144:\n  %145 = load i32, i32* %11, align 4\n  %146 = add nsw i32 %145, 1\n  store i32 %146, i32* %11, align 4\n  br label %77\n"]
+    144 --> 77
+    147["Block 147:\n  %148 = load i64, i64* %10, align 8\n  %149 = trunc i64 %148 to i32\n  %150 = load %struct.Matrix*, %struct.Matrix**...\n  %151 = getelementptr inbounds %struct.Matrix,...\n  %152 = load i32**, i32*** %151, align 8\n  %153 = load i32, i32* %8, align 4\n  %154 = sext i32 %153 to i64\n  %155 = getelementptr inbounds i32*, i32** %15...\n  %156 = load i32*, i32** %155, align 8\n  %157 = load i32, i32* %9, align 4\n  %158 = sext i32 %157 to i64\n  %159 = getelementptr inbounds i32, i32* %156,...\n  store i32 %149, i32* %159, align 4\n  %160 = load %struct.Matrix*, %struct.Matrix**...\n  %161 = getelementptr inbounds %struct.Matrix,...\n  %162 = load i32**, i32*** %161, align 8\n  %163 = load i32, i32* %8, align 4\n  %164 = sext i32 %163 to i64\n  %165 = getelementptr inbounds i32*, i32** %16...\n  %166 = load i32*, i32** %165, align 8\n  %167 = load i32, i32* %9, align 4\n  %168 = sext i32 %167 to i64\n  %169 = getelementptr inbounds i32, i32* %166,...\n  %170 = load i32, i32* %169, align 4\n  %171 = call i32 @abs(i32 %170) #8\n  %172 = sext i32 %171 to i64\n  %173 = load i64, i64* %7, align 8\n  %174 = icmp sgt i64 %172, %173\n  br i1 %174, label %175, label %189\n"]
+    147 -->|true| 175
+    147 -->|false| 189
+    175["Block 175:\n  %176 = load %struct.Matrix*, %struct.Matrix**...\n  %177 = getelementptr inbounds %struct.Matrix,...\n  %178 = load i32**, i32*** %177, align 8\n  %179 = load i32, i32* %8, align 4\n  %180 = sext i32 %179 to i64\n  %181 = getelementptr inbounds i32*, i32** %17...\n  %182 = load i32*, i32** %181, align 8\n  %183 = load i32, i32* %9, align 4\n  %184 = sext i32 %183 to i64\n  %185 = getelementptr inbounds i32, i32* %182,...\n  %186 = load i32, i32* %185, align 4\n  %187 = call i32 @abs(i32 %186) #8\n  %188 = sext i32 %187 to i64\n  store i64 %188, i64* %7, align 8\n  br label %189\n"]
+    175 --> 189
+    189["Block 189:\n  br label %190\n"]
+    189 --> 190
+    190["Block 190:\n  %191 = load i32, i32* %9, align 4\n  %192 = add nsw i32 %191, 1\n  store i32 %192, i32* %9, align 4\n  br label %70\n"]
+    190 --> 70
+    193["Block 193:\n  br label %194\n"]
+    193 --> 194
+    194["Block 194:\n  %195 = load i32, i32* %8, align 4\n  %196 = add nsw i32 %195, 1\n  store i32 %196, i32* %8, align 4\n  br label %63\n"]
+    194 --> 63
+    197["Block 197:\n  %198 = load %struct.Matrix*, %struct.Matrix**...\n  %199 = getelementptr inbounds %struct.Matrix,...\n  %200 = load i32, i32* %199, align 8\n  %201 = load %struct.Matrix*, %struct.Matrix**...\n  %202 = getelementptr inbounds %struct.Matrix,...\n  %203 = load i32, i32* %202, align 4\n  %204 = icmp eq i32 %200, %203\n  %205 = zext i1 %204 to i32\n  %206 = load %struct.Matrix*, %struct.Matrix**...\n  %207 = getelementptr inbounds %struct.Matrix,...\n  store i32 %205, i32* %207, align 8\n  %208 = load %struct.Matrix*, %struct.Matrix**...\n  store %struct.Matrix* %208, %struct.Matrix** ...\n  br label %209\n"]
+    197 --> 209
+    209["Block 209:\n  %210 = load %struct.Matrix*, %struct.Matrix**...\n  ret %struct.Matrix* %210\n"]:::critical
+    classDef critical fill:#f96,stroke:#333,stroke-width:4px
+```
+```mermaid: insertNode
+graph TD
+    2["Block 2:\n  %3 = alloca %struct.Node*, align 8\n  %4 = alloca %struct.Node*, align 8\n  %5 = alloca i32, align 4\n  %6 = alloca %struct.Node*, align 8\n  %7 = alloca %struct.Node*, align 8\n  %8 = alloca %struct.Node*, align 8\n  %9 = alloca i32, align 4\n  store %struct.Node* %0, %struct.Node** %4, al...\n  store i32 %1, i32* %5, align 4\n  %10 = call noalias i8* @malloc(i64 32) #7\n  %11 = bitcast i8* %10 to %struct.Node*\n  store %struct.Node* %11, %struct.Node** %6, a...\n  %12 = load %struct.Node*, %struct.Node** %6, ...\n  %13 = icmp ne %struct.Node* %12, null\n  br i1 %13, label %16, label %14\n"]:::critical
+    2 -->|true| 16
+    2 -->|false| 14
+    14["Block 14:\n  call void @setErrorMessage(i8* getelementptr ...\n  %15 = load %struct.Node*, %struct.Node** %4, ...\n  store %struct.Node* %15, %struct.Node** %3, a...\n  br label %92\n"]
+    14 --> 92
+    16["Block 16:\n  %17 = load i32, i32* %5, align 4\n  %18 = load %struct.Node*, %struct.Node** %6, ...\n  %19 = getelementptr inbounds %struct.Node, %s...\n  store i32 %17, i32* %19, align 8\n  %20 = load %struct.Node*, %struct.Node** %6, ...\n  %21 = getelementptr inbounds %struct.Node, %s...\n  store %struct.Node* null, %struct.Node** %21,...\n  %22 = load %struct.Node*, %struct.Node** %6, ...\n  %23 = getelementptr inbounds %struct.Node, %s...\n  store %struct.Node* null, %struct.Node** %23,...\n  %24 = load %struct.Node*, %struct.Node** %6, ...\n  %25 = getelementptr inbounds %struct.Node, %s...\n  store i32 0, i32* %25, align 8\n  %26 = load %struct.Node*, %struct.Node** %4, ...\n  %27 = icmp ne %struct.Node* %26, null\n  br i1 %27, label %32, label %28\n"]
+    16 -->|true| 32
+    16 -->|false| 28
+    28["Block 28:\n  %29 = load %struct.Node*, %struct.Node** %6, ...\n  %30 = getelementptr inbounds %struct.Node, %s...\n  store i32 0, i32* %30, align 4\n  store i32 0, i32* @insertNode.maxDepth, align 4\n  %31 = load %struct.Node*, %struct.Node** %6, ...\n  store %struct.Node* %31, %struct.Node** %3, a...\n  br label %92\n"]
+    28 --> 92
+    32["Block 32:\n  %33 = load %struct.Node*, %struct.Node** %4, ...\n  store %struct.Node* %33, %struct.Node** %7, a...\n  store %struct.Node* null, %struct.Node** %8, ...\n  store i32 0, i32* %9, align 4\n  br label %34\n"]
+    32 --> 34
+    34["Block 34:\n  %35 = load %struct.Node*, %struct.Node** %7, ...\n  %36 = icmp ne %struct.Node* %35, null\n  br i1 %36, label %37, label %43\n"]
+    34 -->|true| 37
+    34 -->|false| 43
+    37["Block 37:\n  %38 = load %struct.Node*, %struct.Node** %7, ...\n  %39 = getelementptr inbounds %struct.Node, %s...\n  %40 = load i32, i32* %39, align 8\n  %41 = load i32, i32* %5, align 4\n  %42 = icmp slt i32 %40, %41\n  br label %43\n"]
+    37 --> 43
+    43["Block 43:\n  %44 = phi i1 [ false, %34 ], [ %42, %37 ]\n  br i1 %44, label %45, label %59\n"]
+    43 -->|true| 45
+    43 -->|false| 59
+    45["Block 45:\n  %46 = load %struct.Node*, %struct.Node** %7, ...\n  store %struct.Node* %46, %struct.Node** %8, a...\n  %47 = load %struct.Node*, %struct.Node** %7, ...\n  %48 = getelementptr inbounds %struct.Node, %s...\n  %49 = load %struct.Node*, %struct.Node** %48,...\n  store %struct.Node* %49, %struct.Node** %7, a...\n  %50 = load i32, i32* %9, align 4\n  %51 = add nsw i32 %50, 1\n  store i32 %51, i32* %9, align 4\n  %52 = load i32, i32* %9, align 4\n  %53 = icmp sgt i32 %52, 1000\n  br i1 %53, label %54, label %58\n"]
+    45 -->|true| 54
+    45 -->|false| 58
+    54["Block 54:\n  call void @setErrorMessage(i8* getelementptr ...\n  %55 = load %struct.Node*, %struct.Node** %6, ...\n  %56 = bitcast %struct.Node* %55 to i8*\n  call void @free(i8* %56) #7\n  %57 = load %struct.Node*, %struct.Node** %4, ...\n  store %struct.Node* %57, %struct.Node** %3, a...\n  br label %92\n"]
+    54 --> 92
+    58["Block 58:\n  br label %34\n"]
+    58 --> 34
+    59["Block 59:\n  %60 = load i32, i32* %9, align 4\n  %61 = load i32, i32* @insertNode.maxDepth, al...\n  %62 = icmp sgt i32 %60, %61\n  br i1 %62, label %63, label %65\n"]
+    59 -->|true| 63
+    59 -->|false| 65
+    63["Block 63:\n  %64 = load i32, i32* %9, align 4\n  store i32 %64, i32* @insertNode.maxDepth, ali...\n  br label %65\n"]
+    63 --> 65
+    65["Block 65:\n  %66 = load i32, i32* %9, align 4\n  %67 = load %struct.Node*, %struct.Node** %6, ...\n  %68 = getelementptr inbounds %struct.Node, %s...\n  store i32 %66, i32* %68, align 4\n  %69 = load %struct.Node*, %struct.Node** %7, ...\n  %70 = load %struct.Node*, %struct.Node** %6, ...\n  %71 = getelementptr inbounds %struct.Node, %s...\n  store %struct.Node* %69, %struct.Node** %71, ...\n  %72 = load %struct.Node*, %struct.Node** %8, ...\n  %73 = icmp ne %struct.Node* %72, null\n  br i1 %73, label %74, label %81\n"]
+    65 -->|true| 74
+    65 -->|false| 81
+    74["Block 74:\n  %75 = load %struct.Node*, %struct.Node** %6, ...\n  %76 = load %struct.Node*, %struct.Node** %8, ...\n  %77 = getelementptr inbounds %struct.Node, %s...\n  store %struct.Node* %75, %struct.Node** %77, ...\n  %78 = load %struct.Node*, %struct.Node** %8, ...\n  %79 = load %struct.Node*, %struct.Node** %6, ...\n  %80 = getelementptr inbounds %struct.Node, %s...\n  store %struct.Node* %78, %struct.Node** %80, ...\n  br label %83\n"]
+    74 --> 83
+    81["Block 81:\n  %82 = load %struct.Node*, %struct.Node** %6, ...\n  store %struct.Node* %82, %struct.Node** %3, a...\n  br label %92\n"]
+    81 --> 92
+    83["Block 83:\n  %84 = load %struct.Node*, %struct.Node** %7, ...\n  %85 = icmp ne %struct.Node* %84, null\n  br i1 %85, label %86, label %90\n"]
+    83 -->|true| 86
+    83 -->|false| 90
+    86["Block 86:\n  %87 = load %struct.Node*, %struct.Node** %6, ...\n  %88 = load %struct.Node*, %struct.Node** %7, ...\n  %89 = getelementptr inbounds %struct.Node, %s...\n  store %struct.Node* %87, %struct.Node** %89, ...\n  br label %90\n"]
+    86 --> 90
+    90["Block 90:\n  %91 = load %struct.Node*, %struct.Node** %4, ...\n  store %struct.Node* %91, %struct.Node** %3, a...\n  br label %92\n"]
+    90 --> 92
+    92["Block 92:\n  %93 = load %struct.Node*, %struct.Node** %3, ...\n  ret %struct.Node* %93\n"]:::critical
+    classDef critical fill:#f96,stroke:#333,stroke-width:4px
+```
+```mermaid: performSimpleCalculations
+graph TD
+    0["Block 0:\n  %1 = alloca i32, align 4\n  store i32 100, i32* %1, align 4\n  %2 = load i32, i32* %1, align 4\n  %3 = icmp sgt i32 %2, 50\n  br i1 %3, label %4, label %9\n"]:::critical
+    0 -->|true| 4
+    0 -->|false| 9
+    4["Block 4:\n  %5 = load i32, i32* %1, align 4\n  %6 = mul nsw i32 %5, 2\n  %7 = load i32, i32* @calculationResult, align 4\n  %8 = add nsw i32 %7, %6\n  store i32 %8, i32* @calculationResult, align 4\n  br label %14\n"]
+    4 --> 14
+    9["Block 9:\n  %10 = load i32, i32* %1, align 4\n  %11 = sdiv i32 %10, 2\n  %12 = load i32, i32* @calculationResult, align 4\n  %13 = add nsw i32 %12, %11\n  store i32 %13, i32* @calculationResult, align 4\n  br label %14\n"]
+    9 --> 14
+    14["Block 14:\n  %15 = load i32, i32* %1, align 4\n  %16 = srem i32 %15, 3\n  %17 = icmp eq i32 %16, 0\n  br i1 %17, label %18, label %21\n"]:::critical
+    14 -->|true| 18
+    14 -->|false| 21
+    18["Block 18:\n  %19 = load i32, i32* @calculationResult, align 4\n  %20 = mul nsw i32 %19, 3\n  store i32 %20, i32* @calculationResult, align 4\n  br label %24\n"]
+    18 --> 24
+    21["Block 21:\n  %22 = load i32, i32* @calculationResult, align 4\n  %23 = add nsw i32 %22, 3\n  store i32 %23, i32* @calculationResult, align 4\n  br label %24\n"]
+    21 --> 24
+    24["Block 24:\n  %25 = load i32, i32* @calculationResult, align 4\n  %26 = icmp sge i32 %25, 150\n  br i1 %26, label %27, label %33\n"]:::critical
+    24 -->|true| 27
+    24 -->|false| 33
+    27["Block 27:\n  %28 = load i32, i32* @calculationResult, align 4\n  %29 = icmp sle i32 %28, 300\n  br i1 %29, label %30, label %33\n"]
+    27 -->|true| 30
+    27 -->|false| 33
+    30["Block 30:\n  %31 = load i32, i32* @calculationResult, align 4\n  %32 = sub nsw i32 %31, 50\n  store i32 %32, i32* @calculationResult, align 4\n  br label %36\n"]
+    30 --> 36
+    33["Block 33:\n  %34 = load i32, i32* @calculationResult, align 4\n  %35 = add nsw i32 %34, 50\n  store i32 %35, i32* @calculationResult, align 4\n  br label %36\n"]
+    33 --> 36
+    36["Block 36:\n  %37 = load i32, i32* @calculationResult, align 4\n  %38 = srem i32 %37, 2\n  %39 = icmp eq i32 %38, 0\n  br i1 %39, label %40, label %43\n"]:::critical
+    36 -->|true| 40
+    36 -->|false| 43
+    40["Block 40:\n  %41 = load i32, i32* @calculationResult, align 4\n  %42 = sdiv i32 %41, 2\n  store i32 %42, i32* @calculationResult, align 4\n  br label %46\n"]
+    40 --> 46
+    43["Block 43:\n  %44 = load i32, i32* @calculationResult, align 4\n  %45 = mul nsw i32 %44, 2\n  store i32 %45, i32* @calculationResult, align 4\n  br label %46\n"]
+    43 --> 46
+    46["Block 46:\n  %47 = load i32, i32* @calculationResult, align 4\n  %48 = srem i32 %47, 10\n  %49 = icmp slt i32 %48, 5\n  br i1 %49, label %50, label %53\n"]:::critical
+    46 -->|true| 50
+    46 -->|false| 53
+    50["Block 50:\n  %51 = load i32, i32* @calculationResult, align 4\n  %52 = add nsw i32 %51, 5\n  store i32 %52, i32* @calculationResult, align 4\n  br label %56\n"]
+    50 --> 56
+    53["Block 53:\n  %54 = load i32, i32* @calculationResult, align 4\n  %55 = sub nsw i32 %54, 5\n  store i32 %55, i32* @calculationResult, align 4\n  br label %56\n"]
+    53 --> 56
+    56["Block 56:\n  %57 = load i32, i32* @calculationResult, align 4\n  %58 = icmp sgt i32 %57, 1000\n  br i1 %58, label %59, label %60\n"]:::critical
+    56 -->|true| 59
+    56 -->|false| 60
+    59["Block 59:\n  store i32 1000, i32* @calculationResult, align 4\n  br label %63\n"]
+    59 --> 63
+    60["Block 60:\n  %61 = load i32, i32* @calculationResult, align 4\n  %62 = add nsw i32 %61, 10\n  store i32 %62, i32* @calculationResult, align 4\n  br label %63\n"]
+    60 --> 63
+    63["Block 63:\n  %64 = load i32, i32* @calculationResult, align 4\n  %65 = call i32 (i8*, ...) @printf(i8* getelem...\n  ret void\n"]:::critical
+    classDef critical fill:#f96,stroke:#333,stroke-width:4px
+```
+```mermaid: projectA_main
+graph TD
+    0["Block 0:\n  %1 = alloca i32, align 4\n  %2 = alloca %struct.DynamicArray*, align 8\n  %3 = alloca i32, align 4\n  %4 = alloca %struct.Matrix*, align 8\n  %5 = alloca %struct.Matrix*, align 8\n  %6 = alloca i32, align 4\n  %7 = alloca i32, align 4\n  %8 = alloca %struct.Matrix*, align 8\n  %9 = alloca i32, align 4\n  %10 = alloca %struct.Node*, align 8\n  %11 = alloca i32, align 4\n  %12 = alloca i32, align 4\n  %13 = alloca %struct.Node*, align 8\n  %14 = alloca %struct.Node*, align 8\n  %15 = alloca i32, align 4\n  %16 = alloca %struct.Node*, align 8\n  %17 = alloca i32, align 4\n  %18 = alloca i32, align 4\n  %19 = alloca %struct.Node*, align 8\n  %20 = call i64 @time(i64* null) #7\n  %21 = trunc i64 %20 to i32\n  call void @srand(i32 %21) #7\n  %22 = call %struct.DynamicArray* @createDynam...\n  store %struct.DynamicArray* %22, %struct.Dyna...\n  %23 = load %struct.DynamicArray*, %struct.Dyn...\n  %24 = icmp ne %struct.DynamicArray* %23, null\n  br i1 %24, label %28, label %25\n"]:::critical
+    0 -->|true| 28
+    0 -->|false| 25
+    25["Block 25:\n  %26 = call i8* @getErrorMessage()\n  %27 = call i32 (i8*, ...) @printf(i8* getelem...\n  store i32 -1, i32* %1, align 4\n  br label %322\n"]
+    25 --> 322
+    28["Block 28:\n  store i32 0, i32* %3, align 4\n  br label %29\n"]
+    28 --> 29
+    29["Block 29:\n  %30 = load i32, i32* %3, align 4\n  %31 = icmp slt i32 %30, 15\n  br i1 %31, label %32, label %45\n"]
+    29 -->|true| 32
+    29 -->|false| 45
+    32["Block 32:\n  %33 = load %struct.DynamicArray*, %struct.Dyn...\n  %34 = call i32 @rand() #7\n  %35 = srem i32 %34, 100\n  call void @pushBack(%struct.DynamicArray* %33...\n  %36 = load i8*, i8** @globalErrorMessage, ali...\n  %37 = icmp ne i8* %36, null\n  br i1 %37, label %38, label %41\n"]
+    32 -->|true| 38
+    32 -->|false| 41
+    38["Block 38:\n  %39 = call i8* @getErrorMessage()\n  %40 = call i32 (i8*, ...) @printf(i8* getelem...\n  br label %45\n"]
+    38 --> 45
+    41["Block 41:\n  br label %42\n"]
+    41 --> 42
+    42["Block 42:\n  %43 = load i32, i32* %3, align 4\n  %44 = add nsw i32 %43, 1\n  store i32 %44, i32* %3, align 4\n  br label %29\n"]
+    42 --> 29
+    45["Block 45:\n  %46 = call %struct.Matrix* @createMatrix(i32 ...\n  store %struct.Matrix* %46, %struct.Matrix** %...\n  %47 = call %struct.Matrix* @createMatrix(i32 ...\n  store %struct.Matrix* %47, %struct.Matrix** %...\n  %48 = load %struct.Matrix*, %struct.Matrix** ...\n  %49 = icmp ne %struct.Matrix* %48, null\n  br i1 %49, label %50, label %53\n"]
+    45 -->|true| 50
+    45 -->|false| 53
+    50["Block 50:\n  %51 = load %struct.Matrix*, %struct.Matrix** ...\n  %52 = icmp ne %struct.Matrix* %51, null\n  br i1 %52, label %74, label %53\n"]
+    50 -->|true| 74
+    50 -->|false| 53
+    53["Block 53:\n  %54 = call i8* @getErrorMessage()\n  %55 = call i32 (i8*, ...) @printf(i8* getelem...\n  %56 = load %struct.Matrix*, %struct.Matrix** ...\n  %57 = icmp ne %struct.Matrix* %56, null\n  br i1 %57, label %58, label %61\n"]
+    53 -->|true| 58
+    53 -->|false| 61
+    58["Block 58:\n  %59 = load %struct.Matrix*, %struct.Matrix** ...\n  %60 = bitcast %struct.Matrix* %59 to i8*\n  call void @free(i8* %60) #7\n  br label %61\n"]
+    58 --> 61
+    61["Block 61:\n  %62 = load %struct.Matrix*, %struct.Matrix** ...\n  %63 = icmp ne %struct.Matrix* %62, null\n  br i1 %63, label %64, label %67\n"]
+    61 -->|true| 64
+    61 -->|false| 67
+    64["Block 64:\n  %65 = load %struct.Matrix*, %struct.Matrix** ...\n  %66 = bitcast %struct.Matrix* %65 to i8*\n  call void @free(i8* %66) #7\n  br label %67\n"]
+    64 --> 67
+    67["Block 67:\n  %68 = load %struct.DynamicArray*, %struct.Dyn...\n  %69 = getelementptr inbounds %struct.DynamicA...\n  %70 = load i32*, i32** %69, align 8\n  %71 = bitcast i32* %70 to i8*\n  call void @free(i8* %71) #7\n  %72 = load %struct.DynamicArray*, %struct.Dyn...\n  %73 = bitcast %struct.DynamicArray* %72 to i8*\n  call void @free(i8* %73) #7\n  store i32 -1, i32* %1, align 4\n  br label %322\n"]
+    67 --> 322
+    74["Block 74:\n  store i32 0, i32* %6, align 4\n  br label %75\n"]
+    74 --> 75
+    75["Block 75:\n  %76 = load i32, i32* %6, align 4\n  %77 = icmp slt i32 %76, 3\n  br i1 %77, label %78, label %114\n"]
+    75 -->|true| 78
+    75 -->|false| 114
+    78["Block 78:\n  store i32 0, i32* %7, align 4\n  br label %79\n"]
+    78 --> 79
+    79["Block 79:\n  %80 = load i32, i32* %7, align 4\n  %81 = icmp slt i32 %80, 3\n  br i1 %81, label %82, label %110\n"]
+    79 -->|true| 82
+    79 -->|false| 110
+    82["Block 82:\n  %83 = call i32 @rand() #7\n  %84 = srem i32 %83, 10\n  %85 = load %struct.Matrix*, %struct.Matrix** ...\n  %86 = getelementptr inbounds %struct.Matrix, ...\n  %87 = load i32**, i32*** %86, align 8\n  %88 = load i32, i32* %6, align 4\n  %89 = sext i32 %88 to i64\n  %90 = getelementptr inbounds i32*, i32** %87,...\n  %91 = load i32*, i32** %90, align 8\n  %92 = load i32, i32* %7, align 4\n  %93 = sext i32 %92 to i64\n  %94 = getelementptr inbounds i32, i32* %91, i...\n  store i32 %84, i32* %94, align 4\n  %95 = call i32 @rand() #7\n  %96 = srem i32 %95, 10\n  %97 = load %struct.Matrix*, %struct.Matrix** ...\n  %98 = getelementptr inbounds %struct.Matrix, ...\n  %99 = load i32**, i32*** %98, align 8\n  %100 = load i32, i32* %6, align 4\n  %101 = sext i32 %100 to i64\n  %102 = getelementptr inbounds i32*, i32** %99...\n  %103 = load i32*, i32** %102, align 8\n  %104 = load i32, i32* %7, align 4\n  %105 = sext i32 %104 to i64\n  %106 = getelementptr inbounds i32, i32* %103,...\n  store i32 %96, i32* %106, align 4\n  br label %107\n"]
+    82 --> 107
+    107["Block 107:\n  %108 = load i32, i32* %7, align 4\n  %109 = add nsw i32 %108, 1\n  store i32 %109, i32* %7, align 4\n  br label %79\n"]
+    107 --> 79
+    110["Block 110:\n  br label %111\n"]
+    110 --> 111
+    111["Block 111:\n  %112 = load i32, i32* %6, align 4\n  %113 = add nsw i32 %112, 1\n  store i32 %113, i32* %6, align 4\n  br label %75\n"]
+    111 --> 75
+    114["Block 114:\n  %115 = load %struct.Matrix*, %struct.Matrix**...\n  %116 = load %struct.Matrix*, %struct.Matrix**...\n  %117 = call %struct.Matrix* @multiplyMatrices...\n  store %struct.Matrix* %117, %struct.Matrix** ...\n  %118 = load %struct.Matrix*, %struct.Matrix**...\n  %119 = icmp ne %struct.Matrix* %118, null\n  br i1 %119, label %168, label %120\n"]
+    114 -->|true| 168
+    114 -->|false| 120
+    120["Block 120:\n  %121 = call i8* @getErrorMessage()\n  %122 = call i32 (i8*, ...) @printf(i8* getele...\n  store i32 0, i32* %9, align 4\n  br label %123\n"]
+    120 --> 123
+    123["Block 123:\n  %124 = load i32, i32* %9, align 4\n  %125 = load %struct.Matrix*, %struct.Matrix**...\n  %126 = getelementptr inbounds %struct.Matrix,...\n  %127 = load i32, i32* %126, align 8\n  %128 = icmp slt i32 %124, %127\n  br i1 %128, label %129, label %149\n"]
+    123 -->|true| 129
+    123 -->|false| 149
+    129["Block 129:\n  %130 = load %struct.Matrix*, %struct.Matrix**...\n  %131 = getelementptr inbounds %struct.Matrix,...\n  %132 = load i32**, i32*** %131, align 8\n  %133 = load i32, i32* %9, align 4\n  %134 = sext i32 %133 to i64\n  %135 = getelementptr inbounds i32*, i32** %13...\n  %136 = load i32*, i32** %135, align 8\n  %137 = bitcast i32* %136 to i8*\n  call void @free(i8* %137) #7\n  %138 = load %struct.Matrix*, %struct.Matrix**...\n  %139 = getelementptr inbounds %struct.Matrix,...\n  %140 = load i32**, i32*** %139, align 8\n  %141 = load i32, i32* %9, align 4\n  %142 = sext i32 %141 to i64\n  %143 = getelementptr inbounds i32*, i32** %14...\n  %144 = load i32*, i32** %143, align 8\n  %145 = bitcast i32* %144 to i8*\n  call void @free(i8* %145) #7\n  br label %146\n"]
+    129 --> 146
+    146["Block 146:\n  %147 = load i32, i32* %9, align 4\n  %148 = add nsw i32 %147, 1\n  store i32 %148, i32* %9, align 4\n  br label %123\n"]
+    146 --> 123
+    149["Block 149:\n  %150 = load %struct.Matrix*, %struct.Matrix**...\n  %151 = getelementptr inbounds %struct.Matrix,...\n  %152 = load i32**, i32*** %151, align 8\n  %153 = bitcast i32** %152 to i8*\n  call void @free(i8* %153) #7\n  %154 = load %struct.Matrix*, %struct.Matrix**...\n  %155 = getelementptr inbounds %struct.Matrix,...\n  %156 = load i32**, i32*** %155, align 8\n  %157 = bitcast i32** %156 to i8*\n  call void @free(i8* %157) #7\n  %158 = load %struct.Matrix*, %struct.Matrix**...\n  %159 = bitcast %struct.Matrix* %158 to i8*\n  call void @free(i8* %159) #7\n  %160 = load %struct.Matrix*, %struct.Matrix**...\n  %161 = bitcast %struct.Matrix* %160 to i8*\n  call void @free(i8* %161) #7\n  %162 = load %struct.DynamicArray*, %struct.Dy...\n  %163 = getelementptr inbounds %struct.Dynamic...\n  %164 = load i32*, i32** %163, align 8\n  %165 = bitcast i32* %164 to i8*\n  call void @free(i8* %165) #7\n  %166 = load %struct.DynamicArray*, %struct.Dy...\n  %167 = bitcast %struct.DynamicArray* %166 to i8*\n  call void @free(i8* %167) #7\n  store i32 -1, i32* %1, align 4\n  br label %322\n"]
+    149 --> 322
+    168["Block 168:\n  store %struct.Node* null, %struct.Node** %10,...\n  store i32 0, i32* %11, align 4\n  br label %169\n"]
+    168 --> 169
+    169["Block 169:\n  %170 = load i32, i32* %11, align 4\n  %171 = icmp slt i32 %170, 5\n  br i1 %171, label %172, label %186\n"]
+    169 -->|true| 172
+    169 -->|false| 186
+    172["Block 172:\n  %173 = load %struct.Node*, %struct.Node** %10...\n  %174 = call i32 @rand() #7\n  %175 = srem i32 %174, 50\n  %176 = call %struct.Node* @insertNode(%struct...\n  store %struct.Node* %176, %struct.Node** %10,...\n  %177 = load i8*, i8** @globalErrorMessage, al...\n  %178 = icmp ne i8* %177, null\n  br i1 %178, label %179, label %182\n"]
+    172 -->|true| 179
+    172 -->|false| 182
+    179["Block 179:\n  %180 = call i8* @getErrorMessage()\n  %181 = call i32 (i8*, ...) @printf(i8* getele...\n  br label %186\n"]
+    179 --> 186
+    182["Block 182:\n  br label %183\n"]
+    182 --> 183
+    183["Block 183:\n  %184 = load i32, i32* %11, align 4\n  %185 = add nsw i32 %184, 1\n  store i32 %185, i32* %11, align 4\n  br label %169\n"]
+    183 --> 169
+    186["Block 186:\n  %187 = load %struct.DynamicArray*, %struct.Dy...\n  %188 = getelementptr inbounds %struct.Dynamic...\n  %189 = load i32*, i32** %188, align 8\n  %190 = bitcast i32* %189 to i8*\n  call void @free(i8* %190) #7\n  %191 = load %struct.DynamicArray*, %struct.Dy...\n  %192 = bitcast %struct.DynamicArray* %191 to i8*\n  call void @free(i8* %192) #7\n  store i32 0, i32* %12, align 4\n  br label %193\n"]
+    186 --> 193
+    193["Block 193:\n  %194 = load i32, i32* %12, align 4\n  %195 = load %struct.Matrix*, %struct.Matrix**...\n  %196 = getelementptr inbounds %struct.Matrix,...\n  %197 = load i32, i32* %196, align 8\n  %198 = icmp slt i32 %194, %197\n  br i1 %198, label %199, label %227\n"]
+    193 -->|true| 199
+    193 -->|false| 227
+    199["Block 199:\n  %200 = load %struct.Matrix*, %struct.Matrix**...\n  %201 = getelementptr inbounds %struct.Matrix,...\n  %202 = load i32**, i32*** %201, align 8\n  %203 = load i32, i32* %12, align 4\n  %204 = sext i32 %203 to i64\n  %205 = getelementptr inbounds i32*, i32** %20...\n  %206 = load i32*, i32** %205, align 8\n  %207 = bitcast i32* %206 to i8*\n  call void @free(i8* %207) #7\n  %208 = load %struct.Matrix*, %struct.Matrix**...\n  %209 = getelementptr inbounds %struct.Matrix,...\n  %210 = load i32**, i32*** %209, align 8\n  %211 = load i32, i32* %12, align 4\n  %212 = sext i32 %211 to i64\n  %213 = getelementptr inbounds i32*, i32** %21...\n  %214 = load i32*, i32** %213, align 8\n  %215 = bitcast i32* %214 to i8*\n  call void @free(i8* %215) #7\n  %216 = load %struct.Matrix*, %struct.Matrix**...\n  %217 = getelementptr inbounds %struct.Matrix,...\n  %218 = load i32**, i32*** %217, align 8\n  %219 = load i32, i32* %12, align 4\n  %220 = sext i32 %219 to i64\n  %221 = getelementptr inbounds i32*, i32** %21...\n  %222 = load i32*, i32** %221, align 8\n  %223 = bitcast i32* %222 to i8*\n  call void @free(i8* %223) #7\n  br label %224\n"]
+    199 --> 224
+    224["Block 224:\n  %225 = load i32, i32* %12, align 4\n  %226 = add nsw i32 %225, 1\n  store i32 %226, i32* %12, align 4\n  br label %193\n"]
+    224 --> 193
+    227["Block 227:\n  %228 = load %struct.Matrix*, %struct.Matrix**...\n  %229 = getelementptr inbounds %struct.Matrix,...\n  %230 = load i32**, i32*** %229, align 8\n  %231 = bitcast i32** %230 to i8*\n  call void @free(i8* %231) #7\n  %232 = load %struct.Matrix*, %struct.Matrix**...\n  %233 = getelementptr inbounds %struct.Matrix,...\n  %234 = load i32**, i32*** %233, align 8\n  %235 = bitcast i32** %234 to i8*\n  call void @free(i8* %235) #7\n  %236 = load %struct.Matrix*, %struct.Matrix**...\n  %237 = getelementptr inbounds %struct.Matrix,...\n  %238 = load i32**, i32*** %237, align 8\n  %239 = bitcast i32** %238 to i8*\n  call void @free(i8* %239) #7\n  %240 = load %struct.Matrix*, %struct.Matrix**...\n  %241 = bitcast %struct.Matrix* %240 to i8*\n  call void @free(i8* %241) #7\n  %242 = load %struct.Matrix*, %struct.Matrix**...\n  %243 = bitcast %struct.Matrix* %242 to i8*\n  call void @free(i8* %243) #7\n  %244 = load %struct.Matrix*, %struct.Matrix**...\n  %245 = bitcast %struct.Matrix* %244 to i8*\n  call void @free(i8* %245) #7\n  %246 = load %struct.Node*, %struct.Node** %10...\n  %247 = icmp ne %struct.Node* %246, null\n  br i1 %247, label %248, label %316\n"]
+    227 -->|true| 248
+    227 -->|false| 316
+    248["Block 248:\n  %249 = load %struct.Node*, %struct.Node** %10...\n  store %struct.Node* %249, %struct.Node** %13,...\n  %250 = load %struct.Node*, %struct.Node** %10...\n  store %struct.Node* %250, %struct.Node** %14,...\n  store i32 0, i32* %15, align 4\n  br label %251\n"]
+    248 --> 251
+    251["Block 251:\n  %252 = load %struct.Node*, %struct.Node** %14...\n  %253 = icmp ne %struct.Node* %252, null\n  br i1 %253, label %254, label %259\n"]
+    251 -->|true| 254
+    251 -->|false| 259
+    254["Block 254:\n  %255 = load %struct.Node*, %struct.Node** %14...\n  %256 = getelementptr inbounds %struct.Node, %...\n  %257 = load %struct.Node*, %struct.Node** %25...\n  %258 = icmp ne %struct.Node* %257, null\n  br label %259\n"]
+    254 --> 259
+    259["Block 259:\n  %260 = phi i1 [ false, %251 ], [ %258, %254 ]\n  br i1 %260, label %261, label %275\n"]
+    259 -->|true| 261
+    259 -->|false| 275
+    261["Block 261:\n  %262 = load %struct.Node*, %struct.Node** %13...\n  %263 = getelementptr inbounds %struct.Node, %...\n  %264 = load %struct.Node*, %struct.Node** %26...\n  store %struct.Node* %264, %struct.Node** %13,...\n  %265 = load %struct.Node*, %struct.Node** %14...\n  %266 = getelementptr inbounds %struct.Node, %...\n  %267 = load %struct.Node*, %struct.Node** %26...\n  %268 = getelementptr inbounds %struct.Node, %...\n  %269 = load %struct.Node*, %struct.Node** %26...\n  store %struct.Node* %269, %struct.Node** %14,...\n  %270 = load %struct.Node*, %struct.Node** %13...\n  %271 = load %struct.Node*, %struct.Node** %14...\n  %272 = icmp eq %struct.Node* %270, %271\n  br i1 %272, label %273, label %274\n"]
+    261 -->|true| 273
+    261 -->|false| 274
+    273["Block 273:\n  store i32 1, i32* %15, align 4\n  br label %275\n"]
+    273 --> 275
+    274["Block 274:\n  br label %251\n"]
+    274 --> 251
+    275["Block 275:\n  %276 = load i32, i32* %15, align 4\n  %277 = icmp ne i32 %276, 0\n  br i1 %277, label %278, label %304\n"]
+    275 -->|true| 278
+    275 -->|false| 304
+    278["Block 278:\n  call void @setErrorMessage(i8* getelementptr ...\n  %279 = load %struct.Node*, %struct.Node** %10...\n  store %struct.Node* %279, %struct.Node** %16,...\n  store i32 1000, i32* %17, align 4\n  store i32 0, i32* %18, align 4\n  br label %280\n"]
+    278 --> 280
+    280["Block 280:\n  %281 = load %struct.Node*, %struct.Node** %16...\n  %282 = icmp ne %struct.Node* %281, null\n  br i1 %282, label %283, label %287\n"]
+    280 -->|true| 283
+    280 -->|false| 287
+    283["Block 283:\n  %284 = load i32, i32* %18, align 4\n  %285 = load i32, i32* %17, align 4\n  %286 = icmp slt i32 %284, %285\n  br label %287\n"]
+    283 --> 287
+    287["Block 287:\n  %288 = phi i1 [ false, %280 ], [ %286, %283 ]\n  br i1 %288, label %289, label %303\n"]
+    287 -->|true| 289
+    287 -->|false| 303
+    289["Block 289:\n  %290 = load %struct.Node*, %struct.Node** %16...\n  %291 = getelementptr inbounds %struct.Node, %...\n  %292 = load i32, i32* %291, align 8\n  %293 = icmp ne i32 %292, 0\n  br i1 %293, label %294, label %295\n"]
+    289 -->|true| 294
+    289 -->|false| 295
+    294["Block 294:\n  br label %303\n"]
+    294 --> 303
+    295["Block 295:\n  %296 = load %struct.Node*, %struct.Node** %16...\n  %297 = getelementptr inbounds %struct.Node, %...\n  store i32 1, i32* %297, align 8\n  %298 = load %struct.Node*, %struct.Node** %16...\n  %299 = getelementptr inbounds %struct.Node, %...\n  %300 = load %struct.Node*, %struct.Node** %29...\n  store %struct.Node* %300, %struct.Node** %16,...\n  %301 = load i32, i32* %18, align 4\n  %302 = add nsw i32 %301, 1\n  store i32 %302, i32* %18, align 4\n  br label %280\n"]
+    295 --> 280
+    303["Block 303:\n  br label %304\n"]
+    303 --> 304
+    304["Block 304:\n  br label %305\n"]
+    304 --> 305
+    305["Block 305:\n  %306 = load %struct.Node*, %struct.Node** %10...\n  %307 = icmp ne %struct.Node* %306, null\n  br i1 %307, label %308, label %315\n"]
+    305 -->|true| 308
+    305 -->|false| 315
+    308["Block 308:\n  %309 = load %struct.Node*, %struct.Node** %10...\n  store %struct.Node* %309, %struct.Node** %19,...\n  %310 = load %struct.Node*, %struct.Node** %10...\n  %311 = getelementptr inbounds %struct.Node, %...\n  %312 = load %struct.Node*, %struct.Node** %31...\n  store %struct.Node* %312, %struct.Node** %10,...\n  %313 = load %struct.Node*, %struct.Node** %19...\n  %314 = bitcast %struct.Node* %313 to i8*\n  call void @free(i8* %314) #7\n  br label %305\n"]
+    308 --> 305
+    315["Block 315:\n  br label %316\n"]
+    315 --> 316
+    316["Block 316:\n  %317 = load i8*, i8** @globalErrorMessage, al...\n  %318 = icmp ne i8* %317, null\n  br i1 %318, label %319, label %321\n"]
+    316 -->|true| 319
+    316 -->|false| 321
+    319["Block 319:\n  %320 = load i8*, i8** @globalErrorMessage, al...\n  call void @free(i8* %320) #7\n  br label %321\n"]
+    319 --> 321
+    321["Block 321:\n  call void @performSimpleCalculations()\n  store i32 0, i32* %1, align 4\n  br label %322\n"]
+    321 --> 322
+    322["Block 322:\n  %323 = load i32, i32* %1, align 4\n  ret i32 %323\n"]:::critical
+    classDef critical fill:#f96,stroke:#333,stroke-width:4px
+```
+```mermaid: calculateDistance
+graph TD
+    3["Block 3:\n  %4 = alloca double, align 8\n  %5 = alloca i32*, align 8\n  %6 = alloca double, align 8\n  %7 = alloca double, align 8\n  %8 = alloca double, align 8\n  store i32* %2, i32** %5, align 8\n  %9 = load i32*, i32** %5, align 8\n  store i32 0, i32* %9, align 4\n  %10 = getelementptr inbounds %struct.Point, %...\n  %11 = load double, double* %10, align 8\n  %12 = fcmp ole double %11, 0.000000e+00\n  br i1 %12, label %17, label %13\n"]:::critical
+    3 -->|true| 17
+    3 -->|false| 13
+    13["Block 13:\n  %14 = getelementptr inbounds %struct.Point, %...\n  %15 = load double, double* %14, align 8\n  %16 = fcmp ole double %15, 0.000000e+00\n  br i1 %16, label %17, label %19\n"]
+    13 -->|true| 17
+    13 -->|false| 19
+    17["Block 17:\n  %18 = load i32*, i32** %5, align 8\n  store i32 1, i32* %18, align 4\n  call void @setErrorMessage(i8* getelementptr ...\n  store double -1.000000e+00, double* %4, align 8\n  br label %101\n"]
+    17 --> 101
+    19["Block 19:\n  %20 = getelementptr inbounds %struct.Point, %...\n  %21 = load i32, i32* %20, align 8\n  %22 = call i32 @abs(i32 %21) #7\n  %23 = icmp sgt i32 %22, 1000\n  br i1 %23, label %39, label %24\n"]
+    19 -->|true| 39
+    19 -->|false| 24
+    24["Block 24:\n  %25 = getelementptr inbounds %struct.Point, %...\n  %26 = load i32, i32* %25, align 4\n  %27 = call i32 @abs(i32 %26) #7\n  %28 = icmp sgt i32 %27, 1000\n  br i1 %28, label %39, label %29\n"]
+    24 -->|true| 39
+    24 -->|false| 29
+    29["Block 29:\n  %30 = getelementptr inbounds %struct.Point, %...\n  %31 = load i32, i32* %30, align 8\n  %32 = call i32 @abs(i32 %31) #7\n  %33 = icmp sgt i32 %32, 1000\n  br i1 %33, label %39, label %34\n"]
+    29 -->|true| 39
+    29 -->|false| 34
+    34["Block 34:\n  %35 = getelementptr inbounds %struct.Point, %...\n  %36 = load i32, i32* %35, align 4\n  %37 = call i32 @abs(i32 %36) #7\n  %38 = icmp sgt i32 %37, 1000\n  br i1 %38, label %39, label %41\n"]
+    34 -->|true| 39
+    34 -->|false| 41
+    39["Block 39:\n  %40 = load i32*, i32** %5, align 8\n  store i32 3, i32* %40, align 4\n  call void @setErrorMessage(i8* getelementptr ...\n  store double -1.000000e+00, double* %4, align 8\n  br label %101\n"]
+    39 --> 101
+    41["Block 41:\n  %42 = getelementptr inbounds %struct.Point, %...\n  %43 = load i32, i32* %42, align 8\n  %44 = getelementptr inbounds %struct.Point, %...\n  %45 = load i32, i32* %44, align 8\n  %46 = sub nsw i32 %43, %45\n  %47 = sitofp i32 %46 to double\n  %48 = getelementptr inbounds %struct.Point, %...\n  %49 = load double, double* %48, align 8\n  %50 = getelementptr inbounds %struct.Point, %...\n  %51 = load double, double* %50, align 8\n  %52 = fdiv double %49, %51\n  %53 = call double @sqrt(double %52) #8\n  %54 = fmul double %47, %53\n  store double %54, double* %6, align 8\n  %55 = getelementptr inbounds %struct.Point, %...\n  %56 = load i32, i32* %55, align 4\n  %57 = getelementptr inbounds %struct.Point, %...\n  %58 = load i32, i32* %57, align 4\n  %59 = sub nsw i32 %56, %58\n  %60 = sitofp i32 %59 to double\n  %61 = getelementptr inbounds %struct.Point, %...\n  %62 = load double, double* %61, align 8\n  %63 = getelementptr inbounds %struct.Point, %...\n  %64 = load double, double* %63, align 8\n  %65 = fdiv double %62, %64\n  %66 = call double @sqrt(double %65) #8\n  %67 = fmul double %60, %66\n  store double %67, double* %7, align 8\n  %68 = load double, double* %6, align 8\n  %69 = call double @llvm.fabs.f64(double %68)\n  %70 = fcmp ogt double %69, 1.000000e+03\n  br i1 %70, label %75, label %71\n"]
+    41 -->|true| 75
+    41 -->|false| 71
+    71["Block 71:\n  %72 = load double, double* %7, align 8\n  %73 = call double @llvm.fabs.f64(double %72)\n  %74 = fcmp ogt double %73, 1.000000e+03\n  br i1 %74, label %75, label %77\n"]
+    71 -->|true| 75
+    71 -->|false| 77
+    75["Block 75:\n  %76 = load i32*, i32** %5, align 8\n  store i32 5, i32* %76, align 4\n  call void @setErrorMessage(i8* getelementptr ...\n  store double -1.000000e+00, double* %4, align 8\n  br label %101\n"]
+    75 --> 101
+    77["Block 77:\n  %78 = load double, double* %6, align 8\n  %79 = load double, double* %6, align 8\n  %80 = fmul double %78, %79\n  %81 = load double, double* %7, align 8\n  %82 = load double, double* %7, align 8\n  %83 = fmul double %81, %82\n  %84 = fadd double %80, %83\n  %85 = call double @sqrt(double %84) #8\n  store double %85, double* %8, align 8\n  %86 = load double, double* %8, align 8\n  %87 = fcmp uno double %86, %86\n  br i1 %87, label %97, label %88\n"]
+    77 -->|true| 97
+    77 -->|false| 88
+    88["Block 88:\n  %89 = load double, double* %8, align 8\n  %90 = call double @llvm.fabs.f64(double %89) #9\n  %91 = fcmp oeq double %90, 0x7FF0000000000000\n  %92 = bitcast double %89 to i64\n  %93 = icmp slt i64 %92, 0\n  %94 = select i1 %93, i32 -1, i32 1\n  %95 = select i1 %91, i32 %94, i32 0\n  %96 = icmp ne i32 %95, 0\n  br i1 %96, label %97, label %99\n"]
+    88 -->|true| 97
+    88 -->|false| 99
+    97["Block 97:\n  %98 = load i32*, i32** %5, align 8\n  store i32 8, i32* %98, align 4\n  call void @setErrorMessage(i8* getelementptr ...\n  store double -1.000000e+00, double* %4, align 8\n  br label %101\n"]
+    97 --> 101
+    99["Block 99:\n  %100 = load double, double* %8, align 8\n  store double %100, double* %4, align 8\n  br label %101\n"]
+    99 --> 101
+    101["Block 101:\n  %102 = load double, double* %4, align 8\n  ret double %102\n"]:::critical
+    classDef critical fill:#f96,stroke:#333,stroke-width:4px
+```
+```mermaid: calculateCircleArea
+graph TD
+    2["Block 2:\n  %3 = alloca double, align 8\n  %4 = alloca i32*, align 8\n  %5 = alloca double, align 8\n  store i32* %1, i32** %4, align 8\n  %6 = load i32*, i32** %4, align 8\n  store i32 0, i32* %6, align 4\n  %7 = getelementptr inbounds %struct.Circle, %...\n  %8 = load i32, i32* %7, align 8\n  %9 = icmp ne i32 %8, 0\n  br i1 %9, label %12, label %10\n"]:::critical
+    2 -->|true| 12
+    2 -->|false| 10
+    10["Block 10:\n  %11 = load i32*, i32** %4, align 8\n  store i32 1, i32* %11, align 4\n  call void @setErrorMessage(i8* getelementptr ...\n  store double -1.000000e+00, double* %3, align 8\n  br label %85\n"]
+    10 --> 85
+    12["Block 12:\n  %13 = getelementptr inbounds %struct.Circle, ...\n  %14 = load double, double* %13, align 8\n  %15 = fcmp ole double %14, 0.000000e+00\n  br i1 %15, label %16, label %18\n"]
+    12 -->|true| 16
+    12 -->|false| 18
+    16["Block 16:\n  %17 = load i32*, i32** %4, align 8\n  store i32 1, i32* %17, align 4\n  call void @setErrorMessage(i8* getelementptr ...\n  store double -1.000000e+00, double* %3, align 8\n  br label %85\n"]
+    16 --> 85
+    18["Block 18:\n  %19 = getelementptr inbounds %struct.Circle, ...\n  %20 = load double, double* %19, align 8\n  %21 = fcmp ogt double %20, 1.000000e+03\n  br i1 %21, label %22, label %24\n"]
+    18 -->|true| 22
+    18 -->|false| 24
+    22["Block 22:\n  %23 = load i32*, i32** %4, align 8\n  store i32 3, i32* %23, align 4\n  call void @setErrorMessage(i8* getelementptr ...\n  store double -1.000000e+00, double* %3, align 8\n  br label %85\n"]
+    22 --> 85
+    24["Block 24:\n  %25 = getelementptr inbounds %struct.Circle, ...\n  %26 = getelementptr inbounds %struct.Point, %...\n  %27 = load i32, i32* %26, align 8\n  %28 = call i32 @abs(i32 %27) #7\n  %29 = icmp sgt i32 %28, 1000\n  br i1 %29, label %36, label %30\n"]
+    24 -->|true| 36
+    24 -->|false| 30
+    30["Block 30:\n  %31 = getelementptr inbounds %struct.Circle, ...\n  %32 = getelementptr inbounds %struct.Point, %...\n  %33 = load i32, i32* %32, align 4\n  %34 = call i32 @abs(i32 %33) #7\n  %35 = icmp sgt i32 %34, 1000\n  br i1 %35, label %36, label %38\n"]
+    30 -->|true| 36
+    30 -->|false| 38
+    36["Block 36:\n  %37 = load i32*, i32** %4, align 8\n  store i32 3, i32* %37, align 4\n  call void @setErrorMessage(i8* getelementptr ...\n  store double -1.000000e+00, double* %3, align 8\n  br label %85\n"]
+    36 --> 85
+    38["Block 38:\n  %39 = getelementptr inbounds %struct.Circle, ...\n  %40 = load double, double* %39, align 8\n  %41 = fmul double 3.141590e+00, %40\n  %42 = getelementptr inbounds %struct.Circle, ...\n  %43 = load double, double* %42, align 8\n  %44 = fmul double %41, %43\n  store double %44, double* %5, align 8\n  %45 = load double, double* %5, align 8\n  %46 = fcmp uno double %45, %45\n  br i1 %46, label %56, label %47\n"]
+    38 -->|true| 56
+    38 -->|false| 47
+    47["Block 47:\n  %48 = load double, double* %5, align 8\n  %49 = call double @llvm.fabs.f64(double %48) #8\n  %50 = fcmp oeq double %49, 0x7FF0000000000000\n  %51 = bitcast double %48 to i64\n  %52 = icmp slt i64 %51, 0\n  %53 = select i1 %52, i32 -1, i32 1\n  %54 = select i1 %50, i32 %53, i32 0\n  %55 = icmp ne i32 %54, 0\n  br i1 %55, label %56, label %58\n"]
+    47 -->|true| 56
+    47 -->|false| 58
+    56["Block 56:\n  %57 = load i32*, i32** %4, align 8\n  store i32 5, i32* %57, align 4\n  call void @setErrorMessage(i8* getelementptr ...\n  store double -1.000000e+00, double* %3, align 8\n  br label %85\n"]
+    56 --> 85
+    58["Block 58:\n  %59 = getelementptr inbounds %struct.Circle, ...\n  %60 = getelementptr inbounds [256 x i8], [256...\n  %61 = call i32 @strcmp(i8* %60, i8* getelemen...\n  %62 = icmp eq i32 %61, 0\n  br i1 %62, label %63, label %65\n"]
+    58 -->|true| 63
+    58 -->|false| 65
+    63["Block 63:\n  %64 = load double, double* %5, align 8\n  store double %64, double* %3, align 8\n  br label %85\n"]
+    63 --> 85
+    65["Block 65:\n  %66 = getelementptr inbounds %struct.Circle, ...\n  %67 = getelementptr inbounds [256 x i8], [256...\n  %68 = call i32 @strcmp(i8* %67, i8* getelemen...\n  %69 = icmp eq i32 %68, 0\n  br i1 %69, label %70, label %83\n"]
+    65 -->|true| 70
+    65 -->|false| 83
+    70["Block 70:\n  %71 = getelementptr inbounds %struct.Circle, ...\n  %72 = getelementptr inbounds %struct.Point, %...\n  %73 = load double, double* %72, align 8\n  %74 = fcmp ole double %73, 0.000000e+00\n  br i1 %74, label %75, label %77\n"]
+    70 -->|true| 75
+    70 -->|false| 77
+    75["Block 75:\n  %76 = load i32*, i32** %4, align 8\n  store i32 1, i32* %76, align 4\n  call void @setErrorMessage(i8* getelementptr ...\n  store double -1.000000e+00, double* %3, align 8\n  br label %85\n"]
+    75 --> 85
+    77["Block 77:\n  %78 = load double, double* %5, align 8\n  %79 = getelementptr inbounds %struct.Circle, ...\n  %80 = getelementptr inbounds %struct.Point, %...\n  %81 = load double, double* %80, align 8\n  %82 = fmul double %78, %81\n  store double %82, double* %3, align 8\n  br label %85\n"]
+    77 --> 85
+    83["Block 83:\n  %84 = load i32*, i32** %4, align 8\n  store i32 1, i32* %84, align 4\n  call void @setErrorMessage(i8* getelementptr ...\n  store double -1.000000e+00, double* %3, align 8\n  br label %85\n"]
+    83 --> 85
+    85["Block 85:\n  %86 = load double, double* %3, align 8\n  ret double %86\n"]:::critical
+    classDef critical fill:#f96,stroke:#333,stroke-width:4px
+```
+```mermaid: validateMatrix
+graph TD
+    1["Block 1:\n  %2 = alloca i32, align 4\n  %3 = alloca %struct.Matrix*, align 8\n  %4 = alloca i32, align 4\n  store %struct.Matrix* %0, %struct.Matrix** %3...\n  %5 = load %struct.Matrix*, %struct.Matrix** %...\n  %6 = icmp ne %struct.Matrix* %5, null\n  br i1 %6, label %8, label %7\n"]:::critical
+    1 -->|true| 8
+    1 -->|false| 7
+    7["Block 7:\n  call void @setErrorMessage(i8* getelementptr ...\n  store i32 7, i32* %2, align 4\n  br label %72\n"]
+    7 --> 72
+    8["Block 8:\n  %9 = load %struct.Matrix*, %struct.Matrix** %...\n  %10 = getelementptr inbounds %struct.Matrix, ...\n  %11 = load i32**, i32*** %10, align 8\n  %12 = icmp ne i32** %11, null\n  br i1 %12, label %14, label %13\n"]
+    8 -->|true| 14
+    8 -->|false| 13
+    13["Block 13:\n  call void @setErrorMessage(i8* getelementptr ...\n  store i32 7, i32* %2, align 4\n  br label %72\n"]
+    13 --> 72
+    14["Block 14:\n  %15 = load %struct.Matrix*, %struct.Matrix** ...\n  %16 = getelementptr inbounds %struct.Matrix, ...\n  %17 = load i32, i32* %16, align 8\n  %18 = icmp slt i32 %17, 1\n  br i1 %18, label %24, label %19\n"]
+    14 -->|true| 24
+    14 -->|false| 19
+    19["Block 19:\n  %20 = load %struct.Matrix*, %struct.Matrix** ...\n  %21 = getelementptr inbounds %struct.Matrix, ...\n  %22 = load i32, i32* %21, align 4\n  %23 = icmp slt i32 %22, 1\n  br i1 %23, label %24, label %25\n"]
+    19 -->|true| 24
+    19 -->|false| 25
+    24["Block 24:\n  call void @setErrorMessage(i8* getelementptr ...\n  store i32 1, i32* %2, align 4\n  br label %72\n"]
+    24 --> 72
+    25["Block 25:\n  %26 = load %struct.Matrix*, %struct.Matrix** ...\n  %27 = getelementptr inbounds %struct.Matrix, ...\n  %28 = load i32, i32* %27, align 8\n  %29 = icmp sgt i32 %28, 100\n  br i1 %29, label %35, label %30\n"]
+    25 -->|true| 35
+    25 -->|false| 30
+    30["Block 30:\n  %31 = load %struct.Matrix*, %struct.Matrix** ...\n  %32 = getelementptr inbounds %struct.Matrix, ...\n  %33 = load i32, i32* %32, align 4\n  %34 = icmp sgt i32 %33, 100\n  br i1 %34, label %35, label %36\n"]
+    30 -->|true| 35
+    30 -->|false| 36
+    35["Block 35:\n  call void @setErrorMessage(i8* getelementptr ...\n  store i32 3, i32* %2, align 4\n  br label %72\n"]
+    35 --> 72
+    36["Block 36:\n  store i32 0, i32* %4, align 4\n  br label %37\n"]
+    36 --> 37
+    37["Block 37:\n  %38 = load i32, i32* %4, align 4\n  %39 = load %struct.Matrix*, %struct.Matrix** ...\n  %40 = getelementptr inbounds %struct.Matrix, ...\n  %41 = load i32, i32* %40, align 8\n  %42 = icmp slt i32 %38, %41\n  br i1 %42, label %43, label %57\n"]
+    37 -->|true| 43
+    37 -->|false| 57
+    43["Block 43:\n  %44 = load %struct.Matrix*, %struct.Matrix** ...\n  %45 = getelementptr inbounds %struct.Matrix, ...\n  %46 = load i32**, i32*** %45, align 8\n  %47 = load i32, i32* %4, align 4\n  %48 = sext i32 %47 to i64\n  %49 = getelementptr inbounds i32*, i32** %46,...\n  %50 = load i32*, i32** %49, align 8\n  %51 = icmp ne i32* %50, null\n  br i1 %51, label %53, label %52\n"]
+    43 -->|true| 53
+    43 -->|false| 52
+    52["Block 52:\n  call void @setErrorMessage(i8* getelementptr ...\n  store i32 7, i32* %2, align 4\n  br label %72\n"]
+    52 --> 72
+    53["Block 53:\n  br label %54\n"]
+    53 --> 54
+    54["Block 54:\n  %55 = load i32, i32* %4, align 4\n  %56 = add nsw i32 %55, 1\n  store i32 %56, i32* %4, align 4\n  br label %37\n"]
+    54 --> 37
+    57["Block 57:\n  %58 = load %struct.Matrix*, %struct.Matrix** ...\n  %59 = getelementptr inbounds %struct.Matrix, ...\n  %60 = load i32, i32* %59, align 8\n  %61 = load %struct.Matrix*, %struct.Matrix** ...\n  %62 = getelementptr inbounds %struct.Matrix, ...\n  %63 = load i32, i32* %62, align 4\n  %64 = icmp eq i32 %60, %63\n  %65 = zext i1 %64 to i32\n  %66 = load %struct.Matrix*, %struct.Matrix** ...\n  %67 = getelementptr inbounds %struct.Matrix, ...\n  %68 = load i32, i32* %67, align 8\n  %69 = icmp ne i32 %65, %68\n  br i1 %69, label %70, label %71\n"]
+    57 -->|true| 70
+    57 -->|false| 71
+    70["Block 70:\n  call void @setErrorMessage(i8* getelementptr ...\n  store i32 1, i32* %2, align 4\n  br label %72\n"]
+    70 --> 72
+    71["Block 71:\n  store i32 0, i32* %2, align 4\n  br label %72\n"]
+    71 --> 72
+    72["Block 72:\n  %73 = load i32, i32* %2, align 4\n  ret i32 %73\n"]:::critical
+    classDef critical fill:#f96,stroke:#333,stroke-width:4px
+```
+```mermaid: removeDuplicates
+graph TD
+    1["Block 1:\n  %2 = alloca %struct.DynamicArray*, align 8\n  %3 = alloca i32, align 4\n  %4 = alloca i32, align 4\n  %5 = alloca i32, align 4\n  store %struct.DynamicArray* %0, %struct.Dynam...\n  %6 = load %struct.DynamicArray*, %struct.Dyna...\n  %7 = icmp ne %struct.DynamicArray* %6, null\n  br i1 %7, label %8, label %13\n"]:::critical
+    1 -->|true| 8
+    1 -->|false| 13
+    8["Block 8:\n  %9 = load %struct.DynamicArray*, %struct.Dyna...\n  %10 = getelementptr inbounds %struct.DynamicA...\n  %11 = load i32*, i32** %10, align 8\n  %12 = icmp ne i32* %11, null\n  br i1 %12, label %14, label %13\n"]
+    8 -->|true| 14
+    8 -->|false| 13
+    13["Block 13:\n  call void @setErrorMessage(i8* getelementptr ...\n  br label %81\n"]
+    13 --> 81
+    14["Block 14:\n  %15 = load %struct.DynamicArray*, %struct.Dyn...\n  %16 = getelementptr inbounds %struct.DynamicA...\n  %17 = load i32, i32* %16, align 8\n  %18 = icmp sle i32 %17, 1\n  br i1 %18, label %19, label %20\n"]
+    14 -->|true| 19
+    14 -->|false| 20
+    19["Block 19:\n  br label %81\n"]
+    19 --> 81
+    20["Block 20:\n  store i32 0, i32* %3, align 4\n  %21 = load %struct.DynamicArray*, %struct.Dyn...\n  %22 = getelementptr inbounds %struct.DynamicA...\n  %23 = load i32*, i32** %22, align 8\n  %24 = load %struct.DynamicArray*, %struct.Dyn...\n  %25 = getelementptr inbounds %struct.DynamicA...\n  %26 = load i32, i32* %25, align 8\n  %27 = sub nsw i32 %26, 1\n  call void @quickSort(i32* %23, i32 0, i32 %27...\n  %28 = load i32, i32* %3, align 4\n  %29 = icmp ne i32 %28, 0\n  br i1 %29, label %30, label %31\n"]
+    20 -->|true| 30
+    20 -->|false| 31
+    30["Block 30:\n  br label %81\n"]
+    30 --> 81
+    31["Block 31:\n  store i32 1, i32* %4, align 4\n  store i32 1, i32* %5, align 4\n  br label %32\n"]
+    31 --> 32
+    32["Block 32:\n  %33 = load i32, i32* %5, align 4\n  %34 = load %struct.DynamicArray*, %struct.Dyn...\n  %35 = getelementptr inbounds %struct.DynamicA...\n  %36 = load i32, i32* %35, align 8\n  %37 = icmp slt i32 %33, %36\n  br i1 %37, label %38, label %75\n"]
+    32 -->|true| 38
+    32 -->|false| 75
+    38["Block 38:\n  %39 = load %struct.DynamicArray*, %struct.Dyn...\n  %40 = getelementptr inbounds %struct.DynamicA...\n  %41 = load i32*, i32** %40, align 8\n  %42 = load i32, i32* %5, align 4\n  %43 = sext i32 %42 to i64\n  %44 = getelementptr inbounds i32, i32* %41, i...\n  %45 = load i32, i32* %44, align 4\n  %46 = load %struct.DynamicArray*, %struct.Dyn...\n  %47 = getelementptr inbounds %struct.DynamicA...\n  %48 = load i32*, i32** %47, align 8\n  %49 = load i32, i32* %5, align 4\n  %50 = sub nsw i32 %49, 1\n  %51 = sext i32 %50 to i64\n  %52 = getelementptr inbounds i32, i32* %48, i...\n  %53 = load i32, i32* %52, align 4\n  %54 = icmp ne i32 %45, %53\n  br i1 %54, label %55, label %71\n"]
+    38 -->|true| 55
+    38 -->|false| 71
+    55["Block 55:\n  %56 = load %struct.DynamicArray*, %struct.Dyn...\n  %57 = getelementptr inbounds %struct.DynamicA...\n  %58 = load i32*, i32** %57, align 8\n  %59 = load i32, i32* %5, align 4\n  %60 = sext i32 %59 to i64\n  %61 = getelementptr inbounds i32, i32* %58, i...\n  %62 = load i32, i32* %61, align 4\n  %63 = load %struct.DynamicArray*, %struct.Dyn...\n  %64 = getelementptr inbounds %struct.DynamicA...\n  %65 = load i32*, i32** %64, align 8\n  %66 = load i32, i32* %4, align 4\n  %67 = sext i32 %66 to i64\n  %68 = getelementptr inbounds i32, i32* %65, i...\n  store i32 %62, i32* %68, align 4\n  %69 = load i32, i32* %4, align 4\n  %70 = add nsw i32 %69, 1\n  store i32 %70, i32* %4, align 4\n  br label %71\n"]
+    55 --> 71
+    71["Block 71:\n  br label %72\n"]
+    71 --> 72
+    72["Block 72:\n  %73 = load i32, i32* %5, align 4\n  %74 = add nsw i32 %73, 1\n  store i32 %74, i32* %5, align 4\n  br label %32\n"]
+    72 --> 32
+    75["Block 75:\n  %76 = load i32, i32* %4, align 4\n  %77 = load %struct.DynamicArray*, %struct.Dyn...\n  %78 = getelementptr inbounds %struct.DynamicA...\n  store i32 %76, i32* %78, align 8\n  %79 = load %struct.DynamicArray*, %struct.Dyn...\n  %80 = getelementptr inbounds %struct.DynamicA...\n  store i32 1, i32* %80, align 8\n  br label %81\n"]
+    75 --> 81
+    81["Block 81:\n  ret void\n"]:::critical
+    classDef critical fill:#f96,stroke:#333,stroke-width:4px
+```
+```mermaid: findCentroid
+graph TD
+    3["Block 3:\n  %4 = alloca %struct.Point*, align 8\n  %5 = alloca %struct.Point*, align 8\n  %6 = alloca i32, align 4\n  %7 = alloca i32*, align 8\n  %8 = alloca %struct.Point*, align 8\n  %9 = alloca double, align 8\n  %10 = alloca double, align 8\n  %11 = alloca double, align 8\n  %12 = alloca i32, align 4\n  store %struct.Point* %0, %struct.Point** %5, ...\n  store i32 %1, i32* %6, align 4\n  store i32* %2, i32** %7, align 8\n  %13 = load i32*, i32** %7, align 8\n  store i32 0, i32* %13, align 4\n  %14 = load %struct.Point*, %struct.Point** %5...\n  %15 = icmp ne %struct.Point* %14, null\n  br i1 %15, label %16, label %19\n"]:::critical
+    3 -->|true| 16
+    3 -->|false| 19
+    16["Block 16:\n  %17 = load i32, i32* %6, align 4\n  %18 = icmp sle i32 %17, 0\n  br i1 %18, label %19, label %21\n"]
+    16 -->|true| 19
+    16 -->|false| 21
+    19["Block 19:\n  %20 = load i32*, i32** %7, align 8\n  store i32 1, i32* %20, align 4\n  call void @setErrorMessage(i8* getelementptr ...\n  store %struct.Point* null, %struct.Point** %4...\n  br label %165\n"]
+    19 --> 165
+    21["Block 21:\n  %22 = load i32, i32* %6, align 4\n  %23 = icmp sgt i32 %22, 1000\n  br i1 %23, label %24, label %26\n"]
+    21 -->|true| 24
+    21 -->|false| 26
+    24["Block 24:\n  %25 = load i32*, i32** %7, align 8\n  store i32 3, i32* %25, align 4\n  call void @setErrorMessage(i8* getelementptr ...\n  store %struct.Point* null, %struct.Point** %4...\n  br label %165\n"]
+    24 --> 165
+    26["Block 26:\n  %27 = call noalias i8* @malloc(i64 272) #7\n  %28 = bitcast i8* %27 to %struct.Point*\n  store %struct.Point* %28, %struct.Point** %8,...\n  %29 = load %struct.Point*, %struct.Point** %8...\n  %30 = icmp ne %struct.Point* %29, null\n  br i1 %30, label %33, label %31\n"]
+    26 -->|true| 33
+    26 -->|false| 31
+    31["Block 31:\n  %32 = load i32*, i32** %7, align 8\n  store i32 2, i32* %32, align 4\n  call void @setErrorMessage(i8* getelementptr ...\n  store %struct.Point* null, %struct.Point** %4...\n  br label %165\n"]
+    31 --> 165
+    33["Block 33:\n  store double 0.000000e+00, double* %9, align 8\n  store double 0.000000e+00, double* %10, align 8\n  store double 0.000000e+00, double* %11, align 8\n  store i32 0, i32* %12, align 4\n  br label %34\n"]
+    33 --> 34
+    34["Block 34:\n  %35 = load i32, i32* %12, align 4\n  %36 = load i32, i32* %6, align 4\n  %37 = icmp slt i32 %35, %36\n  br i1 %37, label %38, label %134\n"]
+    34 -->|true| 38
+    34 -->|false| 134
+    38["Block 38:\n  %39 = load %struct.Point*, %struct.Point** %5...\n  %40 = load i32, i32* %12, align 4\n  %41 = sext i32 %40 to i64\n  %42 = getelementptr inbounds %struct.Point, %...\n  %43 = getelementptr inbounds %struct.Point, %...\n  %44 = load double, double* %43, align 8\n  %45 = fcmp ole double %44, 0.000000e+00\n  br i1 %45, label %46, label %50\n"]
+    38 -->|true| 46
+    38 -->|false| 50
+    46["Block 46:\n  %47 = load i32*, i32** %7, align 8\n  store i32 1, i32* %47, align 4\n  call void @setErrorMessage(i8* getelementptr ...\n  %48 = load %struct.Point*, %struct.Point** %8...\n  %49 = bitcast %struct.Point* %48 to i8*\n  call void @free(i8* %49) #7\n  store %struct.Point* null, %struct.Point** %4...\n  br label %165\n"]
+    46 --> 165
+    50["Block 50:\n  %51 = load %struct.Point*, %struct.Point** %5...\n  %52 = load i32, i32* %12, align 4\n  %53 = sext i32 %52 to i64\n  %54 = getelementptr inbounds %struct.Point, %...\n  %55 = getelementptr inbounds %struct.Point, %...\n  %56 = load double, double* %55, align 8\n  %57 = load double, double* %9, align 8\n  %58 = fadd double %57, %56\n  store double %58, double* %9, align 8\n  %59 = load %struct.Point*, %struct.Point** %5...\n  %60 = load i32, i32* %12, align 4\n  %61 = sext i32 %60 to i64\n  %62 = getelementptr inbounds %struct.Point, %...\n  %63 = getelementptr inbounds %struct.Point, %...\n  %64 = load i32, i32* %63, align 8\n  %65 = sitofp i32 %64 to double\n  %66 = load %struct.Point*, %struct.Point** %5...\n  %67 = load i32, i32* %12, align 4\n  %68 = sext i32 %67 to i64\n  %69 = getelementptr inbounds %struct.Point, %...\n  %70 = getelementptr inbounds %struct.Point, %...\n  %71 = load double, double* %70, align 8\n  %72 = fmul double %65, %71\n  %73 = load double, double* %10, align 8\n  %74 = fadd double %73, %72\n  store double %74, double* %10, align 8\n  %75 = load %struct.Point*, %struct.Point** %5...\n  %76 = load i32, i32* %12, align 4\n  %77 = sext i32 %76 to i64\n  %78 = getelementptr inbounds %struct.Point, %...\n  %79 = getelementptr inbounds %struct.Point, %...\n  %80 = load i32, i32* %79, align 4\n  %81 = sitofp i32 %80 to double\n  %82 = load %struct.Point*, %struct.Point** %5...\n  %83 = load i32, i32* %12, align 4\n  %84 = sext i32 %83 to i64\n  %85 = getelementptr inbounds %struct.Point, %...\n  %86 = getelementptr inbounds %struct.Point, %...\n  %87 = load double, double* %86, align 8\n  %88 = fmul double %81, %87\n  %89 = load double, double* %11, align 8\n  %90 = fadd double %89, %88\n  store double %90, double* %11, align 8\n  %91 = load double, double* %9, align 8\n  %92 = fcmp uno double %91, %91\n  br i1 %92, label %126, label %93\n"]
+    50 -->|true| 126
+    50 -->|false| 93
+    93["Block 93:\n  %94 = load double, double* %10, align 8\n  %95 = fcmp uno double %94, %94\n  br i1 %95, label %126, label %96\n"]
+    93 -->|true| 126
+    93 -->|false| 96
+    96["Block 96:\n  %97 = load double, double* %11, align 8\n  %98 = fcmp uno double %97, %97\n  br i1 %98, label %126, label %99\n"]
+    96 -->|true| 126
+    96 -->|false| 99
+    99["Block 99:\n  %100 = load double, double* %9, align 8\n  %101 = call double @llvm.fabs.f64(double %100...\n  %102 = fcmp oeq double %101, 0x7FF0000000000000\n  %103 = bitcast double %100 to i64\n  %104 = icmp slt i64 %103, 0\n  %105 = select i1 %104, i32 -1, i32 1\n  %106 = select i1 %102, i32 %105, i32 0\n  %107 = icmp ne i32 %106, 0\n  br i1 %107, label %126, label %108\n"]
+    99 -->|true| 126
+    99 -->|false| 108
+    108["Block 108:\n  %109 = load double, double* %10, align 8\n  %110 = call double @llvm.fabs.f64(double %109...\n  %111 = fcmp oeq double %110, 0x7FF0000000000000\n  %112 = bitcast double %109 to i64\n  %113 = icmp slt i64 %112, 0\n  %114 = select i1 %113, i32 -1, i32 1\n  %115 = select i1 %111, i32 %114, i32 0\n  %116 = icmp ne i32 %115, 0\n  br i1 %116, label %126, label %117\n"]
+    108 -->|true| 126
+    108 -->|false| 117
+    117["Block 117:\n  %118 = load double, double* %11, align 8\n  %119 = call double @llvm.fabs.f64(double %118...\n  %120 = fcmp oeq double %119, 0x7FF0000000000000\n  %121 = bitcast double %118 to i64\n  %122 = icmp slt i64 %121, 0\n  %123 = select i1 %122, i32 -1, i32 1\n  %124 = select i1 %120, i32 %123, i32 0\n  %125 = icmp ne i32 %124, 0\n  br i1 %125, label %126, label %130\n"]
+    117 -->|true| 126
+    117 -->|false| 130
+    126["Block 126:\n  %127 = load i32*, i32** %7, align 8\n  store i32 5, i32* %127, align 4\n  call void @setErrorMessage(i8* getelementptr ...\n  %128 = load %struct.Point*, %struct.Point** %...\n  %129 = bitcast %struct.Point* %128 to i8*\n  call void @free(i8* %129) #7\n  store %struct.Point* null, %struct.Point** %4...\n  br label %165\n"]
+    126 --> 165
+    130["Block 130:\n  br label %131\n"]
+    130 --> 131
+    131["Block 131:\n  %132 = load i32, i32* %12, align 4\n  %133 = add nsw i32 %132, 1\n  store i32 %133, i32* %12, align 4\n  br label %34\n"]
+    131 --> 34
+    134["Block 134:\n  %135 = load double, double* %9, align 8\n  %136 = fcmp oeq double %135, 0.000000e+00\n  br i1 %136, label %137, label %141\n"]
+    134 -->|true| 137
+    134 -->|false| 141
+    137["Block 137:\n  %138 = load i32*, i32** %7, align 8\n  store i32 1, i32* %138, align 4\n  call void @setErrorMessage(i8* getelementptr ...\n  %139 = load %struct.Point*, %struct.Point** %...\n  %140 = bitcast %struct.Point* %139 to i8*\n  call void @free(i8* %140) #7\n  store %struct.Point* null, %struct.Point** %4...\n  br label %165\n"]
+    137 --> 165
+    141["Block 141:\n  %142 = load double, double* %10, align 8\n  %143 = load double, double* %9, align 8\n  %144 = fdiv double %142, %143\n  %145 = fptosi double %144 to i32\n  %146 = load %struct.Point*, %struct.Point** %...\n  %147 = getelementptr inbounds %struct.Point, ...\n  store i32 %145, i32* %147, align 8\n  %148 = load double, double* %11, align 8\n  %149 = load double, double* %9, align 8\n  %150 = fdiv double %148, %149\n  %151 = fptosi double %150 to i32\n  %152 = load %struct.Point*, %struct.Point** %...\n  %153 = getelementptr inbounds %struct.Point, ...\n  store i32 %151, i32* %153, align 4\n  %154 = load double, double* %9, align 8\n  %155 = load i32, i32* %6, align 4\n  %156 = sitofp i32 %155 to double\n  %157 = fdiv double %154, %156\n  %158 = load %struct.Point*, %struct.Point** %...\n  %159 = getelementptr inbounds %struct.Point, ...\n  store double %157, double* %159, align 8\n  %160 = load %struct.Point*, %struct.Point** %...\n  %161 = getelementptr inbounds %struct.Point, ...\n  %162 = getelementptr inbounds [256 x i8], [25...\n  %163 = call i8* @strcpy(i8* %162, i8* getelem...\n  %164 = load %struct.Point*, %struct.Point** %...\n  store %struct.Point* %164, %struct.Point** %4...\n  br label %165\n"]
+    141 --> 165
+    165["Block 165:\n  %166 = load %struct.Point*, %struct.Point** %...\n  ret %struct.Point* %166\n"]:::critical
+    classDef critical fill:#f96,stroke:#333,stroke-width:4px
+```
+```mermaid: reverseString
+graph TD
+    1["Block 1:\n  %2 = alloca i8*, align 8\n  %3 = alloca i32, align 4\n  %4 = alloca i32, align 4\n  %5 = alloca i8, align 1\n  store i8* %0, i8** %2, align 8\n  %6 = load i8*, i8** %2, align 8\n  %7 = call i64 @strlen(i8* %6) #7\n  %8 = trunc i64 %7 to i32\n  store i32 %8, i32* %3, align 4\n  store i32 0, i32* %4, align 4\n  br label %9\n"]:::critical
+    1 --> 9
+    9["Block 9:\n  %10 = load i32, i32* %4, align 4\n  %11 = load i32, i32* %3, align 4\n  %12 = sdiv i32 %11, 2\n  %13 = icmp slt i32 %10, %12\n  br i1 %13, label %14, label %43\n"]:::critical
+    9 -->|true| 14
+    9 -->|false| 43
+    14["Block 14:\n  %15 = load i8*, i8** %2, align 8\n  %16 = load i32, i32* %4, align 4\n  %17 = sext i32 %16 to i64\n  %18 = getelementptr inbounds i8, i8* %15, i64...\n  %19 = load i8, i8* %18, align 1\n  store i8 %19, i8* %5, align 1\n  %20 = load i8*, i8** %2, align 8\n  %21 = load i32, i32* %3, align 4\n  %22 = sub nsw i32 %21, 1\n  %23 = load i32, i32* %4, align 4\n  %24 = sub nsw i32 %22, %23\n  %25 = sext i32 %24 to i64\n  %26 = getelementptr inbounds i8, i8* %20, i64...\n  %27 = load i8, i8* %26, align 1\n  %28 = load i8*, i8** %2, align 8\n  %29 = load i32, i32* %4, align 4\n  %30 = sext i32 %29 to i64\n  %31 = getelementptr inbounds i8, i8* %28, i64...\n  store i8 %27, i8* %31, align 1\n  %32 = load i8, i8* %5, align 1\n  %33 = load i8*, i8** %2, align 8\n  %34 = load i32, i32* %3, align 4\n  %35 = sub nsw i32 %34, 1\n  %36 = load i32, i32* %4, align 4\n  %37 = sub nsw i32 %35, %36\n  %38 = sext i32 %37 to i64\n  %39 = getelementptr inbounds i8, i8* %33, i64...\n  store i8 %32, i8* %39, align 1\n  br label %40\n"]
+    14 --> 40
+    40["Block 40:\n  %41 = load i32, i32* %4, align 4\n  %42 = add nsw i32 %41, 1\n  store i32 %42, i32* %4, align 4\n  br label %9\n"]
+    40 --> 9
+    43["Block 43:\n  ret void\n"]:::critical
+    classDef critical fill:#f96,stroke:#333,stroke-width:4px
+```
+```mermaid: longestIncreasingSubsequence
+graph TD
+    2["Block 2:\n  %3 = alloca i32*, align 8\n  %4 = alloca i32, align 4\n  %5 = alloca [100 x i32], align 16\n  %6 = alloca i32, align 4\n  %7 = alloca i32, align 4\n  %8 = alloca i32, align 4\n  %9 = alloca i32, align 4\n  %10 = alloca i32, align 4\n  store i32* %0, i32** %3, align 8\n  store i32 %1, i32* %4, align 4\n  store i32 0, i32* %6, align 4\n  br label %11\n"]:::critical
+    2 --> 11
+    11["Block 11:\n  %12 = load i32, i32* %6, align 4\n  %13 = load i32, i32* %4, align 4\n  %14 = icmp slt i32 %12, %13\n  br i1 %14, label %15, label %22\n"]:::critical
+    11 -->|true| 15
+    11 -->|false| 22
+    15["Block 15:\n  %16 = load i32, i32* %6, align 4\n  %17 = sext i32 %16 to i64\n  %18 = getelementptr inbounds [100 x i32], [10...\n  store i32 1, i32* %18, align 4\n  br label %19\n"]
+    15 --> 19
+    19["Block 19:\n  %20 = load i32, i32* %6, align 4\n  %21 = add nsw i32 %20, 1\n  store i32 %21, i32* %6, align 4\n  br label %11\n"]
+    19 --> 11
+    22["Block 22:\n  store i32 1, i32* %7, align 4\n  br label %23\n"]:::critical
+    22 --> 23
+    23["Block 23:\n  %24 = load i32, i32* %7, align 4\n  %25 = load i32, i32* %4, align 4\n  %26 = icmp slt i32 %24, %25\n  br i1 %26, label %27, label %72\n"]:::critical
+    23 -->|true| 27
+    23 -->|false| 72
+    27["Block 27:\n  store i32 0, i32* %8, align 4\n  br label %28\n"]
+    27 --> 28
+    28["Block 28:\n  %29 = load i32, i32* %8, align 4\n  %30 = load i32, i32* %7, align 4\n  %31 = icmp slt i32 %29, %30\n  br i1 %31, label %32, label %68\n"]
+    28 -->|true| 32
+    28 -->|false| 68
+    32["Block 32:\n  %33 = load i32*, i32** %3, align 8\n  %34 = load i32, i32* %7, align 4\n  %35 = sext i32 %34 to i64\n  %36 = getelementptr inbounds i32, i32* %33, i...\n  %37 = load i32, i32* %36, align 4\n  %38 = load i32*, i32** %3, align 8\n  %39 = load i32, i32* %8, align 4\n  %40 = sext i32 %39 to i64\n  %41 = getelementptr inbounds i32, i32* %38, i...\n  %42 = load i32, i32* %41, align 4\n  %43 = icmp sgt i32 %37, %42\n  br i1 %43, label %44, label %64\n"]
+    32 -->|true| 44
+    32 -->|false| 64
+    44["Block 44:\n  %45 = load i32, i32* %7, align 4\n  %46 = sext i32 %45 to i64\n  %47 = getelementptr inbounds [100 x i32], [10...\n  %48 = load i32, i32* %47, align 4\n  %49 = load i32, i32* %8, align 4\n  %50 = sext i32 %49 to i64\n  %51 = getelementptr inbounds [100 x i32], [10...\n  %52 = load i32, i32* %51, align 4\n  %53 = add nsw i32 %52, 1\n  %54 = icmp slt i32 %48, %53\n  br i1 %54, label %55, label %64\n"]
+    44 -->|true| 55
+    44 -->|false| 64
+    55["Block 55:\n  %56 = load i32, i32* %8, align 4\n  %57 = sext i32 %56 to i64\n  %58 = getelementptr inbounds [100 x i32], [10...\n  %59 = load i32, i32* %58, align 4\n  %60 = add nsw i32 %59, 1\n  %61 = load i32, i32* %7, align 4\n  %62 = sext i32 %61 to i64\n  %63 = getelementptr inbounds [100 x i32], [10...\n  store i32 %60, i32* %63, align 4\n  br label %64\n"]
+    55 --> 64
+    64["Block 64:\n  br label %65\n"]
+    64 --> 65
+    65["Block 65:\n  %66 = load i32, i32* %8, align 4\n  %67 = add nsw i32 %66, 1\n  store i32 %67, i32* %8, align 4\n  br label %28\n"]
+    65 --> 28
+    68["Block 68:\n  br label %69\n"]
+    68 --> 69
+    69["Block 69:\n  %70 = load i32, i32* %7, align 4\n  %71 = add nsw i32 %70, 1\n  store i32 %71, i32* %7, align 4\n  br label %23\n"]
+    69 --> 23
+    72["Block 72:\n  store i32 0, i32* %9, align 4\n  store i32 0, i32* %10, align 4\n  br label %73\n"]:::critical
+    72 --> 73
+    73["Block 73:\n  %74 = load i32, i32* %10, align 4\n  %75 = load i32, i32* %4, align 4\n  %76 = icmp slt i32 %74, %75\n  br i1 %76, label %77, label %93\n"]:::critical
+    73 -->|true| 77
+    73 -->|false| 93
+    77["Block 77:\n  %78 = load i32, i32* %9, align 4\n  %79 = load i32, i32* %10, align 4\n  %80 = sext i32 %79 to i64\n  %81 = getelementptr inbounds [100 x i32], [10...\n  %82 = load i32, i32* %81, align 4\n  %83 = icmp slt i32 %78, %82\n  br i1 %83, label %84, label %89\n"]
+    77 -->|true| 84
+    77 -->|false| 89
+    84["Block 84:\n  %85 = load i32, i32* %10, align 4\n  %86 = sext i32 %85 to i64\n  %87 = getelementptr inbounds [100 x i32], [10...\n  %88 = load i32, i32* %87, align 4\n  store i32 %88, i32* %9, align 4\n  br label %89\n"]
+    84 --> 89
+    89["Block 89:\n  br label %90\n"]
+    89 --> 90
+    90["Block 90:\n  %91 = load i32, i32* %10, align 4\n  %92 = add nsw i32 %91, 1\n  store i32 %92, i32* %10, align 4\n  br label %73\n"]
+    90 --> 73
+    93["Block 93:\n  %94 = load i32, i32* %9, align 4\n  ret i32 %94\n"]:::critical
+    classDef critical fill:#f96,stroke:#333,stroke-width:4px
+```
+```mermaid: testPoints
+graph TD
+    1["Block 1:\n  %2 = alloca i32, align 4\n  %3 = alloca i32, align 4\n  %4 = alloca i32, align 4\n  %5 = alloca i32, align 4\n  store i32 %0, i32* %3, align 4\n  store i32 0, i32* %4, align 4\n  store i32 1, i32* %5, align 4\n  br label %6\n"]:::critical
+    1 --> 6
+    6["Block 6:\n  %7 = load i32, i32* %5, align 4\n  %8 = icmp slt i32 %7, 5\n  br i1 %8, label %9, label %19\n"]:::critical
+    6 -->|true| 9
+    6 -->|false| 19
+    9["Block 9:\n  %10 = load i32, i32* %4, align 4\n  %11 = add nsw i32 %10, 1\n  store i32 %11, i32* %4, align 4\n  %12 = load i32, i32* %3, align 4\n  %13 = icmp sgt i32 %12, 2\n  br i1 %13, label %14, label %15\n"]
+    9 -->|true| 14
+    9 -->|false| 15
+    14["Block 14:\n  store i32 23, i32* %2, align 4\n  br label %21\n"]
+    14 --> 21
+    15["Block 15:\n  br label %16\n"]
+    15 --> 16
+    16["Block 16:\n  %17 = load i32, i32* %5, align 4\n  %18 = add nsw i32 %17, 1\n  store i32 %18, i32* %5, align 4\n  br label %6\n"]
+    16 --> 6
+    19["Block 19:\n  %20 = load i32, i32* %4, align 4\n  store i32 %20, i32* %2, align 4\n  br label %21\n"]
+    19 --> 21
+    21["Block 21:\n  %22 = load i32, i32* %2, align 4\n  ret i32 %22\n"]:::critical
+    classDef critical fill:#f96,stroke:#333,stroke-width:4px
+```
+```mermaid: countSetBits
+graph TD
+    1["Block 1:\n  %2 = alloca i32, align 4\n  %3 = alloca i32, align 4\n  store i32 %0, i32* %2, align 4\n  store i32 0, i32* %3, align 4\n  br label %4\n"]:::critical
+    1 --> 4
+    4["Block 4:\n  %5 = load i32, i32* %2, align 4\n  %6 = icmp ne i32 %5, 0\n  br i1 %6, label %7, label %14\n"]:::critical
+    4 -->|true| 7
+    4 -->|false| 14
+    7["Block 7:\n  %8 = load i32, i32* %2, align 4\n  %9 = and i32 %8, 1\n  %10 = load i32, i32* %3, align 4\n  %11 = add nsw i32 %10, %9\n  store i32 %11, i32* %3, align 4\n  %12 = load i32, i32* %2, align 4\n  %13 = ashr i32 %12, 1\n  store i32 %13, i32* %2, align 4\n  br label %4\n"]
+    7 --> 4
+    14["Block 14:\n  %15 = load i32, i32* %3, align 4\n  ret i32 %15\n"]:::critical
+    classDef critical fill:#f96,stroke:#333,stroke-width:4px
+```
+```mermaid: memoizedFib
+graph TD
+    1["Block 1:\n  %2 = alloca i32, align 4\n  %3 = alloca i32, align 4\n  store i32 %0, i32* %3, align 4\n  %4 = load i32, i32* %3, align 4\n  %5 = sext i32 %4 to i64\n  %6 = getelementptr inbounds [100 x i32], [100...\n  %7 = load i32, i32* %6, align 4\n  %8 = icmp ne i32 %7, -1\n  br i1 %8, label %9, label %14\n"]:::critical
+    1 -->|true| 9
+    1 -->|false| 14
+    9["Block 9:\n  %10 = load i32, i32* %3, align 4\n  %11 = sext i32 %10 to i64\n  %12 = getelementptr inbounds [100 x i32], [10...\n  %13 = load i32, i32* %12, align 4\n  store i32 %13, i32* %2, align 4\n  br label %34\n"]
+    9 --> 34
+    14["Block 14:\n  %15 = load i32, i32* %3, align 4\n  %16 = icmp sle i32 %15, 1\n  br i1 %16, label %17, label %19\n"]
+    14 -->|true| 17
+    14 -->|false| 19
+    17["Block 17:\n  %18 = load i32, i32* %3, align 4\n  store i32 %18, i32* %2, align 4\n  br label %34\n"]
+    17 --> 34
+    19["Block 19:\n  %20 = load i32, i32* %3, align 4\n  %21 = sub nsw i32 %20, 1\n  %22 = call i32 @memoizedFib(i32 %21)\n  %23 = load i32, i32* %3, align 4\n  %24 = sub nsw i32 %23, 2\n  %25 = call i32 @memoizedFib(i32 %24)\n  %26 = add nsw i32 %22, %25\n  %27 = load i32, i32* %3, align 4\n  %28 = sext i32 %27 to i64\n  %29 = getelementptr inbounds [100 x i32], [10...\n  store i32 %26, i32* %29, align 4\n  %30 = load i32, i32* %3, align 4\n  %31 = sext i32 %30 to i64\n  %32 = getelementptr inbounds [100 x i32], [10...\n  %33 = load i32, i32* %32, align 4\n  store i32 %33, i32* %2, align 4\n  br label %34\n"]
+    19 --> 34
+    34["Block 34:\n  %35 = load i32, i32* %2, align 4\n  ret i32 %35\n"]:::critical
+    classDef critical fill:#f96,stroke:#333,stroke-width:4px
+```
+```mermaid: processMatrix
+graph TD
+    2["Block 2:\n  %3 = alloca [100 x i32]*, align 8\n  %4 = alloca i32, align 4\n  %5 = alloca i32, align 4\n  %6 = alloca i32, align 4\n  %7 = alloca i32, align 4\n  store [100 x i32]* %0, [100 x i32]** %3, align 8\n  store i32 %1, i32* %4, align 4\n  store i32 0, i32* %5, align 4\n  store i32 0, i32* %6, align 4\n  br label %8\n"]:::critical
+    2 --> 8
+    8["Block 8:\n  %9 = load i32, i32* %6, align 4\n  %10 = load i32, i32* %4, align 4\n  %11 = icmp slt i32 %9, %10\n  br i1 %11, label %12, label %80\n"]:::critical
+    8 -->|true| 12
+    8 -->|false| 80
+    12["Block 12:\n  store i32 0, i32* %7, align 4\n  br label %13\n"]
+    12 --> 13
+    13["Block 13:\n  %14 = load i32, i32* %7, align 4\n  %15 = load i32, i32* %4, align 4\n  %16 = icmp slt i32 %14, %15\n  br i1 %16, label %17, label %76\n"]
+    13 -->|true| 17
+    13 -->|false| 76
+    17["Block 17:\n  %18 = load i32, i32* %6, align 4\n  %19 = load i32, i32* %7, align 4\n  %20 = icmp eq i32 %18, %19\n  br i1 %20, label %21, label %55\n"]
+    17 -->|true| 21
+    17 -->|false| 55
+    21["Block 21:\n  %22 = load [100 x i32]*, [100 x i32]** %3, al...\n  %23 = load i32, i32* %6, align 4\n  %24 = sext i32 %23 to i64\n  %25 = getelementptr inbounds [100 x i32], [10...\n  %26 = load i32, i32* %7, align 4\n  %27 = sext i32 %26 to i64\n  %28 = getelementptr inbounds [100 x i32], [10...\n  %29 = load i32, i32* %28, align 4\n  %30 = srem i32 %29, 2\n  %31 = icmp eq i32 %30, 0\n  br i1 %31, label %32, label %43\n"]
+    21 -->|true| 32
+    21 -->|false| 43
+    32["Block 32:\n  %33 = load [100 x i32]*, [100 x i32]** %3, al...\n  %34 = load i32, i32* %6, align 4\n  %35 = sext i32 %34 to i64\n  %36 = getelementptr inbounds [100 x i32], [10...\n  %37 = load i32, i32* %7, align 4\n  %38 = sext i32 %37 to i64\n  %39 = getelementptr inbounds [100 x i32], [10...\n  %40 = load i32, i32* %39, align 4\n  %41 = load i32, i32* %5, align 4\n  %42 = add nsw i32 %41, %40\n  store i32 %42, i32* %5, align 4\n  br label %54\n"]
+    32 --> 54
+    43["Block 43:\n  %44 = load [100 x i32]*, [100 x i32]** %3, al...\n  %45 = load i32, i32* %6, align 4\n  %46 = sext i32 %45 to i64\n  %47 = getelementptr inbounds [100 x i32], [10...\n  %48 = load i32, i32* %7, align 4\n  %49 = sext i32 %48 to i64\n  %50 = getelementptr inbounds [100 x i32], [10...\n  %51 = load i32, i32* %50, align 4\n  %52 = load i32, i32* %5, align 4\n  %53 = sub nsw i32 %52, %51\n  store i32 %53, i32* %5, align 4\n  br label %54\n"]
+    43 --> 54
+    54["Block 54:\n  br label %72\n"]
+    54 --> 72
+    55["Block 55:\n  %56 = load i32, i32* %6, align 4\n  %57 = load i32, i32* %7, align 4\n  %58 = icmp slt i32 %56, %57\n  br i1 %58, label %59, label %71\n"]
+    55 -->|true| 59
+    55 -->|false| 71
+    59["Block 59:\n  %60 = load [100 x i32]*, [100 x i32]** %3, al...\n  %61 = load i32, i32* %6, align 4\n  %62 = sext i32 %61 to i64\n  %63 = getelementptr inbounds [100 x i32], [10...\n  %64 = load i32, i32* %7, align 4\n  %65 = sext i32 %64 to i64\n  %66 = getelementptr inbounds [100 x i32], [10...\n  %67 = load i32, i32* %66, align 4\n  %68 = call i32 @countSetBits(i32 %67)\n  %69 = load i32, i32* %5, align 4\n  %70 = add nsw i32 %69, %68\n  store i32 %70, i32* %5, align 4\n  br label %71\n"]
+    59 --> 71
+    71["Block 71:\n  br label %72\n"]
+    71 --> 72
+    72["Block 72:\n  br label %73\n"]
+    72 --> 73
+    73["Block 73:\n  %74 = load i32, i32* %7, align 4\n  %75 = add nsw i32 %74, 1\n  store i32 %75, i32* %7, align 4\n  br label %13\n"]
+    73 --> 13
+    76["Block 76:\n  br label %77\n"]
+    76 --> 77
+    77["Block 77:\n  %78 = load i32, i32* %6, align 4\n  %79 = add nsw i32 %78, 1\n  store i32 %79, i32* %6, align 4\n  br label %8\n"]
+    77 --> 8
+    80["Block 80:\n  %81 = load i32, i32* %5, align 4\n  ret i32 %81\n"]:::critical
+    classDef critical fill:#f96,stroke:#333,stroke-width:4px
+```
+```mermaid: projectB_main
+graph TD
+    0["Block 0:\n  %1 = alloca [14 x i8], align 1\n  %2 = alloca [8 x i32], align 16\n  %3 = alloca i32, align 4\n  %4 = alloca i32, align 4\n  %5 = alloca [100 x [100 x i32]], align 16\n  %6 = alloca i32, align 4\n  %7 = alloca i32, align 4\n  %8 = alloca i32, align 4\n  %9 = call i32 @testPoints(i32 5)\n  call void @llvm.memset.p0i8.i64(i8* align 16 ...\n  %10 = bitcast [14 x i8]* %1 to i8*\n  call void @llvm.memcpy.p0i8.p0i8.i64(i8* alig...\n  %11 = getelementptr inbounds [14 x i8], [14 x...\n  call void @reverseString(i8* %11)\n  %12 = bitcast [8 x i32]* %2 to i8*\n  call void @llvm.memcpy.p0i8.p0i8.i64(i8* alig...\n  store i32 8, i32* %3, align 4\n  %13 = getelementptr inbounds [8 x i32], [8 x ...\n  %14 = load i32, i32* %3, align 4\n  %15 = call i32 @longestIncreasingSubsequence(...\n  store i32 %15, i32* %4, align 4\n  %16 = bitcast [100 x [100 x i32]]* %5 to i8*\n  call void @llvm.memcpy.p0i8.p0i8.i64(i8* alig...\n  %17 = getelementptr inbounds [100 x [100 x i3...\n  %18 = call i32 @processMatrix([100 x i32]* %1...\n  store i32 %18, i32* %6, align 4\n  store i32 0, i32* %7, align 4\n  br label %19\n"]:::critical
+    0 --> 19
+    19["Block 19:\n  %20 = load i32, i32* %7, align 4\n  %21 = call i32 @memoizedFib(i32 %20)\n  %22 = load i32, i32* %7, align 4\n  %23 = add nsw i32 %22, 1\n  store i32 %23, i32* %7, align 4\n  br label %24\n"]:::critical
+    19 --> 24
+    24["Block 24:\n  %25 = load i32, i32* %7, align 4\n  %26 = icmp slt i32 %25, 10\n  br i1 %26, label %19, label %27\n"]:::critical
+    24 -->|true| 19
+    24 -->|false| 27
+    27["Block 27:\n  %28 = load i32, i32* %4, align 4\n  %29 = icmp sgt i32 %28, 5\n  br i1 %29, label %30, label %40\n"]:::critical
+    27 -->|true| 30
+    27 -->|false| 40
+    30["Block 30:\n  %31 = load i32, i32* %6, align 4\n  %32 = icmp sgt i32 %31, 0\n  br i1 %32, label %33, label %36\n"]
+    30 -->|true| 33
+    30 -->|false| 36
+    33["Block 33:\n  %34 = load i32, i32* %4, align 4\n  %35 = call i32 @memoizedFib(i32 %34)\n  store i32 %35, i32* %8, align 4\n  br label %39\n"]
+    33 --> 39
+    36["Block 36:\n  %37 = load i32, i32* %6, align 4\n  %38 = call i32 @countSetBits(i32 %37)\n  store i32 %38, i32* %8, align 4\n  br label %39\n"]
+    36 --> 39
+    39["Block 39:\n  br label %47\n"]
+    39 --> 47
+    40["Block 40:\n  %41 = getelementptr inbounds [14 x i8], [14 x...\n  %42 = call i64 @strlen(i8* %41) #7\n  %43 = load i32, i32* %6, align 4\n  %44 = sext i32 %43 to i64\n  %45 = add i64 %42, %44\n  %46 = trunc i64 %45 to i32\n  store i32 %46, i32* %8, align 4\n  br label %47\n"]
+    40 --> 47
+    47["Block 47:\n  %48 = load i32, i32* %8, align 4\n  ret i32 %48\n"]:::critical
+    classDef critical fill:#f96,stroke:#333,stroke-width:4px
+```
+[INFO][runOnModule] Creating slices for target functions
+[INFO][runOnModule] targetFuncName: countSetBits
+[INFO][createFunctionSlices] Created 2 slices for target function countSetBits
+[DEBUG][createFunctionSlices] Slice 0 of function countSetBits contains blocks: %1
+[DEBUG][createFunctionSlices] Slice 1 of function countSetBits contains blocks: %4, %7, %14
+[INFO][runOnModule] targetFuncName: longestIncreasingSubsequence
+[INFO][createFunctionSlices] Created 4 slices for target function longestIncreasingSubsequence
+[DEBUG][createFunctionSlices] Slice 0 of function longestIncreasingSubsequence contains blocks: %2
+[DEBUG][createFunctionSlices] Slice 1 of function longestIncreasingSubsequence contains blocks: %11, %15, %22, %19
+[DEBUG][createFunctionSlices] Slice 2 of function longestIncreasingSubsequence contains blocks: %23, %27, %72, %28, %32, %68, %44, %64, %69, %55, %65
+[DEBUG][createFunctionSlices] Slice 3 of function longestIncreasingSubsequence contains blocks: %73, %77, %93, %84, %89, %90
+[INFO][runOnModule] targetFuncName: memoizedFib
+[INFO][createFunctionSlices] Created 1 slices for target function memoizedFib
+[DEBUG][createFunctionSlices] Slice 0 of function memoizedFib contains blocks: %1, %9, %14, %34, %17, %19
+[INFO][runOnModule] targetFuncName: processMatrix
+[INFO][createFunctionSlices] Created 2 slices for target function processMatrix
+[DEBUG][createFunctionSlices] Slice 0 of function processMatrix contains blocks: %2
+[DEBUG][createFunctionSlices] Slice 1 of function processMatrix contains blocks: %8, %12, %80, %13, %17, %76, %21, %55, %77, %32, %43, %59, %71, %54, %72, %73
+[INFO][runOnModule] targetFuncName: projectB_main
+[INFO][createFunctionSlices] Created 3 slices for target function projectB_main
+[DEBUG][createFunctionSlices] Slice 0 of function projectB_main contains blocks: %0
+[DEBUG][createFunctionSlices] Slice 1 of function projectB_main contains blocks: %19, %24
+[DEBUG][createFunctionSlices] Slice 2 of function projectB_main contains blocks: %27, %30, %40, %33, %36, %47, %39
+[INFO][runOnModule] targetFuncName: reverseString
+[INFO][createFunctionSlices] Created 2 slices for target function reverseString
+[DEBUG][createFunctionSlices] Slice 0 of function reverseString contains blocks: %1
+[DEBUG][createFunctionSlices] Slice 1 of function reverseString contains blocks: %9, %14, %43, %40
+[INFO][runOnModule] targetFuncName: testPoints
+[INFO][createFunctionSlices] Created 2 slices for target function testPoints
+[DEBUG][createFunctionSlices] Slice 0 of function testPoints contains blocks: %1
+[DEBUG][createFunctionSlices] Slice 1 of function testPoints contains blocks: %6, %9, %19, %14, %15, %21, %16
+[INFO][runOnModule] Creating fusion points for bunker functions
+[INFO][runOnModule] bunkerFuncName: calculateCircleArea
+[INFO][countFusionPoints] Counted 2 fusion points for bunker function calculateCircleArea
+[INFO][runOnModule] bunkerFuncName: calculateDistance
+[INFO][countFusionPoints] Counted 2 fusion points for bunker function calculateDistance
+[INFO][runOnModule] bunkerFuncName: createDynamicArray
+[INFO][countFusionPoints] Counted 2 fusion points for bunker function createDynamicArray
+[INFO][runOnModule] bunkerFuncName: createMatrix
+[INFO][countFusionPoints] Counted 2 fusion points for bunker function createMatrix
+[INFO][runOnModule] bunkerFuncName: factorial
+[INFO][countFusionPoints] Counted 2 fusion points for bunker function factorial
+[INFO][runOnModule] bunkerFuncName: findCentroid
+[INFO][countFusionPoints] Counted 2 fusion points for bunker function findCentroid
+[INFO][runOnModule] bunkerFuncName: getErrorMessage
+[INFO][countFusionPoints] Counted 2 fusion points for bunker function getErrorMessage
+[INFO][runOnModule] bunkerFuncName: insertNode
+[INFO][countFusionPoints] Counted 2 fusion points for bunker function insertNode
+[INFO][runOnModule] bunkerFuncName: multiplyMatrices
+[INFO][countFusionPoints] Counted 2 fusion points for bunker function multiplyMatrices
+[INFO][runOnModule] bunkerFuncName: performSimpleCalculations
+[INFO][countFusionPoints] Counted 7 fusion points for bunker function performSimpleCalculations
+[INFO][runOnModule] bunkerFuncName: projectA_main
+[INFO][countFusionPoints] Counted 2 fusion points for bunker function projectA_main
+[INFO][runOnModule] bunkerFuncName: pushBack
+[INFO][countFusionPoints] Counted 2 fusion points for bunker function pushBack
+[INFO][runOnModule] bunkerFuncName: quickSort
+[INFO][countFusionPoints] Counted 2 fusion points for bunker function quickSort
+[INFO][runOnModule] bunkerFuncName: removeDuplicates
+[INFO][countFusionPoints] Counted 2 fusion points for bunker function removeDuplicates
+[INFO][runOnModule] bunkerFuncName: setErrorMessage
+[INFO][countFusionPoints] Counted 3 fusion points for bunker function setErrorMessage
+[INFO][runOnModule] bunkerFuncName: validateMatrix
+[INFO][countFusionPoints] Counted 2 fusion points for bunker function validateMatrix
+[INFO][matchFunctionsForFusion] Starting function matching process
+[INFO][matchFunctionsForFusion] Matched target longestIncreasingSubsequence (4 slices) with bunker projectA_main (7 fusion points)
+[INFO][matchFunctionsForFusion] Remaining bunker functions after matching longestIncreasingSubsequence:
+[INFO][matchFunctionsForFusion]     calculateCircleArea (Critical Points: 2)
+[INFO][matchFunctionsForFusion]     calculateDistance (Critical Points: 2)
+[INFO][matchFunctionsForFusion]     createDynamicArray (Critical Points: 2)
+[INFO][matchFunctionsForFusion]     createMatrix (Critical Points: 2)
+[INFO][matchFunctionsForFusion]     factorial (Critical Points: 2)
+[INFO][matchFunctionsForFusion]     findCentroid (Critical Points: 2)
+[INFO][matchFunctionsForFusion]     getErrorMessage (Critical Points: 2)
+[INFO][matchFunctionsForFusion]     insertNode (Critical Points: 2)
+[INFO][matchFunctionsForFusion]     multiplyMatrices (Critical Points: 2)
+[INFO][matchFunctionsForFusion]     projectA_main (Critical Points: 2)
+[INFO][matchFunctionsForFusion]     pushBack (Critical Points: 2)
+[INFO][matchFunctionsForFusion]     quickSort (Critical Points: 2)
+[INFO][matchFunctionsForFusion]     removeDuplicates (Critical Points: 2)
+[INFO][matchFunctionsForFusion]     setErrorMessage (Critical Points: 3)
+[INFO][matchFunctionsForFusion]     validateMatrix (Critical Points: 2)
+[INFO][matchFunctionsForFusion] Matched target projectB_main (3 slices) with bunker setErrorMessage (3 fusion points)
+[INFO][matchFunctionsForFusion] Remaining bunker functions after matching projectB_main:
+[INFO][matchFunctionsForFusion]     calculateCircleArea (Critical Points: 2)
+[INFO][matchFunctionsForFusion]     createDynamicArray (Critical Points: 2)
+[INFO][matchFunctionsForFusion]     createMatrix (Critical Points: 2)
+[INFO][matchFunctionsForFusion]     factorial (Critical Points: 2)
+[INFO][matchFunctionsForFusion]     findCentroid (Critical Points: 2)
+[INFO][matchFunctionsForFusion]     insertNode (Critical Points: 2)
+[INFO][matchFunctionsForFusion]     projectA_main (Critical Points: 2)
+[INFO][matchFunctionsForFusion]     quickSort (Critical Points: 2)
+[INFO][matchFunctionsForFusion]     removeDuplicates (Critical Points: 2)
+[INFO][matchFunctionsForFusion] Matched target countSetBits (2 slices) with bunker removeDuplicates (2 fusion points)
+[INFO][matchFunctionsForFusion] Remaining bunker functions after matching countSetBits:
+[INFO][matchFunctionsForFusion]     calculateCircleArea (Critical Points: 2)
+[INFO][matchFunctionsForFusion]     createDynamicArray (Critical Points: 2)
+[INFO][matchFunctionsForFusion]     createMatrix (Critical Points: 2)
+[INFO][matchFunctionsForFusion]     factorial (Critical Points: 2)
+[INFO][matchFunctionsForFusion]     findCentroid (Critical Points: 2)
+[INFO][matchFunctionsForFusion]     insertNode (Critical Points: 2)
+[INFO][matchFunctionsForFusion]     projectA_main (Critical Points: 2)
+[INFO][matchFunctionsForFusion]     removeDuplicates (Critical Points: 2)
+[INFO][matchFunctionsForFusion] Matched target processMatrix (2 slices) with bunker createMatrix (2 fusion points)
+[INFO][matchFunctionsForFusion] Remaining bunker functions after matching processMatrix:
+[INFO][matchFunctionsForFusion]     calculateCircleArea (Critical Points: 2)
+[INFO][matchFunctionsForFusion]     createMatrix (Critical Points: 2)
+[INFO][matchFunctionsForFusion]     factorial (Critical Points: 2)
+[INFO][matchFunctionsForFusion]     findCentroid (Critical Points: 2)
+[INFO][matchFunctionsForFusion]     insertNode (Critical Points: 2)
+[INFO][matchFunctionsForFusion]     projectA_main (Critical Points: 2)
+[INFO][matchFunctionsForFusion]     removeDuplicates (Critical Points: 2)
+[INFO][matchFunctionsForFusion] Matched target reverseString (2 slices) with bunker factorial (2 fusion points)
+[INFO][matchFunctionsForFusion] Remaining bunker functions after matching reverseString:
+[INFO][matchFunctionsForFusion]     calculateCircleArea (Critical Points: 2)
+[INFO][matchFunctionsForFusion]     factorial (Critical Points: 2)
+[INFO][matchFunctionsForFusion]     findCentroid (Critical Points: 2)
+[INFO][matchFunctionsForFusion]     insertNode (Critical Points: 2)
+[INFO][matchFunctionsForFusion]     projectA_main (Critical Points: 2)
+[INFO][matchFunctionsForFusion]     removeDuplicates (Critical Points: 2)
+[INFO][matchFunctionsForFusion] Matched target testPoints (2 slices) with bunker matchFunctionsFo (2 fusion points)
+[INFO][matchFunctionsForFusion] Remaining bunker functions after matching testPoints:
+[INFO][matchFunctionsForFusion]     calculateCircleArea (Critical Points: 2)
+[INFO][matchFunctionsForFusion]     factorial (Critical Points: 2)
+[INFO][matchFunctionsForFusion]     findCentroid (Critical Points: 2)
+[INFO][matchFunctionsForFusion]     insertNode (Critical Points: 2)
+[INFO][matchFunctionsForFusion]     projectA_main (Critical Points: 2)
+[INFO][matchFunctionsForFusion] Matched target memoizedFib (1 slices) with bunker  ñ‘‹ (2 fusion points)
+[INFO][matchFunctionsForFusion] Remaining bunker functions after matching memoizedFib:
+[INFO][matchFunctionsForFusion]     calculateCircleArea (Critical Points: 2)
+[INFO][matchFunctionsForFusion]     factorial (Critical Points: 2)
+[INFO][matchFunctionsForFusion]     findCentroid (Critical Points: 2)
+[INFO][matchFunctionsForFusion]     insertNode (Critical Points: 2)
+[INFO][generateFusionMatchGraph] Generating fusion match visualization
+```mermaid
+graph LR
+    %% Fusion Match Graph
+    %% Left side: Target Project, Right side: Bunker Project
+
+    subgraph Target["Target Project"]
+        direction TB
+        countSetBits["countSetBits\nCritical Points: 3"]:::target
+        longestIncreasingSubsequence["longestIncreasingSubsequence\nCritical Points: 7"]:::target
+        memoizedFib["memoizedFib\nCritical Points: 2"]:::target
+        processMatrix["processMatrix\nCritical Points: 3"]:::target
+        projectB_main["projectB_main\nCritical Points: 5"]:::target
+        reverseString["reverseString\nCritical Points: 3"]:::target
+        testPoints["testPoints\nCritical Points: 3"]:::target
+    end
+
+    subgraph Bunker["Bunker Project"]
+        direction TB
+        calculateCircleArea["calculateCircleArea\nCritical Points: 2"]:::bunker
+        calculateDistance["calculateDistance\nCritical Points: 2"]:::bunker
+        createDynamicArray["createDynamicArray\nCritical Points: 2"]:::bunker
+        createMatrix["createMatrix\nCritical Points: 2"]:::bunker
+        factorial["factorial\nCritical Points: 2"]:::bunker
+        findCentroid["findCentroid\nCritical Points: 2"]:::bunker
+        getErrorMessage["getErrorMessage\nCritical Points: 2"]:::bunker
+        insertNode["insertNode\nCritical Points: 2"]:::bunker
+        multiplyMatrices["multiplyMatrices\nCritical Points: 2"]:::bunker
+        performSimpleCalculations["performSimpleCalculations\nCritical Points: 7"]:::bunker
+        projectA_main["projectA_main\nCritical Points: 2"]:::bunker
+        pushBack["pushBack\nCritical Points: 2"]:::bunker
+        quickSort["quickSort\nCritical Points: 2"]:::bunker
+        removeDuplicates["removeDuplicates\nCritical Points: 2"]:::bunker
+        setErrorMessage["setErrorMessage\nCritical Points: 3"]:::bunker
+        validateMatrix["validateMatrix\nCritical Points: 2"]:::bunker
+    end
+
+    %% Fusion Matches
+    countSetBits ==>|fusion| quickSort
+    longestIncreasingSubsequence ==>|fusion| performSimpleCalculations
+    memoizedFib ==>|fusion| projectA_main
+    processMatrix ==>|fusion| createDynamicArray
+    projectB_main ==>|fusion| setErrorMessage
+    reverseString ==>|fusion| createMatrix
+    testPoints ==>|fusion| removeDuplicates
+    %% Styles
+    classDef target fill:#f96,stroke:#333,stroke-width:2px
+    classDef bunker fill:#9cf,stroke:#333,stroke-width:2px
+    style Target fill:#fff,stroke:#f96,stroke-width:2px
+    style Bunker fill:#fff,stroke:#9cf,stroke-width:2px
+```
+
+[INFO][generateFusionMatchGraph] Generated visualization with 7 target functions and 16 bunker functions
+[INFO][generateFusionMatchGraph] Total fusion matches: 7

BIN
output/module_fusion.ll


BIN
proprocess_output/combined_tagged.bc


+ 3579 - 0
proprocess_output/combined_tagged.ll

@@ -0,0 +1,3579 @@
+; ModuleID = 'proprocess_output/combined_tagged.bc'
+source_filename = "llvm-link"
+target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-pc-linux-gnu"
+
+%struct._IO_FILE = type { i32, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, %struct._IO_marker*, %struct._IO_FILE*, i32, i32, i64, i16, i8, [1 x i8], i8*, i64, %struct._IO_codecvt*, %struct._IO_wide_data*, %struct._IO_FILE*, i8*, i64, i32, [20 x i8] }
+%struct._IO_marker = type opaque
+%struct._IO_codecvt = type opaque
+%struct._IO_wide_data = type opaque
+%struct.DynamicArray = type { i32*, i32, i32, i32, i32 }
+%struct.Matrix = type { i32**, i32, i32, i32, double }
+%struct.Node = type { i32, %struct.Node*, %struct.Node*, i32, i32 }
+%struct.Point = type { i32, i32, [256 x i8], double }
+%struct.Circle = type { %struct.Point, double, i32, [256 x i8] }
+
+@globalCounter = dso_local global i32 0, align 4
+@globalErrorMessage = dso_local global i8* null, align 8
+@recursionDepth = dso_local global i32 0, align 4
+@.str = private unnamed_addr constant [9 x i8] c"No error\00", align 1
+@stderr = external dso_local global %struct._IO_FILE*, align 8
+@.str.1 = private unnamed_addr constant [55 x i8] c"Critical: Failed to allocate memory for error message\0A\00", align 1
+@.str.2 = private unnamed_addr constant [33 x i8] c"Maximum recursion depth exceeded\00", align 1
+@.str.3 = private unnamed_addr constant [29 x i8] c"Factorial of negative number\00", align 1
+@.str.4 = private unnamed_addr constant [36 x i8] c"Input too large, potential overflow\00", align 1
+@.str.5 = private unnamed_addr constant [31 x i8] c"Factorial calculation overflow\00", align 1
+@.str.6 = private unnamed_addr constant [25 x i8] c"Invalid initial capacity\00", align 1
+@.str.7 = private unnamed_addr constant [46 x i8] c"Initial capacity exceeds maximum allowed size\00", align 1
+@.str.8 = private unnamed_addr constant [49 x i8] c"Memory allocation failed for DynamicArray struct\00", align 1
+@.str.9 = private unnamed_addr constant [35 x i8] c"Memory allocation failed for array\00", align 1
+@.str.10 = private unnamed_addr constant [19 x i8] c"Null array pointer\00", align 1
+@.str.11 = private unnamed_addr constant [25 x i8] c"Array size limit reached\00", align 1
+@.str.12 = private unnamed_addr constant [27 x i8] c"Memory reallocation failed\00", align 1
+@.str.13 = private unnamed_addr constant [46 x i8] c"Maximum recursion depth exceeded in quickSort\00", align 1
+@.str.14 = private unnamed_addr constant [32 x i8] c"Null array pointer in quickSort\00", align 1
+@.str.15 = private unnamed_addr constant [39 x i8] c"Array index out of bounds in quickSort\00", align 1
+@.str.16 = private unnamed_addr constant [28 x i8] c"Matrix dimensions too small\00", align 1
+@.str.17 = private unnamed_addr constant [46 x i8] c"Matrix dimensions exceed maximum allowed size\00", align 1
+@.str.18 = private unnamed_addr constant [43 x i8] c"Memory allocation failed for matrix struct\00", align 1
+@.str.19 = private unnamed_addr constant [41 x i8] c"Memory allocation failed for matrix rows\00", align 1
+@.str.20 = private unnamed_addr constant [44 x i8] c"Memory allocation failed for matrix columns\00", align 1
+@.str.21 = private unnamed_addr constant [20 x i8] c"Null matrix pointer\00", align 1
+@.str.22 = private unnamed_addr constant [20 x i8] c"Invalid matrix data\00", align 1
+@.str.23 = private unnamed_addr constant [45 x i8] c"Invalid matrix dimensions for multiplication\00", align 1
+@.str.24 = private unnamed_addr constant [42 x i8] c"Integer overflow in matrix multiplication\00", align 1
+@.str.25 = private unnamed_addr constant [38 x i8] c"Memory allocation failed for new node\00", align 1
+@insertNode.maxDepth = internal global i32 0, align 4
+@.str.26 = private unnamed_addr constant [34 x i8] c"List exceeds maximum allowed size\00", align 1
+@calculationResult = internal global i32 0, align 4
+@.str.27 = private unnamed_addr constant [30 x i8] c"Final calculation result: %d\0A\00", align 1
+@.str.28 = private unnamed_addr constant [11 x i8] c"Error: %s\0A\00", align 1
+@.str.29 = private unnamed_addr constant [29 x i8] c"Error during array push: %s\0A\00", align 1
+@.str.30 = private unnamed_addr constant [33 x i8] c"Error during list insertion: %s\0A\00", align 1
+@.str.31 = private unnamed_addr constant [43 x i8] c"Circular reference detected in linked list\00", align 1
+@.str.32 = private unnamed_addr constant [22 x i8] c"Invalid point weights\00", align 1
+@.str.33 = private unnamed_addr constant [31 x i8] c"Coordinates out of valid range\00", align 1
+@.str.34 = private unnamed_addr constant [30 x i8] c"Distance calculation overflow\00", align 1
+@.str.35 = private unnamed_addr constant [36 x i8] c"Invalid distance calculation result\00", align 1
+@.str.36 = private unnamed_addr constant [15 x i8] c"Invalid circle\00", align 1
+@.str.37 = private unnamed_addr constant [22 x i8] c"Invalid circle radius\00", align 1
+@.str.38 = private unnamed_addr constant [24 x i8] c"Circle radius too large\00", align 1
+@.str.39 = private unnamed_addr constant [45 x i8] c"Circle center coordinates out of valid range\00", align 1
+@.str.40 = private unnamed_addr constant [26 x i8] c"Area calculation overflow\00", align 1
+@.str.41 = private unnamed_addr constant [9 x i8] c"standard\00", align 1
+@.str.42 = private unnamed_addr constant [9 x i8] c"weighted\00", align 1
+@.str.43 = private unnamed_addr constant [35 x i8] c"Invalid weight for weighted circle\00", align 1
+@.str.44 = private unnamed_addr constant [20 x i8] c"Unknown circle type\00", align 1
+@.str.45 = private unnamed_addr constant [17 x i8] c"Null matrix data\00", align 1
+@.str.46 = private unnamed_addr constant [28 x i8] c"Matrix dimensions too large\00", align 1
+@.str.47 = private unnamed_addr constant [27 x i8] c"Invalid matrix row pointer\00", align 1
+@.str.48 = private unnamed_addr constant [32 x i8] c"Inconsistent square matrix flag\00", align 1
+@.str.49 = private unnamed_addr constant [14 x i8] c"Invalid array\00", align 1
+@.str.50 = private unnamed_addr constant [21 x i8] c"Invalid points array\00", align 1
+@.str.51 = private unnamed_addr constant [16 x i8] c"Too many points\00", align 1
+@.str.52 = private unnamed_addr constant [39 x i8] c"Failed to allocate memory for centroid\00", align 1
+@.str.53 = private unnamed_addr constant [21 x i8] c"Invalid point weight\00", align 1
+@.str.54 = private unnamed_addr constant [30 x i8] c"Centroid calculation overflow\00", align 1
+@.str.55 = private unnamed_addr constant [21 x i8] c"Total weight is zero\00", align 1
+@.str.56 = private unnamed_addr constant [9 x i8] c"Centroid\00", align 1
+@cache = internal global [100 x i32] zeroinitializer, align 16
+@__const.projectB_main.str = private unnamed_addr constant [14 x i8] c"Hello, World!\00", align 1
+@__const.projectB_main.arr = private unnamed_addr constant [8 x i32] [i32 10, i32 22, i32 9, i32 33, i32 21, i32 50, i32 41, i32 60], align 16
+@__const.projectB_main.matrix = private unnamed_addr constant <{ <{ i32, i32, i32, [97 x i32] }>, <{ i32, i32, i32, [97 x i32] }>, <{ i32, i32, i32, [97 x i32] }>, [97 x <{ i32, i32, i32, [97 x i32] }>] }> <{ <{ i32, i32, i32, [97 x i32] }> <{ i32 1, i32 2, i32 3, [97 x i32] zeroinitializer }>, <{ i32, i32, i32, [97 x i32] }> <{ i32 4, i32 5, i32 6, [97 x i32] zeroinitializer }>, <{ i32, i32, i32, [97 x i32] }> <{ i32 7, i32 8, i32 9, [97 x i32] zeroinitializer }>, [97 x <{ i32, i32, i32, [97 x i32] }>] zeroinitializer }>, align 16
+
+; Function Attrs: noinline nounwind optnone uwtable
+define dso_local i8* @getErrorMessage() #0 !project_source !2 {
+  %1 = load i8*, i8** @globalErrorMessage, align 8
+  %2 = icmp ne i8* %1, null
+  br i1 %2, label %3, label %5
+
+3:                                                ; preds = %0
+  %4 = load i8*, i8** @globalErrorMessage, align 8
+  br label %6
+
+5:                                                ; preds = %0
+  br label %6
+
+6:                                                ; preds = %5, %3
+  %7 = phi i8* [ %4, %3 ], [ getelementptr inbounds ([9 x i8], [9 x i8]* @.str, i64 0, i64 0), %5 ]
+  ret i8* %7
+}
+
+; Function Attrs: noinline nounwind optnone uwtable
+define dso_local void @setErrorMessage(i8* %0) #0 !project_source !2 {
+  %2 = alloca i8*, align 8
+  store i8* %0, i8** %2, align 8
+  %3 = load i8*, i8** @globalErrorMessage, align 8
+  %4 = icmp ne i8* %3, null
+  br i1 %4, label %5, label %7
+
+5:                                                ; preds = %1
+  %6 = load i8*, i8** @globalErrorMessage, align 8
+  call void @free(i8* %6) #7
+  br label %7
+
+7:                                                ; preds = %5, %1
+  %8 = load i8*, i8** %2, align 8
+  %9 = icmp ne i8* %8, null
+  br i1 %9, label %10, label %19
+
+10:                                               ; preds = %7
+  %11 = load i8*, i8** %2, align 8
+  %12 = call noalias i8* @strdup(i8* %11) #7
+  store i8* %12, i8** @globalErrorMessage, align 8
+  %13 = load i8*, i8** @globalErrorMessage, align 8
+  %14 = icmp eq i8* %13, null
+  br i1 %14, label %15, label %18
+
+15:                                               ; preds = %10
+  %16 = load %struct._IO_FILE*, %struct._IO_FILE** @stderr, align 8
+  %17 = call i32 (%struct._IO_FILE*, i8*, ...) @fprintf(%struct._IO_FILE* %16, i8* getelementptr inbounds ([55 x i8], [55 x i8]* @.str.1, i64 0, i64 0))
+  br label %18
+
+18:                                               ; preds = %15, %10
+  br label %20
+
+19:                                               ; preds = %7
+  store i8* null, i8** @globalErrorMessage, align 8
+  br label %20
+
+20:                                               ; preds = %19, %18
+  ret void
+}
+
+; Function Attrs: nounwind
+declare dso_local void @free(i8*) #1
+
+; Function Attrs: nounwind
+declare dso_local noalias i8* @strdup(i8*) #1
+
+declare dso_local i32 @fprintf(%struct._IO_FILE*, i8*, ...) #2
+
+; Function Attrs: noinline nounwind optnone uwtable
+define dso_local i32 @factorial(i32 %0) #0 !project_source !2 {
+  %2 = alloca i32, align 4
+  %3 = alloca i32, align 4
+  %4 = alloca i32, align 4
+  %5 = alloca i32, align 4
+  store i32 %0, i32* %3, align 4
+  %6 = load i32, i32* @recursionDepth, align 4
+  %7 = add nsw i32 %6, 1
+  store i32 %7, i32* @recursionDepth, align 4
+  %8 = icmp sgt i32 %7, 1000
+  br i1 %8, label %9, label %12
+
+9:                                                ; preds = %1
+  call void @setErrorMessage(i8* getelementptr inbounds ([33 x i8], [33 x i8]* @.str.2, i64 0, i64 0))
+  %10 = load i32, i32* @recursionDepth, align 4
+  %11 = add nsw i32 %10, -1
+  store i32 %11, i32* @recursionDepth, align 4
+  store i32 -1, i32* %2, align 4
+  br label %53
+
+12:                                               ; preds = %1
+  %13 = load i32, i32* %3, align 4
+  %14 = icmp slt i32 %13, 0
+  br i1 %14, label %15, label %18
+
+15:                                               ; preds = %12
+  call void @setErrorMessage(i8* getelementptr inbounds ([29 x i8], [29 x i8]* @.str.3, i64 0, i64 0))
+  %16 = load i32, i32* @recursionDepth, align 4
+  %17 = add nsw i32 %16, -1
+  store i32 %17, i32* @recursionDepth, align 4
+  store i32 -1, i32* %2, align 4
+  br label %53
+
+18:                                               ; preds = %12
+  %19 = load i32, i32* %3, align 4
+  %20 = icmp sgt i32 %19, 20
+  br i1 %20, label %21, label %24
+
+21:                                               ; preds = %18
+  call void @setErrorMessage(i8* getelementptr inbounds ([36 x i8], [36 x i8]* @.str.4, i64 0, i64 0))
+  %22 = load i32, i32* @recursionDepth, align 4
+  %23 = add nsw i32 %22, -1
+  store i32 %23, i32* @recursionDepth, align 4
+  store i32 -1, i32* %2, align 4
+  br label %53
+
+24:                                               ; preds = %18
+  %25 = load i32, i32* %3, align 4
+  %26 = icmp sle i32 %25, 1
+  br i1 %26, label %27, label %28
+
+27:                                               ; preds = %24
+  store i32 1, i32* %4, align 4
+  br label %49
+
+28:                                               ; preds = %24
+  %29 = load i32, i32* %3, align 4
+  %30 = sub nsw i32 %29, 1
+  %31 = call i32 @factorial(i32 %30)
+  store i32 %31, i32* %5, align 4
+  %32 = load i32, i32* %5, align 4
+  %33 = icmp eq i32 %32, -1
+  br i1 %33, label %34, label %37
+
+34:                                               ; preds = %28
+  %35 = load i32, i32* @recursionDepth, align 4
+  %36 = add nsw i32 %35, -1
+  store i32 %36, i32* @recursionDepth, align 4
+  store i32 -1, i32* %2, align 4
+  br label %53
+
+37:                                               ; preds = %28
+  %38 = load i32, i32* %5, align 4
+  %39 = load i32, i32* %3, align 4
+  %40 = sdiv i32 2147483647, %39
+  %41 = icmp sgt i32 %38, %40
+  br i1 %41, label %42, label %45
+
+42:                                               ; preds = %37
+  call void @setErrorMessage(i8* getelementptr inbounds ([31 x i8], [31 x i8]* @.str.5, i64 0, i64 0))
+  %43 = load i32, i32* @recursionDepth, align 4
+  %44 = add nsw i32 %43, -1
+  store i32 %44, i32* @recursionDepth, align 4
+  store i32 -1, i32* %2, align 4
+  br label %53
+
+45:                                               ; preds = %37
+  %46 = load i32, i32* %3, align 4
+  %47 = load i32, i32* %5, align 4
+  %48 = mul nsw i32 %46, %47
+  store i32 %48, i32* %4, align 4
+  br label %49
+
+49:                                               ; preds = %45, %27
+  %50 = load i32, i32* @recursionDepth, align 4
+  %51 = add nsw i32 %50, -1
+  store i32 %51, i32* @recursionDepth, align 4
+  %52 = load i32, i32* %4, align 4
+  store i32 %52, i32* %2, align 4
+  br label %53
+
+53:                                               ; preds = %49, %42, %34, %21, %15, %9
+  %54 = load i32, i32* %2, align 4
+  ret i32 %54
+}
+
+; Function Attrs: noinline nounwind optnone uwtable
+define dso_local %struct.DynamicArray* @createDynamicArray(i32 %0) #0 !project_source !2 {
+  %2 = alloca %struct.DynamicArray*, align 8
+  %3 = alloca i32, align 4
+  %4 = alloca %struct.DynamicArray*, align 8
+  store i32 %0, i32* %3, align 4
+  %5 = load i32, i32* %3, align 4
+  %6 = icmp sle i32 %5, 0
+  br i1 %6, label %7, label %8
+
+7:                                                ; preds = %1
+  call void @setErrorMessage(i8* getelementptr inbounds ([25 x i8], [25 x i8]* @.str.6, i64 0, i64 0))
+  store %struct.DynamicArray* null, %struct.DynamicArray** %2, align 8
+  br label %44
+
+8:                                                ; preds = %1
+  %9 = load i32, i32* %3, align 4
+  %10 = icmp sgt i32 %9, 1000
+  br i1 %10, label %11, label %12
+
+11:                                               ; preds = %8
+  call void @setErrorMessage(i8* getelementptr inbounds ([46 x i8], [46 x i8]* @.str.7, i64 0, i64 0))
+  store %struct.DynamicArray* null, %struct.DynamicArray** %2, align 8
+  br label %44
+
+12:                                               ; preds = %8
+  %13 = call noalias i8* @malloc(i64 24) #7
+  %14 = bitcast i8* %13 to %struct.DynamicArray*
+  store %struct.DynamicArray* %14, %struct.DynamicArray** %4, align 8
+  %15 = load %struct.DynamicArray*, %struct.DynamicArray** %4, align 8
+  %16 = icmp ne %struct.DynamicArray* %15, null
+  br i1 %16, label %18, label %17
+
+17:                                               ; preds = %12
+  call void @setErrorMessage(i8* getelementptr inbounds ([49 x i8], [49 x i8]* @.str.8, i64 0, i64 0))
+  store %struct.DynamicArray* null, %struct.DynamicArray** %2, align 8
+  br label %44
+
+18:                                               ; preds = %12
+  %19 = load i32, i32* %3, align 4
+  %20 = sext i32 %19 to i64
+  %21 = mul i64 4, %20
+  %22 = call noalias i8* @malloc(i64 %21) #7
+  %23 = bitcast i8* %22 to i32*
+  %24 = load %struct.DynamicArray*, %struct.DynamicArray** %4, align 8
+  %25 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %24, i32 0, i32 0
+  store i32* %23, i32** %25, align 8
+  %26 = load %struct.DynamicArray*, %struct.DynamicArray** %4, align 8
+  %27 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %26, i32 0, i32 0
+  %28 = load i32*, i32** %27, align 8
+  %29 = icmp ne i32* %28, null
+  br i1 %29, label %33, label %30
+
+30:                                               ; preds = %18
+  %31 = load %struct.DynamicArray*, %struct.DynamicArray** %4, align 8
+  %32 = bitcast %struct.DynamicArray* %31 to i8*
+  call void @free(i8* %32) #7
+  call void @setErrorMessage(i8* getelementptr inbounds ([35 x i8], [35 x i8]* @.str.9, i64 0, i64 0))
+  store %struct.DynamicArray* null, %struct.DynamicArray** %2, align 8
+  br label %44
+
+33:                                               ; preds = %18
+  %34 = load %struct.DynamicArray*, %struct.DynamicArray** %4, align 8
+  %35 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %34, i32 0, i32 1
+  store i32 0, i32* %35, align 8
+  %36 = load i32, i32* %3, align 4
+  %37 = load %struct.DynamicArray*, %struct.DynamicArray** %4, align 8
+  %38 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %37, i32 0, i32 2
+  store i32 %36, i32* %38, align 4
+  %39 = load %struct.DynamicArray*, %struct.DynamicArray** %4, align 8
+  %40 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %39, i32 0, i32 3
+  store i32 1, i32* %40, align 8
+  %41 = load %struct.DynamicArray*, %struct.DynamicArray** %4, align 8
+  %42 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %41, i32 0, i32 4
+  store i32 0, i32* %42, align 4
+  %43 = load %struct.DynamicArray*, %struct.DynamicArray** %4, align 8
+  store %struct.DynamicArray* %43, %struct.DynamicArray** %2, align 8
+  br label %44
+
+44:                                               ; preds = %33, %30, %17, %11, %7
+  %45 = load %struct.DynamicArray*, %struct.DynamicArray** %2, align 8
+  ret %struct.DynamicArray* %45
+}
+
+; Function Attrs: nounwind
+declare dso_local noalias i8* @malloc(i64) #1
+
+; Function Attrs: noinline nounwind optnone uwtable
+define dso_local void @pushBack(%struct.DynamicArray* %0, i32 %1) #0 !project_source !2 {
+  %3 = alloca %struct.DynamicArray*, align 8
+  %4 = alloca i32, align 4
+  %5 = alloca i32, align 4
+  %6 = alloca i32*, align 8
+  store %struct.DynamicArray* %0, %struct.DynamicArray** %3, align 8
+  store i32 %1, i32* %4, align 4
+  %7 = load %struct.DynamicArray*, %struct.DynamicArray** %3, align 8
+  %8 = icmp ne %struct.DynamicArray* %7, null
+  br i1 %8, label %10, label %9
+
+9:                                                ; preds = %2
+  call void @setErrorMessage(i8* getelementptr inbounds ([19 x i8], [19 x i8]* @.str.10, i64 0, i64 0))
+  br label %91
+
+10:                                               ; preds = %2
+  %11 = load %struct.DynamicArray*, %struct.DynamicArray** %3, align 8
+  %12 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %11, i32 0, i32 1
+  %13 = load i32, i32* %12, align 8
+  %14 = icmp sge i32 %13, 1000
+  br i1 %14, label %15, label %16
+
+15:                                               ; preds = %10
+  call void @setErrorMessage(i8* getelementptr inbounds ([25 x i8], [25 x i8]* @.str.11, i64 0, i64 0))
+  br label %91
+
+16:                                               ; preds = %10
+  %17 = load %struct.DynamicArray*, %struct.DynamicArray** %3, align 8
+  %18 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %17, i32 0, i32 1
+  %19 = load i32, i32* %18, align 8
+  %20 = load %struct.DynamicArray*, %struct.DynamicArray** %3, align 8
+  %21 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %20, i32 0, i32 2
+  %22 = load i32, i32* %21, align 4
+  %23 = icmp sge i32 %19, %22
+  br i1 %23, label %24, label %52
+
+24:                                               ; preds = %16
+  %25 = load %struct.DynamicArray*, %struct.DynamicArray** %3, align 8
+  %26 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %25, i32 0, i32 2
+  %27 = load i32, i32* %26, align 4
+  %28 = mul nsw i32 %27, 2
+  store i32 %28, i32* %5, align 4
+  %29 = load i32, i32* %5, align 4
+  %30 = icmp sgt i32 %29, 1000
+  br i1 %30, label %31, label %32
+
+31:                                               ; preds = %24
+  store i32 1000, i32* %5, align 4
+  br label %32
+
+32:                                               ; preds = %31, %24
+  %33 = load %struct.DynamicArray*, %struct.DynamicArray** %3, align 8
+  %34 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %33, i32 0, i32 0
+  %35 = load i32*, i32** %34, align 8
+  %36 = bitcast i32* %35 to i8*
+  %37 = load i32, i32* %5, align 4
+  %38 = sext i32 %37 to i64
+  %39 = mul i64 4, %38
+  %40 = call i8* @realloc(i8* %36, i64 %39) #7
+  %41 = bitcast i8* %40 to i32*
+  store i32* %41, i32** %6, align 8
+  %42 = load i32*, i32** %6, align 8
+  %43 = icmp ne i32* %42, null
+  br i1 %43, label %45, label %44
+
+44:                                               ; preds = %32
+  call void @setErrorMessage(i8* getelementptr inbounds ([27 x i8], [27 x i8]* @.str.12, i64 0, i64 0))
+  br label %91
+
+45:                                               ; preds = %32
+  %46 = load i32*, i32** %6, align 8
+  %47 = load %struct.DynamicArray*, %struct.DynamicArray** %3, align 8
+  %48 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %47, i32 0, i32 0
+  store i32* %46, i32** %48, align 8
+  %49 = load i32, i32* %5, align 4
+  %50 = load %struct.DynamicArray*, %struct.DynamicArray** %3, align 8
+  %51 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %50, i32 0, i32 2
+  store i32 %49, i32* %51, align 4
+  br label %52
+
+52:                                               ; preds = %45, %16
+  %53 = load %struct.DynamicArray*, %struct.DynamicArray** %3, align 8
+  %54 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %53, i32 0, i32 3
+  %55 = load i32, i32* %54, align 8
+  %56 = icmp ne i32 %55, 0
+  br i1 %56, label %57, label %78
+
+57:                                               ; preds = %52
+  %58 = load %struct.DynamicArray*, %struct.DynamicArray** %3, align 8
+  %59 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %58, i32 0, i32 1
+  %60 = load i32, i32* %59, align 8
+  %61 = icmp sgt i32 %60, 0
+  br i1 %61, label %62, label %78
+
+62:                                               ; preds = %57
+  %63 = load i32, i32* %4, align 4
+  %64 = load %struct.DynamicArray*, %struct.DynamicArray** %3, align 8
+  %65 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %64, i32 0, i32 0
+  %66 = load i32*, i32** %65, align 8
+  %67 = load %struct.DynamicArray*, %struct.DynamicArray** %3, align 8
+  %68 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %67, i32 0, i32 1
+  %69 = load i32, i32* %68, align 8
+  %70 = sub nsw i32 %69, 1
+  %71 = sext i32 %70 to i64
+  %72 = getelementptr inbounds i32, i32* %66, i64 %71
+  %73 = load i32, i32* %72, align 4
+  %74 = icmp slt i32 %63, %73
+  br i1 %74, label %75, label %78
+
+75:                                               ; preds = %62
+  %76 = load %struct.DynamicArray*, %struct.DynamicArray** %3, align 8
+  %77 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %76, i32 0, i32 3
+  store i32 0, i32* %77, align 8
+  br label %78
+
+78:                                               ; preds = %75, %62, %57, %52
+  %79 = load i32, i32* %4, align 4
+  %80 = load %struct.DynamicArray*, %struct.DynamicArray** %3, align 8
+  %81 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %80, i32 0, i32 0
+  %82 = load i32*, i32** %81, align 8
+  %83 = load %struct.DynamicArray*, %struct.DynamicArray** %3, align 8
+  %84 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %83, i32 0, i32 1
+  %85 = load i32, i32* %84, align 8
+  %86 = add nsw i32 %85, 1
+  store i32 %86, i32* %84, align 8
+  %87 = sext i32 %85 to i64
+  %88 = getelementptr inbounds i32, i32* %82, i64 %87
+  store i32 %79, i32* %88, align 4
+  %89 = load %struct.DynamicArray*, %struct.DynamicArray** %3, align 8
+  %90 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %89, i32 0, i32 4
+  store i32 1, i32* %90, align 4
+  br label %91
+
+91:                                               ; preds = %78, %44, %15, %9
+  ret void
+}
+
+; Function Attrs: nounwind
+declare dso_local i8* @realloc(i8*, i64) #1
+
+; Function Attrs: noinline nounwind optnone uwtable
+define dso_local void @quickSort(i32* %0, i32 %1, i32 %2, i32* %3) #0 !project_source !2 {
+  %5 = alloca i32*, align 8
+  %6 = alloca i32, align 4
+  %7 = alloca i32, align 4
+  %8 = alloca i32*, align 8
+  %9 = alloca i32, align 4
+  %10 = alloca i32, align 4
+  %11 = alloca i32, align 4
+  %12 = alloca i32, align 4
+  %13 = alloca i32, align 4
+  %14 = alloca i32, align 4
+  store i32* %0, i32** %5, align 8
+  store i32 %1, i32* %6, align 4
+  store i32 %2, i32* %7, align 4
+  store i32* %3, i32** %8, align 8
+  %15 = load i32, i32* @recursionDepth, align 4
+  %16 = add nsw i32 %15, 1
+  store i32 %16, i32* @recursionDepth, align 4
+  %17 = icmp sgt i32 %16, 1000
+  br i1 %17, label %18, label %22
+
+18:                                               ; preds = %4
+  call void @setErrorMessage(i8* getelementptr inbounds ([46 x i8], [46 x i8]* @.str.13, i64 0, i64 0))
+  %19 = load i32*, i32** %8, align 8
+  store i32 1, i32* %19, align 4
+  %20 = load i32, i32* @recursionDepth, align 4
+  %21 = add nsw i32 %20, -1
+  store i32 %21, i32* @recursionDepth, align 4
+  br label %247
+
+22:                                               ; preds = %4
+  %23 = load i32*, i32** %5, align 8
+  %24 = icmp ne i32* %23, null
+  br i1 %24, label %29, label %25
+
+25:                                               ; preds = %22
+  call void @setErrorMessage(i8* getelementptr inbounds ([32 x i8], [32 x i8]* @.str.14, i64 0, i64 0))
+  %26 = load i32*, i32** %8, align 8
+  store i32 1, i32* %26, align 4
+  %27 = load i32, i32* @recursionDepth, align 4
+  %28 = add nsw i32 %27, -1
+  store i32 %28, i32* @recursionDepth, align 4
+  br label %247
+
+29:                                               ; preds = %22
+  %30 = load i32, i32* %6, align 4
+  %31 = icmp slt i32 %30, 0
+  br i1 %31, label %41, label %32
+
+32:                                               ; preds = %29
+  %33 = load i32, i32* %7, align 4
+  %34 = icmp slt i32 %33, 0
+  br i1 %34, label %41, label %35
+
+35:                                               ; preds = %32
+  %36 = load i32, i32* %6, align 4
+  %37 = icmp sge i32 %36, 1000
+  br i1 %37, label %41, label %38
+
+38:                                               ; preds = %35
+  %39 = load i32, i32* %7, align 4
+  %40 = icmp sge i32 %39, 1000
+  br i1 %40, label %41, label %45
+
+41:                                               ; preds = %38, %35, %32, %29
+  call void @setErrorMessage(i8* getelementptr inbounds ([39 x i8], [39 x i8]* @.str.15, i64 0, i64 0))
+  %42 = load i32*, i32** %8, align 8
+  store i32 1, i32* %42, align 4
+  %43 = load i32, i32* @recursionDepth, align 4
+  %44 = add nsw i32 %43, -1
+  store i32 %44, i32* @recursionDepth, align 4
+  br label %247
+
+45:                                               ; preds = %38
+  %46 = load i32, i32* %6, align 4
+  %47 = load i32, i32* %7, align 4
+  %48 = icmp slt i32 %46, %47
+  br i1 %48, label %49, label %244
+
+49:                                               ; preds = %45
+  %50 = load i32, i32* %6, align 4
+  %51 = load i32, i32* %7, align 4
+  %52 = load i32, i32* %6, align 4
+  %53 = sub nsw i32 %51, %52
+  %54 = sdiv i32 %53, 2
+  %55 = add nsw i32 %50, %54
+  store i32 %55, i32* %9, align 4
+  %56 = load i32*, i32** %5, align 8
+  %57 = load i32, i32* %6, align 4
+  %58 = sext i32 %57 to i64
+  %59 = getelementptr inbounds i32, i32* %56, i64 %58
+  %60 = load i32, i32* %59, align 4
+  %61 = load i32*, i32** %5, align 8
+  %62 = load i32, i32* %9, align 4
+  %63 = sext i32 %62 to i64
+  %64 = getelementptr inbounds i32, i32* %61, i64 %63
+  %65 = load i32, i32* %64, align 4
+  %66 = icmp sle i32 %60, %65
+  br i1 %66, label %67, label %99
+
+67:                                               ; preds = %49
+  %68 = load i32*, i32** %5, align 8
+  %69 = load i32, i32* %9, align 4
+  %70 = sext i32 %69 to i64
+  %71 = getelementptr inbounds i32, i32* %68, i64 %70
+  %72 = load i32, i32* %71, align 4
+  %73 = load i32*, i32** %5, align 8
+  %74 = load i32, i32* %7, align 4
+  %75 = sext i32 %74 to i64
+  %76 = getelementptr inbounds i32, i32* %73, i64 %75
+  %77 = load i32, i32* %76, align 4
+  %78 = icmp sle i32 %72, %77
+  br i1 %78, label %79, label %81
+
+79:                                               ; preds = %67
+  %80 = load i32, i32* %9, align 4
+  store i32 %80, i32* %10, align 4
+  br label %98
+
+81:                                               ; preds = %67
+  %82 = load i32*, i32** %5, align 8
+  %83 = load i32, i32* %6, align 4
+  %84 = sext i32 %83 to i64
+  %85 = getelementptr inbounds i32, i32* %82, i64 %84
+  %86 = load i32, i32* %85, align 4
+  %87 = load i32*, i32** %5, align 8
+  %88 = load i32, i32* %7, align 4
+  %89 = sext i32 %88 to i64
+  %90 = getelementptr inbounds i32, i32* %87, i64 %89
+  %91 = load i32, i32* %90, align 4
+  %92 = icmp sle i32 %86, %91
+  br i1 %92, label %93, label %95
+
+93:                                               ; preds = %81
+  %94 = load i32, i32* %7, align 4
+  store i32 %94, i32* %10, align 4
+  br label %97
+
+95:                                               ; preds = %81
+  %96 = load i32, i32* %6, align 4
+  store i32 %96, i32* %10, align 4
+  br label %97
+
+97:                                               ; preds = %95, %93
+  br label %98
+
+98:                                               ; preds = %97, %79
+  br label %131
+
+99:                                               ; preds = %49
+  %100 = load i32*, i32** %5, align 8
+  %101 = load i32, i32* %6, align 4
+  %102 = sext i32 %101 to i64
+  %103 = getelementptr inbounds i32, i32* %100, i64 %102
+  %104 = load i32, i32* %103, align 4
+  %105 = load i32*, i32** %5, align 8
+  %106 = load i32, i32* %7, align 4
+  %107 = sext i32 %106 to i64
+  %108 = getelementptr inbounds i32, i32* %105, i64 %107
+  %109 = load i32, i32* %108, align 4
+  %110 = icmp sle i32 %104, %109
+  br i1 %110, label %111, label %113
+
+111:                                              ; preds = %99
+  %112 = load i32, i32* %6, align 4
+  store i32 %112, i32* %10, align 4
+  br label %130
+
+113:                                              ; preds = %99
+  %114 = load i32*, i32** %5, align 8
+  %115 = load i32, i32* %9, align 4
+  %116 = sext i32 %115 to i64
+  %117 = getelementptr inbounds i32, i32* %114, i64 %116
+  %118 = load i32, i32* %117, align 4
+  %119 = load i32*, i32** %5, align 8
+  %120 = load i32, i32* %7, align 4
+  %121 = sext i32 %120 to i64
+  %122 = getelementptr inbounds i32, i32* %119, i64 %121
+  %123 = load i32, i32* %122, align 4
+  %124 = icmp sle i32 %118, %123
+  br i1 %124, label %125, label %127
+
+125:                                              ; preds = %113
+  %126 = load i32, i32* %7, align 4
+  store i32 %126, i32* %10, align 4
+  br label %129
+
+127:                                              ; preds = %113
+  %128 = load i32, i32* %9, align 4
+  store i32 %128, i32* %10, align 4
+  br label %129
+
+129:                                              ; preds = %127, %125
+  br label %130
+
+130:                                              ; preds = %129, %111
+  br label %131
+
+131:                                              ; preds = %130, %98
+  %132 = load i32*, i32** %5, align 8
+  %133 = load i32, i32* %7, align 4
+  %134 = sext i32 %133 to i64
+  %135 = getelementptr inbounds i32, i32* %132, i64 %134
+  %136 = load i32, i32* %135, align 4
+  store i32 %136, i32* %11, align 4
+  %137 = load i32*, i32** %5, align 8
+  %138 = load i32, i32* %10, align 4
+  %139 = sext i32 %138 to i64
+  %140 = getelementptr inbounds i32, i32* %137, i64 %139
+  %141 = load i32, i32* %140, align 4
+  %142 = load i32*, i32** %5, align 8
+  %143 = load i32, i32* %7, align 4
+  %144 = sext i32 %143 to i64
+  %145 = getelementptr inbounds i32, i32* %142, i64 %144
+  store i32 %141, i32* %145, align 4
+  %146 = load i32, i32* %11, align 4
+  %147 = load i32*, i32** %5, align 8
+  %148 = load i32, i32* %10, align 4
+  %149 = sext i32 %148 to i64
+  %150 = getelementptr inbounds i32, i32* %147, i64 %149
+  store i32 %146, i32* %150, align 4
+  %151 = load i32*, i32** %5, align 8
+  %152 = load i32, i32* %7, align 4
+  %153 = sext i32 %152 to i64
+  %154 = getelementptr inbounds i32, i32* %151, i64 %153
+  %155 = load i32, i32* %154, align 4
+  store i32 %155, i32* %12, align 4
+  %156 = load i32, i32* %6, align 4
+  %157 = sub nsw i32 %156, 1
+  store i32 %157, i32* %13, align 4
+  %158 = load i32, i32* %6, align 4
+  store i32 %158, i32* %14, align 4
+  br label %159
+
+159:                                              ; preds = %196, %131
+  %160 = load i32, i32* %14, align 4
+  %161 = load i32, i32* %7, align 4
+  %162 = icmp slt i32 %160, %161
+  br i1 %162, label %163, label %199
+
+163:                                              ; preds = %159
+  %164 = load i32*, i32** %5, align 8
+  %165 = load i32, i32* %14, align 4
+  %166 = sext i32 %165 to i64
+  %167 = getelementptr inbounds i32, i32* %164, i64 %166
+  %168 = load i32, i32* %167, align 4
+  %169 = load i32, i32* %12, align 4
+  %170 = icmp sle i32 %168, %169
+  br i1 %170, label %171, label %195
+
+171:                                              ; preds = %163
+  %172 = load i32, i32* %13, align 4
+  %173 = add nsw i32 %172, 1
+  store i32 %173, i32* %13, align 4
+  %174 = load i32*, i32** %5, align 8
+  %175 = load i32, i32* %13, align 4
+  %176 = sext i32 %175 to i64
+  %177 = getelementptr inbounds i32, i32* %174, i64 %176
+  %178 = load i32, i32* %177, align 4
+  store i32 %178, i32* %11, align 4
+  %179 = load i32*, i32** %5, align 8
+  %180 = load i32, i32* %14, align 4
+  %181 = sext i32 %180 to i64
+  %182 = getelementptr inbounds i32, i32* %179, i64 %181
+  %183 = load i32, i32* %182, align 4
+  %184 = load i32*, i32** %5, align 8
+  %185 = load i32, i32* %13, align 4
+  %186 = sext i32 %185 to i64
+  %187 = getelementptr inbounds i32, i32* %184, i64 %186
+  store i32 %183, i32* %187, align 4
+  %188 = load i32, i32* %11, align 4
+  %189 = load i32*, i32** %5, align 8
+  %190 = load i32, i32* %14, align 4
+  %191 = sext i32 %190 to i64
+  %192 = getelementptr inbounds i32, i32* %189, i64 %191
+  store i32 %188, i32* %192, align 4
+  %193 = load i32, i32* @globalCounter, align 4
+  %194 = add nsw i32 %193, 1
+  store i32 %194, i32* @globalCounter, align 4
+  br label %195
+
+195:                                              ; preds = %171, %163
+  br label %196
+
+196:                                              ; preds = %195
+  %197 = load i32, i32* %14, align 4
+  %198 = add nsw i32 %197, 1
+  store i32 %198, i32* %14, align 4
+  br label %159
+
+199:                                              ; preds = %159
+  %200 = load i32*, i32** %5, align 8
+  %201 = load i32, i32* %13, align 4
+  %202 = add nsw i32 %201, 1
+  %203 = sext i32 %202 to i64
+  %204 = getelementptr inbounds i32, i32* %200, i64 %203
+  %205 = load i32, i32* %204, align 4
+  store i32 %205, i32* %11, align 4
+  %206 = load i32*, i32** %5, align 8
+  %207 = load i32, i32* %7, align 4
+  %208 = sext i32 %207 to i64
+  %209 = getelementptr inbounds i32, i32* %206, i64 %208
+  %210 = load i32, i32* %209, align 4
+  %211 = load i32*, i32** %5, align 8
+  %212 = load i32, i32* %13, align 4
+  %213 = add nsw i32 %212, 1
+  %214 = sext i32 %213 to i64
+  %215 = getelementptr inbounds i32, i32* %211, i64 %214
+  store i32 %210, i32* %215, align 4
+  %216 = load i32, i32* %11, align 4
+  %217 = load i32*, i32** %5, align 8
+  %218 = load i32, i32* %7, align 4
+  %219 = sext i32 %218 to i64
+  %220 = getelementptr inbounds i32, i32* %217, i64 %219
+  store i32 %216, i32* %220, align 4
+  %221 = load i32*, i32** %5, align 8
+  %222 = load i32, i32* %6, align 4
+  %223 = load i32, i32* %13, align 4
+  %224 = load i32*, i32** %8, align 8
+  call void @quickSort(i32* %221, i32 %222, i32 %223, i32* %224)
+  %225 = load i32*, i32** %8, align 8
+  %226 = load i32, i32* %225, align 4
+  %227 = icmp ne i32 %226, 0
+  br i1 %227, label %228, label %231
+
+228:                                              ; preds = %199
+  %229 = load i32, i32* @recursionDepth, align 4
+  %230 = add nsw i32 %229, -1
+  store i32 %230, i32* @recursionDepth, align 4
+  br label %247
+
+231:                                              ; preds = %199
+  %232 = load i32*, i32** %5, align 8
+  %233 = load i32, i32* %13, align 4
+  %234 = add nsw i32 %233, 2
+  %235 = load i32, i32* %7, align 4
+  %236 = load i32*, i32** %8, align 8
+  call void @quickSort(i32* %232, i32 %234, i32 %235, i32* %236)
+  %237 = load i32*, i32** %8, align 8
+  %238 = load i32, i32* %237, align 4
+  %239 = icmp ne i32 %238, 0
+  br i1 %239, label %240, label %243
+
+240:                                              ; preds = %231
+  %241 = load i32, i32* @recursionDepth, align 4
+  %242 = add nsw i32 %241, -1
+  store i32 %242, i32* @recursionDepth, align 4
+  br label %247
+
+243:                                              ; preds = %231
+  br label %244
+
+244:                                              ; preds = %243, %45
+  %245 = load i32, i32* @recursionDepth, align 4
+  %246 = add nsw i32 %245, -1
+  store i32 %246, i32* @recursionDepth, align 4
+  br label %247
+
+247:                                              ; preds = %244, %240, %228, %41, %25, %18
+  ret void
+}
+
+; Function Attrs: noinline nounwind optnone uwtable
+define dso_local %struct.Matrix* @createMatrix(i32 %0, i32 %1) #0 !project_source !2 {
+  %3 = alloca %struct.Matrix*, align 8
+  %4 = alloca i32, align 4
+  %5 = alloca i32, align 4
+  %6 = alloca %struct.Matrix*, align 8
+  %7 = alloca i32, align 4
+  %8 = alloca i32, align 4
+  store i32 %0, i32* %4, align 4
+  store i32 %1, i32* %5, align 4
+  %9 = load i32, i32* %4, align 4
+  %10 = icmp slt i32 %9, 1
+  br i1 %10, label %14, label %11
+
+11:                                               ; preds = %2
+  %12 = load i32, i32* %5, align 4
+  %13 = icmp slt i32 %12, 1
+  br i1 %13, label %14, label %15
+
+14:                                               ; preds = %11, %2
+  call void @setErrorMessage(i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.str.16, i64 0, i64 0))
+  store %struct.Matrix* null, %struct.Matrix** %3, align 8
+  br label %111
+
+15:                                               ; preds = %11
+  %16 = load i32, i32* %4, align 4
+  %17 = icmp sgt i32 %16, 100
+  br i1 %17, label %21, label %18
+
+18:                                               ; preds = %15
+  %19 = load i32, i32* %5, align 4
+  %20 = icmp sgt i32 %19, 100
+  br i1 %20, label %21, label %22
+
+21:                                               ; preds = %18, %15
+  call void @setErrorMessage(i8* getelementptr inbounds ([46 x i8], [46 x i8]* @.str.17, i64 0, i64 0))
+  store %struct.Matrix* null, %struct.Matrix** %3, align 8
+  br label %111
+
+22:                                               ; preds = %18
+  %23 = call noalias i8* @malloc(i64 32) #7
+  %24 = bitcast i8* %23 to %struct.Matrix*
+  store %struct.Matrix* %24, %struct.Matrix** %6, align 8
+  %25 = load %struct.Matrix*, %struct.Matrix** %6, align 8
+  %26 = icmp ne %struct.Matrix* %25, null
+  br i1 %26, label %28, label %27
+
+27:                                               ; preds = %22
+  call void @setErrorMessage(i8* getelementptr inbounds ([43 x i8], [43 x i8]* @.str.18, i64 0, i64 0))
+  store %struct.Matrix* null, %struct.Matrix** %3, align 8
+  br label %111
+
+28:                                               ; preds = %22
+  %29 = load i32, i32* %4, align 4
+  %30 = load %struct.Matrix*, %struct.Matrix** %6, align 8
+  %31 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %30, i32 0, i32 1
+  store i32 %29, i32* %31, align 8
+  %32 = load i32, i32* %5, align 4
+  %33 = load %struct.Matrix*, %struct.Matrix** %6, align 8
+  %34 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %33, i32 0, i32 2
+  store i32 %32, i32* %34, align 4
+  %35 = load i32, i32* %4, align 4
+  %36 = load i32, i32* %5, align 4
+  %37 = icmp eq i32 %35, %36
+  %38 = zext i1 %37 to i32
+  %39 = load %struct.Matrix*, %struct.Matrix** %6, align 8
+  %40 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %39, i32 0, i32 3
+  store i32 %38, i32* %40, align 8
+  %41 = load %struct.Matrix*, %struct.Matrix** %6, align 8
+  %42 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %41, i32 0, i32 4
+  store double 0.000000e+00, double* %42, align 8
+  %43 = load i32, i32* %4, align 4
+  %44 = sext i32 %43 to i64
+  %45 = mul i64 %44, 8
+  %46 = call noalias i8* @malloc(i64 %45) #7
+  %47 = bitcast i8* %46 to i32**
+  %48 = load %struct.Matrix*, %struct.Matrix** %6, align 8
+  %49 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %48, i32 0, i32 0
+  store i32** %47, i32*** %49, align 8
+  %50 = load %struct.Matrix*, %struct.Matrix** %6, align 8
+  %51 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %50, i32 0, i32 0
+  %52 = load i32**, i32*** %51, align 8
+  %53 = icmp ne i32** %52, null
+  br i1 %53, label %57, label %54
+
+54:                                               ; preds = %28
+  %55 = load %struct.Matrix*, %struct.Matrix** %6, align 8
+  %56 = bitcast %struct.Matrix* %55 to i8*
+  call void @free(i8* %56) #7
+  call void @setErrorMessage(i8* getelementptr inbounds ([41 x i8], [41 x i8]* @.str.19, i64 0, i64 0))
+  store %struct.Matrix* null, %struct.Matrix** %3, align 8
+  br label %111
+
+57:                                               ; preds = %28
+  store i32 0, i32* %7, align 4
+  br label %58
+
+58:                                               ; preds = %106, %57
+  %59 = load i32, i32* %7, align 4
+  %60 = load i32, i32* %4, align 4
+  %61 = icmp slt i32 %59, %60
+  br i1 %61, label %62, label %109
+
+62:                                               ; preds = %58
+  %63 = load i32, i32* %5, align 4
+  %64 = sext i32 %63 to i64
+  %65 = call noalias i8* @calloc(i64 %64, i64 4) #7
+  %66 = bitcast i8* %65 to i32*
+  %67 = load %struct.Matrix*, %struct.Matrix** %6, align 8
+  %68 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %67, i32 0, i32 0
+  %69 = load i32**, i32*** %68, align 8
+  %70 = load i32, i32* %7, align 4
+  %71 = sext i32 %70 to i64
+  %72 = getelementptr inbounds i32*, i32** %69, i64 %71
+  store i32* %66, i32** %72, align 8
+  %73 = load %struct.Matrix*, %struct.Matrix** %6, align 8
+  %74 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %73, i32 0, i32 0
+  %75 = load i32**, i32*** %74, align 8
+  %76 = load i32, i32* %7, align 4
+  %77 = sext i32 %76 to i64
+  %78 = getelementptr inbounds i32*, i32** %75, i64 %77
+  %79 = load i32*, i32** %78, align 8
+  %80 = icmp ne i32* %79, null
+  br i1 %80, label %105, label %81
+
+81:                                               ; preds = %62
+  store i32 0, i32* %8, align 4
+  br label %82
+
+82:                                               ; preds = %95, %81
+  %83 = load i32, i32* %8, align 4
+  %84 = load i32, i32* %7, align 4
+  %85 = icmp slt i32 %83, %84
+  br i1 %85, label %86, label %98
+
+86:                                               ; preds = %82
+  %87 = load %struct.Matrix*, %struct.Matrix** %6, align 8
+  %88 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %87, i32 0, i32 0
+  %89 = load i32**, i32*** %88, align 8
+  %90 = load i32, i32* %8, align 4
+  %91 = sext i32 %90 to i64
+  %92 = getelementptr inbounds i32*, i32** %89, i64 %91
+  %93 = load i32*, i32** %92, align 8
+  %94 = bitcast i32* %93 to i8*
+  call void @free(i8* %94) #7
+  br label %95
+
+95:                                               ; preds = %86
+  %96 = load i32, i32* %8, align 4
+  %97 = add nsw i32 %96, 1
+  store i32 %97, i32* %8, align 4
+  br label %82
+
+98:                                               ; preds = %82
+  %99 = load %struct.Matrix*, %struct.Matrix** %6, align 8
+  %100 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %99, i32 0, i32 0
+  %101 = load i32**, i32*** %100, align 8
+  %102 = bitcast i32** %101 to i8*
+  call void @free(i8* %102) #7
+  %103 = load %struct.Matrix*, %struct.Matrix** %6, align 8
+  %104 = bitcast %struct.Matrix* %103 to i8*
+  call void @free(i8* %104) #7
+  call void @setErrorMessage(i8* getelementptr inbounds ([44 x i8], [44 x i8]* @.str.20, i64 0, i64 0))
+  store %struct.Matrix* null, %struct.Matrix** %3, align 8
+  br label %111
+
+105:                                              ; preds = %62
+  br label %106
+
+106:                                              ; preds = %105
+  %107 = load i32, i32* %7, align 4
+  %108 = add nsw i32 %107, 1
+  store i32 %108, i32* %7, align 4
+  br label %58
+
+109:                                              ; preds = %58
+  %110 = load %struct.Matrix*, %struct.Matrix** %6, align 8
+  store %struct.Matrix* %110, %struct.Matrix** %3, align 8
+  br label %111
+
+111:                                              ; preds = %109, %98, %54, %27, %21, %14
+  %112 = load %struct.Matrix*, %struct.Matrix** %3, align 8
+  ret %struct.Matrix* %112
+}
+
+; Function Attrs: nounwind
+declare dso_local noalias i8* @calloc(i64, i64) #1
+
+; Function Attrs: noinline nounwind optnone uwtable
+define dso_local %struct.Matrix* @multiplyMatrices(%struct.Matrix* %0, %struct.Matrix* %1) #0 !project_source !2 {
+  %3 = alloca %struct.Matrix*, align 8
+  %4 = alloca %struct.Matrix*, align 8
+  %5 = alloca %struct.Matrix*, align 8
+  %6 = alloca %struct.Matrix*, align 8
+  %7 = alloca i64, align 8
+  %8 = alloca i32, align 4
+  %9 = alloca i32, align 4
+  %10 = alloca i64, align 8
+  %11 = alloca i32, align 4
+  %12 = alloca i64, align 8
+  %13 = alloca i32, align 4
+  store %struct.Matrix* %0, %struct.Matrix** %4, align 8
+  store %struct.Matrix* %1, %struct.Matrix** %5, align 8
+  %14 = load %struct.Matrix*, %struct.Matrix** %4, align 8
+  %15 = icmp ne %struct.Matrix* %14, null
+  br i1 %15, label %16, label %19
+
+16:                                               ; preds = %2
+  %17 = load %struct.Matrix*, %struct.Matrix** %5, align 8
+  %18 = icmp ne %struct.Matrix* %17, null
+  br i1 %18, label %20, label %19
+
+19:                                               ; preds = %16, %2
+  call void @setErrorMessage(i8* getelementptr inbounds ([20 x i8], [20 x i8]* @.str.21, i64 0, i64 0))
+  store %struct.Matrix* null, %struct.Matrix** %3, align 8
+  br label %209
+
+20:                                               ; preds = %16
+  %21 = load %struct.Matrix*, %struct.Matrix** %4, align 8
+  %22 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %21, i32 0, i32 0
+  %23 = load i32**, i32*** %22, align 8
+  %24 = icmp ne i32** %23, null
+  br i1 %24, label %25, label %30
+
+25:                                               ; preds = %20
+  %26 = load %struct.Matrix*, %struct.Matrix** %5, align 8
+  %27 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %26, i32 0, i32 0
+  %28 = load i32**, i32*** %27, align 8
+  %29 = icmp ne i32** %28, null
+  br i1 %29, label %31, label %30
+
+30:                                               ; preds = %25, %20
+  call void @setErrorMessage(i8* getelementptr inbounds ([20 x i8], [20 x i8]* @.str.22, i64 0, i64 0))
+  store %struct.Matrix* null, %struct.Matrix** %3, align 8
+  br label %209
+
+31:                                               ; preds = %25
+  %32 = load %struct.Matrix*, %struct.Matrix** %4, align 8
+  %33 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %32, i32 0, i32 2
+  %34 = load i32, i32* %33, align 4
+  %35 = load %struct.Matrix*, %struct.Matrix** %5, align 8
+  %36 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %35, i32 0, i32 1
+  %37 = load i32, i32* %36, align 8
+  %38 = icmp ne i32 %34, %37
+  br i1 %38, label %39, label %40
+
+39:                                               ; preds = %31
+  call void @setErrorMessage(i8* getelementptr inbounds ([45 x i8], [45 x i8]* @.str.23, i64 0, i64 0))
+  store %struct.Matrix* null, %struct.Matrix** %3, align 8
+  br label %209
+
+40:                                               ; preds = %31
+  %41 = load %struct.Matrix*, %struct.Matrix** %4, align 8
+  %42 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %41, i32 0, i32 2
+  %43 = load i32, i32* %42, align 4
+  %44 = icmp sgt i32 %43, 100
+  br i1 %44, label %50, label %45
+
+45:                                               ; preds = %40
+  %46 = load %struct.Matrix*, %struct.Matrix** %5, align 8
+  %47 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %46, i32 0, i32 1
+  %48 = load i32, i32* %47, align 8
+  %49 = icmp sgt i32 %48, 100
+  br i1 %49, label %50, label %51
+
+50:                                               ; preds = %45, %40
+  call void @setErrorMessage(i8* getelementptr inbounds ([46 x i8], [46 x i8]* @.str.17, i64 0, i64 0))
+  store %struct.Matrix* null, %struct.Matrix** %3, align 8
+  br label %209
+
+51:                                               ; preds = %45
+  %52 = load %struct.Matrix*, %struct.Matrix** %4, align 8
+  %53 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %52, i32 0, i32 1
+  %54 = load i32, i32* %53, align 8
+  %55 = load %struct.Matrix*, %struct.Matrix** %5, align 8
+  %56 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %55, i32 0, i32 2
+  %57 = load i32, i32* %56, align 4
+  %58 = call %struct.Matrix* @createMatrix(i32 %54, i32 %57)
+  store %struct.Matrix* %58, %struct.Matrix** %6, align 8
+  %59 = load %struct.Matrix*, %struct.Matrix** %6, align 8
+  %60 = icmp ne %struct.Matrix* %59, null
+  br i1 %60, label %62, label %61
+
+61:                                               ; preds = %51
+  store %struct.Matrix* null, %struct.Matrix** %3, align 8
+  br label %209
+
+62:                                               ; preds = %51
+  store i64 0, i64* %7, align 8
+  store i32 0, i32* %8, align 4
+  br label %63
+
+63:                                               ; preds = %194, %62
+  %64 = load i32, i32* %8, align 4
+  %65 = load %struct.Matrix*, %struct.Matrix** %4, align 8
+  %66 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %65, i32 0, i32 1
+  %67 = load i32, i32* %66, align 8
+  %68 = icmp slt i32 %64, %67
+  br i1 %68, label %69, label %197
+
+69:                                               ; preds = %63
+  store i32 0, i32* %9, align 4
+  br label %70
+
+70:                                               ; preds = %190, %69
+  %71 = load i32, i32* %9, align 4
+  %72 = load %struct.Matrix*, %struct.Matrix** %5, align 8
+  %73 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %72, i32 0, i32 2
+  %74 = load i32, i32* %73, align 4
+  %75 = icmp slt i32 %71, %74
+  br i1 %75, label %76, label %193
+
+76:                                               ; preds = %70
+  store i64 0, i64* %10, align 8
+  store i32 0, i32* %11, align 4
+  br label %77
+
+77:                                               ; preds = %144, %76
+  %78 = load i32, i32* %11, align 4
+  %79 = load %struct.Matrix*, %struct.Matrix** %4, align 8
+  %80 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %79, i32 0, i32 2
+  %81 = load i32, i32* %80, align 4
+  %82 = icmp slt i32 %78, %81
+  br i1 %82, label %83, label %147
+
+83:                                               ; preds = %77
+  %84 = load %struct.Matrix*, %struct.Matrix** %4, align 8
+  %85 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %84, i32 0, i32 0
+  %86 = load i32**, i32*** %85, align 8
+  %87 = load i32, i32* %8, align 4
+  %88 = sext i32 %87 to i64
+  %89 = getelementptr inbounds i32*, i32** %86, i64 %88
+  %90 = load i32*, i32** %89, align 8
+  %91 = load i32, i32* %11, align 4
+  %92 = sext i32 %91 to i64
+  %93 = getelementptr inbounds i32, i32* %90, i64 %92
+  %94 = load i32, i32* %93, align 4
+  %95 = sext i32 %94 to i64
+  %96 = load %struct.Matrix*, %struct.Matrix** %5, align 8
+  %97 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %96, i32 0, i32 0
+  %98 = load i32**, i32*** %97, align 8
+  %99 = load i32, i32* %11, align 4
+  %100 = sext i32 %99 to i64
+  %101 = getelementptr inbounds i32*, i32** %98, i64 %100
+  %102 = load i32*, i32** %101, align 8
+  %103 = load i32, i32* %9, align 4
+  %104 = sext i32 %103 to i64
+  %105 = getelementptr inbounds i32, i32* %102, i64 %104
+  %106 = load i32, i32* %105, align 4
+  %107 = sext i32 %106 to i64
+  %108 = mul nsw i64 %95, %107
+  store i64 %108, i64* %12, align 8
+  %109 = load i64, i64* %12, align 8
+  %110 = load i64, i64* %10, align 8
+  %111 = add nsw i64 %110, %109
+  store i64 %111, i64* %10, align 8
+  %112 = load i64, i64* %10, align 8
+  %113 = icmp sgt i64 %112, 2147483647
+  br i1 %113, label %117, label %114
+
+114:                                              ; preds = %83
+  %115 = load i64, i64* %10, align 8
+  %116 = icmp slt i64 %115, -2147483648
+  br i1 %116, label %117, label %143
+
+117:                                              ; preds = %114, %83
+  call void @setErrorMessage(i8* getelementptr inbounds ([42 x i8], [42 x i8]* @.str.24, i64 0, i64 0))
+  store i32 0, i32* %13, align 4
+  br label %118
+
+118:                                              ; preds = %133, %117
+  %119 = load i32, i32* %13, align 4
+  %120 = load %struct.Matrix*, %struct.Matrix** %6, align 8
+  %121 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %120, i32 0, i32 1
+  %122 = load i32, i32* %121, align 8
+  %123 = icmp slt i32 %119, %122
+  br i1 %123, label %124, label %136
+
+124:                                              ; preds = %118
+  %125 = load %struct.Matrix*, %struct.Matrix** %6, align 8
+  %126 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %125, i32 0, i32 0
+  %127 = load i32**, i32*** %126, align 8
+  %128 = load i32, i32* %13, align 4
+  %129 = sext i32 %128 to i64
+  %130 = getelementptr inbounds i32*, i32** %127, i64 %129
+  %131 = load i32*, i32** %130, align 8
+  %132 = bitcast i32* %131 to i8*
+  call void @free(i8* %132) #7
+  br label %133
+
+133:                                              ; preds = %124
+  %134 = load i32, i32* %13, align 4
+  %135 = add nsw i32 %134, 1
+  store i32 %135, i32* %13, align 4
+  br label %118
+
+136:                                              ; preds = %118
+  %137 = load %struct.Matrix*, %struct.Matrix** %6, align 8
+  %138 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %137, i32 0, i32 0
+  %139 = load i32**, i32*** %138, align 8
+  %140 = bitcast i32** %139 to i8*
+  call void @free(i8* %140) #7
+  %141 = load %struct.Matrix*, %struct.Matrix** %6, align 8
+  %142 = bitcast %struct.Matrix* %141 to i8*
+  call void @free(i8* %142) #7
+  store %struct.Matrix* null, %struct.Matrix** %3, align 8
+  br label %209
+
+143:                                              ; preds = %114
+  br label %144
+
+144:                                              ; preds = %143
+  %145 = load i32, i32* %11, align 4
+  %146 = add nsw i32 %145, 1
+  store i32 %146, i32* %11, align 4
+  br label %77
+
+147:                                              ; preds = %77
+  %148 = load i64, i64* %10, align 8
+  %149 = trunc i64 %148 to i32
+  %150 = load %struct.Matrix*, %struct.Matrix** %6, align 8
+  %151 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %150, i32 0, i32 0
+  %152 = load i32**, i32*** %151, align 8
+  %153 = load i32, i32* %8, align 4
+  %154 = sext i32 %153 to i64
+  %155 = getelementptr inbounds i32*, i32** %152, i64 %154
+  %156 = load i32*, i32** %155, align 8
+  %157 = load i32, i32* %9, align 4
+  %158 = sext i32 %157 to i64
+  %159 = getelementptr inbounds i32, i32* %156, i64 %158
+  store i32 %149, i32* %159, align 4
+  %160 = load %struct.Matrix*, %struct.Matrix** %6, align 8
+  %161 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %160, i32 0, i32 0
+  %162 = load i32**, i32*** %161, align 8
+  %163 = load i32, i32* %8, align 4
+  %164 = sext i32 %163 to i64
+  %165 = getelementptr inbounds i32*, i32** %162, i64 %164
+  %166 = load i32*, i32** %165, align 8
+  %167 = load i32, i32* %9, align 4
+  %168 = sext i32 %167 to i64
+  %169 = getelementptr inbounds i32, i32* %166, i64 %168
+  %170 = load i32, i32* %169, align 4
+  %171 = call i32 @abs(i32 %170) #8
+  %172 = sext i32 %171 to i64
+  %173 = load i64, i64* %7, align 8
+  %174 = icmp sgt i64 %172, %173
+  br i1 %174, label %175, label %189
+
+175:                                              ; preds = %147
+  %176 = load %struct.Matrix*, %struct.Matrix** %6, align 8
+  %177 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %176, i32 0, i32 0
+  %178 = load i32**, i32*** %177, align 8
+  %179 = load i32, i32* %8, align 4
+  %180 = sext i32 %179 to i64
+  %181 = getelementptr inbounds i32*, i32** %178, i64 %180
+  %182 = load i32*, i32** %181, align 8
+  %183 = load i32, i32* %9, align 4
+  %184 = sext i32 %183 to i64
+  %185 = getelementptr inbounds i32, i32* %182, i64 %184
+  %186 = load i32, i32* %185, align 4
+  %187 = call i32 @abs(i32 %186) #8
+  %188 = sext i32 %187 to i64
+  store i64 %188, i64* %7, align 8
+  br label %189
+
+189:                                              ; preds = %175, %147
+  br label %190
+
+190:                                              ; preds = %189
+  %191 = load i32, i32* %9, align 4
+  %192 = add nsw i32 %191, 1
+  store i32 %192, i32* %9, align 4
+  br label %70
+
+193:                                              ; preds = %70
+  br label %194
+
+194:                                              ; preds = %193
+  %195 = load i32, i32* %8, align 4
+  %196 = add nsw i32 %195, 1
+  store i32 %196, i32* %8, align 4
+  br label %63
+
+197:                                              ; preds = %63
+  %198 = load %struct.Matrix*, %struct.Matrix** %6, align 8
+  %199 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %198, i32 0, i32 1
+  %200 = load i32, i32* %199, align 8
+  %201 = load %struct.Matrix*, %struct.Matrix** %6, align 8
+  %202 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %201, i32 0, i32 2
+  %203 = load i32, i32* %202, align 4
+  %204 = icmp eq i32 %200, %203
+  %205 = zext i1 %204 to i32
+  %206 = load %struct.Matrix*, %struct.Matrix** %6, align 8
+  %207 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %206, i32 0, i32 3
+  store i32 %205, i32* %207, align 8
+  %208 = load %struct.Matrix*, %struct.Matrix** %6, align 8
+  store %struct.Matrix* %208, %struct.Matrix** %3, align 8
+  br label %209
+
+209:                                              ; preds = %197, %136, %61, %50, %39, %30, %19
+  %210 = load %struct.Matrix*, %struct.Matrix** %3, align 8
+  ret %struct.Matrix* %210
+}
+
+; Function Attrs: nounwind readnone
+declare dso_local i32 @abs(i32) #3
+
+; Function Attrs: noinline nounwind optnone uwtable
+define dso_local %struct.Node* @insertNode(%struct.Node* %0, i32 %1) #0 !project_source !2 {
+  %3 = alloca %struct.Node*, align 8
+  %4 = alloca %struct.Node*, align 8
+  %5 = alloca i32, align 4
+  %6 = alloca %struct.Node*, align 8
+  %7 = alloca %struct.Node*, align 8
+  %8 = alloca %struct.Node*, align 8
+  %9 = alloca i32, align 4
+  store %struct.Node* %0, %struct.Node** %4, align 8
+  store i32 %1, i32* %5, align 4
+  %10 = call noalias i8* @malloc(i64 32) #7
+  %11 = bitcast i8* %10 to %struct.Node*
+  store %struct.Node* %11, %struct.Node** %6, align 8
+  %12 = load %struct.Node*, %struct.Node** %6, align 8
+  %13 = icmp ne %struct.Node* %12, null
+  br i1 %13, label %16, label %14
+
+14:                                               ; preds = %2
+  call void @setErrorMessage(i8* getelementptr inbounds ([38 x i8], [38 x i8]* @.str.25, i64 0, i64 0))
+  %15 = load %struct.Node*, %struct.Node** %4, align 8
+  store %struct.Node* %15, %struct.Node** %3, align 8
+  br label %92
+
+16:                                               ; preds = %2
+  %17 = load i32, i32* %5, align 4
+  %18 = load %struct.Node*, %struct.Node** %6, align 8
+  %19 = getelementptr inbounds %struct.Node, %struct.Node* %18, i32 0, i32 0
+  store i32 %17, i32* %19, align 8
+  %20 = load %struct.Node*, %struct.Node** %6, align 8
+  %21 = getelementptr inbounds %struct.Node, %struct.Node* %20, i32 0, i32 1
+  store %struct.Node* null, %struct.Node** %21, align 8
+  %22 = load %struct.Node*, %struct.Node** %6, align 8
+  %23 = getelementptr inbounds %struct.Node, %struct.Node* %22, i32 0, i32 2
+  store %struct.Node* null, %struct.Node** %23, align 8
+  %24 = load %struct.Node*, %struct.Node** %6, align 8
+  %25 = getelementptr inbounds %struct.Node, %struct.Node* %24, i32 0, i32 3
+  store i32 0, i32* %25, align 8
+  %26 = load %struct.Node*, %struct.Node** %4, align 8
+  %27 = icmp ne %struct.Node* %26, null
+  br i1 %27, label %32, label %28
+
+28:                                               ; preds = %16
+  %29 = load %struct.Node*, %struct.Node** %6, align 8
+  %30 = getelementptr inbounds %struct.Node, %struct.Node* %29, i32 0, i32 4
+  store i32 0, i32* %30, align 4
+  store i32 0, i32* @insertNode.maxDepth, align 4
+  %31 = load %struct.Node*, %struct.Node** %6, align 8
+  store %struct.Node* %31, %struct.Node** %3, align 8
+  br label %92
+
+32:                                               ; preds = %16
+  %33 = load %struct.Node*, %struct.Node** %4, align 8
+  store %struct.Node* %33, %struct.Node** %7, align 8
+  store %struct.Node* null, %struct.Node** %8, align 8
+  store i32 0, i32* %9, align 4
+  br label %34
+
+34:                                               ; preds = %58, %32
+  %35 = load %struct.Node*, %struct.Node** %7, align 8
+  %36 = icmp ne %struct.Node* %35, null
+  br i1 %36, label %37, label %43
+
+37:                                               ; preds = %34
+  %38 = load %struct.Node*, %struct.Node** %7, align 8
+  %39 = getelementptr inbounds %struct.Node, %struct.Node* %38, i32 0, i32 0
+  %40 = load i32, i32* %39, align 8
+  %41 = load i32, i32* %5, align 4
+  %42 = icmp slt i32 %40, %41
+  br label %43
+
+43:                                               ; preds = %37, %34
+  %44 = phi i1 [ false, %34 ], [ %42, %37 ]
+  br i1 %44, label %45, label %59
+
+45:                                               ; preds = %43
+  %46 = load %struct.Node*, %struct.Node** %7, align 8
+  store %struct.Node* %46, %struct.Node** %8, align 8
+  %47 = load %struct.Node*, %struct.Node** %7, align 8
+  %48 = getelementptr inbounds %struct.Node, %struct.Node* %47, i32 0, i32 1
+  %49 = load %struct.Node*, %struct.Node** %48, align 8
+  store %struct.Node* %49, %struct.Node** %7, align 8
+  %50 = load i32, i32* %9, align 4
+  %51 = add nsw i32 %50, 1
+  store i32 %51, i32* %9, align 4
+  %52 = load i32, i32* %9, align 4
+  %53 = icmp sgt i32 %52, 1000
+  br i1 %53, label %54, label %58
+
+54:                                               ; preds = %45
+  call void @setErrorMessage(i8* getelementptr inbounds ([34 x i8], [34 x i8]* @.str.26, i64 0, i64 0))
+  %55 = load %struct.Node*, %struct.Node** %6, align 8
+  %56 = bitcast %struct.Node* %55 to i8*
+  call void @free(i8* %56) #7
+  %57 = load %struct.Node*, %struct.Node** %4, align 8
+  store %struct.Node* %57, %struct.Node** %3, align 8
+  br label %92
+
+58:                                               ; preds = %45
+  br label %34
+
+59:                                               ; preds = %43
+  %60 = load i32, i32* %9, align 4
+  %61 = load i32, i32* @insertNode.maxDepth, align 4
+  %62 = icmp sgt i32 %60, %61
+  br i1 %62, label %63, label %65
+
+63:                                               ; preds = %59
+  %64 = load i32, i32* %9, align 4
+  store i32 %64, i32* @insertNode.maxDepth, align 4
+  br label %65
+
+65:                                               ; preds = %63, %59
+  %66 = load i32, i32* %9, align 4
+  %67 = load %struct.Node*, %struct.Node** %6, align 8
+  %68 = getelementptr inbounds %struct.Node, %struct.Node* %67, i32 0, i32 4
+  store i32 %66, i32* %68, align 4
+  %69 = load %struct.Node*, %struct.Node** %7, align 8
+  %70 = load %struct.Node*, %struct.Node** %6, align 8
+  %71 = getelementptr inbounds %struct.Node, %struct.Node* %70, i32 0, i32 1
+  store %struct.Node* %69, %struct.Node** %71, align 8
+  %72 = load %struct.Node*, %struct.Node** %8, align 8
+  %73 = icmp ne %struct.Node* %72, null
+  br i1 %73, label %74, label %81
+
+74:                                               ; preds = %65
+  %75 = load %struct.Node*, %struct.Node** %6, align 8
+  %76 = load %struct.Node*, %struct.Node** %8, align 8
+  %77 = getelementptr inbounds %struct.Node, %struct.Node* %76, i32 0, i32 1
+  store %struct.Node* %75, %struct.Node** %77, align 8
+  %78 = load %struct.Node*, %struct.Node** %8, align 8
+  %79 = load %struct.Node*, %struct.Node** %6, align 8
+  %80 = getelementptr inbounds %struct.Node, %struct.Node* %79, i32 0, i32 2
+  store %struct.Node* %78, %struct.Node** %80, align 8
+  br label %83
+
+81:                                               ; preds = %65
+  %82 = load %struct.Node*, %struct.Node** %6, align 8
+  store %struct.Node* %82, %struct.Node** %3, align 8
+  br label %92
+
+83:                                               ; preds = %74
+  %84 = load %struct.Node*, %struct.Node** %7, align 8
+  %85 = icmp ne %struct.Node* %84, null
+  br i1 %85, label %86, label %90
+
+86:                                               ; preds = %83
+  %87 = load %struct.Node*, %struct.Node** %6, align 8
+  %88 = load %struct.Node*, %struct.Node** %7, align 8
+  %89 = getelementptr inbounds %struct.Node, %struct.Node* %88, i32 0, i32 2
+  store %struct.Node* %87, %struct.Node** %89, align 8
+  br label %90
+
+90:                                               ; preds = %86, %83
+  %91 = load %struct.Node*, %struct.Node** %4, align 8
+  store %struct.Node* %91, %struct.Node** %3, align 8
+  br label %92
+
+92:                                               ; preds = %90, %81, %54, %28, %14
+  %93 = load %struct.Node*, %struct.Node** %3, align 8
+  ret %struct.Node* %93
+}
+
+; Function Attrs: noinline nounwind optnone uwtable
+define dso_local void @performSimpleCalculations() #0 !project_source !2 {
+  %1 = alloca i32, align 4
+  store i32 100, i32* %1, align 4
+  %2 = load i32, i32* %1, align 4
+  %3 = icmp sgt i32 %2, 50
+  br i1 %3, label %4, label %9
+
+4:                                                ; preds = %0
+  %5 = load i32, i32* %1, align 4
+  %6 = mul nsw i32 %5, 2
+  %7 = load i32, i32* @calculationResult, align 4
+  %8 = add nsw i32 %7, %6
+  store i32 %8, i32* @calculationResult, align 4
+  br label %14
+
+9:                                                ; preds = %0
+  %10 = load i32, i32* %1, align 4
+  %11 = sdiv i32 %10, 2
+  %12 = load i32, i32* @calculationResult, align 4
+  %13 = add nsw i32 %12, %11
+  store i32 %13, i32* @calculationResult, align 4
+  br label %14
+
+14:                                               ; preds = %9, %4
+  %15 = load i32, i32* %1, align 4
+  %16 = srem i32 %15, 3
+  %17 = icmp eq i32 %16, 0
+  br i1 %17, label %18, label %21
+
+18:                                               ; preds = %14
+  %19 = load i32, i32* @calculationResult, align 4
+  %20 = mul nsw i32 %19, 3
+  store i32 %20, i32* @calculationResult, align 4
+  br label %24
+
+21:                                               ; preds = %14
+  %22 = load i32, i32* @calculationResult, align 4
+  %23 = add nsw i32 %22, 3
+  store i32 %23, i32* @calculationResult, align 4
+  br label %24
+
+24:                                               ; preds = %21, %18
+  %25 = load i32, i32* @calculationResult, align 4
+  %26 = icmp sge i32 %25, 150
+  br i1 %26, label %27, label %33
+
+27:                                               ; preds = %24
+  %28 = load i32, i32* @calculationResult, align 4
+  %29 = icmp sle i32 %28, 300
+  br i1 %29, label %30, label %33
+
+30:                                               ; preds = %27
+  %31 = load i32, i32* @calculationResult, align 4
+  %32 = sub nsw i32 %31, 50
+  store i32 %32, i32* @calculationResult, align 4
+  br label %36
+
+33:                                               ; preds = %27, %24
+  %34 = load i32, i32* @calculationResult, align 4
+  %35 = add nsw i32 %34, 50
+  store i32 %35, i32* @calculationResult, align 4
+  br label %36
+
+36:                                               ; preds = %33, %30
+  %37 = load i32, i32* @calculationResult, align 4
+  %38 = srem i32 %37, 2
+  %39 = icmp eq i32 %38, 0
+  br i1 %39, label %40, label %43
+
+40:                                               ; preds = %36
+  %41 = load i32, i32* @calculationResult, align 4
+  %42 = sdiv i32 %41, 2
+  store i32 %42, i32* @calculationResult, align 4
+  br label %46
+
+43:                                               ; preds = %36
+  %44 = load i32, i32* @calculationResult, align 4
+  %45 = mul nsw i32 %44, 2
+  store i32 %45, i32* @calculationResult, align 4
+  br label %46
+
+46:                                               ; preds = %43, %40
+  %47 = load i32, i32* @calculationResult, align 4
+  %48 = srem i32 %47, 10
+  %49 = icmp slt i32 %48, 5
+  br i1 %49, label %50, label %53
+
+50:                                               ; preds = %46
+  %51 = load i32, i32* @calculationResult, align 4
+  %52 = add nsw i32 %51, 5
+  store i32 %52, i32* @calculationResult, align 4
+  br label %56
+
+53:                                               ; preds = %46
+  %54 = load i32, i32* @calculationResult, align 4
+  %55 = sub nsw i32 %54, 5
+  store i32 %55, i32* @calculationResult, align 4
+  br label %56
+
+56:                                               ; preds = %53, %50
+  %57 = load i32, i32* @calculationResult, align 4
+  %58 = icmp sgt i32 %57, 1000
+  br i1 %58, label %59, label %60
+
+59:                                               ; preds = %56
+  store i32 1000, i32* @calculationResult, align 4
+  br label %63
+
+60:                                               ; preds = %56
+  %61 = load i32, i32* @calculationResult, align 4
+  %62 = add nsw i32 %61, 10
+  store i32 %62, i32* @calculationResult, align 4
+  br label %63
+
+63:                                               ; preds = %60, %59
+  %64 = load i32, i32* @calculationResult, align 4
+  %65 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([30 x i8], [30 x i8]* @.str.27, i64 0, i64 0), i32 %64)
+  ret void
+}
+
+declare dso_local i32 @printf(i8*, ...) #2
+
+; Function Attrs: noinline nounwind optnone uwtable
+define dso_local i32 @projectA_main() #0 !project_source !2 {
+  %1 = alloca i32, align 4
+  %2 = alloca %struct.DynamicArray*, align 8
+  %3 = alloca i32, align 4
+  %4 = alloca %struct.Matrix*, align 8
+  %5 = alloca %struct.Matrix*, align 8
+  %6 = alloca i32, align 4
+  %7 = alloca i32, align 4
+  %8 = alloca %struct.Matrix*, align 8
+  %9 = alloca i32, align 4
+  %10 = alloca %struct.Node*, align 8
+  %11 = alloca i32, align 4
+  %12 = alloca i32, align 4
+  %13 = alloca %struct.Node*, align 8
+  %14 = alloca %struct.Node*, align 8
+  %15 = alloca i32, align 4
+  %16 = alloca %struct.Node*, align 8
+  %17 = alloca i32, align 4
+  %18 = alloca i32, align 4
+  %19 = alloca %struct.Node*, align 8
+  %20 = call i64 @time(i64* null) #7
+  %21 = trunc i64 %20 to i32
+  call void @srand(i32 %21) #7
+  %22 = call %struct.DynamicArray* @createDynamicArray(i32 10)
+  store %struct.DynamicArray* %22, %struct.DynamicArray** %2, align 8
+  %23 = load %struct.DynamicArray*, %struct.DynamicArray** %2, align 8
+  %24 = icmp ne %struct.DynamicArray* %23, null
+  br i1 %24, label %28, label %25
+
+25:                                               ; preds = %0
+  %26 = call i8* @getErrorMessage()
+  %27 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.28, i64 0, i64 0), i8* %26)
+  store i32 -1, i32* %1, align 4
+  br label %322
+
+28:                                               ; preds = %0
+  store i32 0, i32* %3, align 4
+  br label %29
+
+29:                                               ; preds = %42, %28
+  %30 = load i32, i32* %3, align 4
+  %31 = icmp slt i32 %30, 15
+  br i1 %31, label %32, label %45
+
+32:                                               ; preds = %29
+  %33 = load %struct.DynamicArray*, %struct.DynamicArray** %2, align 8
+  %34 = call i32 @rand() #7
+  %35 = srem i32 %34, 100
+  call void @pushBack(%struct.DynamicArray* %33, i32 %35)
+  %36 = load i8*, i8** @globalErrorMessage, align 8
+  %37 = icmp ne i8* %36, null
+  br i1 %37, label %38, label %41
+
+38:                                               ; preds = %32
+  %39 = call i8* @getErrorMessage()
+  %40 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([29 x i8], [29 x i8]* @.str.29, i64 0, i64 0), i8* %39)
+  br label %45
+
+41:                                               ; preds = %32
+  br label %42
+
+42:                                               ; preds = %41
+  %43 = load i32, i32* %3, align 4
+  %44 = add nsw i32 %43, 1
+  store i32 %44, i32* %3, align 4
+  br label %29
+
+45:                                               ; preds = %38, %29
+  %46 = call %struct.Matrix* @createMatrix(i32 3, i32 3)
+  store %struct.Matrix* %46, %struct.Matrix** %4, align 8
+  %47 = call %struct.Matrix* @createMatrix(i32 3, i32 3)
+  store %struct.Matrix* %47, %struct.Matrix** %5, align 8
+  %48 = load %struct.Matrix*, %struct.Matrix** %4, align 8
+  %49 = icmp ne %struct.Matrix* %48, null
+  br i1 %49, label %50, label %53
+
+50:                                               ; preds = %45
+  %51 = load %struct.Matrix*, %struct.Matrix** %5, align 8
+  %52 = icmp ne %struct.Matrix* %51, null
+  br i1 %52, label %74, label %53
+
+53:                                               ; preds = %50, %45
+  %54 = call i8* @getErrorMessage()
+  %55 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.28, i64 0, i64 0), i8* %54)
+  %56 = load %struct.Matrix*, %struct.Matrix** %4, align 8
+  %57 = icmp ne %struct.Matrix* %56, null
+  br i1 %57, label %58, label %61
+
+58:                                               ; preds = %53
+  %59 = load %struct.Matrix*, %struct.Matrix** %4, align 8
+  %60 = bitcast %struct.Matrix* %59 to i8*
+  call void @free(i8* %60) #7
+  br label %61
+
+61:                                               ; preds = %58, %53
+  %62 = load %struct.Matrix*, %struct.Matrix** %5, align 8
+  %63 = icmp ne %struct.Matrix* %62, null
+  br i1 %63, label %64, label %67
+
+64:                                               ; preds = %61
+  %65 = load %struct.Matrix*, %struct.Matrix** %5, align 8
+  %66 = bitcast %struct.Matrix* %65 to i8*
+  call void @free(i8* %66) #7
+  br label %67
+
+67:                                               ; preds = %64, %61
+  %68 = load %struct.DynamicArray*, %struct.DynamicArray** %2, align 8
+  %69 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %68, i32 0, i32 0
+  %70 = load i32*, i32** %69, align 8
+  %71 = bitcast i32* %70 to i8*
+  call void @free(i8* %71) #7
+  %72 = load %struct.DynamicArray*, %struct.DynamicArray** %2, align 8
+  %73 = bitcast %struct.DynamicArray* %72 to i8*
+  call void @free(i8* %73) #7
+  store i32 -1, i32* %1, align 4
+  br label %322
+
+74:                                               ; preds = %50
+  store i32 0, i32* %6, align 4
+  br label %75
+
+75:                                               ; preds = %111, %74
+  %76 = load i32, i32* %6, align 4
+  %77 = icmp slt i32 %76, 3
+  br i1 %77, label %78, label %114
+
+78:                                               ; preds = %75
+  store i32 0, i32* %7, align 4
+  br label %79
+
+79:                                               ; preds = %107, %78
+  %80 = load i32, i32* %7, align 4
+  %81 = icmp slt i32 %80, 3
+  br i1 %81, label %82, label %110
+
+82:                                               ; preds = %79
+  %83 = call i32 @rand() #7
+  %84 = srem i32 %83, 10
+  %85 = load %struct.Matrix*, %struct.Matrix** %4, align 8
+  %86 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %85, i32 0, i32 0
+  %87 = load i32**, i32*** %86, align 8
+  %88 = load i32, i32* %6, align 4
+  %89 = sext i32 %88 to i64
+  %90 = getelementptr inbounds i32*, i32** %87, i64 %89
+  %91 = load i32*, i32** %90, align 8
+  %92 = load i32, i32* %7, align 4
+  %93 = sext i32 %92 to i64
+  %94 = getelementptr inbounds i32, i32* %91, i64 %93
+  store i32 %84, i32* %94, align 4
+  %95 = call i32 @rand() #7
+  %96 = srem i32 %95, 10
+  %97 = load %struct.Matrix*, %struct.Matrix** %5, align 8
+  %98 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %97, i32 0, i32 0
+  %99 = load i32**, i32*** %98, align 8
+  %100 = load i32, i32* %6, align 4
+  %101 = sext i32 %100 to i64
+  %102 = getelementptr inbounds i32*, i32** %99, i64 %101
+  %103 = load i32*, i32** %102, align 8
+  %104 = load i32, i32* %7, align 4
+  %105 = sext i32 %104 to i64
+  %106 = getelementptr inbounds i32, i32* %103, i64 %105
+  store i32 %96, i32* %106, align 4
+  br label %107
+
+107:                                              ; preds = %82
+  %108 = load i32, i32* %7, align 4
+  %109 = add nsw i32 %108, 1
+  store i32 %109, i32* %7, align 4
+  br label %79
+
+110:                                              ; preds = %79
+  br label %111
+
+111:                                              ; preds = %110
+  %112 = load i32, i32* %6, align 4
+  %113 = add nsw i32 %112, 1
+  store i32 %113, i32* %6, align 4
+  br label %75
+
+114:                                              ; preds = %75
+  %115 = load %struct.Matrix*, %struct.Matrix** %4, align 8
+  %116 = load %struct.Matrix*, %struct.Matrix** %5, align 8
+  %117 = call %struct.Matrix* @multiplyMatrices(%struct.Matrix* %115, %struct.Matrix* %116)
+  store %struct.Matrix* %117, %struct.Matrix** %8, align 8
+  %118 = load %struct.Matrix*, %struct.Matrix** %8, align 8
+  %119 = icmp ne %struct.Matrix* %118, null
+  br i1 %119, label %168, label %120
+
+120:                                              ; preds = %114
+  %121 = call i8* @getErrorMessage()
+  %122 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.28, i64 0, i64 0), i8* %121)
+  store i32 0, i32* %9, align 4
+  br label %123
+
+123:                                              ; preds = %146, %120
+  %124 = load i32, i32* %9, align 4
+  %125 = load %struct.Matrix*, %struct.Matrix** %4, align 8
+  %126 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %125, i32 0, i32 1
+  %127 = load i32, i32* %126, align 8
+  %128 = icmp slt i32 %124, %127
+  br i1 %128, label %129, label %149
+
+129:                                              ; preds = %123
+  %130 = load %struct.Matrix*, %struct.Matrix** %4, align 8
+  %131 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %130, i32 0, i32 0
+  %132 = load i32**, i32*** %131, align 8
+  %133 = load i32, i32* %9, align 4
+  %134 = sext i32 %133 to i64
+  %135 = getelementptr inbounds i32*, i32** %132, i64 %134
+  %136 = load i32*, i32** %135, align 8
+  %137 = bitcast i32* %136 to i8*
+  call void @free(i8* %137) #7
+  %138 = load %struct.Matrix*, %struct.Matrix** %5, align 8
+  %139 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %138, i32 0, i32 0
+  %140 = load i32**, i32*** %139, align 8
+  %141 = load i32, i32* %9, align 4
+  %142 = sext i32 %141 to i64
+  %143 = getelementptr inbounds i32*, i32** %140, i64 %142
+  %144 = load i32*, i32** %143, align 8
+  %145 = bitcast i32* %144 to i8*
+  call void @free(i8* %145) #7
+  br label %146
+
+146:                                              ; preds = %129
+  %147 = load i32, i32* %9, align 4
+  %148 = add nsw i32 %147, 1
+  store i32 %148, i32* %9, align 4
+  br label %123
+
+149:                                              ; preds = %123
+  %150 = load %struct.Matrix*, %struct.Matrix** %4, align 8
+  %151 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %150, i32 0, i32 0
+  %152 = load i32**, i32*** %151, align 8
+  %153 = bitcast i32** %152 to i8*
+  call void @free(i8* %153) #7
+  %154 = load %struct.Matrix*, %struct.Matrix** %5, align 8
+  %155 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %154, i32 0, i32 0
+  %156 = load i32**, i32*** %155, align 8
+  %157 = bitcast i32** %156 to i8*
+  call void @free(i8* %157) #7
+  %158 = load %struct.Matrix*, %struct.Matrix** %4, align 8
+  %159 = bitcast %struct.Matrix* %158 to i8*
+  call void @free(i8* %159) #7
+  %160 = load %struct.Matrix*, %struct.Matrix** %5, align 8
+  %161 = bitcast %struct.Matrix* %160 to i8*
+  call void @free(i8* %161) #7
+  %162 = load %struct.DynamicArray*, %struct.DynamicArray** %2, align 8
+  %163 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %162, i32 0, i32 0
+  %164 = load i32*, i32** %163, align 8
+  %165 = bitcast i32* %164 to i8*
+  call void @free(i8* %165) #7
+  %166 = load %struct.DynamicArray*, %struct.DynamicArray** %2, align 8
+  %167 = bitcast %struct.DynamicArray* %166 to i8*
+  call void @free(i8* %167) #7
+  store i32 -1, i32* %1, align 4
+  br label %322
+
+168:                                              ; preds = %114
+  store %struct.Node* null, %struct.Node** %10, align 8
+  store i32 0, i32* %11, align 4
+  br label %169
+
+169:                                              ; preds = %183, %168
+  %170 = load i32, i32* %11, align 4
+  %171 = icmp slt i32 %170, 5
+  br i1 %171, label %172, label %186
+
+172:                                              ; preds = %169
+  %173 = load %struct.Node*, %struct.Node** %10, align 8
+  %174 = call i32 @rand() #7
+  %175 = srem i32 %174, 50
+  %176 = call %struct.Node* @insertNode(%struct.Node* %173, i32 %175)
+  store %struct.Node* %176, %struct.Node** %10, align 8
+  %177 = load i8*, i8** @globalErrorMessage, align 8
+  %178 = icmp ne i8* %177, null
+  br i1 %178, label %179, label %182
+
+179:                                              ; preds = %172
+  %180 = call i8* @getErrorMessage()
+  %181 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([33 x i8], [33 x i8]* @.str.30, i64 0, i64 0), i8* %180)
+  br label %186
+
+182:                                              ; preds = %172
+  br label %183
+
+183:                                              ; preds = %182
+  %184 = load i32, i32* %11, align 4
+  %185 = add nsw i32 %184, 1
+  store i32 %185, i32* %11, align 4
+  br label %169
+
+186:                                              ; preds = %179, %169
+  %187 = load %struct.DynamicArray*, %struct.DynamicArray** %2, align 8
+  %188 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %187, i32 0, i32 0
+  %189 = load i32*, i32** %188, align 8
+  %190 = bitcast i32* %189 to i8*
+  call void @free(i8* %190) #7
+  %191 = load %struct.DynamicArray*, %struct.DynamicArray** %2, align 8
+  %192 = bitcast %struct.DynamicArray* %191 to i8*
+  call void @free(i8* %192) #7
+  store i32 0, i32* %12, align 4
+  br label %193
+
+193:                                              ; preds = %224, %186
+  %194 = load i32, i32* %12, align 4
+  %195 = load %struct.Matrix*, %struct.Matrix** %4, align 8
+  %196 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %195, i32 0, i32 1
+  %197 = load i32, i32* %196, align 8
+  %198 = icmp slt i32 %194, %197
+  br i1 %198, label %199, label %227
+
+199:                                              ; preds = %193
+  %200 = load %struct.Matrix*, %struct.Matrix** %4, align 8
+  %201 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %200, i32 0, i32 0
+  %202 = load i32**, i32*** %201, align 8
+  %203 = load i32, i32* %12, align 4
+  %204 = sext i32 %203 to i64
+  %205 = getelementptr inbounds i32*, i32** %202, i64 %204
+  %206 = load i32*, i32** %205, align 8
+  %207 = bitcast i32* %206 to i8*
+  call void @free(i8* %207) #7
+  %208 = load %struct.Matrix*, %struct.Matrix** %5, align 8
+  %209 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %208, i32 0, i32 0
+  %210 = load i32**, i32*** %209, align 8
+  %211 = load i32, i32* %12, align 4
+  %212 = sext i32 %211 to i64
+  %213 = getelementptr inbounds i32*, i32** %210, i64 %212
+  %214 = load i32*, i32** %213, align 8
+  %215 = bitcast i32* %214 to i8*
+  call void @free(i8* %215) #7
+  %216 = load %struct.Matrix*, %struct.Matrix** %8, align 8
+  %217 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %216, i32 0, i32 0
+  %218 = load i32**, i32*** %217, align 8
+  %219 = load i32, i32* %12, align 4
+  %220 = sext i32 %219 to i64
+  %221 = getelementptr inbounds i32*, i32** %218, i64 %220
+  %222 = load i32*, i32** %221, align 8
+  %223 = bitcast i32* %222 to i8*
+  call void @free(i8* %223) #7
+  br label %224
+
+224:                                              ; preds = %199
+  %225 = load i32, i32* %12, align 4
+  %226 = add nsw i32 %225, 1
+  store i32 %226, i32* %12, align 4
+  br label %193
+
+227:                                              ; preds = %193
+  %228 = load %struct.Matrix*, %struct.Matrix** %4, align 8
+  %229 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %228, i32 0, i32 0
+  %230 = load i32**, i32*** %229, align 8
+  %231 = bitcast i32** %230 to i8*
+  call void @free(i8* %231) #7
+  %232 = load %struct.Matrix*, %struct.Matrix** %5, align 8
+  %233 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %232, i32 0, i32 0
+  %234 = load i32**, i32*** %233, align 8
+  %235 = bitcast i32** %234 to i8*
+  call void @free(i8* %235) #7
+  %236 = load %struct.Matrix*, %struct.Matrix** %8, align 8
+  %237 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %236, i32 0, i32 0
+  %238 = load i32**, i32*** %237, align 8
+  %239 = bitcast i32** %238 to i8*
+  call void @free(i8* %239) #7
+  %240 = load %struct.Matrix*, %struct.Matrix** %4, align 8
+  %241 = bitcast %struct.Matrix* %240 to i8*
+  call void @free(i8* %241) #7
+  %242 = load %struct.Matrix*, %struct.Matrix** %5, align 8
+  %243 = bitcast %struct.Matrix* %242 to i8*
+  call void @free(i8* %243) #7
+  %244 = load %struct.Matrix*, %struct.Matrix** %8, align 8
+  %245 = bitcast %struct.Matrix* %244 to i8*
+  call void @free(i8* %245) #7
+  %246 = load %struct.Node*, %struct.Node** %10, align 8
+  %247 = icmp ne %struct.Node* %246, null
+  br i1 %247, label %248, label %316
+
+248:                                              ; preds = %227
+  %249 = load %struct.Node*, %struct.Node** %10, align 8
+  store %struct.Node* %249, %struct.Node** %13, align 8
+  %250 = load %struct.Node*, %struct.Node** %10, align 8
+  store %struct.Node* %250, %struct.Node** %14, align 8
+  store i32 0, i32* %15, align 4
+  br label %251
+
+251:                                              ; preds = %274, %248
+  %252 = load %struct.Node*, %struct.Node** %14, align 8
+  %253 = icmp ne %struct.Node* %252, null
+  br i1 %253, label %254, label %259
+
+254:                                              ; preds = %251
+  %255 = load %struct.Node*, %struct.Node** %14, align 8
+  %256 = getelementptr inbounds %struct.Node, %struct.Node* %255, i32 0, i32 1
+  %257 = load %struct.Node*, %struct.Node** %256, align 8
+  %258 = icmp ne %struct.Node* %257, null
+  br label %259
+
+259:                                              ; preds = %254, %251
+  %260 = phi i1 [ false, %251 ], [ %258, %254 ]
+  br i1 %260, label %261, label %275
+
+261:                                              ; preds = %259
+  %262 = load %struct.Node*, %struct.Node** %13, align 8
+  %263 = getelementptr inbounds %struct.Node, %struct.Node* %262, i32 0, i32 1
+  %264 = load %struct.Node*, %struct.Node** %263, align 8
+  store %struct.Node* %264, %struct.Node** %13, align 8
+  %265 = load %struct.Node*, %struct.Node** %14, align 8
+  %266 = getelementptr inbounds %struct.Node, %struct.Node* %265, i32 0, i32 1
+  %267 = load %struct.Node*, %struct.Node** %266, align 8
+  %268 = getelementptr inbounds %struct.Node, %struct.Node* %267, i32 0, i32 1
+  %269 = load %struct.Node*, %struct.Node** %268, align 8
+  store %struct.Node* %269, %struct.Node** %14, align 8
+  %270 = load %struct.Node*, %struct.Node** %13, align 8
+  %271 = load %struct.Node*, %struct.Node** %14, align 8
+  %272 = icmp eq %struct.Node* %270, %271
+  br i1 %272, label %273, label %274
+
+273:                                              ; preds = %261
+  store i32 1, i32* %15, align 4
+  br label %275
+
+274:                                              ; preds = %261
+  br label %251
+
+275:                                              ; preds = %273, %259
+  %276 = load i32, i32* %15, align 4
+  %277 = icmp ne i32 %276, 0
+  br i1 %277, label %278, label %304
+
+278:                                              ; preds = %275
+  call void @setErrorMessage(i8* getelementptr inbounds ([43 x i8], [43 x i8]* @.str.31, i64 0, i64 0))
+  %279 = load %struct.Node*, %struct.Node** %10, align 8
+  store %struct.Node* %279, %struct.Node** %16, align 8
+  store i32 1000, i32* %17, align 4
+  store i32 0, i32* %18, align 4
+  br label %280
+
+280:                                              ; preds = %295, %278
+  %281 = load %struct.Node*, %struct.Node** %16, align 8
+  %282 = icmp ne %struct.Node* %281, null
+  br i1 %282, label %283, label %287
+
+283:                                              ; preds = %280
+  %284 = load i32, i32* %18, align 4
+  %285 = load i32, i32* %17, align 4
+  %286 = icmp slt i32 %284, %285
+  br label %287
+
+287:                                              ; preds = %283, %280
+  %288 = phi i1 [ false, %280 ], [ %286, %283 ]
+  br i1 %288, label %289, label %303
+
+289:                                              ; preds = %287
+  %290 = load %struct.Node*, %struct.Node** %16, align 8
+  %291 = getelementptr inbounds %struct.Node, %struct.Node* %290, i32 0, i32 3
+  %292 = load i32, i32* %291, align 8
+  %293 = icmp ne i32 %292, 0
+  br i1 %293, label %294, label %295
+
+294:                                              ; preds = %289
+  br label %303
+
+295:                                              ; preds = %289
+  %296 = load %struct.Node*, %struct.Node** %16, align 8
+  %297 = getelementptr inbounds %struct.Node, %struct.Node* %296, i32 0, i32 3
+  store i32 1, i32* %297, align 8
+  %298 = load %struct.Node*, %struct.Node** %16, align 8
+  %299 = getelementptr inbounds %struct.Node, %struct.Node* %298, i32 0, i32 1
+  %300 = load %struct.Node*, %struct.Node** %299, align 8
+  store %struct.Node* %300, %struct.Node** %16, align 8
+  %301 = load i32, i32* %18, align 4
+  %302 = add nsw i32 %301, 1
+  store i32 %302, i32* %18, align 4
+  br label %280
+
+303:                                              ; preds = %294, %287
+  br label %304
+
+304:                                              ; preds = %303, %275
+  br label %305
+
+305:                                              ; preds = %308, %304
+  %306 = load %struct.Node*, %struct.Node** %10, align 8
+  %307 = icmp ne %struct.Node* %306, null
+  br i1 %307, label %308, label %315
+
+308:                                              ; preds = %305
+  %309 = load %struct.Node*, %struct.Node** %10, align 8
+  store %struct.Node* %309, %struct.Node** %19, align 8
+  %310 = load %struct.Node*, %struct.Node** %10, align 8
+  %311 = getelementptr inbounds %struct.Node, %struct.Node* %310, i32 0, i32 1
+  %312 = load %struct.Node*, %struct.Node** %311, align 8
+  store %struct.Node* %312, %struct.Node** %10, align 8
+  %313 = load %struct.Node*, %struct.Node** %19, align 8
+  %314 = bitcast %struct.Node* %313 to i8*
+  call void @free(i8* %314) #7
+  br label %305
+
+315:                                              ; preds = %305
+  br label %316
+
+316:                                              ; preds = %315, %227
+  %317 = load i8*, i8** @globalErrorMessage, align 8
+  %318 = icmp ne i8* %317, null
+  br i1 %318, label %319, label %321
+
+319:                                              ; preds = %316
+  %320 = load i8*, i8** @globalErrorMessage, align 8
+  call void @free(i8* %320) #7
+  br label %321
+
+321:                                              ; preds = %319, %316
+  call void @performSimpleCalculations()
+  store i32 0, i32* %1, align 4
+  br label %322
+
+322:                                              ; preds = %321, %149, %67, %25
+  %323 = load i32, i32* %1, align 4
+  ret i32 %323
+}
+
+; Function Attrs: nounwind
+declare dso_local i64 @time(i64*) #1
+
+; Function Attrs: nounwind
+declare dso_local void @srand(i32) #1
+
+; Function Attrs: nounwind
+declare dso_local i32 @rand() #1
+
+; Function Attrs: noinline nounwind optnone uwtable
+define dso_local double @calculateDistance(%struct.Point* byval(%struct.Point) align 8 %0, %struct.Point* byval(%struct.Point) align 8 %1, i32* %2) #0 !project_source !2 {
+  %4 = alloca double, align 8
+  %5 = alloca i32*, align 8
+  %6 = alloca double, align 8
+  %7 = alloca double, align 8
+  %8 = alloca double, align 8
+  store i32* %2, i32** %5, align 8
+  %9 = load i32*, i32** %5, align 8
+  store i32 0, i32* %9, align 4
+  %10 = getelementptr inbounds %struct.Point, %struct.Point* %0, i32 0, i32 3
+  %11 = load double, double* %10, align 8
+  %12 = fcmp ole double %11, 0.000000e+00
+  br i1 %12, label %17, label %13
+
+13:                                               ; preds = %3
+  %14 = getelementptr inbounds %struct.Point, %struct.Point* %1, i32 0, i32 3
+  %15 = load double, double* %14, align 8
+  %16 = fcmp ole double %15, 0.000000e+00
+  br i1 %16, label %17, label %19
+
+17:                                               ; preds = %13, %3
+  %18 = load i32*, i32** %5, align 8
+  store i32 1, i32* %18, align 4
+  call void @setErrorMessage(i8* getelementptr inbounds ([22 x i8], [22 x i8]* @.str.32, i64 0, i64 0))
+  store double -1.000000e+00, double* %4, align 8
+  br label %101
+
+19:                                               ; preds = %13
+  %20 = getelementptr inbounds %struct.Point, %struct.Point* %0, i32 0, i32 0
+  %21 = load i32, i32* %20, align 8
+  %22 = call i32 @abs(i32 %21) #8
+  %23 = icmp sgt i32 %22, 1000
+  br i1 %23, label %39, label %24
+
+24:                                               ; preds = %19
+  %25 = getelementptr inbounds %struct.Point, %struct.Point* %0, i32 0, i32 1
+  %26 = load i32, i32* %25, align 4
+  %27 = call i32 @abs(i32 %26) #8
+  %28 = icmp sgt i32 %27, 1000
+  br i1 %28, label %39, label %29
+
+29:                                               ; preds = %24
+  %30 = getelementptr inbounds %struct.Point, %struct.Point* %1, i32 0, i32 0
+  %31 = load i32, i32* %30, align 8
+  %32 = call i32 @abs(i32 %31) #8
+  %33 = icmp sgt i32 %32, 1000
+  br i1 %33, label %39, label %34
+
+34:                                               ; preds = %29
+  %35 = getelementptr inbounds %struct.Point, %struct.Point* %1, i32 0, i32 1
+  %36 = load i32, i32* %35, align 4
+  %37 = call i32 @abs(i32 %36) #8
+  %38 = icmp sgt i32 %37, 1000
+  br i1 %38, label %39, label %41
+
+39:                                               ; preds = %34, %29, %24, %19
+  %40 = load i32*, i32** %5, align 8
+  store i32 3, i32* %40, align 4
+  call void @setErrorMessage(i8* getelementptr inbounds ([31 x i8], [31 x i8]* @.str.33, i64 0, i64 0))
+  store double -1.000000e+00, double* %4, align 8
+  br label %101
+
+41:                                               ; preds = %34
+  %42 = getelementptr inbounds %struct.Point, %struct.Point* %1, i32 0, i32 0
+  %43 = load i32, i32* %42, align 8
+  %44 = getelementptr inbounds %struct.Point, %struct.Point* %0, i32 0, i32 0
+  %45 = load i32, i32* %44, align 8
+  %46 = sub nsw i32 %43, %45
+  %47 = sitofp i32 %46 to double
+  %48 = getelementptr inbounds %struct.Point, %struct.Point* %1, i32 0, i32 3
+  %49 = load double, double* %48, align 8
+  %50 = getelementptr inbounds %struct.Point, %struct.Point* %0, i32 0, i32 3
+  %51 = load double, double* %50, align 8
+  %52 = fdiv double %49, %51
+  %53 = call double @sqrt(double %52) #7
+  %54 = fmul double %47, %53
+  store double %54, double* %6, align 8
+  %55 = getelementptr inbounds %struct.Point, %struct.Point* %1, i32 0, i32 1
+  %56 = load i32, i32* %55, align 4
+  %57 = getelementptr inbounds %struct.Point, %struct.Point* %0, i32 0, i32 1
+  %58 = load i32, i32* %57, align 4
+  %59 = sub nsw i32 %56, %58
+  %60 = sitofp i32 %59 to double
+  %61 = getelementptr inbounds %struct.Point, %struct.Point* %1, i32 0, i32 3
+  %62 = load double, double* %61, align 8
+  %63 = getelementptr inbounds %struct.Point, %struct.Point* %0, i32 0, i32 3
+  %64 = load double, double* %63, align 8
+  %65 = fdiv double %62, %64
+  %66 = call double @sqrt(double %65) #7
+  %67 = fmul double %60, %66
+  store double %67, double* %7, align 8
+  %68 = load double, double* %6, align 8
+  %69 = call double @llvm.fabs.f64(double %68)
+  %70 = fcmp ogt double %69, 1.000000e+03
+  br i1 %70, label %75, label %71
+
+71:                                               ; preds = %41
+  %72 = load double, double* %7, align 8
+  %73 = call double @llvm.fabs.f64(double %72)
+  %74 = fcmp ogt double %73, 1.000000e+03
+  br i1 %74, label %75, label %77
+
+75:                                               ; preds = %71, %41
+  %76 = load i32*, i32** %5, align 8
+  store i32 5, i32* %76, align 4
+  call void @setErrorMessage(i8* getelementptr inbounds ([30 x i8], [30 x i8]* @.str.34, i64 0, i64 0))
+  store double -1.000000e+00, double* %4, align 8
+  br label %101
+
+77:                                               ; preds = %71
+  %78 = load double, double* %6, align 8
+  %79 = load double, double* %6, align 8
+  %80 = fmul double %78, %79
+  %81 = load double, double* %7, align 8
+  %82 = load double, double* %7, align 8
+  %83 = fmul double %81, %82
+  %84 = fadd double %80, %83
+  %85 = call double @sqrt(double %84) #7
+  store double %85, double* %8, align 8
+  %86 = load double, double* %8, align 8
+  %87 = fcmp uno double %86, %86
+  br i1 %87, label %97, label %88
+
+88:                                               ; preds = %77
+  %89 = load double, double* %8, align 8
+  %90 = call double @llvm.fabs.f64(double %89) #9
+  %91 = fcmp oeq double %90, 0x7FF0000000000000
+  %92 = bitcast double %89 to i64
+  %93 = icmp slt i64 %92, 0
+  %94 = select i1 %93, i32 -1, i32 1
+  %95 = select i1 %91, i32 %94, i32 0
+  %96 = icmp ne i32 %95, 0
+  br i1 %96, label %97, label %99
+
+97:                                               ; preds = %88, %77
+  %98 = load i32*, i32** %5, align 8
+  store i32 8, i32* %98, align 4
+  call void @setErrorMessage(i8* getelementptr inbounds ([36 x i8], [36 x i8]* @.str.35, i64 0, i64 0))
+  store double -1.000000e+00, double* %4, align 8
+  br label %101
+
+99:                                               ; preds = %88
+  %100 = load double, double* %8, align 8
+  store double %100, double* %4, align 8
+  br label %101
+
+101:                                              ; preds = %99, %97, %75, %39, %17
+  %102 = load double, double* %4, align 8
+  ret double %102
+}
+
+; Function Attrs: nounwind
+declare dso_local double @sqrt(double) #1
+
+; Function Attrs: nounwind readnone speculatable willreturn
+declare double @llvm.fabs.f64(double) #4
+
+; Function Attrs: noinline nounwind optnone uwtable
+define dso_local double @calculateCircleArea(%struct.Circle* byval(%struct.Circle) align 8 %0, i32* %1) #0 !project_source !2 {
+  %3 = alloca double, align 8
+  %4 = alloca i32*, align 8
+  %5 = alloca double, align 8
+  store i32* %1, i32** %4, align 8
+  %6 = load i32*, i32** %4, align 8
+  store i32 0, i32* %6, align 4
+  %7 = getelementptr inbounds %struct.Circle, %struct.Circle* %0, i32 0, i32 2
+  %8 = load i32, i32* %7, align 8
+  %9 = icmp ne i32 %8, 0
+  br i1 %9, label %12, label %10
+
+10:                                               ; preds = %2
+  %11 = load i32*, i32** %4, align 8
+  store i32 1, i32* %11, align 4
+  call void @setErrorMessage(i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.36, i64 0, i64 0))
+  store double -1.000000e+00, double* %3, align 8
+  br label %85
+
+12:                                               ; preds = %2
+  %13 = getelementptr inbounds %struct.Circle, %struct.Circle* %0, i32 0, i32 1
+  %14 = load double, double* %13, align 8
+  %15 = fcmp ole double %14, 0.000000e+00
+  br i1 %15, label %16, label %18
+
+16:                                               ; preds = %12
+  %17 = load i32*, i32** %4, align 8
+  store i32 1, i32* %17, align 4
+  call void @setErrorMessage(i8* getelementptr inbounds ([22 x i8], [22 x i8]* @.str.37, i64 0, i64 0))
+  store double -1.000000e+00, double* %3, align 8
+  br label %85
+
+18:                                               ; preds = %12
+  %19 = getelementptr inbounds %struct.Circle, %struct.Circle* %0, i32 0, i32 1
+  %20 = load double, double* %19, align 8
+  %21 = fcmp ogt double %20, 1.000000e+03
+  br i1 %21, label %22, label %24
+
+22:                                               ; preds = %18
+  %23 = load i32*, i32** %4, align 8
+  store i32 3, i32* %23, align 4
+  call void @setErrorMessage(i8* getelementptr inbounds ([24 x i8], [24 x i8]* @.str.38, i64 0, i64 0))
+  store double -1.000000e+00, double* %3, align 8
+  br label %85
+
+24:                                               ; preds = %18
+  %25 = getelementptr inbounds %struct.Circle, %struct.Circle* %0, i32 0, i32 0
+  %26 = getelementptr inbounds %struct.Point, %struct.Point* %25, i32 0, i32 0
+  %27 = load i32, i32* %26, align 8
+  %28 = call i32 @abs(i32 %27) #8
+  %29 = icmp sgt i32 %28, 1000
+  br i1 %29, label %36, label %30
+
+30:                                               ; preds = %24
+  %31 = getelementptr inbounds %struct.Circle, %struct.Circle* %0, i32 0, i32 0
+  %32 = getelementptr inbounds %struct.Point, %struct.Point* %31, i32 0, i32 1
+  %33 = load i32, i32* %32, align 4
+  %34 = call i32 @abs(i32 %33) #8
+  %35 = icmp sgt i32 %34, 1000
+  br i1 %35, label %36, label %38
+
+36:                                               ; preds = %30, %24
+  %37 = load i32*, i32** %4, align 8
+  store i32 3, i32* %37, align 4
+  call void @setErrorMessage(i8* getelementptr inbounds ([45 x i8], [45 x i8]* @.str.39, i64 0, i64 0))
+  store double -1.000000e+00, double* %3, align 8
+  br label %85
+
+38:                                               ; preds = %30
+  %39 = getelementptr inbounds %struct.Circle, %struct.Circle* %0, i32 0, i32 1
+  %40 = load double, double* %39, align 8
+  %41 = fmul double 3.141590e+00, %40
+  %42 = getelementptr inbounds %struct.Circle, %struct.Circle* %0, i32 0, i32 1
+  %43 = load double, double* %42, align 8
+  %44 = fmul double %41, %43
+  store double %44, double* %5, align 8
+  %45 = load double, double* %5, align 8
+  %46 = fcmp uno double %45, %45
+  br i1 %46, label %56, label %47
+
+47:                                               ; preds = %38
+  %48 = load double, double* %5, align 8
+  %49 = call double @llvm.fabs.f64(double %48) #9
+  %50 = fcmp oeq double %49, 0x7FF0000000000000
+  %51 = bitcast double %48 to i64
+  %52 = icmp slt i64 %51, 0
+  %53 = select i1 %52, i32 -1, i32 1
+  %54 = select i1 %50, i32 %53, i32 0
+  %55 = icmp ne i32 %54, 0
+  br i1 %55, label %56, label %58
+
+56:                                               ; preds = %47, %38
+  %57 = load i32*, i32** %4, align 8
+  store i32 5, i32* %57, align 4
+  call void @setErrorMessage(i8* getelementptr inbounds ([26 x i8], [26 x i8]* @.str.40, i64 0, i64 0))
+  store double -1.000000e+00, double* %3, align 8
+  br label %85
+
+58:                                               ; preds = %47
+  %59 = getelementptr inbounds %struct.Circle, %struct.Circle* %0, i32 0, i32 3
+  %60 = getelementptr inbounds [256 x i8], [256 x i8]* %59, i64 0, i64 0
+  %61 = call i32 @strcmp(i8* %60, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.41, i64 0, i64 0)) #10
+  %62 = icmp eq i32 %61, 0
+  br i1 %62, label %63, label %65
+
+63:                                               ; preds = %58
+  %64 = load double, double* %5, align 8
+  store double %64, double* %3, align 8
+  br label %85
+
+65:                                               ; preds = %58
+  %66 = getelementptr inbounds %struct.Circle, %struct.Circle* %0, i32 0, i32 3
+  %67 = getelementptr inbounds [256 x i8], [256 x i8]* %66, i64 0, i64 0
+  %68 = call i32 @strcmp(i8* %67, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.42, i64 0, i64 0)) #10
+  %69 = icmp eq i32 %68, 0
+  br i1 %69, label %70, label %83
+
+70:                                               ; preds = %65
+  %71 = getelementptr inbounds %struct.Circle, %struct.Circle* %0, i32 0, i32 0
+  %72 = getelementptr inbounds %struct.Point, %struct.Point* %71, i32 0, i32 3
+  %73 = load double, double* %72, align 8
+  %74 = fcmp ole double %73, 0.000000e+00
+  br i1 %74, label %75, label %77
+
+75:                                               ; preds = %70
+  %76 = load i32*, i32** %4, align 8
+  store i32 1, i32* %76, align 4
+  call void @setErrorMessage(i8* getelementptr inbounds ([35 x i8], [35 x i8]* @.str.43, i64 0, i64 0))
+  store double -1.000000e+00, double* %3, align 8
+  br label %85
+
+77:                                               ; preds = %70
+  %78 = load double, double* %5, align 8
+  %79 = getelementptr inbounds %struct.Circle, %struct.Circle* %0, i32 0, i32 0
+  %80 = getelementptr inbounds %struct.Point, %struct.Point* %79, i32 0, i32 3
+  %81 = load double, double* %80, align 8
+  %82 = fmul double %78, %81
+  store double %82, double* %3, align 8
+  br label %85
+
+83:                                               ; preds = %65
+  %84 = load i32*, i32** %4, align 8
+  store i32 1, i32* %84, align 4
+  call void @setErrorMessage(i8* getelementptr inbounds ([20 x i8], [20 x i8]* @.str.44, i64 0, i64 0))
+  store double -1.000000e+00, double* %3, align 8
+  br label %85
+
+85:                                               ; preds = %83, %77, %75, %63, %56, %36, %22, %16, %10
+  %86 = load double, double* %3, align 8
+  ret double %86
+}
+
+; Function Attrs: nounwind readonly
+declare dso_local i32 @strcmp(i8*, i8*) #5
+
+; Function Attrs: noinline nounwind optnone uwtable
+define dso_local i32 @validateMatrix(%struct.Matrix* %0) #0 !project_source !2 {
+  %2 = alloca i32, align 4
+  %3 = alloca %struct.Matrix*, align 8
+  %4 = alloca i32, align 4
+  store %struct.Matrix* %0, %struct.Matrix** %3, align 8
+  %5 = load %struct.Matrix*, %struct.Matrix** %3, align 8
+  %6 = icmp ne %struct.Matrix* %5, null
+  br i1 %6, label %8, label %7
+
+7:                                                ; preds = %1
+  call void @setErrorMessage(i8* getelementptr inbounds ([20 x i8], [20 x i8]* @.str.21, i64 0, i64 0))
+  store i32 7, i32* %2, align 4
+  br label %72
+
+8:                                                ; preds = %1
+  %9 = load %struct.Matrix*, %struct.Matrix** %3, align 8
+  %10 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %9, i32 0, i32 0
+  %11 = load i32**, i32*** %10, align 8
+  %12 = icmp ne i32** %11, null
+  br i1 %12, label %14, label %13
+
+13:                                               ; preds = %8
+  call void @setErrorMessage(i8* getelementptr inbounds ([17 x i8], [17 x i8]* @.str.45, i64 0, i64 0))
+  store i32 7, i32* %2, align 4
+  br label %72
+
+14:                                               ; preds = %8
+  %15 = load %struct.Matrix*, %struct.Matrix** %3, align 8
+  %16 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %15, i32 0, i32 1
+  %17 = load i32, i32* %16, align 8
+  %18 = icmp slt i32 %17, 1
+  br i1 %18, label %24, label %19
+
+19:                                               ; preds = %14
+  %20 = load %struct.Matrix*, %struct.Matrix** %3, align 8
+  %21 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %20, i32 0, i32 2
+  %22 = load i32, i32* %21, align 4
+  %23 = icmp slt i32 %22, 1
+  br i1 %23, label %24, label %25
+
+24:                                               ; preds = %19, %14
+  call void @setErrorMessage(i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.str.16, i64 0, i64 0))
+  store i32 1, i32* %2, align 4
+  br label %72
+
+25:                                               ; preds = %19
+  %26 = load %struct.Matrix*, %struct.Matrix** %3, align 8
+  %27 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %26, i32 0, i32 1
+  %28 = load i32, i32* %27, align 8
+  %29 = icmp sgt i32 %28, 100
+  br i1 %29, label %35, label %30
+
+30:                                               ; preds = %25
+  %31 = load %struct.Matrix*, %struct.Matrix** %3, align 8
+  %32 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %31, i32 0, i32 2
+  %33 = load i32, i32* %32, align 4
+  %34 = icmp sgt i32 %33, 100
+  br i1 %34, label %35, label %36
+
+35:                                               ; preds = %30, %25
+  call void @setErrorMessage(i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.str.46, i64 0, i64 0))
+  store i32 3, i32* %2, align 4
+  br label %72
+
+36:                                               ; preds = %30
+  store i32 0, i32* %4, align 4
+  br label %37
+
+37:                                               ; preds = %54, %36
+  %38 = load i32, i32* %4, align 4
+  %39 = load %struct.Matrix*, %struct.Matrix** %3, align 8
+  %40 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %39, i32 0, i32 1
+  %41 = load i32, i32* %40, align 8
+  %42 = icmp slt i32 %38, %41
+  br i1 %42, label %43, label %57
+
+43:                                               ; preds = %37
+  %44 = load %struct.Matrix*, %struct.Matrix** %3, align 8
+  %45 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %44, i32 0, i32 0
+  %46 = load i32**, i32*** %45, align 8
+  %47 = load i32, i32* %4, align 4
+  %48 = sext i32 %47 to i64
+  %49 = getelementptr inbounds i32*, i32** %46, i64 %48
+  %50 = load i32*, i32** %49, align 8
+  %51 = icmp ne i32* %50, null
+  br i1 %51, label %53, label %52
+
+52:                                               ; preds = %43
+  call void @setErrorMessage(i8* getelementptr inbounds ([27 x i8], [27 x i8]* @.str.47, i64 0, i64 0))
+  store i32 7, i32* %2, align 4
+  br label %72
+
+53:                                               ; preds = %43
+  br label %54
+
+54:                                               ; preds = %53
+  %55 = load i32, i32* %4, align 4
+  %56 = add nsw i32 %55, 1
+  store i32 %56, i32* %4, align 4
+  br label %37
+
+57:                                               ; preds = %37
+  %58 = load %struct.Matrix*, %struct.Matrix** %3, align 8
+  %59 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %58, i32 0, i32 1
+  %60 = load i32, i32* %59, align 8
+  %61 = load %struct.Matrix*, %struct.Matrix** %3, align 8
+  %62 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %61, i32 0, i32 2
+  %63 = load i32, i32* %62, align 4
+  %64 = icmp eq i32 %60, %63
+  %65 = zext i1 %64 to i32
+  %66 = load %struct.Matrix*, %struct.Matrix** %3, align 8
+  %67 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %66, i32 0, i32 3
+  %68 = load i32, i32* %67, align 8
+  %69 = icmp ne i32 %65, %68
+  br i1 %69, label %70, label %71
+
+70:                                               ; preds = %57
+  call void @setErrorMessage(i8* getelementptr inbounds ([32 x i8], [32 x i8]* @.str.48, i64 0, i64 0))
+  store i32 1, i32* %2, align 4
+  br label %72
+
+71:                                               ; preds = %57
+  store i32 0, i32* %2, align 4
+  br label %72
+
+72:                                               ; preds = %71, %70, %52, %35, %24, %13, %7
+  %73 = load i32, i32* %2, align 4
+  ret i32 %73
+}
+
+; Function Attrs: noinline nounwind optnone uwtable
+define dso_local void @removeDuplicates(%struct.DynamicArray* %0) #0 !project_source !2 {
+  %2 = alloca %struct.DynamicArray*, align 8
+  %3 = alloca i32, align 4
+  %4 = alloca i32, align 4
+  %5 = alloca i32, align 4
+  store %struct.DynamicArray* %0, %struct.DynamicArray** %2, align 8
+  %6 = load %struct.DynamicArray*, %struct.DynamicArray** %2, align 8
+  %7 = icmp ne %struct.DynamicArray* %6, null
+  br i1 %7, label %8, label %13
+
+8:                                                ; preds = %1
+  %9 = load %struct.DynamicArray*, %struct.DynamicArray** %2, align 8
+  %10 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %9, i32 0, i32 0
+  %11 = load i32*, i32** %10, align 8
+  %12 = icmp ne i32* %11, null
+  br i1 %12, label %14, label %13
+
+13:                                               ; preds = %8, %1
+  call void @setErrorMessage(i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.49, i64 0, i64 0))
+  br label %81
+
+14:                                               ; preds = %8
+  %15 = load %struct.DynamicArray*, %struct.DynamicArray** %2, align 8
+  %16 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %15, i32 0, i32 1
+  %17 = load i32, i32* %16, align 8
+  %18 = icmp sle i32 %17, 1
+  br i1 %18, label %19, label %20
+
+19:                                               ; preds = %14
+  br label %81
+
+20:                                               ; preds = %14
+  store i32 0, i32* %3, align 4
+  %21 = load %struct.DynamicArray*, %struct.DynamicArray** %2, align 8
+  %22 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %21, i32 0, i32 0
+  %23 = load i32*, i32** %22, align 8
+  %24 = load %struct.DynamicArray*, %struct.DynamicArray** %2, align 8
+  %25 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %24, i32 0, i32 1
+  %26 = load i32, i32* %25, align 8
+  %27 = sub nsw i32 %26, 1
+  call void @quickSort(i32* %23, i32 0, i32 %27, i32* %3)
+  %28 = load i32, i32* %3, align 4
+  %29 = icmp ne i32 %28, 0
+  br i1 %29, label %30, label %31
+
+30:                                               ; preds = %20
+  br label %81
+
+31:                                               ; preds = %20
+  store i32 1, i32* %4, align 4
+  store i32 1, i32* %5, align 4
+  br label %32
+
+32:                                               ; preds = %72, %31
+  %33 = load i32, i32* %5, align 4
+  %34 = load %struct.DynamicArray*, %struct.DynamicArray** %2, align 8
+  %35 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %34, i32 0, i32 1
+  %36 = load i32, i32* %35, align 8
+  %37 = icmp slt i32 %33, %36
+  br i1 %37, label %38, label %75
+
+38:                                               ; preds = %32
+  %39 = load %struct.DynamicArray*, %struct.DynamicArray** %2, align 8
+  %40 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %39, i32 0, i32 0
+  %41 = load i32*, i32** %40, align 8
+  %42 = load i32, i32* %5, align 4
+  %43 = sext i32 %42 to i64
+  %44 = getelementptr inbounds i32, i32* %41, i64 %43
+  %45 = load i32, i32* %44, align 4
+  %46 = load %struct.DynamicArray*, %struct.DynamicArray** %2, align 8
+  %47 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %46, i32 0, i32 0
+  %48 = load i32*, i32** %47, align 8
+  %49 = load i32, i32* %5, align 4
+  %50 = sub nsw i32 %49, 1
+  %51 = sext i32 %50 to i64
+  %52 = getelementptr inbounds i32, i32* %48, i64 %51
+  %53 = load i32, i32* %52, align 4
+  %54 = icmp ne i32 %45, %53
+  br i1 %54, label %55, label %71
+
+55:                                               ; preds = %38
+  %56 = load %struct.DynamicArray*, %struct.DynamicArray** %2, align 8
+  %57 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %56, i32 0, i32 0
+  %58 = load i32*, i32** %57, align 8
+  %59 = load i32, i32* %5, align 4
+  %60 = sext i32 %59 to i64
+  %61 = getelementptr inbounds i32, i32* %58, i64 %60
+  %62 = load i32, i32* %61, align 4
+  %63 = load %struct.DynamicArray*, %struct.DynamicArray** %2, align 8
+  %64 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %63, i32 0, i32 0
+  %65 = load i32*, i32** %64, align 8
+  %66 = load i32, i32* %4, align 4
+  %67 = sext i32 %66 to i64
+  %68 = getelementptr inbounds i32, i32* %65, i64 %67
+  store i32 %62, i32* %68, align 4
+  %69 = load i32, i32* %4, align 4
+  %70 = add nsw i32 %69, 1
+  store i32 %70, i32* %4, align 4
+  br label %71
+
+71:                                               ; preds = %55, %38
+  br label %72
+
+72:                                               ; preds = %71
+  %73 = load i32, i32* %5, align 4
+  %74 = add nsw i32 %73, 1
+  store i32 %74, i32* %5, align 4
+  br label %32
+
+75:                                               ; preds = %32
+  %76 = load i32, i32* %4, align 4
+  %77 = load %struct.DynamicArray*, %struct.DynamicArray** %2, align 8
+  %78 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %77, i32 0, i32 1
+  store i32 %76, i32* %78, align 8
+  %79 = load %struct.DynamicArray*, %struct.DynamicArray** %2, align 8
+  %80 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %79, i32 0, i32 3
+  store i32 1, i32* %80, align 8
+  br label %81
+
+81:                                               ; preds = %75, %30, %19, %13
+  ret void
+}
+
+; Function Attrs: noinline nounwind optnone uwtable
+define dso_local %struct.Point* @findCentroid(%struct.Point* %0, i32 %1, i32* %2) #0 !project_source !2 {
+  %4 = alloca %struct.Point*, align 8
+  %5 = alloca %struct.Point*, align 8
+  %6 = alloca i32, align 4
+  %7 = alloca i32*, align 8
+  %8 = alloca %struct.Point*, align 8
+  %9 = alloca double, align 8
+  %10 = alloca double, align 8
+  %11 = alloca double, align 8
+  %12 = alloca i32, align 4
+  store %struct.Point* %0, %struct.Point** %5, align 8
+  store i32 %1, i32* %6, align 4
+  store i32* %2, i32** %7, align 8
+  %13 = load i32*, i32** %7, align 8
+  store i32 0, i32* %13, align 4
+  %14 = load %struct.Point*, %struct.Point** %5, align 8
+  %15 = icmp ne %struct.Point* %14, null
+  br i1 %15, label %16, label %19
+
+16:                                               ; preds = %3
+  %17 = load i32, i32* %6, align 4
+  %18 = icmp sle i32 %17, 0
+  br i1 %18, label %19, label %21
+
+19:                                               ; preds = %16, %3
+  %20 = load i32*, i32** %7, align 8
+  store i32 1, i32* %20, align 4
+  call void @setErrorMessage(i8* getelementptr inbounds ([21 x i8], [21 x i8]* @.str.50, i64 0, i64 0))
+  store %struct.Point* null, %struct.Point** %4, align 8
+  br label %165
+
+21:                                               ; preds = %16
+  %22 = load i32, i32* %6, align 4
+  %23 = icmp sgt i32 %22, 1000
+  br i1 %23, label %24, label %26
+
+24:                                               ; preds = %21
+  %25 = load i32*, i32** %7, align 8
+  store i32 3, i32* %25, align 4
+  call void @setErrorMessage(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.51, i64 0, i64 0))
+  store %struct.Point* null, %struct.Point** %4, align 8
+  br label %165
+
+26:                                               ; preds = %21
+  %27 = call noalias i8* @malloc(i64 272) #7
+  %28 = bitcast i8* %27 to %struct.Point*
+  store %struct.Point* %28, %struct.Point** %8, align 8
+  %29 = load %struct.Point*, %struct.Point** %8, align 8
+  %30 = icmp ne %struct.Point* %29, null
+  br i1 %30, label %33, label %31
+
+31:                                               ; preds = %26
+  %32 = load i32*, i32** %7, align 8
+  store i32 2, i32* %32, align 4
+  call void @setErrorMessage(i8* getelementptr inbounds ([39 x i8], [39 x i8]* @.str.52, i64 0, i64 0))
+  store %struct.Point* null, %struct.Point** %4, align 8
+  br label %165
+
+33:                                               ; preds = %26
+  store double 0.000000e+00, double* %9, align 8
+  store double 0.000000e+00, double* %10, align 8
+  store double 0.000000e+00, double* %11, align 8
+  store i32 0, i32* %12, align 4
+  br label %34
+
+34:                                               ; preds = %131, %33
+  %35 = load i32, i32* %12, align 4
+  %36 = load i32, i32* %6, align 4
+  %37 = icmp slt i32 %35, %36
+  br i1 %37, label %38, label %134
+
+38:                                               ; preds = %34
+  %39 = load %struct.Point*, %struct.Point** %5, align 8
+  %40 = load i32, i32* %12, align 4
+  %41 = sext i32 %40 to i64
+  %42 = getelementptr inbounds %struct.Point, %struct.Point* %39, i64 %41
+  %43 = getelementptr inbounds %struct.Point, %struct.Point* %42, i32 0, i32 3
+  %44 = load double, double* %43, align 8
+  %45 = fcmp ole double %44, 0.000000e+00
+  br i1 %45, label %46, label %50
+
+46:                                               ; preds = %38
+  %47 = load i32*, i32** %7, align 8
+  store i32 1, i32* %47, align 4
+  call void @setErrorMessage(i8* getelementptr inbounds ([21 x i8], [21 x i8]* @.str.53, i64 0, i64 0))
+  %48 = load %struct.Point*, %struct.Point** %8, align 8
+  %49 = bitcast %struct.Point* %48 to i8*
+  call void @free(i8* %49) #7
+  store %struct.Point* null, %struct.Point** %4, align 8
+  br label %165
+
+50:                                               ; preds = %38
+  %51 = load %struct.Point*, %struct.Point** %5, align 8
+  %52 = load i32, i32* %12, align 4
+  %53 = sext i32 %52 to i64
+  %54 = getelementptr inbounds %struct.Point, %struct.Point* %51, i64 %53
+  %55 = getelementptr inbounds %struct.Point, %struct.Point* %54, i32 0, i32 3
+  %56 = load double, double* %55, align 8
+  %57 = load double, double* %9, align 8
+  %58 = fadd double %57, %56
+  store double %58, double* %9, align 8
+  %59 = load %struct.Point*, %struct.Point** %5, align 8
+  %60 = load i32, i32* %12, align 4
+  %61 = sext i32 %60 to i64
+  %62 = getelementptr inbounds %struct.Point, %struct.Point* %59, i64 %61
+  %63 = getelementptr inbounds %struct.Point, %struct.Point* %62, i32 0, i32 0
+  %64 = load i32, i32* %63, align 8
+  %65 = sitofp i32 %64 to double
+  %66 = load %struct.Point*, %struct.Point** %5, align 8
+  %67 = load i32, i32* %12, align 4
+  %68 = sext i32 %67 to i64
+  %69 = getelementptr inbounds %struct.Point, %struct.Point* %66, i64 %68
+  %70 = getelementptr inbounds %struct.Point, %struct.Point* %69, i32 0, i32 3
+  %71 = load double, double* %70, align 8
+  %72 = fmul double %65, %71
+  %73 = load double, double* %10, align 8
+  %74 = fadd double %73, %72
+  store double %74, double* %10, align 8
+  %75 = load %struct.Point*, %struct.Point** %5, align 8
+  %76 = load i32, i32* %12, align 4
+  %77 = sext i32 %76 to i64
+  %78 = getelementptr inbounds %struct.Point, %struct.Point* %75, i64 %77
+  %79 = getelementptr inbounds %struct.Point, %struct.Point* %78, i32 0, i32 1
+  %80 = load i32, i32* %79, align 4
+  %81 = sitofp i32 %80 to double
+  %82 = load %struct.Point*, %struct.Point** %5, align 8
+  %83 = load i32, i32* %12, align 4
+  %84 = sext i32 %83 to i64
+  %85 = getelementptr inbounds %struct.Point, %struct.Point* %82, i64 %84
+  %86 = getelementptr inbounds %struct.Point, %struct.Point* %85, i32 0, i32 3
+  %87 = load double, double* %86, align 8
+  %88 = fmul double %81, %87
+  %89 = load double, double* %11, align 8
+  %90 = fadd double %89, %88
+  store double %90, double* %11, align 8
+  %91 = load double, double* %9, align 8
+  %92 = fcmp uno double %91, %91
+  br i1 %92, label %126, label %93
+
+93:                                               ; preds = %50
+  %94 = load double, double* %10, align 8
+  %95 = fcmp uno double %94, %94
+  br i1 %95, label %126, label %96
+
+96:                                               ; preds = %93
+  %97 = load double, double* %11, align 8
+  %98 = fcmp uno double %97, %97
+  br i1 %98, label %126, label %99
+
+99:                                               ; preds = %96
+  %100 = load double, double* %9, align 8
+  %101 = call double @llvm.fabs.f64(double %100) #9
+  %102 = fcmp oeq double %101, 0x7FF0000000000000
+  %103 = bitcast double %100 to i64
+  %104 = icmp slt i64 %103, 0
+  %105 = select i1 %104, i32 -1, i32 1
+  %106 = select i1 %102, i32 %105, i32 0
+  %107 = icmp ne i32 %106, 0
+  br i1 %107, label %126, label %108
+
+108:                                              ; preds = %99
+  %109 = load double, double* %10, align 8
+  %110 = call double @llvm.fabs.f64(double %109) #9
+  %111 = fcmp oeq double %110, 0x7FF0000000000000
+  %112 = bitcast double %109 to i64
+  %113 = icmp slt i64 %112, 0
+  %114 = select i1 %113, i32 -1, i32 1
+  %115 = select i1 %111, i32 %114, i32 0
+  %116 = icmp ne i32 %115, 0
+  br i1 %116, label %126, label %117
+
+117:                                              ; preds = %108
+  %118 = load double, double* %11, align 8
+  %119 = call double @llvm.fabs.f64(double %118) #9
+  %120 = fcmp oeq double %119, 0x7FF0000000000000
+  %121 = bitcast double %118 to i64
+  %122 = icmp slt i64 %121, 0
+  %123 = select i1 %122, i32 -1, i32 1
+  %124 = select i1 %120, i32 %123, i32 0
+  %125 = icmp ne i32 %124, 0
+  br i1 %125, label %126, label %130
+
+126:                                              ; preds = %117, %108, %99, %96, %93, %50
+  %127 = load i32*, i32** %7, align 8
+  store i32 5, i32* %127, align 4
+  call void @setErrorMessage(i8* getelementptr inbounds ([30 x i8], [30 x i8]* @.str.54, i64 0, i64 0))
+  %128 = load %struct.Point*, %struct.Point** %8, align 8
+  %129 = bitcast %struct.Point* %128 to i8*
+  call void @free(i8* %129) #7
+  store %struct.Point* null, %struct.Point** %4, align 8
+  br label %165
+
+130:                                              ; preds = %117
+  br label %131
+
+131:                                              ; preds = %130
+  %132 = load i32, i32* %12, align 4
+  %133 = add nsw i32 %132, 1
+  store i32 %133, i32* %12, align 4
+  br label %34
+
+134:                                              ; preds = %34
+  %135 = load double, double* %9, align 8
+  %136 = fcmp oeq double %135, 0.000000e+00
+  br i1 %136, label %137, label %141
+
+137:                                              ; preds = %134
+  %138 = load i32*, i32** %7, align 8
+  store i32 1, i32* %138, align 4
+  call void @setErrorMessage(i8* getelementptr inbounds ([21 x i8], [21 x i8]* @.str.55, i64 0, i64 0))
+  %139 = load %struct.Point*, %struct.Point** %8, align 8
+  %140 = bitcast %struct.Point* %139 to i8*
+  call void @free(i8* %140) #7
+  store %struct.Point* null, %struct.Point** %4, align 8
+  br label %165
+
+141:                                              ; preds = %134
+  %142 = load double, double* %10, align 8
+  %143 = load double, double* %9, align 8
+  %144 = fdiv double %142, %143
+  %145 = fptosi double %144 to i32
+  %146 = load %struct.Point*, %struct.Point** %8, align 8
+  %147 = getelementptr inbounds %struct.Point, %struct.Point* %146, i32 0, i32 0
+  store i32 %145, i32* %147, align 8
+  %148 = load double, double* %11, align 8
+  %149 = load double, double* %9, align 8
+  %150 = fdiv double %148, %149
+  %151 = fptosi double %150 to i32
+  %152 = load %struct.Point*, %struct.Point** %8, align 8
+  %153 = getelementptr inbounds %struct.Point, %struct.Point* %152, i32 0, i32 1
+  store i32 %151, i32* %153, align 4
+  %154 = load double, double* %9, align 8
+  %155 = load i32, i32* %6, align 4
+  %156 = sitofp i32 %155 to double
+  %157 = fdiv double %154, %156
+  %158 = load %struct.Point*, %struct.Point** %8, align 8
+  %159 = getelementptr inbounds %struct.Point, %struct.Point* %158, i32 0, i32 3
+  store double %157, double* %159, align 8
+  %160 = load %struct.Point*, %struct.Point** %8, align 8
+  %161 = getelementptr inbounds %struct.Point, %struct.Point* %160, i32 0, i32 2
+  %162 = getelementptr inbounds [256 x i8], [256 x i8]* %161, i64 0, i64 0
+  %163 = call i8* @strcpy(i8* %162, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.56, i64 0, i64 0)) #7
+  %164 = load %struct.Point*, %struct.Point** %8, align 8
+  store %struct.Point* %164, %struct.Point** %4, align 8
+  br label %165
+
+165:                                              ; preds = %141, %137, %126, %46, %31, %24, %19
+  %166 = load %struct.Point*, %struct.Point** %4, align 8
+  ret %struct.Point* %166
+}
+
+; Function Attrs: nounwind
+declare dso_local i8* @strcpy(i8*, i8*) #1
+
+; Function Attrs: noinline nounwind optnone uwtable
+define dso_local void @reverseString(i8* %0) #0 !project_source !3 {
+  %2 = alloca i8*, align 8
+  %3 = alloca i32, align 4
+  %4 = alloca i32, align 4
+  %5 = alloca i8, align 1
+  store i8* %0, i8** %2, align 8
+  %6 = load i8*, i8** %2, align 8
+  %7 = call i64 @strlen(i8* %6) #10
+  %8 = trunc i64 %7 to i32
+  store i32 %8, i32* %3, align 4
+  store i32 0, i32* %4, align 4
+  br label %9
+
+9:                                                ; preds = %40, %1
+  %10 = load i32, i32* %4, align 4
+  %11 = load i32, i32* %3, align 4
+  %12 = sdiv i32 %11, 2
+  %13 = icmp slt i32 %10, %12
+  br i1 %13, label %14, label %43
+
+14:                                               ; preds = %9
+  %15 = load i8*, i8** %2, align 8
+  %16 = load i32, i32* %4, align 4
+  %17 = sext i32 %16 to i64
+  %18 = getelementptr inbounds i8, i8* %15, i64 %17
+  %19 = load i8, i8* %18, align 1
+  store i8 %19, i8* %5, align 1
+  %20 = load i8*, i8** %2, align 8
+  %21 = load i32, i32* %3, align 4
+  %22 = sub nsw i32 %21, 1
+  %23 = load i32, i32* %4, align 4
+  %24 = sub nsw i32 %22, %23
+  %25 = sext i32 %24 to i64
+  %26 = getelementptr inbounds i8, i8* %20, i64 %25
+  %27 = load i8, i8* %26, align 1
+  %28 = load i8*, i8** %2, align 8
+  %29 = load i32, i32* %4, align 4
+  %30 = sext i32 %29 to i64
+  %31 = getelementptr inbounds i8, i8* %28, i64 %30
+  store i8 %27, i8* %31, align 1
+  %32 = load i8, i8* %5, align 1
+  %33 = load i8*, i8** %2, align 8
+  %34 = load i32, i32* %3, align 4
+  %35 = sub nsw i32 %34, 1
+  %36 = load i32, i32* %4, align 4
+  %37 = sub nsw i32 %35, %36
+  %38 = sext i32 %37 to i64
+  %39 = getelementptr inbounds i8, i8* %33, i64 %38
+  store i8 %32, i8* %39, align 1
+  br label %40
+
+40:                                               ; preds = %14
+  %41 = load i32, i32* %4, align 4
+  %42 = add nsw i32 %41, 1
+  store i32 %42, i32* %4, align 4
+  br label %9
+
+43:                                               ; preds = %9
+  ret void
+}
+
+; Function Attrs: nounwind readonly
+declare dso_local i64 @strlen(i8*) #5
+
+; Function Attrs: noinline nounwind optnone uwtable
+define dso_local i32 @longestIncreasingSubsequence(i32* %0, i32 %1) #0 !project_source !3 {
+  %3 = alloca i32*, align 8
+  %4 = alloca i32, align 4
+  %5 = alloca [100 x i32], align 16
+  %6 = alloca i32, align 4
+  %7 = alloca i32, align 4
+  %8 = alloca i32, align 4
+  %9 = alloca i32, align 4
+  %10 = alloca i32, align 4
+  store i32* %0, i32** %3, align 8
+  store i32 %1, i32* %4, align 4
+  store i32 0, i32* %6, align 4
+  br label %11
+
+11:                                               ; preds = %19, %2
+  %12 = load i32, i32* %6, align 4
+  %13 = load i32, i32* %4, align 4
+  %14 = icmp slt i32 %12, %13
+  br i1 %14, label %15, label %22
+
+15:                                               ; preds = %11
+  %16 = load i32, i32* %6, align 4
+  %17 = sext i32 %16 to i64
+  %18 = getelementptr inbounds [100 x i32], [100 x i32]* %5, i64 0, i64 %17
+  store i32 1, i32* %18, align 4
+  br label %19
+
+19:                                               ; preds = %15
+  %20 = load i32, i32* %6, align 4
+  %21 = add nsw i32 %20, 1
+  store i32 %21, i32* %6, align 4
+  br label %11
+
+22:                                               ; preds = %11
+  store i32 1, i32* %7, align 4
+  br label %23
+
+23:                                               ; preds = %69, %22
+  %24 = load i32, i32* %7, align 4
+  %25 = load i32, i32* %4, align 4
+  %26 = icmp slt i32 %24, %25
+  br i1 %26, label %27, label %72
+
+27:                                               ; preds = %23
+  store i32 0, i32* %8, align 4
+  br label %28
+
+28:                                               ; preds = %65, %27
+  %29 = load i32, i32* %8, align 4
+  %30 = load i32, i32* %7, align 4
+  %31 = icmp slt i32 %29, %30
+  br i1 %31, label %32, label %68
+
+32:                                               ; preds = %28
+  %33 = load i32*, i32** %3, align 8
+  %34 = load i32, i32* %7, align 4
+  %35 = sext i32 %34 to i64
+  %36 = getelementptr inbounds i32, i32* %33, i64 %35
+  %37 = load i32, i32* %36, align 4
+  %38 = load i32*, i32** %3, align 8
+  %39 = load i32, i32* %8, align 4
+  %40 = sext i32 %39 to i64
+  %41 = getelementptr inbounds i32, i32* %38, i64 %40
+  %42 = load i32, i32* %41, align 4
+  %43 = icmp sgt i32 %37, %42
+  br i1 %43, label %44, label %64
+
+44:                                               ; preds = %32
+  %45 = load i32, i32* %7, align 4
+  %46 = sext i32 %45 to i64
+  %47 = getelementptr inbounds [100 x i32], [100 x i32]* %5, i64 0, i64 %46
+  %48 = load i32, i32* %47, align 4
+  %49 = load i32, i32* %8, align 4
+  %50 = sext i32 %49 to i64
+  %51 = getelementptr inbounds [100 x i32], [100 x i32]* %5, i64 0, i64 %50
+  %52 = load i32, i32* %51, align 4
+  %53 = add nsw i32 %52, 1
+  %54 = icmp slt i32 %48, %53
+  br i1 %54, label %55, label %64
+
+55:                                               ; preds = %44
+  %56 = load i32, i32* %8, align 4
+  %57 = sext i32 %56 to i64
+  %58 = getelementptr inbounds [100 x i32], [100 x i32]* %5, i64 0, i64 %57
+  %59 = load i32, i32* %58, align 4
+  %60 = add nsw i32 %59, 1
+  %61 = load i32, i32* %7, align 4
+  %62 = sext i32 %61 to i64
+  %63 = getelementptr inbounds [100 x i32], [100 x i32]* %5, i64 0, i64 %62
+  store i32 %60, i32* %63, align 4
+  br label %64
+
+64:                                               ; preds = %55, %44, %32
+  br label %65
+
+65:                                               ; preds = %64
+  %66 = load i32, i32* %8, align 4
+  %67 = add nsw i32 %66, 1
+  store i32 %67, i32* %8, align 4
+  br label %28
+
+68:                                               ; preds = %28
+  br label %69
+
+69:                                               ; preds = %68
+  %70 = load i32, i32* %7, align 4
+  %71 = add nsw i32 %70, 1
+  store i32 %71, i32* %7, align 4
+  br label %23
+
+72:                                               ; preds = %23
+  store i32 0, i32* %9, align 4
+  store i32 0, i32* %10, align 4
+  br label %73
+
+73:                                               ; preds = %90, %72
+  %74 = load i32, i32* %10, align 4
+  %75 = load i32, i32* %4, align 4
+  %76 = icmp slt i32 %74, %75
+  br i1 %76, label %77, label %93
+
+77:                                               ; preds = %73
+  %78 = load i32, i32* %9, align 4
+  %79 = load i32, i32* %10, align 4
+  %80 = sext i32 %79 to i64
+  %81 = getelementptr inbounds [100 x i32], [100 x i32]* %5, i64 0, i64 %80
+  %82 = load i32, i32* %81, align 4
+  %83 = icmp slt i32 %78, %82
+  br i1 %83, label %84, label %89
+
+84:                                               ; preds = %77
+  %85 = load i32, i32* %10, align 4
+  %86 = sext i32 %85 to i64
+  %87 = getelementptr inbounds [100 x i32], [100 x i32]* %5, i64 0, i64 %86
+  %88 = load i32, i32* %87, align 4
+  store i32 %88, i32* %9, align 4
+  br label %89
+
+89:                                               ; preds = %84, %77
+  br label %90
+
+90:                                               ; preds = %89
+  %91 = load i32, i32* %10, align 4
+  %92 = add nsw i32 %91, 1
+  store i32 %92, i32* %10, align 4
+  br label %73
+
+93:                                               ; preds = %73
+  %94 = load i32, i32* %9, align 4
+  ret i32 %94
+}
+
+; Function Attrs: noinline nounwind optnone uwtable
+define dso_local i32 @testPoints(i32 %0) #0 !project_source !3 {
+  %2 = alloca i32, align 4
+  %3 = alloca i32, align 4
+  %4 = alloca i32, align 4
+  %5 = alloca i32, align 4
+  store i32 %0, i32* %3, align 4
+  store i32 0, i32* %4, align 4
+  store i32 1, i32* %5, align 4
+  br label %6
+
+6:                                                ; preds = %16, %1
+  %7 = load i32, i32* %5, align 4
+  %8 = icmp slt i32 %7, 5
+  br i1 %8, label %9, label %19
+
+9:                                                ; preds = %6
+  %10 = load i32, i32* %4, align 4
+  %11 = add nsw i32 %10, 1
+  store i32 %11, i32* %4, align 4
+  %12 = load i32, i32* %3, align 4
+  %13 = icmp sgt i32 %12, 2
+  br i1 %13, label %14, label %15
+
+14:                                               ; preds = %9
+  store i32 23, i32* %2, align 4
+  br label %21
+
+15:                                               ; preds = %9
+  br label %16
+
+16:                                               ; preds = %15
+  %17 = load i32, i32* %5, align 4
+  %18 = add nsw i32 %17, 1
+  store i32 %18, i32* %5, align 4
+  br label %6
+
+19:                                               ; preds = %6
+  %20 = load i32, i32* %4, align 4
+  store i32 %20, i32* %2, align 4
+  br label %21
+
+21:                                               ; preds = %19, %14
+  %22 = load i32, i32* %2, align 4
+  ret i32 %22
+}
+
+; Function Attrs: noinline nounwind optnone uwtable
+define dso_local i32 @countSetBits(i32 %0) #0 !project_source !3 {
+  %2 = alloca i32, align 4
+  %3 = alloca i32, align 4
+  store i32 %0, i32* %2, align 4
+  store i32 0, i32* %3, align 4
+  br label %4
+
+4:                                                ; preds = %7, %1
+  %5 = load i32, i32* %2, align 4
+  %6 = icmp ne i32 %5, 0
+  br i1 %6, label %7, label %14
+
+7:                                                ; preds = %4
+  %8 = load i32, i32* %2, align 4
+  %9 = and i32 %8, 1
+  %10 = load i32, i32* %3, align 4
+  %11 = add nsw i32 %10, %9
+  store i32 %11, i32* %3, align 4
+  %12 = load i32, i32* %2, align 4
+  %13 = ashr i32 %12, 1
+  store i32 %13, i32* %2, align 4
+  br label %4
+
+14:                                               ; preds = %4
+  %15 = load i32, i32* %3, align 4
+  ret i32 %15
+}
+
+; Function Attrs: noinline nounwind optnone uwtable
+define dso_local i32 @memoizedFib(i32 %0) #0 !project_source !3 {
+  %2 = alloca i32, align 4
+  %3 = alloca i32, align 4
+  store i32 %0, i32* %3, align 4
+  %4 = load i32, i32* %3, align 4
+  %5 = sext i32 %4 to i64
+  %6 = getelementptr inbounds [100 x i32], [100 x i32]* @cache, i64 0, i64 %5
+  %7 = load i32, i32* %6, align 4
+  %8 = icmp ne i32 %7, -1
+  br i1 %8, label %9, label %14
+
+9:                                                ; preds = %1
+  %10 = load i32, i32* %3, align 4
+  %11 = sext i32 %10 to i64
+  %12 = getelementptr inbounds [100 x i32], [100 x i32]* @cache, i64 0, i64 %11
+  %13 = load i32, i32* %12, align 4
+  store i32 %13, i32* %2, align 4
+  br label %34
+
+14:                                               ; preds = %1
+  %15 = load i32, i32* %3, align 4
+  %16 = icmp sle i32 %15, 1
+  br i1 %16, label %17, label %19
+
+17:                                               ; preds = %14
+  %18 = load i32, i32* %3, align 4
+  store i32 %18, i32* %2, align 4
+  br label %34
+
+19:                                               ; preds = %14
+  %20 = load i32, i32* %3, align 4
+  %21 = sub nsw i32 %20, 1
+  %22 = call i32 @memoizedFib(i32 %21)
+  %23 = load i32, i32* %3, align 4
+  %24 = sub nsw i32 %23, 2
+  %25 = call i32 @memoizedFib(i32 %24)
+  %26 = add nsw i32 %22, %25
+  %27 = load i32, i32* %3, align 4
+  %28 = sext i32 %27 to i64
+  %29 = getelementptr inbounds [100 x i32], [100 x i32]* @cache, i64 0, i64 %28
+  store i32 %26, i32* %29, align 4
+  %30 = load i32, i32* %3, align 4
+  %31 = sext i32 %30 to i64
+  %32 = getelementptr inbounds [100 x i32], [100 x i32]* @cache, i64 0, i64 %31
+  %33 = load i32, i32* %32, align 4
+  store i32 %33, i32* %2, align 4
+  br label %34
+
+34:                                               ; preds = %19, %17, %9
+  %35 = load i32, i32* %2, align 4
+  ret i32 %35
+}
+
+; Function Attrs: noinline nounwind optnone uwtable
+define dso_local i32 @processMatrix([100 x i32]* %0, i32 %1) #0 !project_source !3 {
+  %3 = alloca [100 x i32]*, align 8
+  %4 = alloca i32, align 4
+  %5 = alloca i32, align 4
+  %6 = alloca i32, align 4
+  %7 = alloca i32, align 4
+  store [100 x i32]* %0, [100 x i32]** %3, align 8
+  store i32 %1, i32* %4, align 4
+  store i32 0, i32* %5, align 4
+  store i32 0, i32* %6, align 4
+  br label %8
+
+8:                                                ; preds = %77, %2
+  %9 = load i32, i32* %6, align 4
+  %10 = load i32, i32* %4, align 4
+  %11 = icmp slt i32 %9, %10
+  br i1 %11, label %12, label %80
+
+12:                                               ; preds = %8
+  store i32 0, i32* %7, align 4
+  br label %13
+
+13:                                               ; preds = %73, %12
+  %14 = load i32, i32* %7, align 4
+  %15 = load i32, i32* %4, align 4
+  %16 = icmp slt i32 %14, %15
+  br i1 %16, label %17, label %76
+
+17:                                               ; preds = %13
+  %18 = load i32, i32* %6, align 4
+  %19 = load i32, i32* %7, align 4
+  %20 = icmp eq i32 %18, %19
+  br i1 %20, label %21, label %55
+
+21:                                               ; preds = %17
+  %22 = load [100 x i32]*, [100 x i32]** %3, align 8
+  %23 = load i32, i32* %6, align 4
+  %24 = sext i32 %23 to i64
+  %25 = getelementptr inbounds [100 x i32], [100 x i32]* %22, i64 %24
+  %26 = load i32, i32* %7, align 4
+  %27 = sext i32 %26 to i64
+  %28 = getelementptr inbounds [100 x i32], [100 x i32]* %25, i64 0, i64 %27
+  %29 = load i32, i32* %28, align 4
+  %30 = srem i32 %29, 2
+  %31 = icmp eq i32 %30, 0
+  br i1 %31, label %32, label %43
+
+32:                                               ; preds = %21
+  %33 = load [100 x i32]*, [100 x i32]** %3, align 8
+  %34 = load i32, i32* %6, align 4
+  %35 = sext i32 %34 to i64
+  %36 = getelementptr inbounds [100 x i32], [100 x i32]* %33, i64 %35
+  %37 = load i32, i32* %7, align 4
+  %38 = sext i32 %37 to i64
+  %39 = getelementptr inbounds [100 x i32], [100 x i32]* %36, i64 0, i64 %38
+  %40 = load i32, i32* %39, align 4
+  %41 = load i32, i32* %5, align 4
+  %42 = add nsw i32 %41, %40
+  store i32 %42, i32* %5, align 4
+  br label %54
+
+43:                                               ; preds = %21
+  %44 = load [100 x i32]*, [100 x i32]** %3, align 8
+  %45 = load i32, i32* %6, align 4
+  %46 = sext i32 %45 to i64
+  %47 = getelementptr inbounds [100 x i32], [100 x i32]* %44, i64 %46
+  %48 = load i32, i32* %7, align 4
+  %49 = sext i32 %48 to i64
+  %50 = getelementptr inbounds [100 x i32], [100 x i32]* %47, i64 0, i64 %49
+  %51 = load i32, i32* %50, align 4
+  %52 = load i32, i32* %5, align 4
+  %53 = sub nsw i32 %52, %51
+  store i32 %53, i32* %5, align 4
+  br label %54
+
+54:                                               ; preds = %43, %32
+  br label %72
+
+55:                                               ; preds = %17
+  %56 = load i32, i32* %6, align 4
+  %57 = load i32, i32* %7, align 4
+  %58 = icmp slt i32 %56, %57
+  br i1 %58, label %59, label %71
+
+59:                                               ; preds = %55
+  %60 = load [100 x i32]*, [100 x i32]** %3, align 8
+  %61 = load i32, i32* %6, align 4
+  %62 = sext i32 %61 to i64
+  %63 = getelementptr inbounds [100 x i32], [100 x i32]* %60, i64 %62
+  %64 = load i32, i32* %7, align 4
+  %65 = sext i32 %64 to i64
+  %66 = getelementptr inbounds [100 x i32], [100 x i32]* %63, i64 0, i64 %65
+  %67 = load i32, i32* %66, align 4
+  %68 = call i32 @countSetBits(i32 %67)
+  %69 = load i32, i32* %5, align 4
+  %70 = add nsw i32 %69, %68
+  store i32 %70, i32* %5, align 4
+  br label %71
+
+71:                                               ; preds = %59, %55
+  br label %72
+
+72:                                               ; preds = %71, %54
+  br label %73
+
+73:                                               ; preds = %72
+  %74 = load i32, i32* %7, align 4
+  %75 = add nsw i32 %74, 1
+  store i32 %75, i32* %7, align 4
+  br label %13
+
+76:                                               ; preds = %13
+  br label %77
+
+77:                                               ; preds = %76
+  %78 = load i32, i32* %6, align 4
+  %79 = add nsw i32 %78, 1
+  store i32 %79, i32* %6, align 4
+  br label %8
+
+80:                                               ; preds = %8
+  %81 = load i32, i32* %5, align 4
+  ret i32 %81
+}
+
+; Function Attrs: noinline nounwind optnone uwtable
+define dso_local i32 @projectB_main() #0 !project_source !3 {
+  %1 = alloca [14 x i8], align 1
+  %2 = alloca [8 x i32], align 16
+  %3 = alloca i32, align 4
+  %4 = alloca i32, align 4
+  %5 = alloca [100 x [100 x i32]], align 16
+  %6 = alloca i32, align 4
+  %7 = alloca i32, align 4
+  %8 = alloca i32, align 4
+  %9 = call i32 @testPoints(i32 5)
+  call void @llvm.memset.p0i8.i64(i8* align 16 bitcast ([100 x i32]* @cache to i8*), i8 -1, i64 400, i1 false)
+  %10 = bitcast [14 x i8]* %1 to i8*
+  call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 1 %10, i8* align 1 getelementptr inbounds ([14 x i8], [14 x i8]* @__const.projectB_main.str, i32 0, i32 0), i64 14, i1 false)
+  %11 = getelementptr inbounds [14 x i8], [14 x i8]* %1, i64 0, i64 0
+  call void @reverseString(i8* %11)
+  %12 = bitcast [8 x i32]* %2 to i8*
+  call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 16 %12, i8* align 16 bitcast ([8 x i32]* @__const.projectB_main.arr to i8*), i64 32, i1 false)
+  store i32 8, i32* %3, align 4
+  %13 = getelementptr inbounds [8 x i32], [8 x i32]* %2, i64 0, i64 0
+  %14 = load i32, i32* %3, align 4
+  %15 = call i32 @longestIncreasingSubsequence(i32* %13, i32 %14)
+  store i32 %15, i32* %4, align 4
+  %16 = bitcast [100 x [100 x i32]]* %5 to i8*
+  call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 16 %16, i8* align 16 bitcast (<{ <{ i32, i32, i32, [97 x i32] }>, <{ i32, i32, i32, [97 x i32] }>, <{ i32, i32, i32, [97 x i32] }>, [97 x <{ i32, i32, i32, [97 x i32] }>] }>* @__const.projectB_main.matrix to i8*), i64 40000, i1 false)
+  %17 = getelementptr inbounds [100 x [100 x i32]], [100 x [100 x i32]]* %5, i64 0, i64 0
+  %18 = call i32 @processMatrix([100 x i32]* %17, i32 3)
+  store i32 %18, i32* %6, align 4
+  store i32 0, i32* %7, align 4
+  br label %19
+
+19:                                               ; preds = %24, %0
+  %20 = load i32, i32* %7, align 4
+  %21 = call i32 @memoizedFib(i32 %20)
+  %22 = load i32, i32* %7, align 4
+  %23 = add nsw i32 %22, 1
+  store i32 %23, i32* %7, align 4
+  br label %24
+
+24:                                               ; preds = %19
+  %25 = load i32, i32* %7, align 4
+  %26 = icmp slt i32 %25, 10
+  br i1 %26, label %19, label %27
+
+27:                                               ; preds = %24
+  %28 = load i32, i32* %4, align 4
+  %29 = icmp sgt i32 %28, 5
+  br i1 %29, label %30, label %40
+
+30:                                               ; preds = %27
+  %31 = load i32, i32* %6, align 4
+  %32 = icmp sgt i32 %31, 0
+  br i1 %32, label %33, label %36
+
+33:                                               ; preds = %30
+  %34 = load i32, i32* %4, align 4
+  %35 = call i32 @memoizedFib(i32 %34)
+  store i32 %35, i32* %8, align 4
+  br label %39
+
+36:                                               ; preds = %30
+  %37 = load i32, i32* %6, align 4
+  %38 = call i32 @countSetBits(i32 %37)
+  store i32 %38, i32* %8, align 4
+  br label %39
+
+39:                                               ; preds = %36, %33
+  br label %47
+
+40:                                               ; preds = %27
+  %41 = getelementptr inbounds [14 x i8], [14 x i8]* %1, i64 0, i64 0
+  %42 = call i64 @strlen(i8* %41) #10
+  %43 = load i32, i32* %6, align 4
+  %44 = sext i32 %43 to i64
+  %45 = add i64 %42, %44
+  %46 = trunc i64 %45 to i32
+  store i32 %46, i32* %8, align 4
+  br label %47
+
+47:                                               ; preds = %40, %39
+  %48 = load i32, i32* %8, align 4
+  ret i32 %48
+}
+
+; Function Attrs: argmemonly nounwind willreturn
+declare void @llvm.memset.p0i8.i64(i8* nocapture writeonly, i8, i64, i1 immarg) #6
+
+; Function Attrs: argmemonly nounwind willreturn
+declare void @llvm.memcpy.p0i8.p0i8.i64(i8* noalias nocapture writeonly, i8* noalias nocapture readonly, i64, i1 immarg) #6
+
+attributes #0 = { noinline nounwind optnone uwtable "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "frame-pointer"="all" "less-precise-fpmad"="false" "min-legal-vector-width"="0" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }
+attributes #1 = { nounwind "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "frame-pointer"="all" "less-precise-fpmad"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }
+attributes #2 = { "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "frame-pointer"="all" "less-precise-fpmad"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }
+attributes #3 = { nounwind readnone "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "frame-pointer"="all" "less-precise-fpmad"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }
+attributes #4 = { nounwind readnone speculatable willreturn }
+attributes #5 = { nounwind readonly "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "frame-pointer"="all" "less-precise-fpmad"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }
+attributes #6 = { argmemonly nounwind willreturn }
+attributes #7 = { nounwind }
+attributes #8 = { nounwind readnone }
+attributes #9 = { readnone }
+attributes #10 = { nounwind readonly }
+
+!llvm.ident = !{!0, !0}
+!llvm.module.flags = !{!1}
+
+!0 = !{!"clang version 10.0.0-4ubuntu1 "}
+!1 = !{i32 1, !"wchar_size", i32 4}
+!2 = !{!"Bunker"}
+!3 = !{!"Target"}

BIN
proprocess_output/projectA_tagged.bc


BIN
proprocess_output/projectB_tagged.bc


+ 368 - 0
src/CallGraphPass.cpp

@@ -0,0 +1,368 @@
+#include "llvm/Pass.h"
+#include "llvm/IR/Function.h"
+#include "llvm/IR/Module.h"
+#include "llvm/IR/BasicBlock.h"
+#include "llvm/IR/Instructions.h"
+#include "llvm/IR/LegacyPassManager.h"
+#include "llvm/Transforms/IPO/PassManagerBuilder.h"
+#include "llvm/Support/raw_ostream.h"
+#include "llvm/Analysis/CFG.h"
+#include "llvm/Analysis/CallGraph.h"
+#include "LogSystem.h"
+#include <vector>
+#include <map>
+#include <set>
+#include <queue>
+#include <algorithm>
+#include <string>
+
+using namespace llvm;
+
+namespace {
+    struct FunctionSignature {
+        unsigned inDegree;
+        unsigned outDegree;
+        unsigned depth;
+        std::vector<unsigned> callerDepths;
+        std::vector<unsigned> calleeDepths;
+
+        FunctionSignature() : inDegree(0), outDegree(0), depth(0) {}
+
+        bool operator==(const FunctionSignature& other) const {
+            return inDegree == other.inDegree &&
+                   outDegree == other.outDegree &&
+                   depth == other.depth &&
+                   callerDepths == other.callerDepths &&
+                   calleeDepths == other.calleeDepths;
+        }
+    };
+
+    // 函数调用图的节点结构
+    struct CallNode {
+        std::string name;
+        bool isTarget;
+        std::set<std::string> callers;
+        std::set<std::string> callees;
+        unsigned depth;  // 在调用树中的深度
+
+        CallNode() : name(""), isTarget(false), depth(0) {}
+        
+        CallNode(std::string n, bool target = false) 
+            : name(n), isTarget(target), depth(0) {}
+    };
+
+    struct CodeFusionPass : public ModulePass {
+    public:
+        static char ID;
+        CodeFusionPass() : ModulePass(ID) {}
+
+        bool runOnModule(Module &M) override {
+            auto& logger = logging::LogSystem::getInstance();
+            logger.setGlobalLevel(logging::LogLevel::DEBUG);
+            
+            LOG_INFO("runOnModule", "Starting analysis for module: {0}", M.getName().str());
+
+            // 识别所有目标函数
+            for (Function &F : M) {
+                if (!F.isDeclaration() && isTargetCode(F)) {
+                    targetFunctions.insert(F.getName().str());
+                }
+            }
+
+            // 构建完整的调用图
+            buildCallGraph(M);
+
+            // 计算每个函数的调用深度
+            calculateCallDepths();
+
+            // 生成调用图的可视化
+            generateCallGraphs();
+
+            // 分析相似结构
+            findSimilarStructures();
+
+            return false;
+        }
+
+    private:
+        std::map<std::string, CallNode> callGraph;
+        std::set<std::string> targetFunctions;
+        std::map<std::string, unsigned> maxCallDepths;
+
+        void buildCallGraph(Module &M) {
+            LOG_INFO("buildCallGraph", "Building complete call graph");
+
+            // 初始化所有函数节点
+            for (Function &F : M) {
+                if (!F.isDeclaration()) {
+                    std::string fname = F.getName().str();
+                    bool isTarget = targetFunctions.find(fname) != targetFunctions.end();
+                    callGraph.insert({fname, CallNode(fname, isTarget)});
+                }
+            }
+
+            // 分析函数调用关系
+            for (Function &F : M) {
+                if (!F.isDeclaration()) {
+                    std::string callerName = F.getName().str();
+                    
+                    for (BasicBlock &BB : F) {
+                        for (Instruction &I : BB) {
+                            if (CallInst *CI = dyn_cast<CallInst>(&I)) {
+                                Function *CalledF = CI->getCalledFunction();
+                                if (CalledF && !CalledF->isDeclaration()) {
+                                    std::string calleeName = CalledF->getName().str();
+                                    
+                                    // 更新调用关系
+                                    callGraph[callerName].callees.insert(calleeName);
+                                    callGraph[calleeName].callers.insert(callerName);
+                                    
+                                    LOG_DEBUG("buildCallGraph", 
+                                        "Found call: {0} -> {1}", callerName, calleeName);
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+
+        void calculateCallDepths() {
+            LOG_INFO("calculateCallDepths", "Calculating call depths");
+
+            for (const std::string &targetFunc : targetFunctions) {
+                std::map<std::string, unsigned> depths;
+                std::queue<std::pair<std::string, unsigned>> queue;
+                std::set<std::string> visited;
+
+                queue.push(std::make_pair(targetFunc, 0));
+                visited.insert(targetFunc);
+
+                while (!queue.empty()) {
+                    std::string currentFunc = queue.front().first;
+                    unsigned depth = queue.front().second;
+                    queue.pop();
+
+                    depths[currentFunc] = depth;
+                    
+                    for (const std::string &caller : callGraph[currentFunc].callers) {
+                        if (visited.find(caller) == visited.end()) {
+                            queue.push(std::make_pair(caller, depth + 1));
+                            visited.insert(caller);
+                        }
+                    }
+
+                    for (const std::string &callee : callGraph[currentFunc].callees) {
+                        if (visited.find(callee) == visited.end()) {
+                            queue.push(std::make_pair(callee, depth + 1));
+                            visited.insert(callee);
+                        }
+                    }
+                }
+
+                // 更新最大深度
+                for (const auto &pair : depths) {
+                    const std::string &func = pair.first;
+                    unsigned depth = pair.second;
+                    maxCallDepths[func] = std::max(maxCallDepths[func], depth);
+                }
+            }
+        }
+
+        void generateCallGraphs() {
+            LOG_INFO("generateCallGraphs", "Generating complete call graphs");
+
+            // 分别生成目标项目和掩体项目的调用图
+            generateProjectCallGraph("Target Project Call Graph", true);
+            generateProjectCallGraph("Cover Project Call Graph", false);
+        }
+
+        void generateProjectCallGraph(const std::string &title, bool isTarget) {
+            errs() << "```mermaid\n";
+            errs() << "graph TD\n";
+            errs() << "    %% " << title << "\n";
+            
+            // 添加节点
+            for (const auto &pair : callGraph) {
+                const std::string &name = pair.first;
+                const CallNode &node = pair.second;
+                if (node.isTarget == isTarget) {
+                    std::string nodeId = sanitizeNodeId(name);
+                    std::string depth = std::to_string(maxCallDepths[name]);
+                    std::string style = node.isTarget ? ":::target" : "";
+                    
+                    errs() << "    " << nodeId << "[\"" << name 
+                        << "\\nDepth: " << depth << "\"]" << style << "\n";
+                }
+            }
+            
+            // 添加边
+            for (const auto &pair : callGraph) {
+                const std::string &name = pair.first;
+                const CallNode &node = pair.second;
+                if (node.isTarget == isTarget) {
+                    std::string callerId = sanitizeNodeId(name);
+                    
+                    for (const auto &callee : node.callees) {
+                        if (callGraph.at(callee).isTarget == isTarget) {
+                            std::string calleeId = sanitizeNodeId(callee);
+                            errs() << "    " << callerId << " --> " << calleeId << "\n";
+                        }
+                    }
+                }
+            }
+            
+            // 添加样式定义
+            errs() << "    classDef target fill:#f96,stroke:#333,stroke-width:4px\n";
+            errs() << "```\n\n";
+        }
+
+        void findSimilarStructures() {
+            LOG_INFO("findSimilarStructures", "Analyzing call graph similarities");
+
+            // 为每个函数计算特征签名
+            std::map<std::string, FunctionSignature> signatures;
+            for (const auto &pair : callGraph) {
+                const std::string &name = pair.first;
+                const CallNode &node = pair.second;
+                
+                FunctionSignature sig;
+                sig.inDegree = node.callers.size();
+                sig.outDegree = node.callees.size();
+                sig.depth = maxCallDepths[name];
+
+                // 收集调用者深度
+                for (const auto &caller : node.callers) {
+                    sig.callerDepths.push_back(maxCallDepths[caller]);
+                }
+                std::sort(sig.callerDepths.begin(), sig.callerDepths.end());
+
+                // 收集被调用者深度
+                for (const auto &callee : node.callees) {
+                    sig.calleeDepths.push_back(maxCallDepths[callee]);
+                }
+                std::sort(sig.calleeDepths.begin(), sig.calleeDepths.end());
+
+                signatures[name] = sig;
+            }
+
+            // 比较目标函数和掩体函数的相似度
+            for (const auto &targetFunc : targetFunctions) {
+                const auto &targetSig = signatures[targetFunc];
+                std::vector<std::pair<std::string, double>> similarities;
+
+                for (const auto &pair : callGraph) {
+                    const std::string &name = pair.first;
+                    const CallNode &node = pair.second;
+                    
+                    if (!node.isTarget) {
+                        const auto &coverSig = signatures[name];
+                        
+                        // 计算相似度得分
+                        double similarity = calculateSignatureSimilarity(targetSig, coverSig);
+                        
+                        if (similarity > 0.8) { // 相似度阈值
+                            similarities.emplace_back(name, similarity);
+                        }
+                    }
+                }
+
+                // 输出相似函数
+                if (!similarities.empty()) {
+                    LOG_INFO("findSimilarStructures", 
+                        "Similar functions for {0}:", targetFunc);
+                    for (const auto &pair : similarities) {
+                        const std::string &name = pair.first;
+                        double similarity = pair.second;
+                        LOG_INFO("findSimilarStructures", 
+                            "  {0} (similarity: {1:.2f})", name, similarity);
+                    }
+                }
+            }
+        }
+
+        double calculateSignatureSimilarity(
+            const FunctionSignature &sig1, 
+            const FunctionSignature &sig2) {
+            
+            double score = 0.0;
+            unsigned totalFactors = 0;
+
+            // 比较入度和出度
+            if (sig1.inDegree > 0 || sig2.inDegree > 0) {
+                score += 1.0 - std::abs(int(sig1.inDegree) - int(sig2.inDegree)) / 
+                    double(std::max(sig1.inDegree, sig2.inDegree));
+                totalFactors++;
+            }
+            
+            if (sig1.outDegree > 0 || sig2.outDegree > 0) {
+                score += 1.0 - std::abs(int(sig1.outDegree) - int(sig2.outDegree)) / 
+                    double(std::max(sig1.outDegree, sig2.outDegree));
+                totalFactors++;
+            }
+
+            // 比较深度
+            if (sig1.depth > 0 || sig2.depth > 0) {
+                score += 1.0 - std::abs(int(sig1.depth) - int(sig2.depth)) / 
+                    double(std::max(sig1.depth, sig2.depth));
+                totalFactors++;
+            }
+
+            // 比较调用者深度分布
+            if (!sig1.callerDepths.empty() && !sig2.callerDepths.empty()) {
+                score += compareDepthVectors(sig1.callerDepths, sig2.callerDepths);
+                totalFactors++;
+            }
+
+            // 比较被调用者深度分布
+            if (!sig1.calleeDepths.empty() && !sig2.calleeDepths.empty()) {
+                score += compareDepthVectors(sig1.calleeDepths, sig2.calleeDepths);
+                totalFactors++;
+            }
+
+            return totalFactors > 0 ? score / totalFactors : 0.0;
+        }
+
+        double compareDepthVectors(
+            const std::vector<unsigned> &v1, 
+            const std::vector<unsigned> &v2) {
+            
+            size_t maxSize = std::max(v1.size(), v2.size());
+            size_t minSize = std::min(v1.size(), v2.size());
+            
+            // 首先比较向量大小的相似度
+            double sizeSimilarity = double(minSize) / maxSize;
+            
+            // 然后比较实际值的相似度
+            double valueSimilarity = 0.0;
+            for (size_t i = 0; i < minSize; i++) {
+                valueSimilarity += 1.0 - std::abs(int(v1[i]) - int(v2[i])) / 
+                    double(std::max(v1[i], v2[i]));
+            }
+            valueSimilarity /= maxSize;
+
+            return (sizeSimilarity + valueSimilarity) / 2.0;
+        }
+
+        std::string sanitizeNodeId(const std::string &name) {
+            std::string id = name;
+            std::replace(id.begin(), id.end(), '.', '_');
+            std::replace(id.begin(), id.end(), ' ', '_');
+            std::replace(id.begin(), id.end(), '-', '_');
+            return id;
+        }
+
+        bool isTargetCode(Function &F) {
+            if (MDNode *MD = F.getMetadata("project_source")) {
+                if (MDString *ProjectStr = dyn_cast<MDString>(MD->getOperand(0))) {
+                    std::string projectName = ProjectStr->getString().str();
+                    return (projectName == "Target");
+                }
+            }
+            return false;
+        }
+    };
+}
+
+char CodeFusionPass::ID = 0;
+static RegisterPass<CodeFusionPass> X("codefusion", "Code Fusion Pass");

+ 139 - 0
src/LogSystem.h

@@ -0,0 +1,139 @@
+// LogSystem.h
+#ifndef LOG_SYSTEM_H
+#define LOG_SYSTEM_H
+
+#include "llvm/Support/raw_ostream.h"
+#include <string>
+#include <map>
+#include <set>
+#include <sstream>
+
+namespace logging {
+
+enum class LogLevel {
+    TRACE,
+    DEBUG,
+    INFO,
+    WARNING,
+    ERROR,
+    NONE
+};
+
+class LogSystem {
+public:
+    static LogSystem& getInstance() {
+        static LogSystem instance;
+        return instance;
+    }
+
+    void setGlobalLevel(LogLevel level) {
+        globalLevel = level;
+    }
+
+    void setFunctionLevel(const std::string& funcName, LogLevel level) {
+        functionLevels[funcName] = level;
+    }
+
+    void enableFunction(const std::string& funcName) {
+        enabledFunctions.insert(funcName);
+    }
+
+    void disableFunction(const std::string& funcName) {
+        enabledFunctions.erase(funcName);
+    }
+
+    void setContextFunction(const std::string& funcName) {
+        currentFunctionName = funcName;
+    }
+
+    bool shouldLog(const std::string& funcName, LogLevel level) {
+        if (enabledFunctions.find(funcName) == enabledFunctions.end()) {
+            return false;
+        }
+
+        auto it = functionLevels.find(funcName);
+        if (it != functionLevels.end()) {
+            return level >= it->second;
+        }
+
+        return level >= globalLevel;
+    }
+
+    template<typename... Args>
+    void log(const std::string& funcName, LogLevel level, const char* format, Args... args) {
+        if (!shouldLog(funcName, level)) {
+            return;
+        }
+
+        std::string levelStr;
+        switch (level) {
+            case LogLevel::TRACE:   levelStr = "TRACE"; break;
+            case LogLevel::DEBUG:   levelStr = "DEBUG"; break;
+            case LogLevel::INFO:    levelStr = "INFO"; break;
+            case LogLevel::WARNING: levelStr = "WARNING"; break;
+            case LogLevel::ERROR:   levelStr = "ERROR"; break;
+            default: return;
+        }
+
+        std::string msg(format);
+        replaceAll(msg, args...);
+
+        llvm::errs() << "[" << levelStr << "]";
+        if (!currentFunctionName.empty()) {
+            llvm::errs() << "[" << currentFunctionName << "]";
+        }
+        llvm::errs() << "[" << funcName << "] " << msg << "\n";
+    }
+
+private:
+    LogSystem() : globalLevel(LogLevel::INFO) {}
+    LogLevel globalLevel;
+    std::map<std::string, LogLevel> functionLevels;
+    std::set<std::string> enabledFunctions;
+    std::string currentFunctionName;
+
+    // 递归终止条件
+    void replaceAll(std::string&) {}
+
+    // 递归替换函数
+    template<typename T, typename... Args>
+    void replaceAll(std::string& str, T&& value, Args&&... args) {
+        std::stringstream ss;
+        ss << std::forward<T>(value);
+        size_t pos = str.find("{0}");
+        if (pos != std::string::npos) {
+            str.replace(pos, 3, ss.str());
+        }
+        // 移除已处理的参数,继续处理剩余参数
+        std::string rest = str;
+        size_t start = 0;
+        while ((pos = rest.find("{", start)) != std::string::npos) {
+            size_t end = rest.find("}", pos);
+            if (end != std::string::npos) {
+                std::string num = rest.substr(pos + 1, end - pos - 1);
+                int n = std::stoi(num);
+                if (n > 0) {  // 如果不是 {0}
+                    rest.replace(pos, end - pos + 1, "{" + std::to_string(n-1) + "}");
+                }
+            }
+            start = pos + 1;
+        }
+        str = rest;
+        replaceAll(str, std::forward<Args>(args)...);
+    }
+};
+
+#define LOG_TRACE(func, ...) \
+    logging::LogSystem::getInstance().log(func, logging::LogLevel::TRACE, __VA_ARGS__)
+#define LOG_DEBUG(func, ...) \
+    logging::LogSystem::getInstance().log(func, logging::LogLevel::DEBUG, __VA_ARGS__)
+#define LOG_INFO(func, ...) \
+    logging::LogSystem::getInstance().log(func, logging::LogLevel::INFO, __VA_ARGS__)
+#define LOG_WARNING(func, ...) \
+    logging::LogSystem::getInstance().log(func, logging::LogLevel::WARNING, __VA_ARGS__)
+#define LOG_ERROR(func, ...) \
+    logging::LogSystem::getInstance().log(func, logging::LogLevel::ERROR, __VA_ARGS__)
+
+} // namespace logging
+
+#endif // LOG_SYSTEM_H

+ 695 - 0
src/ModuleFusion.cpp

@@ -0,0 +1,695 @@
+#include "llvm/Pass.h"
+#include "llvm/IR/Function.h"
+#include "llvm/IR/Module.h"
+#include "llvm/IR/BasicBlock.h"
+#include "llvm/IR/Instructions.h"
+#include "llvm/IR/LegacyPassManager.h"
+#include "llvm/Transforms/IPO/PassManagerBuilder.h"
+#include "llvm/Support/raw_ostream.h"
+#include "llvm/Analysis/CFG.h"
+#include "llvm/Analysis/CallGraph.h"
+#include "LogSystem.h"
+#include <vector>
+#include <map>
+#include <set>
+#include <queue>
+#include <random>
+#include <algorithm>
+#include <string>
+
+using namespace llvm;
+
+namespace {
+    struct CallNode {
+        std::string name;
+        bool isTarget;
+        std::set<std::string> callers;
+        std::set<std::string> callees;
+        unsigned depth;
+        std::set<BasicBlock*> criticalPoints;
+        unsigned num; // 融合点个数/分片个数
+        
+        CallNode() : name(""), isTarget(false), depth(0), num(0) {}
+
+        CallNode(std::string n, bool target = false) 
+            : name(n), isTarget(target), depth(0), num(0) {}
+    };
+
+    struct CodeFusionPass : public ModulePass {
+    public:
+        static char ID;
+        CodeFusionPass() : ModulePass(ID) {}
+
+        bool runOnModule(Module &M) override {
+            auto& logger = logging::LogSystem::getInstance();
+            logger.setGlobalLevel(logging::LogLevel::DEBUG);
+            // 配置Log输出权限
+            logger.enableFunction("runOnModule");
+            // logger.enableFunction("dumpControlFlowGraph");
+            logger.enableFunction("buildCallGraph");
+            // logger.enableFunction("analyzeFunctionCriticalPoints");
+            // logger.enableFunction("calculateCallDepths");
+            logger.enableFunction("matchFunctionsForFusion");
+            logger.enableFunction("createFunctionSlices");
+            logger.enableFunction("countFusionPoints");
+            logger.enableFunction("generateFusionMatchGraph");
+            
+            LOG_INFO("runOnModule", "Starting analysis for module: {0}", M.getName().str());
+
+            for (Function &F : M) {
+                if(!F.isDeclaration()){
+                    if (isTargetCode(F)) {
+                        targetFunctions.insert(F.getName().str());
+                    }
+                    else{
+                        bunkerFunctions.insert(F.getName().str());
+                    }
+                }
+            }
+
+            buildCallGraph(M);
+            analyzeFunctionCriticalPoints(M);
+            calculateCallDepths(M);
+            generateProjectCallGraph();
+            for (Function &F : M) {
+                if(!F.isDeclaration()){
+                    dumpControlFlowGraph(F);
+                }
+            }
+
+            LOG_INFO("runOnModule", "Creating slices for target functions");
+            for (const auto& targetFuncName : targetFunctions) {
+                LOG_INFO("runOnModule", "targetFuncName: {0}",targetFuncName);
+                if (Function* F = M.getFunction(targetFuncName)) {
+                    createFunctionSlices(*F);
+                } else {
+                    LOG_ERROR("runOnModule", "Could not find function {0} in module", targetFuncName);
+                }
+            }
+
+            LOG_INFO("runOnModule", "Creating fusion points for bunker functions");
+            for (const auto& bunkerFuncName : bunkerFunctions) {
+                LOG_INFO("runOnModule", "bunkerFuncName: {0}",bunkerFuncName);
+                if (Function* F = M.getFunction(bunkerFuncName)) {
+                    countFusionPoints(*F);
+                } else {
+                    LOG_ERROR("runOnModule", "Could not find function {0} in module", bunkerFuncName);
+                }
+            }
+
+            if(matchFunctionsForFusion()){
+                generateFusionMatchGraph();
+            }
+
+            return false;
+        }
+
+    private:
+        std::map<std::string, CallNode> callGraph;
+        std::map<std::string, unsigned> maxCallDepths;
+        std::set<std::string> targetFunctions;
+        std::set<std::string> bunkerFunctions;
+        std::map<std::string, std::string> fusionPairs;
+
+        struct Slice {
+            std::vector<BasicBlock*> blocks;
+        };
+
+        size_t getRandomIndex(size_t max) {
+            static unsigned seed = 0;
+            seed = (seed * 1103515245 + 12345) & 0x7fffffff;
+            return seed % max;
+        }
+
+        bool matchFunctionsForFusion() {
+            LOG_INFO("matchFunctionsForFusion", "Starting function matching process");
+            
+            if (bunkerFunctions.size() < targetFunctions.size()) {
+                LOG_WARNING("matchFunctionsForFusion", 
+                    "Insufficient bunker functions ({0}) for target functions ({1})", 
+                    bunkerFunctions.size(), 
+                    targetFunctions.size());
+                return false;
+            }
+
+            std::vector<std::string> sortedTargets(targetFunctions.begin(), targetFunctions.end());
+            std::sort(sortedTargets.begin(), sortedTargets.end(),
+                [this](const std::string& a, const std::string& b) {
+                    return callGraph[a].num > callGraph[b].num;  // 降序排列
+                });
+
+            std::vector<std::string> availableBunkers(bunkerFunctions.begin(), bunkerFunctions.end());
+
+            for (const auto& targetFunc : sortedTargets) {
+                const auto& targetNode = callGraph[targetFunc];
+                size_t requiredPoints = targetNode.num;
+
+                bool matched = false;
+                while (!availableBunkers.empty() && !matched) {
+                    size_t idx = getRandomIndex(availableBunkers.size());
+                    const auto& bunkerFunc = availableBunkers[idx];
+                    const auto& bunkerNode = callGraph[bunkerFunc];
+
+                    if (bunkerNode.num >= requiredPoints) {
+                        fusionPairs[targetFunc] = bunkerFunc;
+                        availableBunkers.erase(availableBunkers.begin() + idx);
+                        matched = true;
+                        LOG_INFO("matchFunctionsForFusion", 
+                            "Matched target {0} ({1} slices) with bunker {2} ({3} fusion points)",
+                            targetFunc, 
+                            targetNode.num,
+                            bunkerFunc,
+                            bunkerNode.num);
+                    } else {
+                        availableBunkers.erase(availableBunkers.begin() + idx);
+                    }
+                }
+
+                if (!matched) {
+                    LOG_ERROR("matchFunctionsForFusion", 
+                        "Could not find suitable bunker function for target {0}", 
+                        targetFunc);
+                    return false;
+                }
+                // LOG_INFO("matchFunctionsForFusion", "Remaining bunker functions after matching {0}:", targetFunc);
+                // for (const auto& remainingBunker : availableBunkers) {
+                //     const auto& bunkerNode = callGraph[remainingBunker];
+                //     LOG_INFO("matchFunctionsForFusion", 
+                //         "    {0} (Critical Points: {1})", 
+                //         remainingBunker, 
+                //         bunkerNode.criticalPoints.size());
+                // }
+            }
+            return true;
+        }
+
+        void generateFusionMatchGraph() {
+            LOG_INFO("generateFusionMatchGraph", "Generating fusion match visualization");
+            
+            errs() << "```mermaid\n";
+            errs() << "graph LR\n";
+            errs() << "    %% Fusion Match Graph\n";
+            errs() << "    %% Left side: Target Project, Right side: Bunker Project\n\n";
+            
+            errs() << "    subgraph Target[\"Target Project\"]\n";
+            errs() << "        direction TB\n";
+            for (const auto& targetFunc : targetFunctions) {
+                std::string nodeId = sanitizeNodeId(targetFunc);
+                std::string criticalPoints = std::to_string(callGraph[targetFunc].criticalPoints.size());
+                errs() << "        " << nodeId << "[\"" << targetFunc 
+                    << "\\nCritical Points: " << criticalPoints
+                    << "\"]:::target\n";
+            }
+            errs() << "    end\n\n";
+            
+            errs() << "    subgraph Bunker[\"Bunker Project\"]\n";
+            errs() << "        direction TB\n";
+            for (const auto& bunkerFunc : bunkerFunctions) {
+                std::string nodeId = sanitizeNodeId(bunkerFunc);
+                std::string criticalPoints = std::to_string(callGraph[bunkerFunc].criticalPoints.size());
+                errs() << "        " << nodeId << "[\"" << bunkerFunc 
+                    << "\\nCritical Points: " << criticalPoints
+                    << "\"]:::bunker\n";
+            }
+            errs() << "    end\n\n";
+            
+            errs() << "    %% Fusion Matches\n";
+            for (const auto& match : fusionPairs) {
+                std::string targetId = sanitizeNodeId(match.first);
+                std::string bunkerId = sanitizeNodeId(match.second);
+                errs() << "    " << targetId << " ==>|fusion| " << bunkerId << "\n";
+            }
+            
+            errs() << "    %% Styles\n";
+            errs() << "    classDef target fill:#f96,stroke:#333,stroke-width:2px\n";
+            errs() << "    classDef bunker fill:#9cf,stroke:#333,stroke-width:2px\n";
+            errs() << "    style Target fill:#fff,stroke:#f96,stroke-width:2px\n";
+            errs() << "    style Bunker fill:#fff,stroke:#9cf,stroke-width:2px\n";
+            
+            errs() << "```\n\n";
+            
+            LOG_INFO("generateFusionMatchGraph", 
+                "Generated visualization with {0} target functions and {1} bunker functions", 
+                targetFunctions.size(), 
+                bunkerFunctions.size());
+            LOG_INFO("generateFusionMatchGraph", 
+                "Total fusion matches: {0}", 
+                fusionPairs.size());
+        }
+
+        void countFusionPoints(Function& F) {
+            std::string fname = F.getName().str();
+            
+            if (targetFunctions.find(fname) != targetFunctions.end()) {
+                return;
+            }
+
+            auto& criticalPoints = callGraph[fname].criticalPoints;
+            if (criticalPoints.empty()) {
+                callGraph[fname].num = 0;
+                return;
+            }
+            callGraph[fname].num = criticalPoints.size();
+
+            LOG_INFO("countFusionPoints", 
+                "Counted {0} fusion points for bunker function {1}",
+                criticalPoints.size(),
+                fname);
+        }
+
+        void createFunctionSlices(Function& F) {
+            std::string fname = F.getName().str();
+            
+            if (!callGraph[fname].isTarget) {
+                return;
+            }
+
+            auto& criticalPoints = callGraph[fname].criticalPoints;
+            if (criticalPoints.empty()) {
+                return;
+            }
+
+            BasicBlock* entryBlock = &F.getEntryBlock();
+            criticalPoints.insert(entryBlock);
+
+            std::vector<BasicBlock*> orderedPoints(criticalPoints.begin(), criticalPoints.end());
+            std::sort(orderedPoints.begin(), orderedPoints.end(),
+                [](BasicBlock* a, BasicBlock* b) {
+                    return a->getName() < b->getName();
+                });
+
+            std::set<BasicBlock*> processedBlocks;
+            std::vector<Slice> slices;
+
+            for (size_t i = 0; i < orderedPoints.size(); i++) {
+                BasicBlock* currentCritical = orderedPoints[i];
+                
+                if (processedBlocks.count(currentCritical)) {
+                    continue;
+                }
+
+                size_t numSuccessors = std::distance(succ_begin(currentCritical), succ_end(currentCritical));
+                size_t numPredecessors = std::distance(pred_begin(currentCritical), pred_end(currentCritical));
+
+                Slice newSlice;
+                if (numSuccessors <= 1 && numPredecessors <= 1) {
+                    newSlice.blocks.push_back(currentCritical);
+                    processedBlocks.insert(currentCritical);
+                } else {
+                    BasicBlock* nextCritical = nullptr;
+                    for (size_t j = i + 1; j < orderedPoints.size(); j++) {
+                        if (!processedBlocks.count(orderedPoints[j])) {
+                            nextCritical = orderedPoints[j];
+                            break;
+                        }
+                    }
+
+                    if (!nextCritical) {
+                        newSlice.blocks.push_back(currentCritical);
+                        processedBlocks.insert(currentCritical);
+                    } else {
+                        std::queue<BasicBlock*> queue;
+                        queue.push(currentCritical);
+                        while (!queue.empty()) {
+                            BasicBlock* current = queue.front();
+                            queue.pop();
+                            if (processedBlocks.count(current)) {
+                                continue;
+                            }
+                            processedBlocks.insert(current);
+                            newSlice.blocks.push_back(current);
+                            if (current != nextCritical) {
+                                for (BasicBlock* succ : successors(current)) {
+                                    if (!processedBlocks.count(succ) && 
+                                        (succ == nextCritical || !criticalPoints.count(succ))) {
+                                        queue.push(succ);
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+                if (!newSlice.blocks.empty()) {
+                    slices.push_back(newSlice);
+                }
+            }
+
+            callGraph[fname].num = slices.size();
+
+            LOG_INFO("createFunctionSlices", 
+                "Created {0} slices for target function {1}",
+                slices.size(),
+                fname);
+
+            for (size_t i = 0; i < slices.size(); i++) {
+                std::string blockNames;
+                for (BasicBlock* block : slices[i].blocks) {
+                    if (!blockNames.empty()) {
+                        blockNames += ", ";
+                    }
+                    blockNames += getNodeId(block);
+                }
+                LOG_DEBUG("createFunctionSlices", 
+                    "Slice {0} of function {1} contains blocks: {2}",
+                    i,
+                    fname,
+                    blockNames);
+            }
+        }
+
+        bool isTargetCode(Function &F) {
+            if (MDNode *MD = F.getMetadata("project_source")) {
+                if (MDString *ProjectStr = dyn_cast<MDString>(MD->getOperand(0))) {
+                    std::string projectName = ProjectStr->getString().str();
+                    return (projectName == "Target");
+                }
+            }
+            return false;
+        }
+
+        void dumpControlFlowGraph(Function &F) {
+            LOG_INFO("dumpControlFlowGraph", "Generating control flow graph for function: {0}", 
+                F.getName().str());
+            
+            if (F.empty()) {
+                LOG_WARNING("dumpControlFlowGraph", "Function is empty!");
+                return;
+            }
+
+            LOG_INFO("dumpControlFlowGraph", "Starting Mermaid graph generation");
+            errs() << "```mermaid: " << F.getName().str() << "\n";
+            errs() << "graph TD\n";
+            
+            for (BasicBlock &BB : F) {
+                std::string nodeId = getNodeId(&BB);
+                if (!nodeId.empty() && nodeId[0] == '%') {
+                    nodeId = nodeId.substr(1);
+                }
+                std::replace(nodeId.begin(), nodeId.end(), '.', '_');
+                std::replace(nodeId.begin(), nodeId.end(), ' ', '_');
+                std::replace(nodeId.begin(), nodeId.end(), '%', '_');
+                std::replace(nodeId.begin(), nodeId.end(), '-', '_');
+
+                LOG_TRACE("dumpControlFlowGraph", "Processing block with ID: {0}", nodeId);
+
+                std::string blockContent;
+                raw_string_ostream contentOS(blockContent);
+                
+                contentOS << "Block " << nodeId << ":\\n";
+                
+                for (Instruction &I : BB) {
+                    std::string instStr;
+                    raw_string_ostream instOS(instStr);
+                    I.print(instOS);
+                    instOS.flush();
+                    
+                    std::replace(instStr.begin(), instStr.end(), '"', '\'');
+                    std::replace(instStr.begin(), instStr.end(), '\n', ' ');
+                    
+                    if (instStr.length() > 50) {
+                        LOG_TRACE("dumpControlFlowGraph", "Truncating long instruction in block {0}", nodeId);
+                        instStr = instStr.substr(0, 47) + "...";
+                    }
+                    
+                    contentOS << instStr << "\\n";
+                }
+                contentOS.flush();
+
+                std::string fname = F.getName().str();
+
+                if (callGraph[fname].criticalPoints.count(&BB)) {
+                    LOG_TRACE("dumpControlFlowGraph", "Marking block {0} as critical", nodeId);
+                    errs() << "    " << nodeId << "[\"" << blockContent << "\"]:::critical\n";
+                } else {
+                    errs() << "    " << nodeId << "[\"" << blockContent << "\"]\n";
+                }
+
+                for (BasicBlock *Succ : successors(&BB)) {
+                    std::string succId;
+                    raw_string_ostream succOS(succId);
+                    Succ->printAsOperand(succOS, false);
+                    succOS.flush();
+                    
+                    if (!succId.empty() && succId[0] == '%') {
+                        succId = succId.substr(1);
+                    }
+                    
+                    std::replace(succId.begin(), succId.end(), '.', '_');
+                    std::replace(succId.begin(), succId.end(), ' ', '_');
+                    std::replace(succId.begin(), succId.end(), '%', '_');
+                    std::replace(succId.begin(), succId.end(), '-', '_');
+
+                    LOG_TRACE("dumpControlFlowGraph", "Processing edge from {0} to {1}", nodeId, succId);
+
+                    if (BranchInst *BI = dyn_cast<BranchInst>(BB.getTerminator())) {
+                        if (BI->isConditional()) {
+                            std::string condStr;
+                            raw_string_ostream condOS(condStr);
+                            BI->getCondition()->print(condOS);
+                            condOS.flush();
+                            
+                            bool isTrue = BI->getSuccessor(0) == Succ;
+                            LOG_TRACE("dumpControlFlowGraph", "Adding conditional branch edge: {0}", 
+                                isTrue ? "true" : "false");
+                            errs() << "    " << nodeId << " -->|" 
+                                << (isTrue ? "true" : "false") << "| " 
+                                << succId << "\n";
+                        } else {
+                            errs() << "    " << nodeId << " --> " << succId << "\n";
+                        }
+                    } else if (SwitchInst *SI = dyn_cast<SwitchInst>(BB.getTerminator())) {
+                        if (Succ == SI->getDefaultDest()) {
+                            LOG_TRACE("dumpControlFlowGraph", "Adding switch default edge");
+                            errs() << "    " << nodeId << " -->|default| " << succId << "\n";
+                        } else {
+                            for (auto Case : SI->cases()) {
+                                if (Case.getCaseSuccessor() == Succ) {
+                                    std::string caseStr;
+                                    raw_string_ostream caseOS(caseStr);
+                                    Case.getCaseValue()->print(caseOS);
+                                    LOG_TRACE("dumpControlFlowGraph", "Adding switch case edge: {0}", 
+                                        caseStr);
+                                    errs() << "    " << nodeId << " -->|case " 
+                                        << caseStr << "| " << succId << "\n";
+                                }
+                            }
+                        }
+                    } else {
+                        errs() << "    " << nodeId << " --> " << succId << "\n";
+                    }
+                }
+            }
+            errs() << "    classDef critical fill:#f96,stroke:#333,stroke-width:4px\n";
+            errs() << "```\n";
+            LOG_INFO("dumpControlFlowGraph", "Completed graph generation");
+        }
+
+        std::string getNodeId(BasicBlock *BB) {
+            std::string nodeId;
+            raw_string_ostream idOS(nodeId);
+            BB->printAsOperand(idOS, false);
+            idOS.flush();
+            return nodeId;
+        }
+
+        bool checkCriticalPoint(BasicBlock *BB) {
+            if (!BB) return false;
+            Function *F = BB->getParent();
+            if (!F) return false;
+            BasicBlock *Entry = &F->getEntryBlock();
+            BasicBlock *Exit = nullptr;
+            for (BasicBlock &B : *F) {
+                if (isa<ReturnInst>(B.getTerminator()) || 
+                    isa<UnreachableInst>(B.getTerminator())) {
+                    Exit = &B;
+                    break;
+                }
+            }
+            if (!Exit) return false;
+            std::set<BasicBlock*> visitedWithoutCurrent;
+            std::function<bool(BasicBlock*, BasicBlock*)> canReachExitWithout;
+            canReachExitWithout = [&canReachExitWithout, &visitedWithoutCurrent, BB]
+                (BasicBlock *Start, BasicBlock *Target) -> bool {
+                    if (Start == BB) return false;
+                    if (Start == Target) return true;
+                    
+                    if (visitedWithoutCurrent.count(Start)) return false;
+                    visitedWithoutCurrent.insert(Start);
+
+                    for (BasicBlock *Succ : successors(Start)) {
+                        if (canReachExitWithout(Succ, Target)) {
+                            return true;
+                        }
+                    }
+                    return false;
+                };
+            visitedWithoutCurrent.clear();
+            return !canReachExitWithout(Entry, Exit);
+        }
+
+        void analyzeFunctionCriticalPoints(Module &M) {
+            for (Function &F : M) {
+                if (!F.isDeclaration()) {
+                    std::string fname = F.getName().str();
+                    
+                    for (BasicBlock &BB : F) {
+                        if (checkCriticalPoint(&BB)) {
+                            callGraph[fname].criticalPoints.insert(&BB);
+                        }
+                    }
+                    LOG_INFO("analyzeFunctionCriticalPoints", 
+                        "Function {0} has {1} critical points", 
+                        fname, 
+                        callGraph[fname].criticalPoints.size());
+                }
+            }
+        }
+
+        void buildCallGraph(Module &M) {
+            LOG_INFO("buildCallGraph", "Building complete call graph");
+            for (Function &F : M) {
+                if (!F.isDeclaration()) {
+                    std::string fname = F.getName().str();
+                    bool isTarget = targetFunctions.find(fname) != targetFunctions.end();
+                    callGraph[fname] = CallNode(fname, isTarget);
+                }
+            }
+            for (Function &F : M) {
+                if (!F.isDeclaration()) {
+                    std::string callerName = F.getName().str();
+                    for (BasicBlock &BB : F) {
+                        for (Instruction &I : BB) {
+                            if (CallInst *CI = dyn_cast<CallInst>(&I)) {
+                                Function *CalledF = CI->getCalledFunction();
+                                if (CalledF && !CalledF->isDeclaration()) {
+                                    std::string calleeName = CalledF->getName().str();
+                                    callGraph[callerName].callees.insert(calleeName);
+                                    callGraph[calleeName].callers.insert(callerName);
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+
+        void calculateCallDepths(Module &M) {
+            LOG_INFO("calculateCallDepths", "Calculating call depths for all functions in module");
+
+            maxCallDepths.clear();
+            
+            for (Function &F : M) {
+                if (F.isDeclaration()) {
+                    continue;
+                }
+                std::string startFunc = F.getName().str();
+                std::map<std::string, unsigned> depths;
+                std::queue<std::pair<std::string, unsigned>> queue;
+                std::set<std::string> visited;
+
+                queue.push(std::make_pair(startFunc, 0));
+                visited.insert(startFunc);
+
+                while (!queue.empty()) {
+                    std::string currentFunc = queue.front().first;
+                    unsigned depth = queue.front().second;
+                    queue.pop();
+                    depths[currentFunc] = depth;
+                    for (const std::string &caller : callGraph[currentFunc].callers) {
+                        if (visited.find(caller) == visited.end()) {
+                            queue.push(std::make_pair(caller, depth + 1));
+                            visited.insert(caller);
+                        }
+                    }
+                    for (const std::string &callee : callGraph[currentFunc].callees) {
+                        if (visited.find(callee) == visited.end()) {
+                            queue.push(std::make_pair(callee, depth + 1));
+                            visited.insert(callee);
+                        }
+                    }
+                }
+
+                for (const auto &pair : depths) {
+                    const std::string &func = pair.first;
+                    unsigned depth = pair.second;
+                    maxCallDepths[func] = std::max(maxCallDepths[func], depth);
+                }
+
+                LOG_DEBUG("calculateCallDepths", 
+                    "Function {0}: processed {1} related functions, max depth {2}", 
+                    startFunc, 
+                    depths.size(),
+                    maxCallDepths[startFunc]);
+            }
+
+            unsigned maxDepth = 0;
+            std::string deepestFunc;
+            for (const auto &pair : maxCallDepths) {
+                if (pair.second > maxDepth) {
+                    maxDepth = pair.second;
+                    deepestFunc = pair.first;
+                }
+            }
+            LOG_INFO("calculateCallDepths", 
+                "Analysis complete - Total functions: {0}, Maximum depth: {1} (in function: {2})", 
+                maxCallDepths.size(), 
+                maxDepth,
+                deepestFunc);
+        }
+
+        void generateProjectCallGraph() {
+            errs() << "```mermaid\n";
+            errs() << "graph TD\n";
+            errs() << "    %% Project Call Graph\n";
+            
+            for (const auto &pair : callGraph) {
+                const std::string &name = pair.first;
+                const CallNode &node = pair.second;
+                std::string nodeId = sanitizeNodeId(name);
+                std::string depth = std::to_string(maxCallDepths[name]);
+                std::string criticalPoints = std::to_string(node.criticalPoints.size());
+                std::string style = node.isTarget ? ":::target" : "";
+                errs() << "    " << nodeId << "[\"" << name 
+                    << "\\nDepth: " << depth 
+                    << "\\nCritical Points: " << criticalPoints
+                    << "\"]" << style << "\n";
+            }
+            
+            for (const auto &pair : callGraph) {
+                const std::string &name = pair.first;
+                const CallNode &node = pair.second;
+                std::string callerId = sanitizeNodeId(name);
+                for (const auto &callee : node.callees) {
+                    std::string calleeId = sanitizeNodeId(callee);
+                    errs() << "    " << callerId << " --> " << calleeId << "\n";
+                }
+            }
+            errs() << "    classDef target fill:#f96,stroke:#333,stroke-width:4px\n";
+            errs() << "```\n\n";
+        }
+
+        std::string sanitizeNodeId(const std::string &name) {
+            std::string id = name;
+            // 移除前导 %
+            if (!id.empty() && id[0] == '%') {
+                id = id.substr(1);
+            }
+            
+            // 替换非法字符
+            std::replace(id.begin(), id.end(), '.', '_');
+            std::replace(id.begin(), id.end(), ' ', '_');
+            std::replace(id.begin(), id.end(), '-', '_');
+            std::replace(id.begin(), id.end(), '%', '_');
+            
+            // 确保ID以字母开头
+            if (!id.empty() && std::isdigit(id[0])) {
+                id = "block_" + id;
+            }
+            
+            return id;
+        }
+    };
+}
+
+char CodeFusionPass::ID = 0;
+static RegisterPass<CodeFusionPass> X("codefusion", "Code Fusion Pass");

+ 61 - 0
src/ProprocessFunctionPass.cpp

@@ -0,0 +1,61 @@
+#include "llvm/Pass.h"
+#include "llvm/IR/Module.h"
+#include "llvm/IR/Function.h"
+#include "llvm/IR/MDBuilder.h"
+#include "llvm/Support/raw_ostream.h"
+#include "llvm/Support/CommandLine.h"
+
+using namespace llvm;
+
+// 添加命令行选项,用于指定项目名称
+static cl::opt<std::string> ProjectName(
+    "project-name",
+    cl::desc("Specify the project name to be added as metadata"),
+    cl::value_desc("name"),
+    cl::Required // 设置为必需参数
+);
+
+namespace {
+struct ProjectMetadataPass : public ModulePass {
+    static char ID;
+    ProjectMetadataPass() : ModulePass(ID) {}
+
+    bool runOnModule(Module &M) override {
+        bool Modified = false;
+        LLVMContext &Ctx = M.getContext();
+
+        // 创建项目名称的metadata字符串
+        MDString *ProjectStr = MDString::get(Ctx, ProjectName.getValue());
+        
+        // 为每个非声明函数添加metadata
+        for (Function &F : M) {
+            if (F.isDeclaration())
+                continue;
+
+            // 检查函数是否已经有项目metadata
+            if (F.getMetadata("project_source")) {
+                errs() << "Warning: Function " << F.getName() 
+                       << " already has project metadata.\n";
+                continue;
+            }
+
+            // 创建metadata节点
+            MDNode *ProjectMD = MDNode::get(Ctx, ProjectStr);
+            
+            // 为函数添加metadata
+            F.setMetadata("project_source", ProjectMD);
+            
+            errs() << "Added project metadata '" << ProjectName 
+                   << "' to function: " << F.getName() << "\n";
+            
+            Modified = true;
+        }
+
+        return Modified;
+    }
+};
+}
+
+char ProjectMetadataPass::ID = 0;
+static RegisterPass<ProjectMetadataPass> 
+    X("add-project-metadata", "Add project source metadata to functions");

+ 409 - 0
src/SliceFusionPass.cpp

@@ -0,0 +1,409 @@
+#include "llvm/Pass.h"
+#include "llvm/IR/Function.h"
+#include "llvm/IR/BasicBlock.h"
+#include "llvm/IR/Instructions.h"
+#include "llvm/IR/LegacyPassManager.h"
+#include "llvm/Transforms/IPO/PassManagerBuilder.h"
+#include "llvm/Support/raw_ostream.h"
+#include "llvm/Analysis/CFG.h"
+#include "LogSystem.h"
+#include <vector>
+#include <map>
+#include <set>
+#include <queue>
+#include <algorithm>
+#include <string>
+
+using namespace llvm;
+
+namespace
+{
+    struct CodeFusionPass : public FunctionPass
+    {
+    public:
+        static char ID;
+        CodeFusionPass() : FunctionPass(ID) {}
+
+        bool runOnFunction(Function &F) override
+        {
+            // 配置日志系统
+            auto& logger = logging::LogSystem::getInstance();
+            logger.setGlobalLevel(logging::LogLevel::DEBUG);
+            logger.setContextFunction(F.getName().str());
+            // 配置Function输出权限
+            logger.enableFunction("checkCriticalPoint");
+            // logger.enableFunction("dumpControlFlowGraph");
+            // logger.enableFunction("isTargetCode");
+            LOG_INFO("runOnFunction", "Starting analysis for function: {0}", F.getName().str());
+
+            if(isTargetCode(F)){
+                for (BasicBlock &BB : F) {
+                    if(checkCriticalPoint(&BB)){
+                        criticalPoints.insert(&BB);
+                    }
+                }
+            }
+
+            // 绘制控制流图
+            // dumpControlFlowGraph(F);
+            
+            // 主要的混淆逻辑在这里实现
+            // analyzeFunction(F);
+            // selectFusionPoints(F);
+            // sliceTargetCode(F);
+            // fuseCode(F);
+            return true;
+        }
+
+    private:
+        std::set<BasicBlock*> criticalPoints;
+        std::vector<BasicBlock *> fusionPoints;
+        std::vector<std::vector<BasicBlock *>> targetSlices;
+
+        bool isTargetCode(Function &Func) {
+            LOG_INFO("isTargetCode", "Checking if function '{0}' is target code", Func.getName().str());
+            if (MDNode *MD = Func.getMetadata("project_source")) {
+                if (MDString *ProjectStr = dyn_cast<MDString>(MD->getOperand(0))) {
+                    std::string projectName = ProjectStr->getString().str();
+                    bool isTarget = (projectName == "Target");
+                    
+                    LOG_INFO("isTargetCode", "Function '{0}' project: {1}, isTarget: {2}", 
+                        Func.getName().str(), projectName, isTarget ? "true" : "false");
+                    
+                    return isTarget;
+                }
+            } 
+            if (!Func.isDeclaration()) {
+                LOG_WARNING("isTargetCode", "Function '{0}' has no project metadata, considering as non-target", 
+                    Func.getName().str());
+            }
+            return false;
+        }
+
+        std::string getNodeId(BasicBlock *BB){
+            std::string nodeId;
+            raw_string_ostream idOS(nodeId);
+            BB->printAsOperand(idOS, false);
+            idOS.flush();
+            return nodeId;
+        }
+
+        bool checkCriticalPoint(BasicBlock *BB) {
+            LOG_DEBUG("checkCriticalPoint", "Starting critical point check: {0}", getNodeId(BB));
+            if (!BB) {
+                LOG_ERROR("checkCriticalPoint", "Null basic block provided");
+                return false;
+            }
+            
+            Function *F = BB->getParent();
+            if (!F) {
+                LOG_ERROR("checkCriticalPoint", "Cannot get parent function for block");
+                return false;
+            }
+
+            // 获取起始和终止基本块
+            BasicBlock *Entry = &F->getEntryBlock();
+            BasicBlock *Exit = nullptr;
+            for (BasicBlock &B : *F) {
+                if (isa<ReturnInst>(B.getTerminator()) || 
+                    isa<UnreachableInst>(B.getTerminator())) {
+                    Exit = &B;
+                    break;
+                }
+            }
+            if (!Exit) {
+                LOG_WARNING("checkCriticalPoint", "No exit block found in function");
+                return false;
+            }
+
+            // 存储已访问的节点
+            std::set<BasicBlock*> visitedWithoutCurrent;
+            
+            // 不经过当前基本块的遍历函数
+            std::function<bool(BasicBlock*, BasicBlock*)> canReachExitWithout;
+            canReachExitWithout = [&canReachExitWithout, &visitedWithoutCurrent, BB]
+                (BasicBlock *Start, BasicBlock *Target) -> bool {
+                    if (Start == BB) return false;
+                    if (Start == Target) return true;
+                    
+                    if (visitedWithoutCurrent.count(Start)) return false;
+                    visitedWithoutCurrent.insert(Start);
+
+                    for (BasicBlock *Succ : successors(Start)) {
+                        if (canReachExitWithout(Succ, Target)) {
+                            return true;
+                        }
+                    }
+                    return false;
+                };
+
+            // 输出块的基本信息
+            LOG_TRACE("checkCriticalPoint", "Analyzing block: {0}", getNodeId(BB));
+            LOG_TRACE("checkCriticalPoint", "  Predecessors: {0}, Successors: {1}", 
+                pred_size(BB), succ_size(BB));
+
+            // 列出前驱基本块
+            LOG_TRACE("checkCriticalPoint", "Predecessor blocks:");
+            for (BasicBlock *Pred : predecessors(BB)) {
+                LOG_TRACE("checkCriticalPoint", "    {0}", getNodeId(Pred));
+            }
+
+            // 列出后继基本块
+            LOG_TRACE("checkCriticalPoint", "Successor blocks:");
+            for (BasicBlock *Succ : successors(BB)) {
+                LOG_TRACE("checkCriticalPoint", "    {0}", getNodeId(Succ));
+            }
+
+            // 清空访问集合
+            visitedWithoutCurrent.clear();
+            
+            // 判断从入口到出口是否必须经过当前基本块
+            bool isCritical = !canReachExitWithout(Entry, Exit);
+            
+            LOG_DEBUG("checkCriticalPoint", "Block {0} critical status: {1}", 
+                BB->getName().str(), isCritical ? "yes" : "no");
+            
+            return isCritical;
+        }
+
+        void dumpControlFlowGraph(Function &F) {
+            LOG_INFO("dumpControlFlowGraph", "Generating control flow graph for function: {0}", 
+                F.getName().str());
+            
+            if (F.empty()) {
+                LOG_WARNING("dumpControlFlowGraph", "Function is empty!");
+                return;
+            }
+
+            LOG_INFO("dumpControlFlowGraph", "Starting Mermaid graph generation");
+            errs() << "```mermaid\n";
+            errs() << "graph TD\n";
+            
+            // 为所有基本块创建节点
+            for (BasicBlock &BB : F) {
+                // 获取基本块的ID
+                std::string nodeId = getNodeId(&BB);
+                
+                if (!nodeId.empty() && nodeId[0] == '%') {
+                    nodeId = nodeId.substr(1);
+                }
+                
+                // 清理节点ID中的特殊字符
+                std::replace(nodeId.begin(), nodeId.end(), '.', '_');
+                std::replace(nodeId.begin(), nodeId.end(), ' ', '_');
+                std::replace(nodeId.begin(), nodeId.end(), '%', '_');
+                std::replace(nodeId.begin(), nodeId.end(), '-', '_');
+
+                LOG_TRACE("dumpControlFlowGraph", "Processing block with ID: {0}", nodeId);
+
+                // 构建基本块内容字符串
+                std::string blockContent;
+                raw_string_ostream contentOS(blockContent);
+                
+                // 添加基本块标签
+                contentOS << "Block " << nodeId << ":\\n";
+                
+                // 添加基本块中的每条指令
+                for (Instruction &I : BB) {
+                    std::string instStr;
+                    raw_string_ostream instOS(instStr);
+                    I.print(instOS);
+                    instOS.flush();
+                    
+                    // 清理指令字符串
+                    std::replace(instStr.begin(), instStr.end(), '"', '\'');
+                    std::replace(instStr.begin(), instStr.end(), '\n', ' ');
+                    
+                    // 如果指令太长,截断它
+                    if (instStr.length() > 50) {
+                        LOG_TRACE("dumpControlFlowGraph", "Truncating long instruction in block {0}", nodeId);
+                        instStr = instStr.substr(0, 47) + "...";
+                    }
+                    
+                    contentOS << instStr << "\\n";
+                }
+                contentOS.flush();
+
+                // 生成节点
+                if (criticalPoints.count(&BB)) {
+                    LOG_TRACE("dumpControlFlowGraph", "Marking block {0} as critical", nodeId);
+                    errs() << "    " << nodeId << "[\"" << blockContent << "\"]:::critical\n";
+                } else {
+                    errs() << "    " << nodeId << "[\"" << blockContent << "\"]\n";
+                }
+
+                // 处理边
+                for (BasicBlock *Succ : successors(&BB)) {
+                    std::string succId;
+                    raw_string_ostream succOS(succId);
+                    Succ->printAsOperand(succOS, false);
+                    succOS.flush();
+                    
+                    if (!succId.empty() && succId[0] == '%') {
+                        succId = succId.substr(1);
+                    }
+                    
+                    std::replace(succId.begin(), succId.end(), '.', '_');
+                    std::replace(succId.begin(), succId.end(), ' ', '_');
+                    std::replace(succId.begin(), succId.end(), '%', '_');
+                    std::replace(succId.begin(), succId.end(), '-', '_');
+
+                    LOG_TRACE("dumpControlFlowGraph", "Processing edge from {0} to {1}", nodeId, succId);
+
+                    // 检查分支类型并添加边
+                    if (BranchInst *BI = dyn_cast<BranchInst>(BB.getTerminator())) {
+                        if (BI->isConditional()) {
+                            // 获取条件表达式
+                            std::string condStr;
+                            raw_string_ostream condOS(condStr);
+                            BI->getCondition()->print(condOS);
+                            condOS.flush();
+                            
+                            bool isTrue = BI->getSuccessor(0) == Succ;
+                            LOG_TRACE("dumpControlFlowGraph", "Adding conditional branch edge: {0}", 
+                                isTrue ? "true" : "false");
+                            errs() << "    " << nodeId << " -->|" 
+                                << (isTrue ? "true" : "false") << "| " 
+                                << succId << "\n";
+                        } else {
+                            errs() << "    " << nodeId << " --> " << succId << "\n";
+                        }
+                    } else if (SwitchInst *SI = dyn_cast<SwitchInst>(BB.getTerminator())) {
+                        // 处理switch指令
+                        if (Succ == SI->getDefaultDest()) {
+                            LOG_TRACE("dumpControlFlowGraph", "Adding switch default edge");
+                            errs() << "    " << nodeId << " -->|default| " << succId << "\n";
+                        } else {
+                            for (auto Case : SI->cases()) {
+                                if (Case.getCaseSuccessor() == Succ) {
+                                    std::string caseStr;
+                                    raw_string_ostream caseOS(caseStr);
+                                    Case.getCaseValue()->print(caseOS);
+                                    LOG_TRACE("dumpControlFlowGraph", "Adding switch case edge: {0}", 
+                                        caseStr);
+                                    errs() << "    " << nodeId << " -->|case " 
+                                        << caseStr << "| " << succId << "\n";
+                                }
+                            }
+                        }
+                    } else {
+                        errs() << "    " << nodeId << " --> " << succId << "\n";
+                    }
+                }
+            }
+            
+            errs() << "    classDef critical fill:#f96,stroke:#333,stroke-width:4px\n";
+            errs() << "```\n";
+            LOG_INFO("dumpControlFlowGraph", "Completed graph generation");
+        }
+
+        void analyzeFunction(Function &F)
+        {
+            for (BasicBlock &BB : F)
+            {
+                for (Instruction &I : BB)
+                {
+                    if (CallInst *CI = dyn_cast<CallInst>(&I))
+                    {
+                        // 分析函数调用
+                        Function *CalledF = CI->getCalledFunction();
+                        if (CalledF && CalledF->isDeclaration())
+                        {
+                            errs() << "External function call: " << CalledF->getName() << "\n";
+                            // 这里可以添加区分变量
+                        }
+                    }
+                    // 可以添加更多的分析,如全局变量访问等
+                }
+            }
+        }
+
+        void selectFusionPoints(Function &F) {
+            errs() << "\n=== Starting Fusion Points Selection for function: " 
+                << F.getName() << " ===\n";
+            
+            fusionPoints.clear();
+            criticalPoints.clear();
+            
+            std::set<BasicBlock*> visited;
+            
+            // 首先收集所有可能的关键点
+            for (BasicBlock &BB : F) {
+                if (checkCriticalPoint(&BB)) {
+                    criticalPoints.insert(&BB);
+                }
+            }
+            
+            errs() << "\nIdentified " << criticalPoints.size() << " potential critical points\n";
+            
+            // 按照支配关系排序关键点
+            std::vector<BasicBlock*> orderedPoints;
+            BasicBlock *entryBlock = &F.getEntryBlock();
+            std::vector<BasicBlock*> workList;
+            workList.push_back(entryBlock);
+            
+            while (!workList.empty()) {
+                BasicBlock *current = workList.back();
+                workList.pop_back();
+                
+                if (visited.count(current))
+                    continue;
+                    
+                visited.insert(current);
+                
+                if (criticalPoints.count(current)) {
+                    orderedPoints.push_back(current);
+                    errs() << "Adding ordered critical point: " << current->getName() << "\n";
+                }
+                
+                for (BasicBlock *succ : successors(current)) {
+                    if (!visited.count(succ)) {
+                        workList.push_back(succ);
+                    }
+                }
+            }
+            
+            fusionPoints = orderedPoints;
+            
+            errs() << "\nSelected " << fusionPoints.size() << " fusion points in order:\n";
+            for (BasicBlock *BB : fusionPoints) {
+                errs() << "  " << BB->getName() << "\n";
+            }
+            
+            errs() << "\nValidating fusion points:\n";
+            for (size_t i = 0; i < fusionPoints.size(); ++i) {
+                BasicBlock *current = fusionPoints[i];
+                errs() << "Fusion point " << i << ": " << current->getName() << "\n";
+                
+                errs() << "Instructions in this fusion point:\n";
+                for (Instruction &I : *current) {
+                    errs() << "  " << I << "\n";
+                }
+                
+                if (i < fusionPoints.size() - 1) {
+                    BasicBlock *next = fusionPoints[i + 1];
+                    errs() << "Distance to next fusion point: " 
+                        << std::distance(current->getIterator(), next->getIterator()) 
+                        << " blocks\n";
+                }
+            }
+            
+            errs() << "=== Finished Fusion Points Selection ===\n\n";
+        }
+
+        void sliceTargetCode(Function &F)
+        {
+            errs() << "Slicing target code\n";
+            // 目标代码分片逻辑
+        }
+
+        void fuseCode(Function &F)
+        {
+            errs() << "Fusing code\n";
+            // 代码融合逻辑
+        }
+    };
+}
+
+char CodeFusionPass::ID = 0;
+static RegisterPass<CodeFusionPass> X("codefusion", "Code Fusion Pass");