Browse Source

feat: code fusion

Shellmiao 1 day ago
parent
commit
cf1a6eff45

BIN
build/ModuleFusion.so


+ 220 - 80
output/log_module_fusion.txt

@@ -1211,7 +1211,7 @@ graph TD
 [INFO][matchFunctionsForFusion] Matched target processMatrix (2 slices) with bunker createMatrix (2 fusion points)
 [INFO][matchFunctionsForFusion] Matched target processMatrix (2 slices) with bunker createMatrix (2 fusion points)
 [INFO][matchFunctionsForFusion] Matched target reverseString (2 slices) with bunker factorial (2 fusion points)
 [INFO][matchFunctionsForFusion] Matched target reverseString (2 slices) with bunker factorial (2 fusion points)
 [INFO][matchFunctionsForFusion] Matched target testPoints (2 slices) with bunker matchFunctionsFo (2 fusion points)
 [INFO][matchFunctionsForFusion] Matched target testPoints (2 slices) with bunker matchFunctionsFo (2 fusion points)
-[INFO][matchFunctionsForFusion] Matched target memoizedFib (1 slices) with bunker ÐRk< e< (2 fusion points)
+[INFO][matchFunctionsForFusion] Matched target memoizedFib (1 slices) with bunker 0–°ÿ (2 fusion points)
 [INFO][generateFusionMatchGraph] Generating fusion match visualization
 [INFO][generateFusionMatchGraph] Generating fusion match visualization
 ```mermaid
 ```mermaid
 graph LR
 graph LR
@@ -1375,13 +1375,6 @@ graph LR
 [DEBUG][updateCallSite] Using direct return value
 [DEBUG][updateCallSite] Using direct return value
 [DEBUG][updateCallSite] Successfully replaced all uses of original call
 [DEBUG][updateCallSite] Successfully replaced all uses of original call
 [INFO][updateCallSite] Successfully updated call site from   %68 = call i32 @countSetBits(i32 %67) to   %68 = call i32 @fused_quickSort(i1 true, i32* null, i32 0, i32 0, i32* null, i32 %67)
 [INFO][updateCallSite] Successfully updated call site from   %68 = call i32 @countSetBits(i32 %67) to   %68 = call i32 @fused_quickSort(i1 true, i32* null, i32 0, i32 0, i32* null, i32 %67)
-[INFO][performCodeFusion] Listing all return instructions in fused function: fused_quickSort
-[INFO][performCodeFusion] Return instruction in block :
-    ret i32 %265
-[INFO][performCodeFusion]   Return value type: i32
-[INFO][performCodeFusion] Return instruction in block :
-    ret i32 0
-[INFO][performCodeFusion]   Return value type: i32
 [INFO][performCodeFusion] Completed function fusion: fused_quickSort
 [INFO][performCodeFusion] Completed function fusion: fused_quickSort
 [INFO][performCodeFusion] Processing function pair: target=longestIncreasingSubsequence, bunker=performSimpleCalculations
 [INFO][performCodeFusion] Processing function pair: target=longestIncreasingSubsequence, bunker=performSimpleCalculations
 [DEBUG][performCodeFusion] Processing return values for fused function: fused_performSimpleCalculations
 [DEBUG][performCodeFusion] Processing return values for fused function: fused_performSimpleCalculations
@@ -1413,48 +1406,40 @@ graph LR
 [DEBUG][updateCallSite] Using direct return value
 [DEBUG][updateCallSite] Using direct return value
 [DEBUG][updateCallSite] Successfully replaced all uses of original call
 [DEBUG][updateCallSite] Successfully replaced all uses of original call
 [INFO][updateCallSite] Successfully updated call site from   %15 = call i32 @longestIncreasingSubsequence(i32* %13, i32 %14) to   %15 = call i32 @fused_performSimpleCalculations(i1 true, i32* %13, i32 %14)
 [INFO][updateCallSite] Successfully updated call site from   %15 = call i32 @longestIncreasingSubsequence(i32* %13, i32 %14) to   %15 = call i32 @fused_performSimpleCalculations(i1 true, i32* %13, i32 %14)
-[INFO][performCodeFusion] Listing all return instructions in fused function: fused_performSimpleCalculations
-[INFO][performCodeFusion] Return instruction in block :
-    ret i32 %122
-[INFO][performCodeFusion]   Return value type: i32
-[INFO][performCodeFusion] Return instruction in block :
-    ret i32 0
-[INFO][performCodeFusion]   Return value type: i32
 [INFO][performCodeFusion] Completed function fusion: fused_performSimpleCalculations
 [INFO][performCodeFusion] Completed function fusion: fused_performSimpleCalculations
 [INFO][performCodeFusion] Processing function pair: target=memoizedFib, bunker=projectA_main
 [INFO][performCodeFusion] Processing function pair: target=memoizedFib, bunker=projectA_main
 [DEBUG][performCodeFusion] Processing return values for fused function: fused_projectA_main
 [DEBUG][performCodeFusion] Processing return values for fused function: fused_projectA_main
 [DEBUG][performCodeFusion] Fused function return type: fused_return_projectA_main_memoizedFib
 [DEBUG][performCodeFusion] Fused function return type: fused_return_projectA_main_memoizedFib
 [DEBUG][performCodeFusion] Processing struct return type with 2 elements
 [DEBUG][performCodeFusion] Processing struct return type with 2 elements
 [DEBUG][performCodeFusion] Setting default target return value
 [DEBUG][performCodeFusion] Setting default target return value
-[DEBUG][performCodeFusion] Target type is integer type, setting to 0
 [DEBUG][performCodeFusion] Created struct return for bunker block: %360 with types: target=i32, bunker=i32
 [DEBUG][performCodeFusion] Created struct return for bunker block: %360 with types: target=i32, bunker=i32
 [DEBUG][performCodeFusion] Created struct return for target block: %18 with types: target=i32, bunker=i32
 [DEBUG][performCodeFusion] Created struct return for target block: %18 with types: target=i32, bunker=i32
 [DEBUG][updateCallSite] Original call instruction:
 [DEBUG][updateCallSite] Original call instruction:
-    %29 = call i32 @memoizedFib(i32 %28)
+    %28 = call i32 @memoizedFib(i32 %27)
 [DEBUG][updateCallSite] Adding target control parameter
 [DEBUG][updateCallSite] Adding target control parameter
 [DEBUG][updateCallSite] Adding default bunker parameters:
 [DEBUG][updateCallSite] Adding default bunker parameters:
 [DEBUG][updateCallSite] Adding original call parameters:
 [DEBUG][updateCallSite] Adding original call parameters:
 [DEBUG][updateCallSite]   Argument 0: type=i32
 [DEBUG][updateCallSite]   Argument 0: type=i32
 [DEBUG][updateCallSite] New call instruction:
 [DEBUG][updateCallSite] New call instruction:
-    %29 = call %fused_return_projectA_main_memoizedFib @fused_projectA_main(i1 true, i32 %28)
+    %28 = call %fused_return_projectA_main_memoizedFib @fused_projectA_main(i1 true, i32 %27)
 [DEBUG][updateCallSite] Processing non-void return value of type: i32
 [DEBUG][updateCallSite] Processing non-void return value of type: i32
 [DEBUG][updateCallSite] Extracting value from struct return type
 [DEBUG][updateCallSite] Extracting value from struct return type
 [DEBUG][updateCallSite] Extracted value type: i32
 [DEBUG][updateCallSite] Extracted value type: i32
 [DEBUG][updateCallSite] Successfully replaced all uses of original call
 [DEBUG][updateCallSite] Successfully replaced all uses of original call
-[INFO][updateCallSite] Successfully updated call site from   %29 = call i32 @memoizedFib(i32 %28) to   %29 = call %fused_return_projectA_main_memoizedFib @fused_projectA_main(i1 true, i32 %28)
+[INFO][updateCallSite] Successfully updated call site from   %28 = call i32 @memoizedFib(i32 %27) to   %28 = call %fused_return_projectA_main_memoizedFib @fused_projectA_main(i1 true, i32 %27)
 [DEBUG][updateCallSite] Original call instruction:
 [DEBUG][updateCallSite] Original call instruction:
-    %26 = call i32 @memoizedFib(i32 %25)
+    %25 = call i32 @memoizedFib(i32 %24)
 [DEBUG][updateCallSite] Adding target control parameter
 [DEBUG][updateCallSite] Adding target control parameter
 [DEBUG][updateCallSite] Adding default bunker parameters:
 [DEBUG][updateCallSite] Adding default bunker parameters:
 [DEBUG][updateCallSite] Adding original call parameters:
 [DEBUG][updateCallSite] Adding original call parameters:
 [DEBUG][updateCallSite]   Argument 0: type=i32
 [DEBUG][updateCallSite]   Argument 0: type=i32
 [DEBUG][updateCallSite] New call instruction:
 [DEBUG][updateCallSite] New call instruction:
-    %26 = call %fused_return_projectA_main_memoizedFib @fused_projectA_main(i1 true, i32 %25)
+    %25 = call %fused_return_projectA_main_memoizedFib @fused_projectA_main(i1 true, i32 %24)
 [DEBUG][updateCallSite] Processing non-void return value of type: i32
 [DEBUG][updateCallSite] Processing non-void return value of type: i32
 [DEBUG][updateCallSite] Extracting value from struct return type
 [DEBUG][updateCallSite] Extracting value from struct return type
 [DEBUG][updateCallSite] Extracted value type: i32
 [DEBUG][updateCallSite] Extracted value type: i32
 [DEBUG][updateCallSite] Successfully replaced all uses of original call
 [DEBUG][updateCallSite] Successfully replaced all uses of original call
-[INFO][updateCallSite] Successfully updated call site from   %26 = call i32 @memoizedFib(i32 %25) to   %26 = call %fused_return_projectA_main_memoizedFib @fused_projectA_main(i1 true, i32 %25)
+[INFO][updateCallSite] Successfully updated call site from   %25 = call i32 @memoizedFib(i32 %24) to   %25 = call %fused_return_projectA_main_memoizedFib @fused_projectA_main(i1 true, i32 %24)
 [DEBUG][updateCallSite] Original call instruction:
 [DEBUG][updateCallSite] Original call instruction:
     %35 = call i32 @memoizedFib(i32 %34)
     %35 = call i32 @memoizedFib(i32 %34)
 [DEBUG][updateCallSite] Adding target control parameter
 [DEBUG][updateCallSite] Adding target control parameter
@@ -1507,24 +1492,150 @@ graph LR
 [DEBUG][updateCallSite] Extracted value type: i32
 [DEBUG][updateCallSite] Extracted value type: i32
 [DEBUG][updateCallSite] Successfully replaced all uses of original call
 [DEBUG][updateCallSite] Successfully replaced all uses of original call
 [INFO][updateCallSite] Successfully updated call site from   %22 = call i32 @memoizedFib(i32 %21) to   %22 = call %fused_return_projectA_main_memoizedFib @fused_projectA_main(i1 true, i32 %21)
 [INFO][updateCallSite] Successfully updated call site from   %22 = call i32 @memoizedFib(i32 %21) to   %22 = call %fused_return_projectA_main_memoizedFib @fused_projectA_main(i1 true, i32 %21)
-[INFO][performCodeFusion] Listing all return instructions in fused function: fused_projectA_main
-[INFO][performCodeFusion] Return instruction in block :
-    ret %fused_return_projectA_main_memoizedFib %20
-[INFO][performCodeFusion]   Return value type: fused_return_projectA_main_memoizedFib
-[INFO][performCodeFusion] Return instruction in block :
-    ret %fused_return_projectA_main_memoizedFib %363
-[INFO][performCodeFusion]   Return value type: fused_return_projectA_main_memoizedFib
 [INFO][performCodeFusion] Completed function fusion: fused_projectA_main
 [INFO][performCodeFusion] Completed function fusion: fused_projectA_main
 [INFO][performCodeFusion] Processing function pair: target=processMatrix, bunker=createDynamicArray
 [INFO][performCodeFusion] Processing function pair: target=processMatrix, bunker=createDynamicArray
+[INFO][performCodeFusion] Listing all instructions after block cloning in function: fused_createDynamicArray
+```mermaid: fused_createDynamicArray
+graph TD
+    entry["Block entry:\n"]
+    4["Block 4:\n  %5 = alloca [100 x i32]*, align 8\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  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"]
+    4 --> 8
+    10["Block 10:\n  %11 = alloca %struct.DynamicArray*, align 8\n  %12 = alloca i32, align 4\n  %13 = alloca %struct.DynamicArray*, align 8\n  store i32 %0, i32* %3, align 4\n  %14 = load i32, i32* %3, align 4\n  %15 = icmp sle i32 %5, 0\n  br i1 %6, label %7, label %8\n"]
+    10 -->|true| 7
+    10 -->|false| 8
+    16["Block 16:\n  call void @setErrorMessage(i8* getelementptr ...\n  store %struct.DynamicArray* null, %struct.Dyn...\n  br label %44\n"]
+    16 --> 44
+    17["Block 17:\n  %18 = load i32, i32* %3, align 4\n  %19 = icmp sgt i32 %9, 1000\n  br i1 %10, label %11, label %12\n"]
+    17 -->|true| 11
+    17 -->|false| 12
+    20["Block 20:\n  call void @setErrorMessage(i8* getelementptr ...\n  store %struct.DynamicArray* null, %struct.Dyn...\n  br label %44\n"]
+    20 --> 44
+    21["Block 21:\n  %22 = call noalias i8* @malloc(i64 24) #7\n  %23 = bitcast i8* %13 to %struct.DynamicArray*\n  store %struct.DynamicArray* %14, %struct.Dyna...\n  %24 = load %struct.DynamicArray*, %struct.Dyn...\n  %25 = icmp ne %struct.DynamicArray* %15, null\n  br i1 %16, label %18, label %17\n"]
+    21 -->|true| 18
+    21 -->|false| 17
+    26["Block 26:\n  call void @setErrorMessage(i8* getelementptr ...\n  store %struct.DynamicArray* null, %struct.Dyn...\n  br label %44\n"]
+    26 --> 44
+    27["Block 27:\n  %28 = load i32, i32* %3, align 4\n  %29 = sext i32 %19 to i64\n  %30 = mul i64 4, %20\n  %31 = call noalias i8* @malloc(i64 %21) #7\n  %32 = bitcast i8* %22 to i32*\n  %33 = load %struct.DynamicArray*, %struct.Dyn...\n  %34 = getelementptr inbounds %struct.DynamicA...\n  store i32* %23, i32** %25, align 8\n  %35 = load %struct.DynamicArray*, %struct.Dyn...\n  %36 = getelementptr inbounds %struct.DynamicA...\n  %37 = load i32*, i32** %27, align 8\n  %38 = icmp ne i32* %28, null\n  br i1 %29, label %33, label %30\n"]
+    27 -->|true| 33
+    27 -->|false| 30
+    39["Block 39:\n  %40 = load %struct.DynamicArray*, %struct.Dyn...\n  %41 = 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"]
+    39 --> 44
+    42["Block 42:\n  %43 = load %struct.DynamicArray*, %struct.Dyn...\n  %44 = getelementptr inbounds %struct.DynamicA...\n  store i32 0, i32* %35, align 8\n  %45 = load i32, i32* %3, align 4\n  %46 = load %struct.DynamicArray*, %struct.Dyn...\n  %47 = getelementptr inbounds %struct.DynamicA...\n  store i32 %36, i32* %38, align 4\n  %48 = load %struct.DynamicArray*, %struct.Dyn...\n  %49 = getelementptr inbounds %struct.DynamicA...\n  store i32 1, i32* %40, align 8\n  %50 = load %struct.DynamicArray*, %struct.Dyn...\n  %51 = getelementptr inbounds %struct.DynamicA...\n  store i32 0, i32* %42, align 4\n  %52 = load %struct.DynamicArray*, %struct.Dyn...\n  store %struct.DynamicArray* %43, %struct.Dyna...\n  br label %44\n"]
+    42 --> 44
+    53["Block 53:\n  %54 = load i32, i32* %6, align 4\n  %55 = load i32, i32* %4, align 4\n  %56 = icmp slt i32 %9, %10\n  br i1 %11, label %12, label %80\n"]
+    53 -->|true| 12
+    53 -->|false| 80
+    57["Block 57:\n  store i32 0, i32* %7, align 4\n  br label %13\n"]
+    57 --> 13
+    58["Block 58:\n  %59 = load i32, i32* %5, align 4\n  ret i32 %81\n"]
+    60["Block 60:\n  %61 = load i32, i32* %7, align 4\n  %62 = load i32, i32* %4, align 4\n  %63 = icmp slt i32 %14, %15\n  br i1 %16, label %17, label %76\n"]
+    60 -->|true| 17
+    60 -->|false| 76
+    64["Block 64:\n  %65 = load i32, i32* %6, align 4\n  %66 = load i32, i32* %7, align 4\n  %67 = icmp eq i32 %18, %19\n  br i1 %20, label %21, label %55\n"]
+    64 -->|true| 21
+    64 -->|false| 55
+    68["Block 68:\n  br label %77\n"]
+    68 --> 77
+    69["Block 69:\n  %70 = load [100 x i32]*, [100 x i32]** %3, al...\n  %71 = load i32, i32* %6, align 4\n  %72 = sext i32 %23 to i64\n  %73 = getelementptr inbounds [100 x i32], [10...\n  %74 = load i32, i32* %7, align 4\n  %75 = sext i32 %26 to i64\n  %76 = getelementptr inbounds [100 x i32], [10...\n  %77 = load i32, i32* %28, align 4\n  %78 = srem i32 %29, 2\n  %79 = icmp eq i32 %30, 0\n  br i1 %31, label %32, label %43\n"]
+    69 -->|true| 32
+    69 -->|false| 43
+    80["Block 80:\n  %81 = load i32, i32* %6, align 4\n  %82 = load i32, i32* %7, align 4\n  %83 = icmp slt i32 %56, %57\n  br i1 %58, label %59, label %71\n"]
+    80 -->|true| 59
+    80 -->|false| 71
+    84["Block 84:\n  %85 = load i32, i32* %6, align 4\n  %86 = add nsw i32 %78, 1\n  store i32 %79, i32* %6, align 4\n  br label %8\n"]
+    84 --> 8
+    87["Block 87:\n  %88 = load [100 x i32]*, [100 x i32]** %3, al...\n  %89 = load i32, i32* %6, align 4\n  %90 = sext i32 %34 to i64\n  %91 = getelementptr inbounds [100 x i32], [10...\n  %92 = load i32, i32* %7, align 4\n  %93 = sext i32 %37 to i64\n  %94 = getelementptr inbounds [100 x i32], [10...\n  %95 = load i32, i32* %39, align 4\n  %96 = load i32, i32* %5, align 4\n  %97 = add nsw i32 %41, %40\n  store i32 %42, i32* %5, align 4\n  br label %54\n"]
+    87 --> 54
+    98["Block 98:\n  %99 = load [100 x i32]*, [100 x i32]** %3, al...\n  %100 = load i32, i32* %6, align 4\n  %101 = sext i32 %45 to i64\n  %102 = getelementptr inbounds [100 x i32], [1...\n  %103 = load i32, i32* %7, align 4\n  %104 = sext i32 %48 to i64\n  %105 = getelementptr inbounds [100 x i32], [1...\n  %106 = load i32, i32* %50, align 4\n  %107 = load i32, i32* %5, align 4\n  %108 = sub nsw i32 %52, %51\n  store i32 %53, i32* %5, align 4\n  br label %54\n"]
+    98 --> 54
+    109["Block 109:\n  %110 = load [100 x i32]*, [100 x i32]** %3, a...\n  %111 = load i32, i32* %6, align 4\n  %112 = sext i32 %61 to i64\n  %113 = getelementptr inbounds [100 x i32], [1...\n  %114 = load i32, i32* %7, align 4\n  %115 = sext i32 %64 to i64\n  %116 = getelementptr inbounds [100 x i32], [1...\n  %117 = load i32, i32* %66, align 4\n  %118 = call i32 @fused_quickSort(i1 true, i32...\n  %119 = load i32, i32* %5, align 4\n  %120 = add nsw i32 %69, %68\n  store i32 %70, i32* %5, align 4\n  br label %71\n"]
+    109 --> 71
+    121["Block 121:\n  br label %72\n"]
+    121 --> 72
+    122["Block 122:\n  br label %72\n"]
+    122 --> 72
+    123["Block 123:\n  br label %73\n"]
+    123 --> 73
+    124["Block 124:\n  %125 = load i32, i32* %7, align 4\n  %126 = add nsw i32 %74, 1\n  store i32 %75, i32* %7, align 4\n  br label %13\n"]
+    124 --> 13
+    127["Block 127:\n  %128 = load %struct.DynamicArray*, %struct.Dy...\n  ret %struct.DynamicArray* %45\n"]
+    classDef critical fill:#f96,stroke:#333,stroke-width:4px
+```
+[INFO][performCodeFusion] Listing all instructions after block cloning in function: fused_createDynamicArray
+```mermaid: fused_createDynamicArray
+graph TD
+    entry["Block entry:\n"]
+    4["Block 4:\n  %5 = alloca [100 x i32]*, align 8\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  store [100 x i32]* %2, [100 x i32]** %5, align 8\n  store i32 %3, i32* %6, align 4\n  store i32 0, i32* %7, align 4\n  store i32 0, i32* %8, align 4\n  br label %10\n"]
+    4 --> 10
+    10["Block 10:\n  %11 = alloca %struct.DynamicArray*, align 8\n  %12 = alloca i32, align 4\n  %13 = alloca %struct.DynamicArray*, align 8\n  store i32 %1, i32* %12, align 4\n  %14 = load i32, i32* %12, align 4\n  %15 = icmp sle i32 %14, 0\n  br i1 %15, label %16, label %17\n"]
+    10 -->|true| 16
+    10 -->|false| 17
+    16["Block 16:\n  call void @setErrorMessage(i8* getelementptr ...\n  store %struct.DynamicArray* null, %struct.Dyn...\n  br label %127\n"]
+    16 --> 127
+    17["Block 17:\n  %18 = load i32, i32* %12, align 4\n  %19 = icmp sgt i32 %18, 1000\n  br i1 %19, label %20, label %21\n"]
+    17 -->|true| 20
+    17 -->|false| 21
+    20["Block 20:\n  call void @setErrorMessage(i8* getelementptr ...\n  store %struct.DynamicArray* null, %struct.Dyn...\n  br label %127\n"]
+    20 --> 127
+    21["Block 21:\n  %22 = call noalias i8* @malloc(i64 24) #7\n  %23 = bitcast i8* %22 to %struct.DynamicArray*\n  store %struct.DynamicArray* %23, %struct.Dyna...\n  %24 = load %struct.DynamicArray*, %struct.Dyn...\n  %25 = icmp ne %struct.DynamicArray* %24, null\n  br i1 %25, label %27, label %26\n"]
+    21 -->|true| 27
+    21 -->|false| 26
+    26["Block 26:\n  call void @setErrorMessage(i8* getelementptr ...\n  store %struct.DynamicArray* null, %struct.Dyn...\n  br label %127\n"]
+    26 --> 127
+    27["Block 27:\n  %28 = load i32, i32* %12, align 4\n  %29 = sext i32 %28 to i64\n  %30 = mul i64 4, %29\n  %31 = call noalias i8* @malloc(i64 %30) #7\n  %32 = bitcast i8* %31 to i32*\n  %33 = load %struct.DynamicArray*, %struct.Dyn...\n  %34 = getelementptr inbounds %struct.DynamicA...\n  store i32* %32, i32** %34, align 8\n  %35 = load %struct.DynamicArray*, %struct.Dyn...\n  %36 = getelementptr inbounds %struct.DynamicA...\n  %37 = load i32*, i32** %36, align 8\n  %38 = icmp ne i32* %37, null\n  br i1 %38, label %42, label %39\n"]
+    27 -->|true| 42
+    27 -->|false| 39
+    39["Block 39:\n  %40 = load %struct.DynamicArray*, %struct.Dyn...\n  %41 = bitcast %struct.DynamicArray* %40 to i8*\n  call void @free(i8* %41) #7\n  call void @setErrorMessage(i8* getelementptr ...\n  store %struct.DynamicArray* null, %struct.Dyn...\n  br label %127\n"]
+    39 --> 127
+    42["Block 42:\n  %43 = load %struct.DynamicArray*, %struct.Dyn...\n  %44 = getelementptr inbounds %struct.DynamicA...\n  store i32 0, i32* %44, align 8\n  %45 = load i32, i32* %12, align 4\n  %46 = load %struct.DynamicArray*, %struct.Dyn...\n  %47 = getelementptr inbounds %struct.DynamicA...\n  store i32 %45, i32* %47, align 4\n  %48 = load %struct.DynamicArray*, %struct.Dyn...\n  %49 = getelementptr inbounds %struct.DynamicA...\n  store i32 1, i32* %49, align 8\n  %50 = load %struct.DynamicArray*, %struct.Dyn...\n  %51 = getelementptr inbounds %struct.DynamicA...\n  store i32 0, i32* %51, align 4\n  %52 = load %struct.DynamicArray*, %struct.Dyn...\n  store %struct.DynamicArray* %52, %struct.Dyna...\n  br label %53\n"]
+    42 --> 53
+    53["Block 53:\n  %54 = load i32, i32* %8, align 4\n  %55 = load i32, i32* %6, align 4\n  %56 = icmp slt i32 %54, %55\n  br i1 %56, label %57, label %58\n"]
+    53 -->|true| 57
+    53 -->|false| 58
+    57["Block 57:\n  store i32 0, i32* %9, align 4\n  br label %60\n"]
+    57 --> 60
+    58["Block 58:\n  %59 = load i32, i32* %7, align 4\n  ret i32 %81\n"]
+    60["Block 60:\n  %61 = load i32, i32* %9, align 4\n  %62 = load i32, i32* %6, align 4\n  %63 = icmp slt i32 %61, %62\n  br i1 %63, label %64, label %68\n"]
+    60 -->|true| 64
+    60 -->|false| 68
+    64["Block 64:\n  %65 = load i32, i32* %8, align 4\n  %66 = load i32, i32* %9, align 4\n  %67 = icmp eq i32 %65, %66\n  br i1 %67, label %69, label %80\n"]
+    64 -->|true| 69
+    64 -->|false| 80
+    68["Block 68:\n  br label %84\n"]
+    68 --> 84
+    69["Block 69:\n  %70 = load [100 x i32]*, [100 x i32]** %5, al...\n  %71 = load i32, i32* %8, align 4\n  %72 = sext i32 %71 to i64\n  %73 = getelementptr inbounds [100 x i32], [10...\n  %74 = load i32, i32* %9, align 4\n  %75 = sext i32 %74 to i64\n  %76 = getelementptr inbounds [100 x i32], [10...\n  %77 = load i32, i32* %76, align 4\n  %78 = srem i32 %77, 2\n  %79 = icmp eq i32 %78, 0\n  br i1 %79, label %87, label %98\n"]
+    69 -->|true| 87
+    69 -->|false| 98
+    80["Block 80:\n  %81 = load i32, i32* %8, align 4\n  %82 = load i32, i32* %9, align 4\n  %83 = icmp slt i32 %81, %82\n  br i1 %83, label %109, label %121\n"]
+    80 -->|true| 109
+    80 -->|false| 121
+    84["Block 84:\n  %85 = load i32, i32* %8, align 4\n  %86 = add nsw i32 %85, 1\n  store i32 %86, i32* %8, align 4\n  br label %53\n"]
+    84 --> 53
+    87["Block 87:\n  %88 = load [100 x i32]*, [100 x i32]** %5, al...\n  %89 = load i32, i32* %8, align 4\n  %90 = sext i32 %89 to i64\n  %91 = getelementptr inbounds [100 x i32], [10...\n  %92 = load i32, i32* %9, align 4\n  %93 = sext i32 %92 to i64\n  %94 = getelementptr inbounds [100 x i32], [10...\n  %95 = load i32, i32* %94, align 4\n  %96 = load i32, i32* %7, align 4\n  %97 = add nsw i32 %96, %95\n  store i32 %97, i32* %7, align 4\n  br label %122\n"]
+    87 --> 122
+    98["Block 98:\n  %99 = load [100 x i32]*, [100 x i32]** %5, al...\n  %100 = load i32, i32* %8, align 4\n  %101 = sext i32 %100 to i64\n  %102 = getelementptr inbounds [100 x i32], [1...\n  %103 = load i32, i32* %9, align 4\n  %104 = sext i32 %103 to i64\n  %105 = getelementptr inbounds [100 x i32], [1...\n  %106 = load i32, i32* %105, align 4\n  %107 = load i32, i32* %7, align 4\n  %108 = sub nsw i32 %107, %106\n  store i32 %108, i32* %7, align 4\n  br label %122\n"]
+    98 --> 122
+    109["Block 109:\n  %110 = load [100 x i32]*, [100 x i32]** %5, a...\n  %111 = load i32, i32* %8, align 4\n  %112 = sext i32 %111 to i64\n  %113 = getelementptr inbounds [100 x i32], [1...\n  %114 = load i32, i32* %9, align 4\n  %115 = sext i32 %114 to i64\n  %116 = getelementptr inbounds [100 x i32], [1...\n  %117 = load i32, i32* %116, align 4\n  %118 = call i32 @fused_quickSort(i1 true, i32...\n  %119 = load i32, i32* %7, align 4\n  %120 = add nsw i32 %119, %118\n  store i32 %120, i32* %7, align 4\n  br label %121\n"]
+    109 --> 121
+    121["Block 121:\n  br label %123\n"]
+    121 --> 123
+    122["Block 122:\n  br label %123\n"]
+    122 --> 123
+    123["Block 123:\n  br label %124\n"]
+    123 --> 124
+    124["Block 124:\n  %125 = load i32, i32* %9, align 4\n  %126 = add nsw i32 %125, 1\n  store i32 %126, i32* %9, align 4\n  br label %127\n"]
+    124 --> 127
+    127["Block 127:\n  %128 = load %struct.DynamicArray*, %struct.Dy...\n  ret %struct.DynamicArray* %45\n"]
+    classDef critical fill:#f96,stroke:#333,stroke-width:4px
+```
 [DEBUG][performCodeFusion] Processing return values for fused function: fused_createDynamicArray
 [DEBUG][performCodeFusion] Processing return values for fused function: fused_createDynamicArray
 [DEBUG][performCodeFusion] Fused function return type: fused_return_createDynamicArray_processMatrix
 [DEBUG][performCodeFusion] Fused function return type: fused_return_createDynamicArray_processMatrix
 [DEBUG][performCodeFusion] Processing struct return type with 2 elements
 [DEBUG][performCodeFusion] Processing struct return type with 2 elements
 [DEBUG][performCodeFusion] Setting default target return value
 [DEBUG][performCodeFusion] Setting default target return value
-[DEBUG][performCodeFusion] Target type is integer type, setting to 0
 [DEBUG][performCodeFusion] Created struct return for bunker block: %127 with types: target=i32, bunker=struct.DynamicArray*
 [DEBUG][performCodeFusion] Created struct return for bunker block: %127 with types: target=i32, bunker=struct.DynamicArray*
 [DEBUG][performCodeFusion] Created struct return for target block: %58 with types: target=i32, bunker=struct.DynamicArray*
 [DEBUG][performCodeFusion] Created struct return for target block: %58 with types: target=i32, bunker=struct.DynamicArray*
 [DEBUG][updateCallSite] Original call instruction:
 [DEBUG][updateCallSite] Original call instruction:
-    %60 = call %struct.DynamicArray* @createDynamicArray(i32 10)
+    %59 = call %struct.DynamicArray* @createDynamicArray(i32 10)
 [DEBUG][updateCallSite] Adding bunker control parameter
 [DEBUG][updateCallSite] Adding bunker control parameter
 [DEBUG][updateCallSite] Adding original call parameters:
 [DEBUG][updateCallSite] Adding original call parameters:
 [DEBUG][updateCallSite]   Argument 0: type=i32
 [DEBUG][updateCallSite]   Argument 0: type=i32
@@ -1532,12 +1643,12 @@ graph LR
 [DEBUG][updateCallSite]   Parameter type: array of i32*
 [DEBUG][updateCallSite]   Parameter type: array of i32*
 [DEBUG][updateCallSite]   Parameter type: i32
 [DEBUG][updateCallSite]   Parameter type: i32
 [DEBUG][updateCallSite] New call instruction:
 [DEBUG][updateCallSite] New call instruction:
-    %60 = call %fused_return_createDynamicArray_processMatrix @fused_createDynamicArray(i1 false, i32 10, [100 x i32]* null, i32 0)
+    %59 = call %fused_return_createDynamicArray_processMatrix @fused_createDynamicArray(i1 false, i32 10, [100 x i32]* null, i32 0)
 [DEBUG][updateCallSite] Processing non-void return value of type: struct.DynamicArray*
 [DEBUG][updateCallSite] Processing non-void return value of type: struct.DynamicArray*
 [DEBUG][updateCallSite] Extracting value from struct return type
 [DEBUG][updateCallSite] Extracting value from struct return type
 [DEBUG][updateCallSite] Extracted value type: struct.DynamicArray*
 [DEBUG][updateCallSite] Extracted value type: struct.DynamicArray*
 [DEBUG][updateCallSite] Successfully replaced all uses of original call
 [DEBUG][updateCallSite] Successfully replaced all uses of original call
-[INFO][updateCallSite] Successfully updated call site from   %60 = call %struct.DynamicArray* @createDynamicArray(i32 10) to   %60 = call %fused_return_createDynamicArray_processMatrix @fused_createDynamicArray(i1 false, i32 10, [100 x i32]* null, i32 0)
+[INFO][updateCallSite] Successfully updated call site from   %59 = call %struct.DynamicArray* @createDynamicArray(i32 10) to   %59 = call %fused_return_createDynamicArray_processMatrix @fused_createDynamicArray(i1 false, i32 10, [100 x i32]* null, i32 0)
 [DEBUG][updateCallSite] Original call instruction:
 [DEBUG][updateCallSite] Original call instruction:
     %18 = call i32 @processMatrix([100 x i32]* %17, i32 3)
     %18 = call i32 @processMatrix([100 x i32]* %17, i32 3)
 [DEBUG][updateCallSite] Adding target control parameter
 [DEBUG][updateCallSite] Adding target control parameter
@@ -1553,13 +1664,74 @@ graph LR
 [DEBUG][updateCallSite] Extracted value type: i32
 [DEBUG][updateCallSite] Extracted value type: i32
 [DEBUG][updateCallSite] Successfully replaced all uses of original call
 [DEBUG][updateCallSite] Successfully replaced all uses of original call
 [INFO][updateCallSite] Successfully updated call site from   %18 = call i32 @processMatrix([100 x i32]* %17, i32 3) to   %18 = call %fused_return_createDynamicArray_processMatrix @fused_createDynamicArray(i1 true, i32 0, [100 x i32]* %17, i32 3)
 [INFO][updateCallSite] Successfully updated call site from   %18 = call i32 @processMatrix([100 x i32]* %17, i32 3) to   %18 = call %fused_return_createDynamicArray_processMatrix @fused_createDynamicArray(i1 true, i32 0, [100 x i32]* %17, i32 3)
-[INFO][performCodeFusion] Listing all return instructions in fused function: fused_createDynamicArray
-[INFO][performCodeFusion] Return instruction in block :
-    ret %fused_return_createDynamicArray_processMatrix %60
-[INFO][performCodeFusion]   Return value type: fused_return_createDynamicArray_processMatrix
-[INFO][performCodeFusion] Return instruction in block :
-    ret %fused_return_createDynamicArray_processMatrix %130
-[INFO][performCodeFusion]   Return value type: fused_return_createDynamicArray_processMatrix
+[INFO][performCodeFusion] Listing all instructions after block cloning in function: fused_createDynamicArray
+```mermaid: fused_createDynamicArray
+graph TD
+    entry["Block entry:\n  br label %4\n"]
+    entry --> 4
+    4["Block 4:\n  %5 = alloca [100 x i32]*, align 8\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  store [100 x i32]* %2, [100 x i32]** %5, align 8\n  store i32 %3, i32* %6, align 4\n  store i32 0, i32* %7, align 4\n  store i32 0, i32* %8, align 4\n  br label %10\n"]
+    4 --> 10
+    10["Block 10:\n  %11 = alloca %struct.DynamicArray*, align 8\n  %12 = alloca i32, align 4\n  %13 = alloca %struct.DynamicArray*, align 8\n  store i32 %1, i32* %12, align 4\n  %14 = load i32, i32* %12, align 4\n  %15 = icmp sle i32 %14, 0\n  br i1 %15, label %16, label %17\n"]
+    10 -->|true| 16
+    10 -->|false| 17
+    16["Block 16:\n  call void @setErrorMessage(i8* getelementptr ...\n  store %struct.DynamicArray* null, %struct.Dyn...\n  br label %127\n"]
+    16 --> 127
+    17["Block 17:\n  %18 = load i32, i32* %12, align 4\n  %19 = icmp sgt i32 %18, 1000\n  br i1 %19, label %20, label %21\n"]
+    17 -->|true| 20
+    17 -->|false| 21
+    20["Block 20:\n  call void @setErrorMessage(i8* getelementptr ...\n  store %struct.DynamicArray* null, %struct.Dyn...\n  br label %127\n"]
+    20 --> 127
+    21["Block 21:\n  %22 = call noalias i8* @malloc(i64 24) #7\n  %23 = bitcast i8* %22 to %struct.DynamicArray*\n  store %struct.DynamicArray* %23, %struct.Dyna...\n  %24 = load %struct.DynamicArray*, %struct.Dyn...\n  %25 = icmp ne %struct.DynamicArray* %24, null\n  br i1 %25, label %27, label %26\n"]
+    21 -->|true| 27
+    21 -->|false| 26
+    26["Block 26:\n  call void @setErrorMessage(i8* getelementptr ...\n  store %struct.DynamicArray* null, %struct.Dyn...\n  br label %127\n"]
+    26 --> 127
+    27["Block 27:\n  %28 = load i32, i32* %12, align 4\n  %29 = sext i32 %28 to i64\n  %30 = mul i64 4, %29\n  %31 = call noalias i8* @malloc(i64 %30) #7\n  %32 = bitcast i8* %31 to i32*\n  %33 = load %struct.DynamicArray*, %struct.Dyn...\n  %34 = getelementptr inbounds %struct.DynamicA...\n  store i32* %32, i32** %34, align 8\n  %35 = load %struct.DynamicArray*, %struct.Dyn...\n  %36 = getelementptr inbounds %struct.DynamicA...\n  %37 = load i32*, i32** %36, align 8\n  %38 = icmp ne i32* %37, null\n  br i1 %38, label %42, label %39\n"]
+    27 -->|true| 42
+    27 -->|false| 39
+    39["Block 39:\n  %40 = load %struct.DynamicArray*, %struct.Dyn...\n  %41 = bitcast %struct.DynamicArray* %40 to i8*\n  call void @free(i8* %41) #7\n  call void @setErrorMessage(i8* getelementptr ...\n  store %struct.DynamicArray* null, %struct.Dyn...\n  br label %127\n"]
+    39 --> 127
+    42["Block 42:\n  %43 = load %struct.DynamicArray*, %struct.Dyn...\n  %44 = getelementptr inbounds %struct.DynamicA...\n  store i32 0, i32* %44, align 8\n  %45 = load i32, i32* %12, align 4\n  %46 = load %struct.DynamicArray*, %struct.Dyn...\n  %47 = getelementptr inbounds %struct.DynamicA...\n  store i32 %45, i32* %47, align 4\n  %48 = load %struct.DynamicArray*, %struct.Dyn...\n  %49 = getelementptr inbounds %struct.DynamicA...\n  store i32 1, i32* %49, align 8\n  %50 = load %struct.DynamicArray*, %struct.Dyn...\n  %51 = getelementptr inbounds %struct.DynamicA...\n  store i32 0, i32* %51, align 4\n  %52 = load %struct.DynamicArray*, %struct.Dyn...\n  store %struct.DynamicArray* %52, %struct.Dyna...\n  br label %53\n"]
+    42 --> 53
+    53["Block 53:\n  %54 = load i32, i32* %8, align 4\n  %55 = load i32, i32* %6, align 4\n  %56 = icmp slt i32 %54, %55\n  br i1 %56, label %57, label %58\n"]
+    53 -->|true| 57
+    53 -->|false| 58
+    57["Block 57:\n  store i32 0, i32* %9, align 4\n  br label %60\n"]
+    57 --> 60
+    58["Block 58:\n  %59 = load i32, i32* %7, align 4\n  %struct.target = insertvalue %fused_return_cr...\n  %struct.bunker1 = insertvalue %fused_return_c...\n  ret %fused_return_createDynamicArray_processM...\n"]
+    60["Block 60:\n  %61 = load i32, i32* %9, align 4\n  %62 = load i32, i32* %6, align 4\n  %63 = icmp slt i32 %61, %62\n  br i1 %63, label %64, label %68\n"]
+    60 -->|true| 64
+    60 -->|false| 68
+    64["Block 64:\n  %65 = load i32, i32* %8, align 4\n  %66 = load i32, i32* %9, align 4\n  %67 = icmp eq i32 %65, %66\n  br i1 %67, label %69, label %80\n"]
+    64 -->|true| 69
+    64 -->|false| 80
+    68["Block 68:\n  br label %84\n"]
+    68 --> 84
+    69["Block 69:\n  %70 = load [100 x i32]*, [100 x i32]** %5, al...\n  %71 = load i32, i32* %8, align 4\n  %72 = sext i32 %71 to i64\n  %73 = getelementptr inbounds [100 x i32], [10...\n  %74 = load i32, i32* %9, align 4\n  %75 = sext i32 %74 to i64\n  %76 = getelementptr inbounds [100 x i32], [10...\n  %77 = load i32, i32* %76, align 4\n  %78 = srem i32 %77, 2\n  %79 = icmp eq i32 %78, 0\n  br i1 %79, label %87, label %98\n"]
+    69 -->|true| 87
+    69 -->|false| 98
+    80["Block 80:\n  %81 = load i32, i32* %8, align 4\n  %82 = load i32, i32* %9, align 4\n  %83 = icmp slt i32 %81, %82\n  br i1 %83, label %109, label %121\n"]
+    80 -->|true| 109
+    80 -->|false| 121
+    84["Block 84:\n  %85 = load i32, i32* %8, align 4\n  %86 = add nsw i32 %85, 1\n  store i32 %86, i32* %8, align 4\n  br label %53\n"]
+    84 --> 53
+    87["Block 87:\n  %88 = load [100 x i32]*, [100 x i32]** %5, al...\n  %89 = load i32, i32* %8, align 4\n  %90 = sext i32 %89 to i64\n  %91 = getelementptr inbounds [100 x i32], [10...\n  %92 = load i32, i32* %9, align 4\n  %93 = sext i32 %92 to i64\n  %94 = getelementptr inbounds [100 x i32], [10...\n  %95 = load i32, i32* %94, align 4\n  %96 = load i32, i32* %7, align 4\n  %97 = add nsw i32 %96, %95\n  store i32 %97, i32* %7, align 4\n  br label %122\n"]
+    87 --> 122
+    98["Block 98:\n  %99 = load [100 x i32]*, [100 x i32]** %5, al...\n  %100 = load i32, i32* %8, align 4\n  %101 = sext i32 %100 to i64\n  %102 = getelementptr inbounds [100 x i32], [1...\n  %103 = load i32, i32* %9, align 4\n  %104 = sext i32 %103 to i64\n  %105 = getelementptr inbounds [100 x i32], [1...\n  %106 = load i32, i32* %105, align 4\n  %107 = load i32, i32* %7, align 4\n  %108 = sub nsw i32 %107, %106\n  store i32 %108, i32* %7, align 4\n  br label %122\n"]
+    98 --> 122
+    109["Block 109:\n  %110 = load [100 x i32]*, [100 x i32]** %5, a...\n  %111 = load i32, i32* %8, align 4\n  %112 = sext i32 %111 to i64\n  %113 = getelementptr inbounds [100 x i32], [1...\n  %114 = load i32, i32* %9, align 4\n  %115 = sext i32 %114 to i64\n  %116 = getelementptr inbounds [100 x i32], [1...\n  %117 = load i32, i32* %116, align 4\n  %118 = call i32 @fused_quickSort(i1 true, i32...\n  %119 = load i32, i32* %7, align 4\n  %120 = add nsw i32 %119, %118\n  store i32 %120, i32* %7, align 4\n  br label %121\n"]
+    109 --> 121
+    121["Block 121:\n  br label %123\n"]
+    121 --> 123
+    122["Block 122:\n  br label %123\n"]
+    122 --> 123
+    123["Block 123:\n  br label %124\n"]
+    123 --> 124
+    124["Block 124:\n  %125 = load i32, i32* %9, align 4\n  %126 = add nsw i32 %125, 1\n  store i32 %126, i32* %9, align 4\n  br label %127\n"]
+    124 --> 127
+    127["Block 127:\n  %128 = load %struct.DynamicArray*, %struct.Dy...\n  %struct.bunker = insertvalue %fused_return_cr...\n  ret %fused_return_createDynamicArray_processM...\n"]
+    classDef critical fill:#f96,stroke:#333,stroke-width:4px
+```
 [INFO][performCodeFusion] Completed function fusion: fused_createDynamicArray
 [INFO][performCodeFusion] Completed function fusion: fused_createDynamicArray
 [INFO][performCodeFusion] Processing function pair: target=projectB_main, bunker=setErrorMessage
 [INFO][performCodeFusion] Processing function pair: target=projectB_main, bunker=setErrorMessage
 [DEBUG][performCodeFusion] Processing return values for fused function: fused_setErrorMessage
 [DEBUG][performCodeFusion] Processing return values for fused function: fused_setErrorMessage
@@ -1614,9 +1786,9 @@ graph LR
 [DEBUG][updateCallSite]   Argument 0: type=i8*
 [DEBUG][updateCallSite]   Argument 0: type=i8*
 [DEBUG][updateCallSite] Adding default target parameters:
 [DEBUG][updateCallSite] Adding default target parameters:
 [DEBUG][updateCallSite] New call instruction:
 [DEBUG][updateCallSite] New call instruction:
-    %317 = call i32 @fused_setErrorMessage(i1 false, i8* getelementptr inbounds ([43 x i8], [43 x i8]* @.str.31, i64 0, i64 0))
+    %316 = call i32 @fused_setErrorMessage(i1 false, i8* getelementptr inbounds ([43 x i8], [43 x i8]* @.str.31, i64 0, i64 0))
 [DEBUG][updateCallSite] Void return type, no value processing needed
 [DEBUG][updateCallSite] Void return type, no value processing needed
-[INFO][updateCallSite] Successfully updated call site from   call void @setErrorMessage(i8* getelementptr inbounds ([43 x i8], [43 x i8]* @.str.31, i64 0, i64 0)) to   %317 = call i32 @fused_setErrorMessage(i1 false, i8* getelementptr inbounds ([43 x i8], [43 x i8]* @.str.31, i64 0, i64 0))
+[INFO][updateCallSite] Successfully updated call site from   call void @setErrorMessage(i8* getelementptr inbounds ([43 x i8], [43 x i8]* @.str.31, i64 0, i64 0)) to   %316 = call i32 @fused_setErrorMessage(i1 false, i8* getelementptr inbounds ([43 x i8], [43 x i8]* @.str.31, i64 0, i64 0))
 [DEBUG][updateCallSite] Original call instruction:
 [DEBUG][updateCallSite] Original call instruction:
     call void @setErrorMessage(i8* getelementptr inbounds ([39 x i8], [39 x i8]* @.str.15, i64 0, i64 0))
     call void @setErrorMessage(i8* getelementptr inbounds ([39 x i8], [39 x i8]* @.str.15, i64 0, i64 0))
 [DEBUG][updateCallSite] Adding bunker control parameter
 [DEBUG][updateCallSite] Adding bunker control parameter
@@ -2077,13 +2249,6 @@ graph LR
     %10 = call i32 @fused_setErrorMessage(i1 false, i8* getelementptr inbounds ([33 x i8], [33 x i8]* @.str.2, i64 0, i64 0))
     %10 = call i32 @fused_setErrorMessage(i1 false, i8* getelementptr inbounds ([33 x i8], [33 x i8]* @.str.2, i64 0, i64 0))
 [DEBUG][updateCallSite] Void return type, no value processing needed
 [DEBUG][updateCallSite] Void return type, no value processing needed
 [INFO][updateCallSite] Successfully updated call site from   call void @setErrorMessage(i8* getelementptr inbounds ([33 x i8], [33 x i8]* @.str.2, i64 0, i64 0)) to   %10 = call i32 @fused_setErrorMessage(i1 false, i8* getelementptr inbounds ([33 x i8], [33 x i8]* @.str.2, i64 0, i64 0))
 [INFO][updateCallSite] Successfully updated call site from   call void @setErrorMessage(i8* getelementptr inbounds ([33 x i8], [33 x i8]* @.str.2, i64 0, i64 0)) to   %10 = call i32 @fused_setErrorMessage(i1 false, i8* getelementptr inbounds ([33 x i8], [33 x i8]* @.str.2, i64 0, i64 0))
-[INFO][performCodeFusion] Listing all return instructions in fused function: fused_setErrorMessage
-[INFO][performCodeFusion] Return instruction in block :
-    ret i32 %68
-[INFO][performCodeFusion]   Return value type: i32
-[INFO][performCodeFusion] Return instruction in block :
-    ret i32 0
-[INFO][performCodeFusion]   Return value type: i32
 [INFO][performCodeFusion] Completed function fusion: fused_setErrorMessage
 [INFO][performCodeFusion] Completed function fusion: fused_setErrorMessage
 [INFO][performCodeFusion] Processing function pair: target=reverseString, bunker=createMatrix
 [INFO][performCodeFusion] Processing function pair: target=reverseString, bunker=createMatrix
 [DEBUG][performCodeFusion] Processing return values for fused function: fused_createMatrix
 [DEBUG][performCodeFusion] Processing return values for fused function: fused_createMatrix
@@ -2092,7 +2257,7 @@ graph LR
 [DEBUG][performCodeFusion] Updated bunker return in block %161 with value type struct.Matrix*
 [DEBUG][performCodeFusion] Updated bunker return in block %161 with value type struct.Matrix*
 [DEBUG][performCodeFusion] Updated target return in block %157 with value type struct.Matrix*
 [DEBUG][performCodeFusion] Updated target return in block %157 with value type struct.Matrix*
 [DEBUG][updateCallSite] Original call instruction:
 [DEBUG][updateCallSite] Original call instruction:
-    %85 = call %struct.Matrix* @createMatrix(i32 3, i32 3)
+    %84 = call %struct.Matrix* @createMatrix(i32 3, i32 3)
 [DEBUG][updateCallSite] Adding bunker control parameter
 [DEBUG][updateCallSite] Adding bunker control parameter
 [DEBUG][updateCallSite] Adding original call parameters:
 [DEBUG][updateCallSite] Adding original call parameters:
 [DEBUG][updateCallSite]   Argument 0: type=i32
 [DEBUG][updateCallSite]   Argument 0: type=i32
@@ -2100,13 +2265,13 @@ graph LR
 [DEBUG][updateCallSite] Adding default target parameters:
 [DEBUG][updateCallSite] Adding default target parameters:
 [DEBUG][updateCallSite]   Parameter type: i8*
 [DEBUG][updateCallSite]   Parameter type: i8*
 [DEBUG][updateCallSite] New call instruction:
 [DEBUG][updateCallSite] New call instruction:
-    %85 = call %struct.Matrix* @fused_createMatrix(i1 false, i32 3, i32 3, i8* null)
+    %84 = call %struct.Matrix* @fused_createMatrix(i1 false, i32 3, i32 3, i8* null)
 [DEBUG][updateCallSite] Processing non-void return value of type: struct.Matrix*
 [DEBUG][updateCallSite] Processing non-void return value of type: struct.Matrix*
 [DEBUG][updateCallSite] Using direct return value
 [DEBUG][updateCallSite] Using direct return value
 [DEBUG][updateCallSite] Successfully replaced all uses of original call
 [DEBUG][updateCallSite] Successfully replaced all uses of original call
-[INFO][updateCallSite] Successfully updated call site from   %85 = call %struct.Matrix* @createMatrix(i32 3, i32 3) to   %85 = call %struct.Matrix* @fused_createMatrix(i1 false, i32 3, i32 3, i8* null)
+[INFO][updateCallSite] Successfully updated call site from   %84 = call %struct.Matrix* @createMatrix(i32 3, i32 3) to   %84 = call %struct.Matrix* @fused_createMatrix(i1 false, i32 3, i32 3, i8* null)
 [DEBUG][updateCallSite] Original call instruction:
 [DEBUG][updateCallSite] Original call instruction:
-    %84 = call %struct.Matrix* @createMatrix(i32 3, i32 3)
+    %83 = call %struct.Matrix* @createMatrix(i32 3, i32 3)
 [DEBUG][updateCallSite] Adding bunker control parameter
 [DEBUG][updateCallSite] Adding bunker control parameter
 [DEBUG][updateCallSite] Adding original call parameters:
 [DEBUG][updateCallSite] Adding original call parameters:
 [DEBUG][updateCallSite]   Argument 0: type=i32
 [DEBUG][updateCallSite]   Argument 0: type=i32
@@ -2114,11 +2279,11 @@ graph LR
 [DEBUG][updateCallSite] Adding default target parameters:
 [DEBUG][updateCallSite] Adding default target parameters:
 [DEBUG][updateCallSite]   Parameter type: i8*
 [DEBUG][updateCallSite]   Parameter type: i8*
 [DEBUG][updateCallSite] New call instruction:
 [DEBUG][updateCallSite] New call instruction:
-    %84 = call %struct.Matrix* @fused_createMatrix(i1 false, i32 3, i32 3, i8* null)
+    %83 = call %struct.Matrix* @fused_createMatrix(i1 false, i32 3, i32 3, i8* null)
 [DEBUG][updateCallSite] Processing non-void return value of type: struct.Matrix*
 [DEBUG][updateCallSite] Processing non-void return value of type: struct.Matrix*
 [DEBUG][updateCallSite] Using direct return value
 [DEBUG][updateCallSite] Using direct return value
 [DEBUG][updateCallSite] Successfully replaced all uses of original call
 [DEBUG][updateCallSite] Successfully replaced all uses of original call
-[INFO][updateCallSite] Successfully updated call site from   %84 = call %struct.Matrix* @createMatrix(i32 3, i32 3) to   %84 = call %struct.Matrix* @fused_createMatrix(i1 false, i32 3, i32 3, i8* null)
+[INFO][updateCallSite] Successfully updated call site from   %83 = call %struct.Matrix* @createMatrix(i32 3, i32 3) to   %83 = call %struct.Matrix* @fused_createMatrix(i1 false, i32 3, i32 3, i8* null)
 [DEBUG][updateCallSite] Original call instruction:
 [DEBUG][updateCallSite] Original call instruction:
     %62 = call %struct.Matrix* @createMatrix(i32 %58, i32 %61)
     %62 = call %struct.Matrix* @createMatrix(i32 %58, i32 %61)
 [DEBUG][updateCallSite] Adding bunker control parameter
 [DEBUG][updateCallSite] Adding bunker control parameter
@@ -2145,13 +2310,6 @@ graph LR
     %14 = call %struct.Matrix* @fused_createMatrix(i1 true, i32 0, i32 0, i8* %13)
     %14 = call %struct.Matrix* @fused_createMatrix(i1 true, i32 0, i32 0, i8* %13)
 [DEBUG][updateCallSite] Void return type, no value processing needed
 [DEBUG][updateCallSite] Void return type, no value processing needed
 [INFO][updateCallSite] Successfully updated call site from   call void @reverseString(i8* %13) to   %14 = call %struct.Matrix* @fused_createMatrix(i1 true, i32 0, i32 0, i8* %13)
 [INFO][updateCallSite] Successfully updated call site from   call void @reverseString(i8* %13) to   %14 = call %struct.Matrix* @fused_createMatrix(i1 true, i32 0, i32 0, i8* %13)
-[INFO][performCodeFusion] Listing all return instructions in fused function: fused_createMatrix
-[INFO][performCodeFusion] Return instruction in block :
-    ret %struct.Matrix* null
-[INFO][performCodeFusion]   Return value type: struct.Matrix*
-[INFO][performCodeFusion] Return instruction in block :
-    ret %struct.Matrix* %162
-[INFO][performCodeFusion]   Return value type: struct.Matrix*
 [INFO][performCodeFusion] Completed function fusion: fused_createMatrix
 [INFO][performCodeFusion] Completed function fusion: fused_createMatrix
 [INFO][performCodeFusion] Processing function pair: target=testPoints, bunker=removeDuplicates
 [INFO][performCodeFusion] Processing function pair: target=testPoints, bunker=removeDuplicates
 [DEBUG][performCodeFusion] Processing return values for fused function: fused_removeDuplicates
 [DEBUG][performCodeFusion] Processing return values for fused function: fused_removeDuplicates
@@ -2172,23 +2330,5 @@ graph LR
 [DEBUG][updateCallSite] Using direct return value
 [DEBUG][updateCallSite] Using direct return value
 [DEBUG][updateCallSite] Successfully replaced all uses of original call
 [DEBUG][updateCallSite] Successfully replaced all uses of original call
 [INFO][updateCallSite] Successfully updated call site from   %11 = call i32 @testPoints(i32 5) to   %11 = call i32 @fused_removeDuplicates(i1 true, %struct.DynamicArray* null, i32 5)
 [INFO][updateCallSite] Successfully updated call site from   %11 = call i32 @testPoints(i32 5) to   %11 = call i32 @fused_removeDuplicates(i1 true, %struct.DynamicArray* null, i32 5)
-[INFO][performCodeFusion] Listing all return instructions in fused function: fused_removeDuplicates
-[INFO][performCodeFusion] Return instruction in block :
-    ret i32 %103
-[INFO][performCodeFusion]   Return value type: i32
-[INFO][performCodeFusion] Return instruction in block :
-    ret i32 0
-[INFO][performCodeFusion]   Return value type: i32
 [INFO][performCodeFusion] Completed function fusion: fused_removeDuplicates
 [INFO][performCodeFusion] Completed function fusion: fused_removeDuplicates
 [INFO][performCodeFusion] Code fusion completed, processed 7 function pairs
 [INFO][performCodeFusion] Code fusion completed, processed 7 function pairs
-Invalid InsertValueInst operands!
-  %20 = insertvalue %fused_return_projectA_main_memoizedFib { i32 undef, i32 0 }, Stack dump:
-0.	Program arguments: opt -load ./build/ModuleFusion.so -codefusion 
-1.	Running pass 'Function Pass Manager' on module '<stdin>'.
-2.	Running pass 'Module Verifier' on function '@fused_projectA_main'
-#0 0x00007fb5e4a734ff llvm::sys::PrintStackTrace(llvm::raw_ostream&) (/lib/x86_64-linux-gnu/libLLVM-10.so.1+0x9814ff)
-#1 0x00007fb5e4a717b0 llvm::sys::RunSignalHandlers() (/lib/x86_64-linux-gnu/libLLVM-10.so.1+0x97f7b0)
-#2 0x00007fb5e4a73ac5 (/lib/x86_64-linux-gnu/libLLVM-10.so.1+0x981ac5)
-#3 0x00007fb5e879a420 __restore_rt (/lib/x86_64-linux-gnu/libpthread.so.0+0x14420)
-#4 0x00007fb5e4a7db82 (/lib/x86_64-linux-gnu/libLLVM-10.so.1+0x98bb82)
-#5 0x000000003c6e1dd8 

BIN
output/module_fusion.bc


+ 2696 - 22
output/module_fusion_text.cbe.c

@@ -6,6 +6,30 @@ typedef unsigned char bool;
 #endif
 #endif
 
 
 typedef uint64_t ConstantDoubleTy;
 typedef uint64_t ConstantDoubleTy;
+/* get a declaration for alloca */
+#if defined(__CYGWIN__) || defined(__MINGW32__)
+#define  alloca(x) __builtin_alloca((x))
+#define _alloca(x) __builtin_alloca((x))
+#elif defined(__APPLE__)
+extern void *__builtin_alloca(unsigned long);
+#define alloca(x) __builtin_alloca(x)
+#define longjmp _longjmp
+#define setjmp _setjmp
+#elif defined(__sun__)
+#if defined(__sparcv9)
+extern void *__builtin_alloca(unsigned long);
+#else
+extern void *__builtin_alloca(unsigned int);
+#endif
+#define alloca(x) __builtin_alloca(x)
+#elif defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__DragonFly__) || defined(__arm__)
+#define alloca(x) __builtin_alloca(x)
+#elif defined(_MSC_VER)
+#define alloca(x) _alloca(x)
+#else
+#include <alloca.h>
+#endif
+
 #ifndef _MSC_VER
 #ifndef _MSC_VER
 #define __forceinline __attribute__((always_inline)) inline
 #define __forceinline __attribute__((always_inline)) inline
 #endif
 #endif
@@ -51,6 +75,8 @@ struct l_struct_struct_OC_Node;
 struct l_array_256_uint8_t;
 struct l_array_256_uint8_t;
 struct l_struct_struct_OC_Point;
 struct l_struct_struct_OC_Point;
 struct l_struct_struct_OC_Circle;
 struct l_struct_struct_OC_Circle;
+struct l_struct_fused_return_projectA_main_memoizedFib;
+struct l_struct_fused_return_createDynamicArray_processMatrix;
 struct l_array_9_uint8_t;
 struct l_array_9_uint8_t;
 struct l_array_55_uint8_t;
 struct l_array_55_uint8_t;
 struct l_array_33_uint8_t;
 struct l_array_33_uint8_t;
@@ -89,8 +115,7 @@ struct l_array_97_uint32_t;
 struct l_unnamed_2;
 struct l_unnamed_2;
 struct l_array_97_struct_AC_l_unnamed_2;
 struct l_array_97_struct_AC_l_unnamed_2;
 struct l_unnamed_1;
 struct l_unnamed_1;
-struct l_struct_fused_return_projectA_main_memoizedFib;
-struct l_struct_fused_return_createDynamicArray_processMatrix;
+struct l_array_100_struct_AC_l_array_100_uint32_t;
 
 
 /* Function definitions */
 /* Function definitions */
 
 
@@ -134,6 +159,14 @@ struct l_struct_struct_OC_Circle {
   uint32_t field2;
   uint32_t field2;
   struct l_array_256_uint8_t field3;
   struct l_array_256_uint8_t field3;
 };
 };
+struct l_struct_fused_return_projectA_main_memoizedFib {
+  uint32_t field0;
+  uint32_t field1;
+};
+struct l_struct_fused_return_createDynamicArray_processMatrix {
+  uint32_t field0;
+  void* field1;
+};
 struct l_array_9_uint8_t {
 struct l_array_9_uint8_t {
   uint8_t array[9];
   uint8_t array[9];
 };
 };
@@ -266,6 +299,9 @@ struct l_unnamed_1 {
 #ifdef _MSC_VER
 #ifdef _MSC_VER
 #pragma pack(pop)
 #pragma pack(pop)
 #endif
 #endif
+struct l_array_100_struct_AC_l_array_100_uint32_t {
+  struct l_array_100_uint32_t array[100];
+};
 
 
 /* Global Variable Declarations */
 /* Global Variable Declarations */
 extern uint32_t globalCounter;
 extern uint32_t globalCounter;
@@ -338,35 +374,37 @@ const static __PREFIXALIGN__(16) struct l_unnamed_1 __const_OC_projectB_main_OC_
 
 
 /* Function Declarations */
 /* Function Declarations */
 void* getErrorMessage(void) __ATTRIBUTELIST__((noinline, nothrow));
 void* getErrorMessage(void) __ATTRIBUTELIST__((noinline, nothrow));
-void free(void* _610) __ATTRIBUTELIST__((nothrow));
-void* strdup(void* _611) __ATTRIBUTELIST__((nothrow));
-uint32_t fprintf(void* _612, void* _613, ...);
+void free(void* _1484) __ATTRIBUTELIST__((nothrow));
+void* strdup(void* _1485) __ATTRIBUTELIST__((nothrow));
+uint32_t fprintf(void* _1486, void* _1487, ...);
 uint32_t factorial(uint32_t _7) __ATTRIBUTELIST__((noinline, nothrow));
 uint32_t factorial(uint32_t _7) __ATTRIBUTELIST__((noinline, nothrow));
-void* malloc(uint64_t _614) __ATTRIBUTELIST__((nothrow));
+void* malloc(uint64_t _1488) __ATTRIBUTELIST__((nothrow));
 void pushBack(void* _50, uint32_t _51) __ATTRIBUTELIST__((noinline, nothrow));
 void pushBack(void* _50, uint32_t _51) __ATTRIBUTELIST__((noinline, nothrow));
-void* realloc(void* _615, uint64_t _616) __ATTRIBUTELIST__((nothrow));
-void* calloc(uint64_t _617, uint64_t _618) __ATTRIBUTELIST__((nothrow));
+void* realloc(void* _1489, uint64_t _1490) __ATTRIBUTELIST__((nothrow));
+void* calloc(uint64_t _1491, uint64_t _1492) __ATTRIBUTELIST__((nothrow));
 void* multiplyMatrices(void* _111, void* _112) __ATTRIBUTELIST__((noinline, nothrow));
 void* multiplyMatrices(void* _111, void* _112) __ATTRIBUTELIST__((noinline, nothrow));
-uint32_t abs(uint32_t _619) __ATTRIBUTELIST__((nothrow));
+uint32_t abs(uint32_t _1493) __ATTRIBUTELIST__((nothrow));
 void* insertNode(void* _251, uint32_t _252) __ATTRIBUTELIST__((noinline, nothrow));
 void* insertNode(void* _251, uint32_t _252) __ATTRIBUTELIST__((noinline, nothrow));
-uint32_t printf(void* _620, ...);
-uint64_t time(void* _621) __ATTRIBUTELIST__((nothrow));
-void srand(uint32_t _622) __ATTRIBUTELIST__((nothrow));
+uint32_t printf(void* _1494, ...);
+uint64_t time(void* _1495) __ATTRIBUTELIST__((nothrow));
+void srand(uint32_t _1496) __ATTRIBUTELIST__((nothrow));
 uint32_t rand(void) __ATTRIBUTELIST__((nothrow));
 uint32_t rand(void) __ATTRIBUTELIST__((nothrow));
 double calculateDistance(struct l_struct_struct_OC_Point _323, struct l_struct_struct_OC_Point _324, void* _325) __ATTRIBUTELIST__((noinline, nothrow));
 double calculateDistance(struct l_struct_struct_OC_Point _323, struct l_struct_struct_OC_Point _324, void* _325) __ATTRIBUTELIST__((noinline, nothrow));
 double calculateCircleArea(struct l_struct_struct_OC_Circle _390, void* _391) __ATTRIBUTELIST__((noinline, nothrow));
 double calculateCircleArea(struct l_struct_struct_OC_Circle _390, void* _391) __ATTRIBUTELIST__((noinline, nothrow));
-uint32_t strcmp(void* _623, void* _624) __ATTRIBUTELIST__((nothrow));
+uint32_t strcmp(void* _1497, void* _1498) __ATTRIBUTELIST__((nothrow));
 uint32_t validateMatrix(void* _449) __ATTRIBUTELIST__((noinline, nothrow));
 uint32_t validateMatrix(void* _449) __ATTRIBUTELIST__((noinline, nothrow));
 void* findCentroid(void* _504, uint32_t _505, void* _506) __ATTRIBUTELIST__((noinline, nothrow));
 void* findCentroid(void* _504, uint32_t _505, void* _506) __ATTRIBUTELIST__((noinline, nothrow));
-void* strcpy(void* _625, void* _626) __ATTRIBUTELIST__((nothrow));
-uint64_t strlen(void* _627) __ATTRIBUTELIST__((nothrow));
-uint32_t fused_quickSort(bool _628, void* _629, uint32_t _630, uint32_t _631, void* _632, uint32_t _633);
-uint32_t fused_performSimpleCalculations(bool _634, void* _635, uint32_t _636);
-struct l_struct_fused_return_projectA_main_memoizedFib fused_projectA_main(bool _637, uint32_t _638);
-struct l_struct_fused_return_createDynamicArray_processMatrix fused_createDynamicArray(bool _639, uint32_t _640, void* _641, uint32_t _642);
-uint32_t fused_setErrorMessage(bool _643, void* _644);
-void* fused_createMatrix(bool _645, uint32_t _646, uint32_t _647, void* _648);
-uint32_t fused_removeDuplicates(bool _649, void* _650, uint32_t _651);
+void* strcpy(void* _1499, void* _1500) __ATTRIBUTELIST__((nothrow));
+uint64_t strlen(void* _1501) __ATTRIBUTELIST__((nothrow));
+uint32_t fused_quickSort(bool _610, void* _611, uint32_t _612, uint32_t _613, void* _614, uint32_t _615);
+uint32_t fused_performSimpleCalculations(bool _796, void* _797, uint32_t _798);
+struct l_struct_fused_return_projectA_main_memoizedFib fused_projectA_main(bool _904, uint32_t _905);
+struct l_struct_fused_return_createDynamicArray_processMatrix fused_createDynamicArray(bool _1151, uint32_t _1152, void* _1153, uint32_t _1154);
+uint32_t fused_setErrorMessage(bool _1242, void* _1243);
+void* fused_createMatrix(bool _1301, uint32_t _1302, uint32_t _1303, void* _1304);
+uint32_t fused_removeDuplicates(bool _1409, void* _1410, uint32_t _1411);
+void* memset(void* _1502, uint32_t _1503, uint64_t _1504);
+void* memcpy(void* _1505, void* _1506, uint64_t _1507);
 
 
 
 
 /* Global Variable Definitions and Initialization */
 /* Global Variable Definitions and Initialization */
@@ -468,6 +506,26 @@ static __forceinline uint32_t llvm_sdiv_u32(int32_t a, int32_t b) {
   uint32_t r = a / b;
   uint32_t r = a / b;
   return r;
   return r;
 }
 }
+static __forceinline uint32_t llvm_srem_u32(int32_t a, int32_t b) {
+  uint32_t r = a % b;
+  return r;
+}
+static __forceinline uint32_t llvm_ashr_u32(int32_t a, int32_t b) {
+  uint32_t r = a >> b;
+  return r;
+}
+static __forceinline struct l_struct_fused_return_projectA_main_memoizedFib llvm_ctor_struct_fused_return_projectA_main_memoizedFib(uint32_t x0, uint32_t x1) {
+  struct l_struct_fused_return_projectA_main_memoizedFib r;
+  r.field0 = x0;
+  r.field1 = x1;
+  return r;
+}
+static __forceinline struct l_struct_fused_return_createDynamicArray_processMatrix llvm_ctor_struct_fused_return_createDynamicArray_processMatrix(uint32_t x0, void* x1) {
+  struct l_struct_fused_return_createDynamicArray_processMatrix r;
+  r.field0 = x0;
+  r.field1 = x1;
+  return r;
+}
 static __forceinline double llvm_OC_fabs_OC_f64(double a) {
 static __forceinline double llvm_OC_fabs_OC_f64(double a) {
   double r;
   double r;
   r = fabs(a);
   r = fabs(a);
@@ -2326,3 +2384,2619 @@ _590:
   return _586;
   return _586;
 }
 }
 
 
+
+uint32_t fused_quickSort(bool _610, void* _611, uint32_t _612, uint32_t _613, void* _614, uint32_t _615) {
+  void* _616;
+  void* _617;
+  void* _618;
+  void* _619;
+  void* _620;
+  void* _621;
+  void* _622;
+  void* _623;
+  void* _624;
+  void* _625;
+  void* _626;
+  void* _627;
+  uint32_t _628;
+  uint32_t _629;
+  uint32_t _630;
+  void* _631;
+  uint32_t _632;
+  void* _633;
+  uint32_t _634;
+  void* _635;
+  uint32_t _636;
+  uint32_t _637;
+  uint32_t _638;
+  uint32_t _639;
+  uint32_t _640;
+  uint32_t _641;
+  void* _642;
+  uint32_t _643;
+  uint32_t _644;
+  uint32_t _645;
+  uint32_t _646;
+  uint32_t _647;
+  uint32_t _648;
+  void* _649;
+  uint32_t _650;
+  uint32_t _651;
+  void* _652;
+  uint32_t _653;
+  uint32_t _654;
+  void* _655;
+  uint32_t _656;
+  uint32_t _657;
+  void* _658;
+  uint32_t _659;
+  uint32_t _660;
+  uint32_t _661;
+  void* _662;
+  uint32_t _663;
+  uint32_t _664;
+  void* _665;
+  uint32_t _666;
+  uint32_t _667;
+  uint32_t _668;
+  uint32_t _669;
+  void* _670;
+  uint32_t _671;
+  uint32_t _672;
+  void* _673;
+  uint32_t _674;
+  uint32_t _675;
+  uint32_t _676;
+  void* _677;
+  uint32_t _678;
+  uint32_t _679;
+  void* _680;
+  uint32_t _681;
+  uint32_t _682;
+  uint32_t _683;
+  uint32_t _684;
+  void* _685;
+  uint32_t _686;
+  uint32_t _687;
+  void* _688;
+  uint32_t _689;
+  uint32_t _690;
+  void* _691;
+  uint32_t _692;
+  uint32_t _693;
+  void* _694;
+  uint32_t _695;
+  void* _696;
+  uint32_t _697;
+  uint32_t _698;
+  uint32_t _699;
+  uint32_t _700;
+  uint32_t _701;
+  uint32_t _702;
+  void* _703;
+  uint32_t _704;
+  uint32_t _705;
+  uint32_t _706;
+  uint32_t _707;
+  void* _708;
+  uint32_t _709;
+  uint32_t _710;
+  void* _711;
+  uint32_t _712;
+  uint32_t _713;
+  void* _714;
+  uint32_t _715;
+  uint32_t _716;
+  void* _717;
+  uint32_t _718;
+  uint32_t _719;
+  uint32_t _720;
+  void* _721;
+  uint32_t _722;
+  uint32_t _723;
+  void* _724;
+  uint32_t _725;
+  uint32_t _726;
+  void* _727;
+  uint32_t _728;
+  uint32_t _729;
+  void* _730;
+  uint32_t _731;
+  void* _732;
+  uint32_t _733;
+  uint32_t _734;
+  void* _735;
+  uint32_t _736;
+  void* _737;
+  uint32_t _738;
+  uint32_t _739;
+  void* _740;
+  uint32_t _741;
+  uint32_t _742;
+  void* _743;
+  uint32_t _744;
+  void* _745;
+  uint32_t _746;
+  uint32_t _747;
+  uint32_t _748;
+  uint32_t _749;
+  uint32_t _750;
+  uint32_t _751;
+  uint32_t _752;
+  uint32_t _753;
+
+  goto _754;
+
+_754:
+  _616 = (void*) alloca(sizeof(uint32_t));
+  _617 = (void*) alloca(sizeof(uint32_t));
+  *(uint32_t*)_616 = _615;
+  *(uint32_t*)_617 = 0;
+  goto _755;
+
+_755:
+  _618 = (void*) alloca(sizeof(void*));
+  _619 = (void*) alloca(sizeof(uint32_t));
+  _620 = (void*) alloca(sizeof(uint32_t));
+  _621 = (void*) alloca(sizeof(void*));
+  _622 = (void*) alloca(sizeof(uint32_t));
+  _623 = (void*) alloca(sizeof(uint32_t));
+  _624 = (void*) alloca(sizeof(uint32_t));
+  _625 = (void*) alloca(sizeof(uint32_t));
+  _626 = (void*) alloca(sizeof(uint32_t));
+  _627 = (void*) alloca(sizeof(uint32_t));
+  *(void**)_618 = _611;
+  *(uint32_t*)_619 = _612;
+  *(uint32_t*)_620 = _613;
+  *(void**)_621 = _614;
+  _628 = recursionDepth;
+  _629 = llvm_add_u32(_628, 1);
+  recursionDepth = _629;
+  if ((((int32_t)_629) > ((int32_t)1000u))) {
+    goto _756;
+  } else {
+    goto _757;
+  }
+
+_756:
+  _630 = fused_setErrorMessage(0, (&_OC_str_OC_13));
+  _631 = *(void**)_621;
+  *(uint32_t*)_631 = 1;
+  _632 = recursionDepth;
+  recursionDepth = (llvm_add_u32(_632, -1));
+  goto _758;
+
+_757:
+  _633 = *(void**)_618;
+  if ((_633 != ((void*)/*NULL*/0))) {
+    goto _759;
+  } else {
+    goto _760;
+  }
+
+_760:
+  _634 = fused_setErrorMessage(0, (&_OC_str_OC_14));
+  _635 = *(void**)_621;
+  *(uint32_t*)_635 = 1;
+  _636 = recursionDepth;
+  recursionDepth = (llvm_add_u32(_636, -1));
+  goto _758;
+
+_759:
+  _637 = *(uint32_t*)_619;
+  if ((((int32_t)_637) < ((int32_t)0u))) {
+    goto _761;
+  } else {
+    goto _762;
+  }
+
+_762:
+  _638 = *(uint32_t*)_620;
+  if ((((int32_t)_638) < ((int32_t)0u))) {
+    goto _761;
+  } else {
+    goto _763;
+  }
+
+_763:
+  _639 = *(uint32_t*)_619;
+  if ((((int32_t)_639) >= ((int32_t)1000u))) {
+    goto _761;
+  } else {
+    goto _764;
+  }
+
+_764:
+  _640 = *(uint32_t*)_620;
+  if ((((int32_t)_640) >= ((int32_t)1000u))) {
+    goto _761;
+  } else {
+    goto _765;
+  }
+
+_761:
+  _641 = fused_setErrorMessage(0, (&_OC_str_OC_15));
+  _642 = *(void**)_621;
+  *(uint32_t*)_642 = 1;
+  _643 = recursionDepth;
+  recursionDepth = (llvm_add_u32(_643, -1));
+  goto _758;
+
+_765:
+  _644 = *(uint32_t*)_619;
+  _645 = *(uint32_t*)_620;
+  if ((((int32_t)_644) < ((int32_t)_645))) {
+    goto _766;
+  } else {
+    goto _767;
+  }
+
+_766:
+  _646 = *(uint32_t*)_619;
+  _647 = *(uint32_t*)_620;
+  _648 = *(uint32_t*)_619;
+  *(uint32_t*)_622 = (llvm_add_u32(_646, (llvm_sdiv_u32((llvm_sub_u32(_647, _648)), 2))));
+  _649 = *(void**)_618;
+  _650 = *(uint32_t*)_619;
+  _651 = *(uint32_t*)(((&((uint32_t*)_649)[((int64_t)(((int64_t)(int32_t)_650)))])));
+  _652 = *(void**)_618;
+  _653 = *(uint32_t*)_622;
+  _654 = *(uint32_t*)(((&((uint32_t*)_652)[((int64_t)(((int64_t)(int32_t)_653)))])));
+  if ((((int32_t)_651) <= ((int32_t)_654))) {
+    goto _768;
+  } else {
+    goto _769;
+  }
+
+_768:
+  _655 = *(void**)_618;
+  _656 = *(uint32_t*)_622;
+  _657 = *(uint32_t*)(((&((uint32_t*)_655)[((int64_t)(((int64_t)(int32_t)_656)))])));
+  _658 = *(void**)_618;
+  _659 = *(uint32_t*)_620;
+  _660 = *(uint32_t*)(((&((uint32_t*)_658)[((int64_t)(((int64_t)(int32_t)_659)))])));
+  if ((((int32_t)_657) <= ((int32_t)_660))) {
+    goto _770;
+  } else {
+    goto _771;
+  }
+
+_770:
+  _661 = *(uint32_t*)_622;
+  *(uint32_t*)_623 = _661;
+  goto _772;
+
+_771:
+  _662 = *(void**)_618;
+  _663 = *(uint32_t*)_619;
+  _664 = *(uint32_t*)(((&((uint32_t*)_662)[((int64_t)(((int64_t)(int32_t)_663)))])));
+  _665 = *(void**)_618;
+  _666 = *(uint32_t*)_620;
+  _667 = *(uint32_t*)(((&((uint32_t*)_665)[((int64_t)(((int64_t)(int32_t)_666)))])));
+  if ((((int32_t)_664) <= ((int32_t)_667))) {
+    goto _773;
+  } else {
+    goto _774;
+  }
+
+_773:
+  _668 = *(uint32_t*)_620;
+  *(uint32_t*)_623 = _668;
+  goto _775;
+
+_774:
+  _669 = *(uint32_t*)_619;
+  *(uint32_t*)_623 = _669;
+  goto _775;
+
+_775:
+  goto _772;
+
+_772:
+  goto _776;
+
+_769:
+  _670 = *(void**)_618;
+  _671 = *(uint32_t*)_619;
+  _672 = *(uint32_t*)(((&((uint32_t*)_670)[((int64_t)(((int64_t)(int32_t)_671)))])));
+  _673 = *(void**)_618;
+  _674 = *(uint32_t*)_620;
+  _675 = *(uint32_t*)(((&((uint32_t*)_673)[((int64_t)(((int64_t)(int32_t)_674)))])));
+  if ((((int32_t)_672) <= ((int32_t)_675))) {
+    goto _777;
+  } else {
+    goto _778;
+  }
+
+_777:
+  _676 = *(uint32_t*)_619;
+  *(uint32_t*)_623 = _676;
+  goto _779;
+
+_778:
+  _677 = *(void**)_618;
+  _678 = *(uint32_t*)_622;
+  _679 = *(uint32_t*)(((&((uint32_t*)_677)[((int64_t)(((int64_t)(int32_t)_678)))])));
+  _680 = *(void**)_618;
+  _681 = *(uint32_t*)_620;
+  _682 = *(uint32_t*)(((&((uint32_t*)_680)[((int64_t)(((int64_t)(int32_t)_681)))])));
+  if ((((int32_t)_679) <= ((int32_t)_682))) {
+    goto _780;
+  } else {
+    goto _781;
+  }
+
+_780:
+  _683 = *(uint32_t*)_620;
+  *(uint32_t*)_623 = _683;
+  goto _782;
+
+_781:
+  _684 = *(uint32_t*)_622;
+  *(uint32_t*)_623 = _684;
+  goto _782;
+
+_782:
+  goto _779;
+
+_779:
+  goto _776;
+
+_776:
+  _685 = *(void**)_618;
+  _686 = *(uint32_t*)_620;
+  _687 = *(uint32_t*)(((&((uint32_t*)_685)[((int64_t)(((int64_t)(int32_t)_686)))])));
+  *(uint32_t*)_624 = _687;
+  _688 = *(void**)_618;
+  _689 = *(uint32_t*)_623;
+  _690 = *(uint32_t*)(((&((uint32_t*)_688)[((int64_t)(((int64_t)(int32_t)_689)))])));
+  _691 = *(void**)_618;
+  _692 = *(uint32_t*)_620;
+  *(uint32_t*)(((&((uint32_t*)_691)[((int64_t)(((int64_t)(int32_t)_692)))]))) = _690;
+  _693 = *(uint32_t*)_624;
+  _694 = *(void**)_618;
+  _695 = *(uint32_t*)_623;
+  *(uint32_t*)(((&((uint32_t*)_694)[((int64_t)(((int64_t)(int32_t)_695)))]))) = _693;
+  _696 = *(void**)_618;
+  _697 = *(uint32_t*)_620;
+  _698 = *(uint32_t*)(((&((uint32_t*)_696)[((int64_t)(((int64_t)(int32_t)_697)))])));
+  *(uint32_t*)_625 = _698;
+  _699 = *(uint32_t*)_619;
+  *(uint32_t*)_626 = (llvm_sub_u32(_699, 1));
+  _700 = *(uint32_t*)_619;
+  *(uint32_t*)_627 = _700;
+  goto _783;
+
+  do {     /* Syntactic loop '' to make GCC happy */
+_783:
+  _701 = *(uint32_t*)_627;
+  _702 = *(uint32_t*)_620;
+  if ((((int32_t)_701) < ((int32_t)_702))) {
+    goto _784;
+  } else {
+    goto _785;
+  }
+
+_784:
+  _703 = *(void**)_618;
+  _704 = *(uint32_t*)_627;
+  _705 = *(uint32_t*)(((&((uint32_t*)_703)[((int64_t)(((int64_t)(int32_t)_704)))])));
+  _706 = *(uint32_t*)_625;
+  if ((((int32_t)_705) <= ((int32_t)_706))) {
+    goto _786;
+  } else {
+    goto _787;
+  }
+
+_786:
+  _707 = *(uint32_t*)_626;
+  *(uint32_t*)_626 = (llvm_add_u32(_707, 1));
+  _708 = *(void**)_618;
+  _709 = *(uint32_t*)_626;
+  _710 = *(uint32_t*)(((&((uint32_t*)_708)[((int64_t)(((int64_t)(int32_t)_709)))])));
+  *(uint32_t*)_624 = _710;
+  _711 = *(void**)_618;
+  _712 = *(uint32_t*)_627;
+  _713 = *(uint32_t*)(((&((uint32_t*)_711)[((int64_t)(((int64_t)(int32_t)_712)))])));
+  _714 = *(void**)_618;
+  _715 = *(uint32_t*)_626;
+  *(uint32_t*)(((&((uint32_t*)_714)[((int64_t)(((int64_t)(int32_t)_715)))]))) = _713;
+  _716 = *(uint32_t*)_624;
+  _717 = *(void**)_618;
+  _718 = *(uint32_t*)_627;
+  *(uint32_t*)(((&((uint32_t*)_717)[((int64_t)(((int64_t)(int32_t)_718)))]))) = _716;
+  _719 = globalCounter;
+  globalCounter = (llvm_add_u32(_719, 1));
+  goto _787;
+
+_787:
+  goto _788;
+
+_788:
+  _720 = *(uint32_t*)_627;
+  *(uint32_t*)_627 = (llvm_add_u32(_720, 1));
+  goto _783;
+
+  } while (1); /* end of syntactic loop '' */
+_785:
+  _721 = *(void**)_618;
+  _722 = *(uint32_t*)_626;
+  _723 = *(uint32_t*)(((&((uint32_t*)_721)[((int64_t)(((int64_t)(int32_t)(llvm_add_u32(_722, 1)))))])));
+  *(uint32_t*)_624 = _723;
+  _724 = *(void**)_618;
+  _725 = *(uint32_t*)_620;
+  _726 = *(uint32_t*)(((&((uint32_t*)_724)[((int64_t)(((int64_t)(int32_t)_725)))])));
+  _727 = *(void**)_618;
+  _728 = *(uint32_t*)_626;
+  *(uint32_t*)(((&((uint32_t*)_727)[((int64_t)(((int64_t)(int32_t)(llvm_add_u32(_728, 1)))))]))) = _726;
+  _729 = *(uint32_t*)_624;
+  _730 = *(void**)_618;
+  _731 = *(uint32_t*)_620;
+  *(uint32_t*)(((&((uint32_t*)_730)[((int64_t)(((int64_t)(int32_t)_731)))]))) = _729;
+  _732 = *(void**)_618;
+  _733 = *(uint32_t*)_619;
+  _734 = *(uint32_t*)_626;
+  _735 = *(void**)_621;
+  _736 = fused_quickSort(0, _732, _733, _734, _735, 0);
+  _737 = *(void**)_621;
+  _738 = *(uint32_t*)_737;
+  if ((_738 != 0u)) {
+    goto _789;
+  } else {
+    goto _790;
+  }
+
+_789:
+  _739 = recursionDepth;
+  recursionDepth = (llvm_add_u32(_739, -1));
+  goto _758;
+
+_790:
+  _740 = *(void**)_618;
+  _741 = *(uint32_t*)_626;
+  _742 = *(uint32_t*)_620;
+  _743 = *(void**)_621;
+  _744 = fused_quickSort(0, _740, (llvm_add_u32(_741, 2)), _742, _743, 0);
+  _745 = *(void**)_621;
+  _746 = *(uint32_t*)_745;
+  if ((_746 != 0u)) {
+    goto _791;
+  } else {
+    goto _792;
+  }
+
+_791:
+  _747 = recursionDepth;
+  recursionDepth = (llvm_add_u32(_747, -1));
+  goto _758;
+
+_792:
+  goto _767;
+
+_767:
+  _748 = recursionDepth;
+  recursionDepth = (llvm_add_u32(_748, -1));
+  goto _793;
+
+  do {     /* Syntactic loop '' to make GCC happy */
+_793:
+  _749 = *(uint32_t*)_616;
+  if ((_749 != 0u)) {
+    goto _794;
+  } else {
+    goto _795;
+  }
+
+_794:
+  _750 = *(uint32_t*)_616;
+  _751 = *(uint32_t*)_617;
+  *(uint32_t*)_617 = (llvm_add_u32(_751, (_750 & 1)));
+  _752 = *(uint32_t*)_616;
+  *(uint32_t*)_616 = (llvm_ashr_u32(_752, 1));
+  goto _793;
+
+  } while (1); /* end of syntactic loop '' */
+_795:
+  _753 = *(uint32_t*)_617;
+  return _753;
+_758:
+  return 0;
+}
+
+
+uint32_t fused_performSimpleCalculations(bool _796, void* _797, uint32_t _798) {
+  void* _799;
+  void* _800;
+  void* _801;
+  void* _802;
+  void* _803;
+  void* _804;
+  void* _805;
+  void* _806;
+  void* _807;
+  uint32_t _808;
+  uint32_t _809;
+  uint32_t _810;
+  uint32_t _811;
+  uint32_t _812;
+  uint32_t _813;
+  uint32_t _814;
+  uint32_t _815;
+  uint32_t _816;
+  uint32_t _817;
+  uint32_t _818;
+  uint32_t _819;
+  uint32_t _820;
+  uint32_t _821;
+  uint32_t _822;
+  uint32_t _823;
+  void* _824;
+  uint32_t _825;
+  uint32_t _826;
+  void* _827;
+  uint32_t _828;
+  uint32_t _829;
+  uint32_t _830;
+  uint32_t _831;
+  uint32_t _832;
+  uint32_t _833;
+  uint32_t _834;
+  uint32_t _835;
+  uint32_t _836;
+  uint32_t _837;
+  uint32_t _838;
+  uint32_t _839;
+  uint32_t _840;
+  uint32_t _841;
+  uint32_t _842;
+  uint32_t _843;
+  uint32_t _844;
+  uint32_t _845;
+  uint32_t _846;
+  uint32_t _847;
+  uint32_t _848;
+  uint32_t _849;
+  uint32_t _850;
+  uint32_t _851;
+  uint32_t _852;
+  uint32_t _853;
+  uint32_t _854;
+  uint32_t _855;
+  uint32_t _856;
+  uint32_t _857;
+  uint32_t _858;
+  uint32_t _859;
+  uint32_t _860;
+  uint32_t _861;
+
+  goto _862;
+
+_862:
+  _799 = (void*) alloca(sizeof(void*));
+  _800 = (void*) alloca(sizeof(uint32_t));
+  _801 = (void*) alloca(sizeof(struct l_array_100_uint32_t));
+  _802 = (void*) alloca(sizeof(uint32_t));
+  _803 = (void*) alloca(sizeof(uint32_t));
+  _804 = (void*) alloca(sizeof(uint32_t));
+  _805 = (void*) alloca(sizeof(uint32_t));
+  _806 = (void*) alloca(sizeof(uint32_t));
+  *(void**)_799 = _797;
+  *(uint32_t*)_800 = _798;
+  *(uint32_t*)_802 = 0;
+  goto _863;
+
+_863:
+  _807 = (void*) alloca(sizeof(uint32_t));
+  *(uint32_t*)_807 = 100;
+  _808 = *(uint32_t*)_807;
+  if ((((int32_t)_808) > ((int32_t)50u))) {
+    goto _864;
+  } else {
+    goto _865;
+  }
+
+_864:
+  _809 = *(uint32_t*)_807;
+  _810 = calculationResult;
+  calculationResult = (llvm_add_u32(_810, (llvm_mul_u32(_809, 2))));
+  goto _866;
+
+_865:
+  _811 = *(uint32_t*)_807;
+  _812 = calculationResult;
+  calculationResult = (llvm_add_u32(_812, (llvm_sdiv_u32(_811, 2))));
+  goto _867;
+
+_867:
+  _813 = *(uint32_t*)_802;
+  _814 = *(uint32_t*)_800;
+  if ((((int32_t)_813) < ((int32_t)_814))) {
+    goto _868;
+  } else {
+    goto _869;
+  }
+
+_868:
+  _815 = *(uint32_t*)_802;
+  *(uint32_t*)(((&((struct l_array_100_uint32_t*)_801)->array[((int64_t)(((int64_t)(int32_t)_815)))]))) = 1;
+  goto _870;
+
+_869:
+  *(uint32_t*)_803 = 1;
+  goto _871;
+
+_870:
+  _816 = *(uint32_t*)_802;
+  *(uint32_t*)_802 = (llvm_add_u32(_816, 1));
+  goto _866;
+
+_866:
+  _817 = *(uint32_t*)_807;
+  if (((llvm_srem_u32(_817, 3)) == 0u)) {
+    goto _872;
+  } else {
+    goto _873;
+  }
+
+_872:
+  _818 = calculationResult;
+  calculationResult = (llvm_mul_u32(_818, 3));
+  goto _874;
+
+_873:
+  _819 = calculationResult;
+  calculationResult = (llvm_add_u32(_819, 3));
+  goto _871;
+
+  do {     /* Syntactic loop '' to make GCC happy */
+_871:
+  _820 = *(uint32_t*)_803;
+  _821 = *(uint32_t*)_800;
+  if ((((int32_t)_820) < ((int32_t)_821))) {
+    goto _875;
+  } else {
+    goto _876;
+  }
+
+_875:
+  *(uint32_t*)_804 = 0;
+  goto _877;
+
+_877:
+  _822 = *(uint32_t*)_804;
+  _823 = *(uint32_t*)_803;
+  if ((((int32_t)_822) < ((int32_t)_823))) {
+    goto _878;
+  } else {
+    goto _879;
+  }
+
+_879:
+  goto _880;
+
+_880:
+  _834 = *(uint32_t*)_803;
+  *(uint32_t*)_803 = (llvm_add_u32(_834, 1));
+  goto _871;
+
+  } while (1); /* end of syntactic loop '' */
+_876:
+  *(uint32_t*)_805 = 0;
+  *(uint32_t*)_806 = 0;
+  goto _881;
+
+_878:
+  _824 = *(void**)_799;
+  _825 = *(uint32_t*)_803;
+  _826 = *(uint32_t*)(((&((uint32_t*)_824)[((int64_t)(((int64_t)(int32_t)_825)))])));
+  _827 = *(void**)_799;
+  _828 = *(uint32_t*)_804;
+  _829 = *(uint32_t*)(((&((uint32_t*)_827)[((int64_t)(((int64_t)(int32_t)_828)))])));
+  if ((((int32_t)_826) > ((int32_t)_829))) {
+    goto _882;
+  } else {
+    goto _883;
+  }
+
+_882:
+  _830 = *(uint32_t*)_803;
+  _831 = *(uint32_t*)(((&((struct l_array_100_uint32_t*)_801)->array[((int64_t)(((int64_t)(int32_t)_830)))])));
+  _832 = *(uint32_t*)_804;
+  _833 = *(uint32_t*)(((&((struct l_array_100_uint32_t*)_801)->array[((int64_t)(((int64_t)(int32_t)_832)))])));
+  if ((((int32_t)_831) < ((int32_t)(llvm_add_u32(_833, 1))))) {
+    goto _884;
+  } else {
+    goto _883;
+  }
+
+_883:
+  goto _885;
+
+_884:
+  _835 = *(uint32_t*)_804;
+  _836 = *(uint32_t*)(((&((struct l_array_100_uint32_t*)_801)->array[((int64_t)(((int64_t)(int32_t)_835)))])));
+  _837 = *(uint32_t*)_803;
+  *(uint32_t*)(((&((struct l_array_100_uint32_t*)_801)->array[((int64_t)(((int64_t)(int32_t)_837)))]))) = (llvm_add_u32(_836, 1));
+  goto _883;
+
+_885:
+  _838 = *(uint32_t*)_804;
+  *(uint32_t*)_804 = (llvm_add_u32(_838, 1));
+  goto _874;
+
+_874:
+  _839 = calculationResult;
+  if ((((int32_t)_839) >= ((int32_t)150u))) {
+    goto _886;
+  } else {
+    goto _887;
+  }
+
+_886:
+  _840 = calculationResult;
+  if ((((int32_t)_840) <= ((int32_t)300u))) {
+    goto _888;
+  } else {
+    goto _887;
+  }
+
+_888:
+  _841 = calculationResult;
+  calculationResult = (llvm_sub_u32(_841, 50));
+  goto _889;
+
+_887:
+  _842 = calculationResult;
+  calculationResult = (llvm_add_u32(_842, 50));
+  goto _881;
+
+_881:
+  _843 = *(uint32_t*)_806;
+  _844 = *(uint32_t*)_800;
+  if ((((int32_t)_843) < ((int32_t)_844))) {
+    goto _890;
+  } else {
+    goto _891;
+  }
+
+_890:
+  _845 = *(uint32_t*)_805;
+  _846 = *(uint32_t*)_806;
+  _847 = *(uint32_t*)(((&((struct l_array_100_uint32_t*)_801)->array[((int64_t)(((int64_t)(int32_t)_846)))])));
+  if ((((int32_t)_845) < ((int32_t)_847))) {
+    goto _892;
+  } else {
+    goto _893;
+  }
+
+_891:
+  _848 = *(uint32_t*)_805;
+  return _848;
+_892:
+  _849 = *(uint32_t*)_806;
+  _850 = *(uint32_t*)(((&((struct l_array_100_uint32_t*)_801)->array[((int64_t)(((int64_t)(int32_t)_849)))])));
+  *(uint32_t*)_805 = _850;
+  goto _893;
+
+_893:
+  goto _894;
+
+_894:
+  _851 = *(uint32_t*)_806;
+  *(uint32_t*)_806 = (llvm_add_u32(_851, 1));
+  goto _889;
+
+_889:
+  _852 = calculationResult;
+  if (((llvm_srem_u32(_852, 2)) == 0u)) {
+    goto _895;
+  } else {
+    goto _896;
+  }
+
+_895:
+  _853 = calculationResult;
+  calculationResult = (llvm_sdiv_u32(_853, 2));
+  goto _897;
+
+_896:
+  _854 = calculationResult;
+  calculationResult = (llvm_mul_u32(_854, 2));
+  goto _897;
+
+_897:
+  _855 = calculationResult;
+  if ((((int32_t)(llvm_srem_u32(_855, 10))) < ((int32_t)5u))) {
+    goto _898;
+  } else {
+    goto _899;
+  }
+
+_898:
+  _856 = calculationResult;
+  calculationResult = (llvm_add_u32(_856, 5));
+  goto _900;
+
+_899:
+  _857 = calculationResult;
+  calculationResult = (llvm_sub_u32(_857, 5));
+  goto _900;
+
+_900:
+  _858 = calculationResult;
+  if ((((int32_t)_858) > ((int32_t)1000u))) {
+    goto _901;
+  } else {
+    goto _902;
+  }
+
+_901:
+  calculationResult = 1000;
+  goto _903;
+
+_902:
+  _859 = calculationResult;
+  calculationResult = (llvm_add_u32(_859, 10));
+  goto _903;
+
+_903:
+  _860 = calculationResult;
+  _861 = printf((&_OC_str_OC_27), _860);
+  return 0;
+}
+
+
+struct l_struct_fused_return_projectA_main_memoizedFib fused_projectA_main(bool _904, uint32_t _905) {
+  void* _906;
+  void* _907;
+  uint32_t _908;
+  uint32_t _909;
+  uint32_t _910;
+  uint32_t _911;
+  uint32_t _912;
+  uint32_t _913;
+  struct l_struct_fused_return_projectA_main_memoizedFib llvm_cbe_struct_2e_target;
+  struct l_struct_fused_return_projectA_main_memoizedFib llvm_cbe_struct_2e_bunker1;
+  uint32_t _914;
+  uint32_t _915;
+  struct l_struct_fused_return_projectA_main_memoizedFib _916;
+  uint32_t _917;
+  struct l_struct_fused_return_projectA_main_memoizedFib _918;
+  uint32_t _919;
+  uint32_t _920;
+  uint32_t _921;
+  void* _922;
+  void* _923;
+  void* _924;
+  void* _925;
+  void* _926;
+  void* _927;
+  void* _928;
+  void* _929;
+  void* _930;
+  void* _931;
+  void* _932;
+  void* _933;
+  void* _934;
+  void* _935;
+  void* _936;
+  void* _937;
+  void* _938;
+  void* _939;
+  void* _940;
+  uint64_t _941;
+  struct l_struct_fused_return_createDynamicArray_processMatrix _942;
+  void* _943;
+  void* _944;
+  uint32_t _945;
+  uint32_t _946;
+  void* _947;
+  uint32_t _948;
+  void* _949;
+  void* _950;
+  uint32_t _951;
+  uint32_t _952;
+  void* _953;
+  void* _954;
+  void* _955;
+  void* _956;
+  void* _957;
+  uint32_t _958;
+  void* _959;
+  void* _960;
+  void* _961;
+  void* _962;
+  void* _963;
+  void* _964;
+  void* _965;
+  uint32_t _966;
+  uint32_t _967;
+  uint32_t _968;
+  void* _969;
+  void* _970;
+  uint32_t _971;
+  void* _972;
+  uint32_t _973;
+  uint32_t _974;
+  void* _975;
+  void* _976;
+  uint32_t _977;
+  void* _978;
+  uint32_t _979;
+  uint32_t _980;
+  uint32_t _981;
+  void* _982;
+  void* _983;
+  void* _984;
+  void* _985;
+  void* _986;
+  uint32_t _987;
+  uint32_t _988;
+  void* _989;
+  uint32_t _990;
+  void* _991;
+  void* _992;
+  uint32_t _993;
+  void* _994;
+  void* _995;
+  void* _996;
+  uint32_t _997;
+  void* _998;
+  uint32_t _999;
+  void* _1000;
+  void* _1001;
+  void* _1002;
+  void* _1003;
+  void* _1004;
+  void* _1005;
+  void* _1006;
+  void* _1007;
+  void* _1008;
+  uint32_t _1009;
+  void* _1010;
+  uint32_t _1011;
+  void* _1012;
+  void* _1013;
+  void* _1014;
+  uint32_t _1015;
+  uint32_t _1016;
+  void* _1017;
+  void* _1018;
+  void* _1019;
+  uint32_t _1020;
+  void* _1021;
+  uint32_t _1022;
+  void* _1023;
+  void* _1024;
+  uint32_t _1025;
+  void* _1026;
+  void* _1027;
+  void* _1028;
+  uint32_t _1029;
+  void* _1030;
+  void* _1031;
+  void* _1032;
+  uint32_t _1033;
+  void* _1034;
+  uint32_t _1035;
+  void* _1036;
+  void* _1037;
+  void* _1038;
+  void* _1039;
+  void* _1040;
+  void* _1041;
+  void* _1042;
+  void* _1043;
+  void* _1044;
+  void* _1045;
+  void* _1046;
+  void* _1047;
+  void* _1048;
+  void* _1049;
+  void* _1050;
+  bool _1051;
+  bool _1051__PHI_TEMPORARY;
+  void* _1052;
+  void* _1053;
+  void* _1054;
+  void* _1055;
+  void* _1056;
+  void* _1057;
+  void* _1058;
+  uint32_t _1059;
+  uint32_t _1060;
+  void* _1061;
+  void* _1062;
+  uint32_t _1063;
+  uint32_t _1064;
+  bool _1065;
+  bool _1065__PHI_TEMPORARY;
+  void* _1066;
+  uint32_t _1067;
+  void* _1068;
+  void* _1069;
+  void* _1070;
+  uint32_t _1071;
+  void* _1072;
+  void* _1073;
+  void* _1074;
+  void* _1075;
+  void* _1076;
+  void* _1077;
+  void* _1078;
+  uint32_t _1079;
+  uint32_t _1080;
+  struct l_struct_fused_return_projectA_main_memoizedFib llvm_cbe_struct_2e_bunker;
+
+  goto _1081;
+
+_1081:
+  _906 = (void*) alloca(sizeof(uint32_t));
+  _907 = (void*) alloca(sizeof(uint32_t));
+  *(uint32_t*)_907 = _905;
+  _908 = *(uint32_t*)_907;
+  _909 = *(uint32_t*)(((&(&cache)->array[((int64_t)(((int64_t)(int32_t)_908)))])));
+  if ((_909 != 4294967295u)) {
+    goto _1082;
+  } else {
+    goto _1083;
+  }
+
+_1082:
+  _910 = *(uint32_t*)_907;
+  _911 = *(uint32_t*)(((&(&cache)->array[((int64_t)(((int64_t)(int32_t)_910)))])));
+  *(uint32_t*)_906 = _911;
+  goto _1084;
+
+_1083:
+  _912 = *(uint32_t*)_907;
+  if ((((int32_t)_912) <= ((int32_t)1u))) {
+    goto _1085;
+  } else {
+    goto _1086;
+  }
+
+_1084:
+  _913 = *(uint32_t*)_906;
+  llvm_cbe_struct_2e_target = llvm_ctor_struct_fused_return_projectA_main_memoizedFib(0, 0);
+  llvm_cbe_struct_2e_target.field0 = _913;
+  llvm_cbe_struct_2e_bunker1 = llvm_cbe_struct_2e_target;
+  llvm_cbe_struct_2e_bunker1.field1 = 0;
+  return llvm_cbe_struct_2e_bunker1;
+_1085:
+  _914 = *(uint32_t*)_907;
+  *(uint32_t*)_906 = _914;
+  goto _1084;
+
+_1086:
+  _915 = *(uint32_t*)_907;
+  _916 = fused_projectA_main(1, (llvm_sub_u32(_915, 1)));
+  _917 = *(uint32_t*)_907;
+  _918 = fused_projectA_main(1, (llvm_sub_u32(_917, 2)));
+  _919 = *(uint32_t*)_907;
+  *(uint32_t*)(((&(&cache)->array[((int64_t)(((int64_t)(int32_t)_919)))]))) = (llvm_add_u32(((_916.field0)), ((_918.field0))));
+  _920 = *(uint32_t*)_907;
+  _921 = *(uint32_t*)(((&(&cache)->array[((int64_t)(((int64_t)(int32_t)_920)))])));
+  *(uint32_t*)_906 = _921;
+  goto _1087;
+
+_1087:
+  _922 = (void*) alloca(sizeof(uint32_t));
+  _923 = (void*) alloca(sizeof(void*));
+  _924 = (void*) alloca(sizeof(uint32_t));
+  _925 = (void*) alloca(sizeof(void*));
+  _926 = (void*) alloca(sizeof(void*));
+  _927 = (void*) alloca(sizeof(uint32_t));
+  _928 = (void*) alloca(sizeof(uint32_t));
+  _929 = (void*) alloca(sizeof(void*));
+  _930 = (void*) alloca(sizeof(uint32_t));
+  _931 = (void*) alloca(sizeof(void*));
+  _932 = (void*) alloca(sizeof(uint32_t));
+  _933 = (void*) alloca(sizeof(uint32_t));
+  _934 = (void*) alloca(sizeof(void*));
+  _935 = (void*) alloca(sizeof(void*));
+  _936 = (void*) alloca(sizeof(uint32_t));
+  _937 = (void*) alloca(sizeof(void*));
+  _938 = (void*) alloca(sizeof(uint32_t));
+  _939 = (void*) alloca(sizeof(uint32_t));
+  _940 = (void*) alloca(sizeof(void*));
+  _941 = time(((void*)/*NULL*/0));
+  srand((((uint32_t)_941)));
+  _942 = fused_createDynamicArray(0, 10, ((void*)/*NULL*/0), 0);
+  *(void**)_923 = ((_942.field1));
+  _943 = *(void**)_923;
+  if ((_943 != ((void*)/*NULL*/0))) {
+    goto _1088;
+  } else {
+    goto _1089;
+  }
+
+_1089:
+  _944 = getErrorMessage();
+  _945 = printf((&_OC_str_OC_28), _944);
+  *(uint32_t*)_922 = -1;
+  goto _1090;
+
+_1088:
+  *(uint32_t*)_924 = 0;
+  goto _1091;
+
+  do {     /* Syntactic loop '' to make GCC happy */
+_1091:
+  _946 = *(uint32_t*)_924;
+  if ((((int32_t)_946) < ((int32_t)15u))) {
+    goto _1092;
+  } else {
+    goto _1093;
+  }
+
+_1092:
+  _947 = *(void**)_923;
+  _948 = rand();
+  pushBack(_947, (llvm_srem_u32(_948, 100)));
+  _949 = globalErrorMessage;
+  if ((_949 != ((void*)/*NULL*/0))) {
+    goto _1094;
+  } else {
+    goto _1095;
+  }
+
+_1095:
+  goto _1096;
+
+_1096:
+  _952 = *(uint32_t*)_924;
+  *(uint32_t*)_924 = (llvm_add_u32(_952, 1));
+  goto _1091;
+
+  } while (1); /* end of syntactic loop '' */
+_1094:
+  _950 = getErrorMessage();
+  _951 = printf((&_OC_str_OC_29), _950);
+  goto _1093;
+
+_1093:
+  _953 = fused_createMatrix(0, 3, 3, ((void*)/*NULL*/0));
+  *(void**)_925 = _953;
+  _954 = fused_createMatrix(0, 3, 3, ((void*)/*NULL*/0));
+  *(void**)_926 = _954;
+  _955 = *(void**)_925;
+  if ((_955 != ((void*)/*NULL*/0))) {
+    goto _1097;
+  } else {
+    goto _1098;
+  }
+
+_1097:
+  _956 = *(void**)_926;
+  if ((_956 != ((void*)/*NULL*/0))) {
+    goto _1099;
+  } else {
+    goto _1098;
+  }
+
+_1098:
+  _957 = getErrorMessage();
+  _958 = printf((&_OC_str_OC_28), _957);
+  _959 = *(void**)_925;
+  if ((_959 != ((void*)/*NULL*/0))) {
+    goto _1100;
+  } else {
+    goto _1101;
+  }
+
+_1100:
+  _960 = *(void**)_925;
+  free((((void*)_960)));
+  goto _1101;
+
+_1101:
+  _961 = *(void**)_926;
+  if ((_961 != ((void*)/*NULL*/0))) {
+    goto _1102;
+  } else {
+    goto _1103;
+  }
+
+_1102:
+  _962 = *(void**)_926;
+  free((((void*)_962)));
+  goto _1103;
+
+_1103:
+  _963 = *(void**)_923;
+  _964 = *(void**)(((&(((struct l_struct_struct_OC_DynamicArray*)_963)->field0))));
+  free((((void*)_964)));
+  _965 = *(void**)_923;
+  free((((void*)_965)));
+  *(uint32_t*)_922 = -1;
+  goto _1090;
+
+_1099:
+  *(uint32_t*)_927 = 0;
+  goto _1104;
+
+  do {     /* Syntactic loop '' to make GCC happy */
+_1104:
+  _966 = *(uint32_t*)_927;
+  if ((((int32_t)_966) < ((int32_t)3u))) {
+    goto _1105;
+  } else {
+    goto _1106;
+  }
+
+_1105:
+  *(uint32_t*)_928 = 0;
+  goto _1107;
+
+  do {     /* Syntactic loop '' to make GCC happy */
+_1107:
+  _967 = *(uint32_t*)_928;
+  if ((((int32_t)_967) < ((int32_t)3u))) {
+    goto _1108;
+  } else {
+    goto _1109;
+  }
+
+_1108:
+  _968 = rand();
+  _969 = *(void**)_925;
+  _970 = *(void**)(((&(((struct l_struct_struct_OC_Matrix*)_969)->field0))));
+  _971 = *(uint32_t*)_927;
+  _972 = *(void**)(((&((void**)_970)[((int64_t)(((int64_t)(int32_t)_971)))])));
+  _973 = *(uint32_t*)_928;
+  *(uint32_t*)(((&((uint32_t*)_972)[((int64_t)(((int64_t)(int32_t)_973)))]))) = (llvm_srem_u32(_968, 10));
+  _974 = rand();
+  _975 = *(void**)_926;
+  _976 = *(void**)(((&(((struct l_struct_struct_OC_Matrix*)_975)->field0))));
+  _977 = *(uint32_t*)_927;
+  _978 = *(void**)(((&((void**)_976)[((int64_t)(((int64_t)(int32_t)_977)))])));
+  _979 = *(uint32_t*)_928;
+  *(uint32_t*)(((&((uint32_t*)_978)[((int64_t)(((int64_t)(int32_t)_979)))]))) = (llvm_srem_u32(_974, 10));
+  goto _1110;
+
+_1110:
+  _980 = *(uint32_t*)_928;
+  *(uint32_t*)_928 = (llvm_add_u32(_980, 1));
+  goto _1107;
+
+  } while (1); /* end of syntactic loop '' */
+_1109:
+  goto _1111;
+
+_1111:
+  _981 = *(uint32_t*)_927;
+  *(uint32_t*)_927 = (llvm_add_u32(_981, 1));
+  goto _1104;
+
+  } while (1); /* end of syntactic loop '' */
+_1106:
+  _982 = *(void**)_925;
+  _983 = *(void**)_926;
+  _984 = multiplyMatrices(_982, _983);
+  *(void**)_929 = _984;
+  _985 = *(void**)_929;
+  if ((_985 != ((void*)/*NULL*/0))) {
+    goto _1112;
+  } else {
+    goto _1113;
+  }
+
+_1113:
+  _986 = getErrorMessage();
+  _987 = printf((&_OC_str_OC_28), _986);
+  *(uint32_t*)_930 = 0;
+  goto _1114;
+
+  do {     /* Syntactic loop '' to make GCC happy */
+_1114:
+  _988 = *(uint32_t*)_930;
+  _989 = *(void**)_925;
+  _990 = *(uint32_t*)(((&(((struct l_struct_struct_OC_Matrix*)_989)->field1))));
+  if ((((int32_t)_988) < ((int32_t)_990))) {
+    goto _1115;
+  } else {
+    goto _1116;
+  }
+
+_1115:
+  _991 = *(void**)_925;
+  _992 = *(void**)(((&(((struct l_struct_struct_OC_Matrix*)_991)->field0))));
+  _993 = *(uint32_t*)_930;
+  _994 = *(void**)(((&((void**)_992)[((int64_t)(((int64_t)(int32_t)_993)))])));
+  free((((void*)_994)));
+  _995 = *(void**)_926;
+  _996 = *(void**)(((&(((struct l_struct_struct_OC_Matrix*)_995)->field0))));
+  _997 = *(uint32_t*)_930;
+  _998 = *(void**)(((&((void**)_996)[((int64_t)(((int64_t)(int32_t)_997)))])));
+  free((((void*)_998)));
+  goto _1117;
+
+_1117:
+  _999 = *(uint32_t*)_930;
+  *(uint32_t*)_930 = (llvm_add_u32(_999, 1));
+  goto _1114;
+
+  } while (1); /* end of syntactic loop '' */
+_1116:
+  _1000 = *(void**)_925;
+  _1001 = *(void**)(((&(((struct l_struct_struct_OC_Matrix*)_1000)->field0))));
+  free((((void*)_1001)));
+  _1002 = *(void**)_926;
+  _1003 = *(void**)(((&(((struct l_struct_struct_OC_Matrix*)_1002)->field0))));
+  free((((void*)_1003)));
+  _1004 = *(void**)_925;
+  free((((void*)_1004)));
+  _1005 = *(void**)_926;
+  free((((void*)_1005)));
+  _1006 = *(void**)_923;
+  _1007 = *(void**)(((&(((struct l_struct_struct_OC_DynamicArray*)_1006)->field0))));
+  free((((void*)_1007)));
+  _1008 = *(void**)_923;
+  free((((void*)_1008)));
+  *(uint32_t*)_922 = -1;
+  goto _1090;
+
+_1112:
+  *(void**)_931 = ((void*)/*NULL*/0);
+  *(uint32_t*)_932 = 0;
+  goto _1118;
+
+  do {     /* Syntactic loop '' to make GCC happy */
+_1118:
+  _1009 = *(uint32_t*)_932;
+  if ((((int32_t)_1009) < ((int32_t)5u))) {
+    goto _1119;
+  } else {
+    goto _1120;
+  }
+
+_1119:
+  _1010 = *(void**)_931;
+  _1011 = rand();
+  _1012 = insertNode(_1010, (llvm_srem_u32(_1011, 50)));
+  *(void**)_931 = _1012;
+  _1013 = globalErrorMessage;
+  if ((_1013 != ((void*)/*NULL*/0))) {
+    goto _1121;
+  } else {
+    goto _1122;
+  }
+
+_1122:
+  goto _1123;
+
+_1123:
+  _1016 = *(uint32_t*)_932;
+  *(uint32_t*)_932 = (llvm_add_u32(_1016, 1));
+  goto _1118;
+
+  } while (1); /* end of syntactic loop '' */
+_1121:
+  _1014 = getErrorMessage();
+  _1015 = printf((&_OC_str_OC_30), _1014);
+  goto _1120;
+
+_1120:
+  _1017 = *(void**)_923;
+  _1018 = *(void**)(((&(((struct l_struct_struct_OC_DynamicArray*)_1017)->field0))));
+  free((((void*)_1018)));
+  _1019 = *(void**)_923;
+  free((((void*)_1019)));
+  *(uint32_t*)_933 = 0;
+  goto _1124;
+
+  do {     /* Syntactic loop '' to make GCC happy */
+_1124:
+  _1020 = *(uint32_t*)_933;
+  _1021 = *(void**)_925;
+  _1022 = *(uint32_t*)(((&(((struct l_struct_struct_OC_Matrix*)_1021)->field1))));
+  if ((((int32_t)_1020) < ((int32_t)_1022))) {
+    goto _1125;
+  } else {
+    goto _1126;
+  }
+
+_1125:
+  _1023 = *(void**)_925;
+  _1024 = *(void**)(((&(((struct l_struct_struct_OC_Matrix*)_1023)->field0))));
+  _1025 = *(uint32_t*)_933;
+  _1026 = *(void**)(((&((void**)_1024)[((int64_t)(((int64_t)(int32_t)_1025)))])));
+  free((((void*)_1026)));
+  _1027 = *(void**)_926;
+  _1028 = *(void**)(((&(((struct l_struct_struct_OC_Matrix*)_1027)->field0))));
+  _1029 = *(uint32_t*)_933;
+  _1030 = *(void**)(((&((void**)_1028)[((int64_t)(((int64_t)(int32_t)_1029)))])));
+  free((((void*)_1030)));
+  _1031 = *(void**)_929;
+  _1032 = *(void**)(((&(((struct l_struct_struct_OC_Matrix*)_1031)->field0))));
+  _1033 = *(uint32_t*)_933;
+  _1034 = *(void**)(((&((void**)_1032)[((int64_t)(((int64_t)(int32_t)_1033)))])));
+  free((((void*)_1034)));
+  goto _1127;
+
+_1127:
+  _1035 = *(uint32_t*)_933;
+  *(uint32_t*)_933 = (llvm_add_u32(_1035, 1));
+  goto _1124;
+
+  } while (1); /* end of syntactic loop '' */
+_1126:
+  _1036 = *(void**)_925;
+  _1037 = *(void**)(((&(((struct l_struct_struct_OC_Matrix*)_1036)->field0))));
+  free((((void*)_1037)));
+  _1038 = *(void**)_926;
+  _1039 = *(void**)(((&(((struct l_struct_struct_OC_Matrix*)_1038)->field0))));
+  free((((void*)_1039)));
+  _1040 = *(void**)_929;
+  _1041 = *(void**)(((&(((struct l_struct_struct_OC_Matrix*)_1040)->field0))));
+  free((((void*)_1041)));
+  _1042 = *(void**)_925;
+  free((((void*)_1042)));
+  _1043 = *(void**)_926;
+  free((((void*)_1043)));
+  _1044 = *(void**)_929;
+  free((((void*)_1044)));
+  _1045 = *(void**)_931;
+  if ((_1045 != ((void*)/*NULL*/0))) {
+    goto _1128;
+  } else {
+    goto _1129;
+  }
+
+_1128:
+  _1046 = *(void**)_931;
+  *(void**)_934 = _1046;
+  _1047 = *(void**)_931;
+  *(void**)_935 = _1047;
+  *(uint32_t*)_936 = 0;
+  goto _1130;
+
+  do {     /* Syntactic loop '' to make GCC happy */
+_1130:
+  _1048 = *(void**)_935;
+  if ((_1048 != ((void*)/*NULL*/0))) {
+    goto _1131;
+  } else {
+    _1051__PHI_TEMPORARY = 0;   /* for PHI node */
+    goto _1132;
+  }
+
+_1131:
+  _1049 = *(void**)_935;
+  _1050 = *(void**)(((&(((struct l_struct_struct_OC_Node*)_1049)->field1))));
+  _1051__PHI_TEMPORARY = (_1050 != ((void*)/*NULL*/0));   /* for PHI node */
+  goto _1132;
+
+_1132:
+  _1051 = _1051__PHI_TEMPORARY;
+  if (_1051) {
+    goto _1133;
+  } else {
+    goto _1134;
+  }
+
+_1133:
+  _1052 = *(void**)_934;
+  _1053 = *(void**)(((&(((struct l_struct_struct_OC_Node*)_1052)->field1))));
+  *(void**)_934 = _1053;
+  _1054 = *(void**)_935;
+  _1055 = *(void**)(((&(((struct l_struct_struct_OC_Node*)_1054)->field1))));
+  _1056 = *(void**)(((&(((struct l_struct_struct_OC_Node*)_1055)->field1))));
+  *(void**)_935 = _1056;
+  _1057 = *(void**)_934;
+  _1058 = *(void**)_935;
+  if ((_1057 == _1058)) {
+    goto _1135;
+  } else {
+    goto _1136;
+  }
+
+_1136:
+  goto _1130;
+
+  } while (1); /* end of syntactic loop '' */
+_1135:
+  *(uint32_t*)_936 = 1;
+  goto _1134;
+
+_1134:
+  _1059 = *(uint32_t*)_936;
+  if ((_1059 != 0u)) {
+    goto _1137;
+  } else {
+    goto _1138;
+  }
+
+_1137:
+  _1060 = fused_setErrorMessage(0, (&_OC_str_OC_31));
+  _1061 = *(void**)_931;
+  *(void**)_937 = _1061;
+  *(uint32_t*)_938 = 1000;
+  *(uint32_t*)_939 = 0;
+  goto _1139;
+
+  do {     /* Syntactic loop '' to make GCC happy */
+_1139:
+  _1062 = *(void**)_937;
+  if ((_1062 != ((void*)/*NULL*/0))) {
+    goto _1140;
+  } else {
+    _1065__PHI_TEMPORARY = 0;   /* for PHI node */
+    goto _1141;
+  }
+
+_1140:
+  _1063 = *(uint32_t*)_939;
+  _1064 = *(uint32_t*)_938;
+  _1065__PHI_TEMPORARY = (((int32_t)_1063) < ((int32_t)_1064));   /* for PHI node */
+  goto _1141;
+
+_1141:
+  _1065 = _1065__PHI_TEMPORARY;
+  if (_1065) {
+    goto _1142;
+  } else {
+    goto _1143;
+  }
+
+_1142:
+  _1066 = *(void**)_937;
+  _1067 = *(uint32_t*)(((&(((struct l_struct_struct_OC_Node*)_1066)->field3))));
+  if ((_1067 != 0u)) {
+    goto _1144;
+  } else {
+    goto _1145;
+  }
+
+_1145:
+  _1068 = *(void**)_937;
+  *(uint32_t*)(((&(((struct l_struct_struct_OC_Node*)_1068)->field3)))) = 1;
+  _1069 = *(void**)_937;
+  _1070 = *(void**)(((&(((struct l_struct_struct_OC_Node*)_1069)->field1))));
+  *(void**)_937 = _1070;
+  _1071 = *(uint32_t*)_939;
+  *(uint32_t*)_939 = (llvm_add_u32(_1071, 1));
+  goto _1139;
+
+  } while (1); /* end of syntactic loop '' */
+_1144:
+  goto _1143;
+
+_1143:
+  goto _1138;
+
+_1138:
+  goto _1146;
+
+  do {     /* Syntactic loop '' to make GCC happy */
+_1146:
+  _1072 = *(void**)_931;
+  if ((_1072 != ((void*)/*NULL*/0))) {
+    goto _1147;
+  } else {
+    goto _1148;
+  }
+
+_1147:
+  _1073 = *(void**)_931;
+  *(void**)_940 = _1073;
+  _1074 = *(void**)_931;
+  _1075 = *(void**)(((&(((struct l_struct_struct_OC_Node*)_1074)->field1))));
+  *(void**)_931 = _1075;
+  _1076 = *(void**)_940;
+  free((((void*)_1076)));
+  goto _1146;
+
+  } while (1); /* end of syntactic loop '' */
+_1148:
+  goto _1129;
+
+_1129:
+  _1077 = globalErrorMessage;
+  if ((_1077 != ((void*)/*NULL*/0))) {
+    goto _1149;
+  } else {
+    goto _1150;
+  }
+
+_1149:
+  _1078 = globalErrorMessage;
+  free(_1078);
+  goto _1150;
+
+_1150:
+  _1079 = fused_performSimpleCalculations(0, ((void*)/*NULL*/0), 0);
+  *(uint32_t*)_922 = 0;
+  goto _1090;
+
+_1090:
+  _1080 = *(uint32_t*)_922;
+  llvm_cbe_struct_2e_bunker = llvm_ctor_struct_fused_return_projectA_main_memoizedFib(0, /*UNDEF*/0);
+  llvm_cbe_struct_2e_bunker.field1 = _1080;
+  return llvm_cbe_struct_2e_bunker;
+}
+
+
+struct l_struct_fused_return_createDynamicArray_processMatrix fused_createDynamicArray(bool _1151, uint32_t _1152, void* _1153, uint32_t _1154) {
+  void* _1155;
+  void* _1156;
+  void* _1157;
+  void* _1158;
+  void* _1159;
+  void* _1160;
+  void* _1161;
+  void* _1162;
+  uint32_t _1163;
+  uint32_t _1164;
+  uint32_t _1165;
+  uint32_t _1166;
+  void* _1167;
+  void* _1168;
+  uint32_t _1169;
+  uint32_t _1170;
+  void* _1171;
+  void* _1172;
+  void* _1173;
+  void* _1174;
+  void* _1175;
+  uint32_t _1176;
+  void* _1177;
+  uint32_t _1178;
+  void* _1179;
+  void* _1180;
+  void* _1181;
+  void* _1182;
+  uint32_t _1183;
+  uint32_t _1184;
+  uint32_t _1185;
+  struct l_struct_fused_return_createDynamicArray_processMatrix llvm_cbe_struct_2e_target;
+  struct l_struct_fused_return_createDynamicArray_processMatrix llvm_cbe_struct_2e_bunker1;
+  uint32_t _1186;
+  uint32_t _1187;
+  uint32_t _1188;
+  uint32_t _1189;
+  void* _1190;
+  uint32_t _1191;
+  uint32_t _1192;
+  uint32_t _1193;
+  uint32_t _1194;
+  uint32_t _1195;
+  uint32_t _1196;
+  void* _1197;
+  uint32_t _1198;
+  uint32_t _1199;
+  uint32_t _1200;
+  uint32_t _1201;
+  void* _1202;
+  uint32_t _1203;
+  uint32_t _1204;
+  uint32_t _1205;
+  uint32_t _1206;
+  void* _1207;
+  uint32_t _1208;
+  uint32_t _1209;
+  uint32_t _1210;
+  uint32_t _1211;
+  uint32_t _1212;
+  uint32_t _1213;
+  void* _1214;
+  struct l_struct_fused_return_createDynamicArray_processMatrix llvm_cbe_struct_2e_bunker;
+
+  goto _1215;
+
+_1215:
+  _1155 = (void*) alloca(sizeof(void*));
+  _1156 = (void*) alloca(sizeof(uint32_t));
+  _1157 = (void*) alloca(sizeof(uint32_t));
+  _1158 = (void*) alloca(sizeof(uint32_t));
+  _1159 = (void*) alloca(sizeof(uint32_t));
+  *(void**)_1155 = _1153;
+  *(uint32_t*)_1156 = _1154;
+  *(uint32_t*)_1157 = 0;
+  *(uint32_t*)_1158 = 0;
+  goto _1216;
+
+_1216:
+  _1160 = (void*) alloca(sizeof(void*));
+  _1161 = (void*) alloca(sizeof(uint32_t));
+  _1162 = (void*) alloca(sizeof(void*));
+  *(uint32_t*)_1161 = _1152;
+  _1163 = *(uint32_t*)_1161;
+  if ((((int32_t)_1163) <= ((int32_t)0u))) {
+    goto _1217;
+  } else {
+    goto _1218;
+  }
+
+_1217:
+  _1164 = fused_setErrorMessage(0, (&_OC_str_OC_6));
+  *(void**)_1160 = ((void*)/*NULL*/0);
+  goto _1219;
+
+_1218:
+  _1165 = *(uint32_t*)_1161;
+  if ((((int32_t)_1165) > ((int32_t)1000u))) {
+    goto _1220;
+  } else {
+    goto _1221;
+  }
+
+_1220:
+  _1166 = fused_setErrorMessage(0, (&_OC_str_OC_7));
+  *(void**)_1160 = ((void*)/*NULL*/0);
+  goto _1219;
+
+_1221:
+  _1167 = malloc(24);
+  *(void**)_1162 = (((void*)_1167));
+  _1168 = *(void**)_1162;
+  if ((_1168 != ((void*)/*NULL*/0))) {
+    goto _1222;
+  } else {
+    goto _1223;
+  }
+
+_1223:
+  _1169 = fused_setErrorMessage(0, (&_OC_str_OC_8));
+  *(void**)_1160 = ((void*)/*NULL*/0);
+  goto _1219;
+
+_1222:
+  _1170 = *(uint32_t*)_1161;
+  _1171 = malloc((llvm_mul_u64(4, (((int64_t)(int32_t)_1170)))));
+  _1172 = *(void**)_1162;
+  *(void**)(((&(((struct l_struct_struct_OC_DynamicArray*)_1172)->field0)))) = (((void*)_1171));
+  _1173 = *(void**)_1162;
+  _1174 = *(void**)(((&(((struct l_struct_struct_OC_DynamicArray*)_1173)->field0))));
+  if ((_1174 != ((void*)/*NULL*/0))) {
+    goto _1224;
+  } else {
+    goto _1225;
+  }
+
+_1225:
+  _1175 = *(void**)_1162;
+  free((((void*)_1175)));
+  _1176 = fused_setErrorMessage(0, (&_OC_str_OC_9));
+  *(void**)_1160 = ((void*)/*NULL*/0);
+  goto _1219;
+
+_1224:
+  _1177 = *(void**)_1162;
+  *(uint32_t*)(((&(((struct l_struct_struct_OC_DynamicArray*)_1177)->field1)))) = 0;
+  _1178 = *(uint32_t*)_1161;
+  _1179 = *(void**)_1162;
+  *(uint32_t*)(((&(((struct l_struct_struct_OC_DynamicArray*)_1179)->field2)))) = _1178;
+  _1180 = *(void**)_1162;
+  *(uint32_t*)(((&(((struct l_struct_struct_OC_DynamicArray*)_1180)->field3)))) = 1;
+  _1181 = *(void**)_1162;
+  *(uint32_t*)(((&(((struct l_struct_struct_OC_DynamicArray*)_1181)->field4)))) = 0;
+  _1182 = *(void**)_1162;
+  *(void**)_1160 = _1182;
+  goto _1226;
+
+  do {     /* Syntactic loop '' to make GCC happy */
+_1226:
+  _1183 = *(uint32_t*)_1158;
+  _1184 = *(uint32_t*)_1156;
+  if ((((int32_t)_1183) < ((int32_t)_1184))) {
+    goto _1227;
+  } else {
+    goto _1228;
+  }
+
+_1227:
+  *(uint32_t*)_1159 = 0;
+  goto _1229;
+
+_1229:
+  _1186 = *(uint32_t*)_1159;
+  _1187 = *(uint32_t*)_1156;
+  if ((((int32_t)_1186) < ((int32_t)_1187))) {
+    goto _1230;
+  } else {
+    goto _1231;
+  }
+
+_1231:
+  goto _1232;
+
+_1232:
+  _1196 = *(uint32_t*)_1158;
+  *(uint32_t*)_1158 = (llvm_add_u32(_1196, 1));
+  goto _1226;
+
+  } while (1); /* end of syntactic loop '' */
+_1228:
+  _1185 = *(uint32_t*)_1157;
+  llvm_cbe_struct_2e_target = llvm_ctor_struct_fused_return_createDynamicArray_processMatrix(0, ((void*)/*NULL*/0));
+  llvm_cbe_struct_2e_target.field0 = _1185;
+  llvm_cbe_struct_2e_bunker1 = llvm_cbe_struct_2e_target;
+  llvm_cbe_struct_2e_bunker1.field1 = ((void*)/*NULL*/0);
+  return llvm_cbe_struct_2e_bunker1;
+_1230:
+  _1188 = *(uint32_t*)_1158;
+  _1189 = *(uint32_t*)_1159;
+  if ((_1188 == _1189)) {
+    goto _1233;
+  } else {
+    goto _1234;
+  }
+
+_1233:
+  _1190 = *(void**)_1155;
+  _1191 = *(uint32_t*)_1158;
+  _1192 = *(uint32_t*)_1159;
+  _1193 = *(uint32_t*)(((&((struct l_array_100_uint32_t*)(((&((struct l_array_100_uint32_t*)_1190)[((int64_t)(((int64_t)(int32_t)_1191)))]))))->array[((int64_t)(((int64_t)(int32_t)_1192)))])));
+  if (((llvm_srem_u32(_1193, 2)) == 0u)) {
+    goto _1235;
+  } else {
+    goto _1236;
+  }
+
+_1234:
+  _1194 = *(uint32_t*)_1158;
+  _1195 = *(uint32_t*)_1159;
+  if ((((int32_t)_1194) < ((int32_t)_1195))) {
+    goto _1237;
+  } else {
+    goto _1238;
+  }
+
+_1235:
+  _1197 = *(void**)_1155;
+  _1198 = *(uint32_t*)_1158;
+  _1199 = *(uint32_t*)_1159;
+  _1200 = *(uint32_t*)(((&((struct l_array_100_uint32_t*)(((&((struct l_array_100_uint32_t*)_1197)[((int64_t)(((int64_t)(int32_t)_1198)))]))))->array[((int64_t)(((int64_t)(int32_t)_1199)))])));
+  _1201 = *(uint32_t*)_1157;
+  *(uint32_t*)_1157 = (llvm_add_u32(_1201, _1200));
+  goto _1239;
+
+_1236:
+  _1202 = *(void**)_1155;
+  _1203 = *(uint32_t*)_1158;
+  _1204 = *(uint32_t*)_1159;
+  _1205 = *(uint32_t*)(((&((struct l_array_100_uint32_t*)(((&((struct l_array_100_uint32_t*)_1202)[((int64_t)(((int64_t)(int32_t)_1203)))]))))->array[((int64_t)(((int64_t)(int32_t)_1204)))])));
+  _1206 = *(uint32_t*)_1157;
+  *(uint32_t*)_1157 = (llvm_sub_u32(_1206, _1205));
+  goto _1239;
+
+_1237:
+  _1207 = *(void**)_1155;
+  _1208 = *(uint32_t*)_1158;
+  _1209 = *(uint32_t*)_1159;
+  _1210 = *(uint32_t*)(((&((struct l_array_100_uint32_t*)(((&((struct l_array_100_uint32_t*)_1207)[((int64_t)(((int64_t)(int32_t)_1208)))]))))->array[((int64_t)(((int64_t)(int32_t)_1209)))])));
+  _1211 = fused_quickSort(1, ((void*)/*NULL*/0), 0, 0, ((void*)/*NULL*/0), _1210);
+  _1212 = *(uint32_t*)_1157;
+  *(uint32_t*)_1157 = (llvm_add_u32(_1212, _1211));
+  goto _1238;
+
+_1238:
+  goto _1240;
+
+_1239:
+  goto _1240;
+
+_1240:
+  goto _1241;
+
+_1241:
+  _1213 = *(uint32_t*)_1159;
+  *(uint32_t*)_1159 = (llvm_add_u32(_1213, 1));
+  goto _1219;
+
+_1219:
+  _1214 = *(void**)_1160;
+  llvm_cbe_struct_2e_bunker = llvm_ctor_struct_fused_return_createDynamicArray_processMatrix(0, /*UNDEF*/((void*)/*NULL*/0));
+  llvm_cbe_struct_2e_bunker.field1 = _1214;
+  return llvm_cbe_struct_2e_bunker;
+}
+
+
+uint32_t fused_setErrorMessage(bool _1242, void* _1243) {
+  void* _1244;
+  void* _1245;
+  void* _1246;
+  void* _1247;
+  void* _1248;
+  void* _1249;
+  void* _1250;
+  void* _1251;
+  uint32_t _1252;
+  void* _1253;
+  void* _1254;
+  void* _1255;
+  void* _1256;
+  uint32_t _1257;
+  uint32_t _1258;
+  void* _1259;
+  struct l_struct_fused_return_createDynamicArray_processMatrix _1260;
+  void* _1261;
+  void* _1262;
+  void* _1263;
+  uint32_t _1264;
+  struct l_struct_fused_return_projectA_main_memoizedFib _1265;
+  uint32_t llvm_cbe_extracted_target_return1target_;
+  uint32_t _1266;
+  uint32_t _1267;
+  void* _1268;
+  void* _1269;
+  void* _1270;
+  void* _1271;
+  void* _1272;
+  uint32_t _1273;
+  uint32_t _1274;
+  uint32_t _1275;
+  uint64_t _1276;
+  uint32_t _1277;
+  uint32_t _1278;
+  struct l_struct_fused_return_projectA_main_memoizedFib _1279;
+  uint32_t _1280;
+  uint32_t _1281;
+  uint32_t _1282;
+
+  goto _1283;
+
+_1283:
+  _1244 = (void*) alloca(sizeof(struct l_array_14_uint8_t));
+  _1245 = (void*) alloca(sizeof(struct l_array_8_uint32_t));
+  _1246 = (void*) alloca(sizeof(uint32_t));
+  _1247 = (void*) alloca(sizeof(uint32_t));
+  _1248 = (void*) alloca(sizeof(struct l_array_100_struct_AC_l_array_100_uint32_t));
+  _1249 = (void*) alloca(sizeof(uint32_t));
+  _1250 = (void*) alloca(sizeof(uint32_t));
+  _1251 = (void*) alloca(sizeof(uint32_t));
+  _1252 = fused_removeDuplicates(1, ((void*)/*NULL*/0), 5);
+  _1253 = memset((&cache), 255, 400);
+  _1254 = memcpy((((void*)_1244)), (&__const_OC_projectB_main_OC_str), 14);
+  _1255 = fused_createMatrix(1, 0, 0, (((&((struct l_array_14_uint8_t*)_1244)->array[((int64_t)0)]))));
+  _1256 = memcpy((((void*)_1245)), (&__const_OC_projectB_main_OC_arr), 32);
+  *(uint32_t*)_1246 = 8;
+  _1257 = *(uint32_t*)_1246;
+  _1258 = fused_performSimpleCalculations(1, (((&((struct l_array_8_uint32_t*)_1245)->array[((int64_t)0)]))), _1257);
+  *(uint32_t*)_1247 = _1258;
+  _1259 = memcpy((((void*)_1248)), (&__const_OC_projectB_main_OC_matrix), 40000);
+  _1260 = fused_createDynamicArray(1, 0, (((&((struct l_array_100_struct_AC_l_array_100_uint32_t*)_1248)->array[((int64_t)0)]))), 3);
+  *(uint32_t*)_1249 = ((_1260.field0));
+  *(uint32_t*)_1250 = 0;
+  goto _1284;
+
+_1284:
+  _1261 = (void*) alloca(sizeof(void*));
+  *(void**)_1261 = _1243;
+  _1262 = globalErrorMessage;
+  if ((_1262 != ((void*)/*NULL*/0))) {
+    goto _1285;
+  } else {
+    goto _1286;
+  }
+
+_1285:
+  _1263 = globalErrorMessage;
+  free(_1263);
+  goto _1287;
+
+_1287:
+  _1264 = *(uint32_t*)_1250;
+  _1265 = fused_projectA_main(1, _1264);
+  llvm_cbe_extracted_target_return1target_ = (_1265.field0);
+  _1266 = *(uint32_t*)_1250;
+  *(uint32_t*)_1250 = (llvm_add_u32(_1266, 1));
+  goto _1288;
+
+_1288:
+  _1267 = *(uint32_t*)_1250;
+  goto _1286;
+
+_1286:
+  _1268 = *(void**)_1261;
+  if ((_1268 != ((void*)/*NULL*/0))) {
+    goto _1289;
+  } else {
+    goto _1290;
+  }
+
+_1289:
+  _1269 = *(void**)_1261;
+  _1270 = strdup(_1269);
+  globalErrorMessage = _1270;
+  _1271 = globalErrorMessage;
+  if ((_1271 == ((void*)/*NULL*/0))) {
+    goto _1291;
+  } else {
+    goto _1292;
+  }
+
+_1291:
+  _1272 = stderr;
+  _1273 = fprintf(_1272, (&_OC_str_OC_1));
+  goto _1292;
+
+_1292:
+  goto _1293;
+
+_1290:
+  globalErrorMessage = ((void*)/*NULL*/0);
+  goto _1294;
+
+_1294:
+  _1274 = *(uint32_t*)_1247;
+  if ((((int32_t)_1274) > ((int32_t)5u))) {
+    goto _1295;
+  } else {
+    goto _1296;
+  }
+
+_1295:
+  _1275 = *(uint32_t*)_1249;
+  if ((((int32_t)_1275) > ((int32_t)0u))) {
+    goto _1297;
+  } else {
+    goto _1298;
+  }
+
+_1296:
+  _1276 = strlen((((&((struct l_array_14_uint8_t*)_1244)->array[((int64_t)0)]))));
+  _1277 = *(uint32_t*)_1249;
+  *(uint32_t*)_1251 = (((uint32_t)(llvm_add_u64(_1276, (((int64_t)(int32_t)_1277))))));
+  goto _1299;
+
+_1297:
+  _1278 = *(uint32_t*)_1247;
+  _1279 = fused_projectA_main(1, _1278);
+  *(uint32_t*)_1251 = ((_1279.field0));
+  goto _1300;
+
+_1298:
+  _1280 = *(uint32_t*)_1249;
+  _1281 = fused_quickSort(1, ((void*)/*NULL*/0), 0, 0, ((void*)/*NULL*/0), _1280);
+  *(uint32_t*)_1251 = _1281;
+  goto _1300;
+
+_1299:
+  _1282 = *(uint32_t*)_1251;
+  return _1282;
+_1300:
+  goto _1293;
+
+_1293:
+  return 0;
+}
+
+
+void* fused_createMatrix(bool _1301, uint32_t _1302, uint32_t _1303, void* _1304) {
+  void* _1305;
+  void* _1306;
+  void* _1307;
+  void* _1308;
+  void* _1309;
+  uint64_t _1310;
+  void* _1311;
+  void* _1312;
+  void* _1313;
+  void* _1314;
+  void* _1315;
+  void* _1316;
+  uint32_t _1317;
+  uint32_t _1318;
+  uint32_t _1319;
+  uint32_t _1320;
+  uint32_t _1321;
+  uint32_t _1322;
+  void* _1323;
+  void* _1324;
+  uint32_t _1325;
+  uint32_t _1326;
+  void* _1327;
+  uint32_t _1328;
+  void* _1329;
+  uint32_t _1330;
+  uint32_t _1331;
+  void* _1332;
+  void* _1333;
+  uint32_t _1334;
+  void* _1335;
+  void* _1336;
+  void* _1337;
+  void* _1338;
+  void* _1339;
+  uint32_t _1340;
+  uint32_t _1341;
+  uint32_t _1342;
+  uint32_t _1343;
+  void* _1344;
+  void* _1345;
+  void* _1346;
+  uint32_t _1347;
+  void* _1348;
+  void* _1349;
+  uint32_t _1350;
+  void* _1351;
+  uint32_t _1352;
+  uint32_t _1353;
+  void* _1354;
+  void* _1355;
+  uint32_t _1356;
+  void* _1357;
+  uint32_t _1358;
+  void* _1359;
+  void* _1360;
+  void* _1361;
+  uint32_t _1362;
+  uint32_t _1363;
+  void* _1364;
+  uint32_t _1365;
+  uint32_t _1366;
+  void* _1367;
+  uint32_t _1368;
+  uint8_t _1369;
+  void* _1370;
+  uint32_t _1371;
+  uint32_t _1372;
+  uint8_t _1373;
+  void* _1374;
+  uint32_t _1375;
+  uint8_t _1376;
+  void* _1377;
+  uint32_t _1378;
+  uint32_t _1379;
+  uint32_t _1380;
+  void* _1381;
+
+  goto _1382;
+
+_1382:
+  _1305 = (void*) alloca(sizeof(void*));
+  _1306 = (void*) alloca(sizeof(uint32_t));
+  _1307 = (void*) alloca(sizeof(uint32_t));
+  _1308 = (void*) alloca(sizeof(uint8_t));
+  *(void**)_1305 = _1304;
+  _1309 = *(void**)_1305;
+  _1310 = strlen(_1309);
+  *(uint32_t*)_1306 = (((uint32_t)_1310));
+  *(uint32_t*)_1307 = 0;
+  goto _1383;
+
+_1383:
+  _1311 = (void*) alloca(sizeof(void*));
+  _1312 = (void*) alloca(sizeof(uint32_t));
+  _1313 = (void*) alloca(sizeof(uint32_t));
+  _1314 = (void*) alloca(sizeof(void*));
+  _1315 = (void*) alloca(sizeof(uint32_t));
+  _1316 = (void*) alloca(sizeof(uint32_t));
+  *(uint32_t*)_1312 = _1302;
+  *(uint32_t*)_1313 = _1303;
+  _1317 = *(uint32_t*)_1312;
+  if ((((int32_t)_1317) < ((int32_t)1u))) {
+    goto _1384;
+  } else {
+    goto _1385;
+  }
+
+_1385:
+  _1318 = *(uint32_t*)_1313;
+  if ((((int32_t)_1318) < ((int32_t)1u))) {
+    goto _1384;
+  } else {
+    goto _1386;
+  }
+
+_1384:
+  _1319 = fused_setErrorMessage(0, (&_OC_str_OC_16));
+  *(void**)_1311 = ((void*)/*NULL*/0);
+  goto _1387;
+
+_1386:
+  _1320 = *(uint32_t*)_1312;
+  if ((((int32_t)_1320) > ((int32_t)100u))) {
+    goto _1388;
+  } else {
+    goto _1389;
+  }
+
+_1389:
+  _1321 = *(uint32_t*)_1313;
+  if ((((int32_t)_1321) > ((int32_t)100u))) {
+    goto _1388;
+  } else {
+    goto _1390;
+  }
+
+_1388:
+  _1322 = fused_setErrorMessage(0, (&_OC_str_OC_17));
+  *(void**)_1311 = ((void*)/*NULL*/0);
+  goto _1387;
+
+_1390:
+  _1323 = malloc(32);
+  *(void**)_1314 = (((void*)_1323));
+  _1324 = *(void**)_1314;
+  if ((_1324 != ((void*)/*NULL*/0))) {
+    goto _1391;
+  } else {
+    goto _1392;
+  }
+
+_1392:
+  _1325 = fused_setErrorMessage(0, (&_OC_str_OC_18));
+  *(void**)_1311 = ((void*)/*NULL*/0);
+  goto _1387;
+
+_1391:
+  _1326 = *(uint32_t*)_1312;
+  _1327 = *(void**)_1314;
+  *(uint32_t*)(((&(((struct l_struct_struct_OC_Matrix*)_1327)->field1)))) = _1326;
+  _1328 = *(uint32_t*)_1313;
+  _1329 = *(void**)_1314;
+  *(uint32_t*)(((&(((struct l_struct_struct_OC_Matrix*)_1329)->field2)))) = _1328;
+  _1330 = *(uint32_t*)_1312;
+  _1331 = *(uint32_t*)_1313;
+  _1332 = *(void**)_1314;
+  *(uint32_t*)(((&(((struct l_struct_struct_OC_Matrix*)_1332)->field3)))) = (((uint32_t)(bool)(_1330 == _1331)));
+  _1333 = *(void**)_1314;
+  *(double*)(((&(((struct l_struct_struct_OC_Matrix*)_1333)->field4)))) = 0;
+  _1334 = *(uint32_t*)_1312;
+  _1335 = malloc((llvm_mul_u64((((int64_t)(int32_t)_1334)), 8)));
+  _1336 = *(void**)_1314;
+  *(void**)(((&(((struct l_struct_struct_OC_Matrix*)_1336)->field0)))) = (((void*)_1335));
+  _1337 = *(void**)_1314;
+  _1338 = *(void**)(((&(((struct l_struct_struct_OC_Matrix*)_1337)->field0))));
+  if ((_1338 != ((void*)/*NULL*/0))) {
+    goto _1393;
+  } else {
+    goto _1394;
+  }
+
+_1394:
+  _1339 = *(void**)_1314;
+  free((((void*)_1339)));
+  _1340 = fused_setErrorMessage(0, (&_OC_str_OC_19));
+  *(void**)_1311 = ((void*)/*NULL*/0);
+  goto _1387;
+
+_1393:
+  *(uint32_t*)_1315 = 0;
+  goto _1395;
+
+  do {     /* Syntactic loop '' to make GCC happy */
+_1395:
+  _1341 = *(uint32_t*)_1315;
+  _1342 = *(uint32_t*)_1312;
+  if ((((int32_t)_1341) < ((int32_t)_1342))) {
+    goto _1396;
+  } else {
+    goto _1397;
+  }
+
+_1396:
+  _1343 = *(uint32_t*)_1313;
+  _1344 = calloc((((int64_t)(int32_t)_1343)), 4);
+  _1345 = *(void**)_1314;
+  _1346 = *(void**)(((&(((struct l_struct_struct_OC_Matrix*)_1345)->field0))));
+  _1347 = *(uint32_t*)_1315;
+  *(void**)(((&((void**)_1346)[((int64_t)(((int64_t)(int32_t)_1347)))]))) = (((void*)_1344));
+  _1348 = *(void**)_1314;
+  _1349 = *(void**)(((&(((struct l_struct_struct_OC_Matrix*)_1348)->field0))));
+  _1350 = *(uint32_t*)_1315;
+  _1351 = *(void**)(((&((void**)_1349)[((int64_t)(((int64_t)(int32_t)_1350)))])));
+  if ((_1351 != ((void*)/*NULL*/0))) {
+    goto _1398;
+  } else {
+    goto _1399;
+  }
+
+_1398:
+  goto _1400;
+
+_1400:
+  _1363 = *(uint32_t*)_1315;
+  *(uint32_t*)_1315 = (llvm_add_u32(_1363, 1));
+  goto _1395;
+
+  } while (1); /* end of syntactic loop '' */
+_1399:
+  *(uint32_t*)_1316 = 0;
+  goto _1401;
+
+  do {     /* Syntactic loop '' to make GCC happy */
+_1401:
+  _1352 = *(uint32_t*)_1316;
+  _1353 = *(uint32_t*)_1315;
+  if ((((int32_t)_1352) < ((int32_t)_1353))) {
+    goto _1402;
+  } else {
+    goto _1403;
+  }
+
+_1402:
+  _1354 = *(void**)_1314;
+  _1355 = *(void**)(((&(((struct l_struct_struct_OC_Matrix*)_1354)->field0))));
+  _1356 = *(uint32_t*)_1316;
+  _1357 = *(void**)(((&((void**)_1355)[((int64_t)(((int64_t)(int32_t)_1356)))])));
+  free((((void*)_1357)));
+  goto _1404;
+
+_1404:
+  _1358 = *(uint32_t*)_1316;
+  *(uint32_t*)_1316 = (llvm_add_u32(_1358, 1));
+  goto _1401;
+
+  } while (1); /* end of syntactic loop '' */
+_1403:
+  _1359 = *(void**)_1314;
+  _1360 = *(void**)(((&(((struct l_struct_struct_OC_Matrix*)_1359)->field0))));
+  free((((void*)_1360)));
+  _1361 = *(void**)_1314;
+  free((((void*)_1361)));
+  _1362 = fused_setErrorMessage(0, (&_OC_str_OC_20));
+  *(void**)_1311 = ((void*)/*NULL*/0);
+  goto _1387;
+
+_1397:
+  _1364 = *(void**)_1314;
+  *(void**)_1311 = _1364;
+  goto _1405;
+
+_1405:
+  _1365 = *(uint32_t*)_1307;
+  _1366 = *(uint32_t*)_1306;
+  if ((((int32_t)_1365) < ((int32_t)(llvm_sdiv_u32(_1366, 2))))) {
+    goto _1406;
+  } else {
+    goto _1407;
+  }
+
+_1406:
+  _1367 = *(void**)_1305;
+  _1368 = *(uint32_t*)_1307;
+  _1369 = *(uint8_t*)(((&((uint8_t*)_1367)[((int64_t)(((int64_t)(int32_t)_1368)))])));
+  *(uint8_t*)_1308 = _1369;
+  _1370 = *(void**)_1305;
+  _1371 = *(uint32_t*)_1306;
+  _1372 = *(uint32_t*)_1307;
+  _1373 = *(uint8_t*)(((&((uint8_t*)_1370)[((int64_t)(((int64_t)(int32_t)(llvm_sub_u32((llvm_sub_u32(_1371, 1)), _1372)))))])));
+  _1374 = *(void**)_1305;
+  _1375 = *(uint32_t*)_1307;
+  *(uint8_t*)(((&((uint8_t*)_1374)[((int64_t)(((int64_t)(int32_t)_1375)))]))) = _1373;
+  _1376 = *(uint8_t*)_1308;
+  _1377 = *(void**)_1305;
+  _1378 = *(uint32_t*)_1306;
+  _1379 = *(uint32_t*)_1307;
+  *(uint8_t*)(((&((uint8_t*)_1377)[((int64_t)(((int64_t)(int32_t)(llvm_sub_u32((llvm_sub_u32(_1378, 1)), _1379)))))]))) = _1376;
+  goto _1408;
+
+_1407:
+  return ((void*)/*NULL*/0);
+_1408:
+  _1380 = *(uint32_t*)_1307;
+  *(uint32_t*)_1307 = (llvm_add_u32(_1380, 1));
+  goto _1387;
+
+_1387:
+  _1381 = *(void**)_1311;
+  return _1381;
+}
+
+
+uint32_t fused_removeDuplicates(bool _1409, void* _1410, uint32_t _1411) {
+  void* _1412;
+  void* _1413;
+  void* _1414;
+  void* _1415;
+  void* _1416;
+  void* _1417;
+  void* _1418;
+  void* _1419;
+  void* _1420;
+  void* _1421;
+  void* _1422;
+  uint32_t _1423;
+  void* _1424;
+  uint32_t _1425;
+  void* _1426;
+  void* _1427;
+  void* _1428;
+  uint32_t _1429;
+  uint32_t _1430;
+  uint32_t _1431;
+  uint32_t _1432;
+  void* _1433;
+  uint32_t _1434;
+  void* _1435;
+  void* _1436;
+  uint32_t _1437;
+  uint32_t _1438;
+  void* _1439;
+  void* _1440;
+  uint32_t _1441;
+  uint32_t _1442;
+  void* _1443;
+  void* _1444;
+  uint32_t _1445;
+  uint32_t _1446;
+  void* _1447;
+  void* _1448;
+  uint32_t _1449;
+  uint32_t _1450;
+  uint32_t _1451;
+  uint32_t _1452;
+  void* _1453;
+  void* _1454;
+  uint32_t _1455;
+  uint32_t _1456;
+  uint32_t _1457;
+  uint32_t _1458;
+  uint32_t _1459;
+  uint32_t _1460;
+
+  goto _1461;
+
+_1461:
+  _1412 = (void*) alloca(sizeof(uint32_t));
+  _1413 = (void*) alloca(sizeof(uint32_t));
+  _1414 = (void*) alloca(sizeof(uint32_t));
+  _1415 = (void*) alloca(sizeof(uint32_t));
+  *(uint32_t*)_1413 = _1411;
+  *(uint32_t*)_1414 = 0;
+  *(uint32_t*)_1415 = 1;
+  goto _1462;
+
+_1462:
+  _1416 = (void*) alloca(sizeof(void*));
+  _1417 = (void*) alloca(sizeof(uint32_t));
+  _1418 = (void*) alloca(sizeof(uint32_t));
+  _1419 = (void*) alloca(sizeof(uint32_t));
+  *(void**)_1416 = _1410;
+  _1420 = *(void**)_1416;
+  if ((_1420 != ((void*)/*NULL*/0))) {
+    goto _1463;
+  } else {
+    goto _1464;
+  }
+
+_1463:
+  _1421 = *(void**)_1416;
+  _1422 = *(void**)(((&(((struct l_struct_struct_OC_DynamicArray*)_1421)->field0))));
+  if ((_1422 != ((void*)/*NULL*/0))) {
+    goto _1465;
+  } else {
+    goto _1464;
+  }
+
+_1464:
+  _1423 = fused_setErrorMessage(0, (&_OC_str_OC_49));
+  goto _1466;
+
+_1465:
+  _1424 = *(void**)_1416;
+  _1425 = *(uint32_t*)(((&(((struct l_struct_struct_OC_DynamicArray*)_1424)->field1))));
+  if ((((int32_t)_1425) <= ((int32_t)1u))) {
+    goto _1467;
+  } else {
+    goto _1468;
+  }
+
+_1467:
+  goto _1466;
+
+_1468:
+  *(uint32_t*)_1417 = 0;
+  _1426 = *(void**)_1416;
+  _1427 = *(void**)(((&(((struct l_struct_struct_OC_DynamicArray*)_1426)->field0))));
+  _1428 = *(void**)_1416;
+  _1429 = *(uint32_t*)(((&(((struct l_struct_struct_OC_DynamicArray*)_1428)->field1))));
+  _1430 = fused_quickSort(0, _1427, 0, (llvm_sub_u32(_1429, 1)), _1417, 0);
+  _1431 = *(uint32_t*)_1417;
+  if ((_1431 != 0u)) {
+    goto _1469;
+  } else {
+    goto _1470;
+  }
+
+_1469:
+  goto _1466;
+
+_1470:
+  *(uint32_t*)_1418 = 1;
+  *(uint32_t*)_1419 = 1;
+  goto _1471;
+
+  do {     /* Syntactic loop '' to make GCC happy */
+_1471:
+  _1432 = *(uint32_t*)_1419;
+  _1433 = *(void**)_1416;
+  _1434 = *(uint32_t*)(((&(((struct l_struct_struct_OC_DynamicArray*)_1433)->field1))));
+  if ((((int32_t)_1432) < ((int32_t)_1434))) {
+    goto _1472;
+  } else {
+    goto _1473;
+  }
+
+_1472:
+  _1435 = *(void**)_1416;
+  _1436 = *(void**)(((&(((struct l_struct_struct_OC_DynamicArray*)_1435)->field0))));
+  _1437 = *(uint32_t*)_1419;
+  _1438 = *(uint32_t*)(((&((uint32_t*)_1436)[((int64_t)(((int64_t)(int32_t)_1437)))])));
+  _1439 = *(void**)_1416;
+  _1440 = *(void**)(((&(((struct l_struct_struct_OC_DynamicArray*)_1439)->field0))));
+  _1441 = *(uint32_t*)_1419;
+  _1442 = *(uint32_t*)(((&((uint32_t*)_1440)[((int64_t)(((int64_t)(int32_t)(llvm_sub_u32(_1441, 1)))))])));
+  if ((_1438 != _1442)) {
+    goto _1474;
+  } else {
+    goto _1475;
+  }
+
+_1474:
+  _1443 = *(void**)_1416;
+  _1444 = *(void**)(((&(((struct l_struct_struct_OC_DynamicArray*)_1443)->field0))));
+  _1445 = *(uint32_t*)_1419;
+  _1446 = *(uint32_t*)(((&((uint32_t*)_1444)[((int64_t)(((int64_t)(int32_t)_1445)))])));
+  _1447 = *(void**)_1416;
+  _1448 = *(void**)(((&(((struct l_struct_struct_OC_DynamicArray*)_1447)->field0))));
+  _1449 = *(uint32_t*)_1418;
+  *(uint32_t*)(((&((uint32_t*)_1448)[((int64_t)(((int64_t)(int32_t)_1449)))]))) = _1446;
+  _1450 = *(uint32_t*)_1418;
+  *(uint32_t*)_1418 = (llvm_add_u32(_1450, 1));
+  goto _1475;
+
+_1475:
+  goto _1476;
+
+_1476:
+  _1451 = *(uint32_t*)_1419;
+  *(uint32_t*)_1419 = (llvm_add_u32(_1451, 1));
+  goto _1471;
+
+  } while (1); /* end of syntactic loop '' */
+_1473:
+  _1452 = *(uint32_t*)_1418;
+  _1453 = *(void**)_1416;
+  *(uint32_t*)(((&(((struct l_struct_struct_OC_DynamicArray*)_1453)->field1)))) = _1452;
+  _1454 = *(void**)_1416;
+  *(uint32_t*)(((&(((struct l_struct_struct_OC_DynamicArray*)_1454)->field3)))) = 1;
+  goto _1477;
+
+_1477:
+  _1455 = *(uint32_t*)_1415;
+  if ((((int32_t)_1455) < ((int32_t)5u))) {
+    goto _1478;
+  } else {
+    goto _1479;
+  }
+
+_1478:
+  _1456 = *(uint32_t*)_1414;
+  *(uint32_t*)_1414 = (llvm_add_u32(_1456, 1));
+  _1457 = *(uint32_t*)_1413;
+  if ((((int32_t)_1457) > ((int32_t)2u))) {
+    goto _1480;
+  } else {
+    goto _1481;
+  }
+
+_1479:
+  _1458 = *(uint32_t*)_1414;
+  *(uint32_t*)_1412 = _1458;
+  goto _1482;
+
+_1480:
+  *(uint32_t*)_1412 = 23;
+  goto _1482;
+
+_1481:
+  goto _1483;
+
+_1482:
+  _1459 = *(uint32_t*)_1412;
+  return _1459;
+_1483:
+  _1460 = *(uint32_t*)_1415;
+  *(uint32_t*)_1415 = (llvm_add_u32(_1460, 1));
+  goto _1466;
+
+_1466:
+  return 0;
+}
+

File diff suppressed because it is too large
+ 475 - 0
output/module_fusion_text.cbe_bak.c


+ 2007 - 7
output/module_fusion_text.ll

@@ -1565,19 +1565,2019 @@ declare void @llvm.memset.p0i8.i64(i8* nocapture writeonly, i8, i64, i1 immarg)
 ; Function Attrs: argmemonly nounwind willreturn
 ; Function Attrs: argmemonly nounwind willreturn
 declare void @llvm.memcpy.p0i8.p0i8.i64(i8* noalias nocapture writeonly, i8* noalias nocapture readonly, i64, i1 immarg) #6
 declare void @llvm.memcpy.p0i8.p0i8.i64(i8* noalias nocapture writeonly, i8* noalias nocapture readonly, i64, i1 immarg) #6
 
 
-declare i32 @fused_quickSort(i1, i32*, i32, i32, i32*, i32)
+define i32 @fused_quickSort(i1 %0, i32* %1, i32 %2, i32 %3, i32* %4, i32 %5) {
+entry:
+  br label %6
+
+6:                                                ; preds = %entry
+  %7 = alloca i32, align 4
+  %8 = alloca i32, align 4
+  store i32 %5, i32* %7, align 4
+  store i32 0, i32* %8, align 4
+  br label %9
+
+9:                                                ; preds = %6
+  %10 = alloca i32*, align 8
+  %11 = alloca i32, align 4
+  %12 = alloca i32, align 4
+  %13 = alloca i32*, align 8
+  %14 = alloca i32, align 4
+  %15 = alloca i32, align 4
+  %16 = alloca i32, align 4
+  %17 = alloca i32, align 4
+  %18 = alloca i32, align 4
+  %19 = alloca i32, align 4
+  store i32* %1, i32** %10, align 8
+  store i32 %2, i32* %11, align 4
+  store i32 %3, i32* %12, align 4
+  store i32* %4, i32** %13, align 8
+  %20 = load i32, i32* @recursionDepth, align 4
+  %21 = add nsw i32 %20, 1
+  store i32 %21, i32* @recursionDepth, align 4
+  %22 = icmp sgt i32 %21, 1000
+  br i1 %22, label %23, label %28
+
+23:                                               ; preds = %9
+  %24 = call i32 @fused_setErrorMessage(i1 false, i8* getelementptr inbounds ([46 x i8], [46 x i8]* @.str.13, i64 0, i64 0))
+  %25 = load i32*, i32** %13, align 8
+  store i32 1, i32* %25, align 4
+  %26 = load i32, i32* @recursionDepth, align 4
+  %27 = add nsw i32 %26, -1
+  store i32 %27, i32* @recursionDepth, align 4
+  br label %269
+
+28:                                               ; preds = %9
+  %29 = load i32*, i32** %10, align 8
+  %30 = icmp ne i32* %29, null
+  br i1 %30, label %36, label %31
+
+31:                                               ; preds = %28
+  %32 = call i32 @fused_setErrorMessage(i1 false, i8* getelementptr inbounds ([32 x i8], [32 x i8]* @.str.14, i64 0, i64 0))
+  %33 = load i32*, i32** %13, align 8
+  store i32 1, i32* %33, align 4
+  %34 = load i32, i32* @recursionDepth, align 4
+  %35 = add nsw i32 %34, -1
+  store i32 %35, i32* @recursionDepth, align 4
+  br label %269
+
+36:                                               ; preds = %28
+  %37 = load i32, i32* %11, align 4
+  %38 = icmp slt i32 %37, 0
+  br i1 %38, label %48, label %39
+
+39:                                               ; preds = %36
+  %40 = load i32, i32* %12, align 4
+  %41 = icmp slt i32 %40, 0
+  br i1 %41, label %48, label %42
+
+42:                                               ; preds = %39
+  %43 = load i32, i32* %11, align 4
+  %44 = icmp sge i32 %43, 1000
+  br i1 %44, label %48, label %45
+
+45:                                               ; preds = %42
+  %46 = load i32, i32* %12, align 4
+  %47 = icmp sge i32 %46, 1000
+  br i1 %47, label %48, label %53
+
+48:                                               ; preds = %45, %42, %39, %36
+  %49 = call i32 @fused_setErrorMessage(i1 false, i8* getelementptr inbounds ([39 x i8], [39 x i8]* @.str.15, i64 0, i64 0))
+  %50 = load i32*, i32** %13, align 8
+  store i32 1, i32* %50, align 4
+  %51 = load i32, i32* @recursionDepth, align 4
+  %52 = add nsw i32 %51, -1
+  store i32 %52, i32* @recursionDepth, align 4
+  br label %269
+
+53:                                               ; preds = %45
+  %54 = load i32, i32* %11, align 4
+  %55 = load i32, i32* %12, align 4
+  %56 = icmp slt i32 %54, %55
+  br i1 %56, label %57, label %254
+
+57:                                               ; preds = %53
+  %58 = load i32, i32* %11, align 4
+  %59 = load i32, i32* %12, align 4
+  %60 = load i32, i32* %11, align 4
+  %61 = sub nsw i32 %59, %60
+  %62 = sdiv i32 %61, 2
+  %63 = add nsw i32 %58, %62
+  store i32 %63, i32* %14, align 4
+  %64 = load i32*, i32** %10, align 8
+  %65 = load i32, i32* %11, align 4
+  %66 = sext i32 %65 to i64
+  %67 = getelementptr inbounds i32, i32* %64, i64 %66
+  %68 = load i32, i32* %67, align 4
+  %69 = load i32*, i32** %10, align 8
+  %70 = load i32, i32* %14, align 4
+  %71 = sext i32 %70 to i64
+  %72 = getelementptr inbounds i32, i32* %69, i64 %71
+  %73 = load i32, i32* %72, align 4
+  %74 = icmp sle i32 %68, %73
+  br i1 %74, label %75, label %107
+
+75:                                               ; preds = %57
+  %76 = load i32*, i32** %10, align 8
+  %77 = load i32, i32* %14, align 4
+  %78 = sext i32 %77 to i64
+  %79 = getelementptr inbounds i32, i32* %76, i64 %78
+  %80 = load i32, i32* %79, align 4
+  %81 = load i32*, i32** %10, align 8
+  %82 = load i32, i32* %12, align 4
+  %83 = sext i32 %82 to i64
+  %84 = getelementptr inbounds i32, i32* %81, i64 %83
+  %85 = load i32, i32* %84, align 4
+  %86 = icmp sle i32 %80, %85
+  br i1 %86, label %87, label %89
+
+87:                                               ; preds = %75
+  %88 = load i32, i32* %14, align 4
+  store i32 %88, i32* %15, align 4
+  br label %106
+
+89:                                               ; preds = %75
+  %90 = load i32*, i32** %10, 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 = load i32*, i32** %10, align 8
+  %96 = load i32, i32* %12, align 4
+  %97 = sext i32 %96 to i64
+  %98 = getelementptr inbounds i32, i32* %95, i64 %97
+  %99 = load i32, i32* %98, align 4
+  %100 = icmp sle i32 %94, %99
+  br i1 %100, label %101, label %103
+
+101:                                              ; preds = %89
+  %102 = load i32, i32* %12, align 4
+  store i32 %102, i32* %15, align 4
+  br label %105
+
+103:                                              ; preds = %89
+  %104 = load i32, i32* %11, align 4
+  store i32 %104, i32* %15, align 4
+  br label %105
+
+105:                                              ; preds = %103, %101
+  br label %106
+
+106:                                              ; preds = %105, %87
+  br label %139
+
+107:                                              ; preds = %57
+  %108 = load i32*, i32** %10, align 8
+  %109 = load i32, i32* %11, align 4
+  %110 = sext i32 %109 to i64
+  %111 = getelementptr inbounds i32, i32* %108, i64 %110
+  %112 = load i32, i32* %111, align 4
+  %113 = load i32*, i32** %10, align 8
+  %114 = load i32, i32* %12, align 4
+  %115 = sext i32 %114 to i64
+  %116 = getelementptr inbounds i32, i32* %113, i64 %115
+  %117 = load i32, i32* %116, align 4
+  %118 = icmp sle i32 %112, %117
+  br i1 %118, label %119, label %121
+
+119:                                              ; preds = %107
+  %120 = load i32, i32* %11, align 4
+  store i32 %120, i32* %15, align 4
+  br label %138
+
+121:                                              ; preds = %107
+  %122 = load i32*, i32** %10, align 8
+  %123 = load i32, i32* %14, align 4
+  %124 = sext i32 %123 to i64
+  %125 = getelementptr inbounds i32, i32* %122, i64 %124
+  %126 = load i32, i32* %125, align 4
+  %127 = load i32*, i32** %10, align 8
+  %128 = load i32, i32* %12, align 4
+  %129 = sext i32 %128 to i64
+  %130 = getelementptr inbounds i32, i32* %127, i64 %129
+  %131 = load i32, i32* %130, align 4
+  %132 = icmp sle i32 %126, %131
+  br i1 %132, label %133, label %135
+
+133:                                              ; preds = %121
+  %134 = load i32, i32* %12, align 4
+  store i32 %134, i32* %15, align 4
+  br label %137
+
+135:                                              ; preds = %121
+  %136 = load i32, i32* %14, align 4
+  store i32 %136, i32* %15, align 4
+  br label %137
+
+137:                                              ; preds = %135, %133
+  br label %138
+
+138:                                              ; preds = %137, %119
+  br label %139
+
+139:                                              ; preds = %138, %106
+  %140 = load i32*, i32** %10, align 8
+  %141 = load i32, i32* %12, align 4
+  %142 = sext i32 %141 to i64
+  %143 = getelementptr inbounds i32, i32* %140, i64 %142
+  %144 = load i32, i32* %143, align 4
+  store i32 %144, i32* %16, align 4
+  %145 = load i32*, i32** %10, align 8
+  %146 = load i32, i32* %15, align 4
+  %147 = sext i32 %146 to i64
+  %148 = getelementptr inbounds i32, i32* %145, i64 %147
+  %149 = load i32, i32* %148, align 4
+  %150 = load i32*, i32** %10, align 8
+  %151 = load i32, i32* %12, align 4
+  %152 = sext i32 %151 to i64
+  %153 = getelementptr inbounds i32, i32* %150, i64 %152
+  store i32 %149, i32* %153, align 4
+  %154 = load i32, i32* %16, align 4
+  %155 = load i32*, i32** %10, align 8
+  %156 = load i32, i32* %15, align 4
+  %157 = sext i32 %156 to i64
+  %158 = getelementptr inbounds i32, i32* %155, i64 %157
+  store i32 %154, i32* %158, align 4
+  %159 = load i32*, i32** %10, align 8
+  %160 = load i32, i32* %12, align 4
+  %161 = sext i32 %160 to i64
+  %162 = getelementptr inbounds i32, i32* %159, i64 %161
+  %163 = load i32, i32* %162, align 4
+  store i32 %163, i32* %17, align 4
+  %164 = load i32, i32* %11, align 4
+  %165 = sub nsw i32 %164, 1
+  store i32 %165, i32* %18, align 4
+  %166 = load i32, i32* %11, align 4
+  store i32 %166, i32* %19, align 4
+  br label %167
+
+167:                                              ; preds = %204, %139
+  %168 = load i32, i32* %19, align 4
+  %169 = load i32, i32* %12, align 4
+  %170 = icmp slt i32 %168, %169
+  br i1 %170, label %171, label %207
+
+171:                                              ; preds = %167
+  %172 = load i32*, i32** %10, align 8
+  %173 = load i32, i32* %19, align 4
+  %174 = sext i32 %173 to i64
+  %175 = getelementptr inbounds i32, i32* %172, i64 %174
+  %176 = load i32, i32* %175, align 4
+  %177 = load i32, i32* %17, align 4
+  %178 = icmp sle i32 %176, %177
+  br i1 %178, label %179, label %203
+
+179:                                              ; preds = %171
+  %180 = load i32, i32* %18, align 4
+  %181 = add nsw i32 %180, 1
+  store i32 %181, i32* %18, align 4
+  %182 = load i32*, i32** %10, align 8
+  %183 = load i32, i32* %18, align 4
+  %184 = sext i32 %183 to i64
+  %185 = getelementptr inbounds i32, i32* %182, i64 %184
+  %186 = load i32, i32* %185, align 4
+  store i32 %186, i32* %16, align 4
+  %187 = load i32*, i32** %10, align 8
+  %188 = load i32, i32* %19, align 4
+  %189 = sext i32 %188 to i64
+  %190 = getelementptr inbounds i32, i32* %187, i64 %189
+  %191 = load i32, i32* %190, align 4
+  %192 = load i32*, i32** %10, align 8
+  %193 = load i32, i32* %18, align 4
+  %194 = sext i32 %193 to i64
+  %195 = getelementptr inbounds i32, i32* %192, i64 %194
+  store i32 %191, i32* %195, align 4
+  %196 = load i32, i32* %16, align 4
+  %197 = load i32*, i32** %10, align 8
+  %198 = load i32, i32* %19, align 4
+  %199 = sext i32 %198 to i64
+  %200 = getelementptr inbounds i32, i32* %197, i64 %199
+  store i32 %196, i32* %200, align 4
+  %201 = load i32, i32* @globalCounter, align 4
+  %202 = add nsw i32 %201, 1
+  store i32 %202, i32* @globalCounter, align 4
+  br label %203
+
+203:                                              ; preds = %179, %171
+  br label %204
+
+204:                                              ; preds = %203
+  %205 = load i32, i32* %19, align 4
+  %206 = add nsw i32 %205, 1
+  store i32 %206, i32* %19, align 4
+  br label %167
+
+207:                                              ; preds = %167
+  %208 = load i32*, i32** %10, align 8
+  %209 = load i32, i32* %18, align 4
+  %210 = add nsw i32 %209, 1
+  %211 = sext i32 %210 to i64
+  %212 = getelementptr inbounds i32, i32* %208, i64 %211
+  %213 = load i32, i32* %212, align 4
+  store i32 %213, i32* %16, align 4
+  %214 = load i32*, i32** %10, align 8
+  %215 = load i32, i32* %12, align 4
+  %216 = sext i32 %215 to i64
+  %217 = getelementptr inbounds i32, i32* %214, i64 %216
+  %218 = load i32, i32* %217, align 4
+  %219 = load i32*, i32** %10, align 8
+  %220 = load i32, i32* %18, align 4
+  %221 = add nsw i32 %220, 1
+  %222 = sext i32 %221 to i64
+  %223 = getelementptr inbounds i32, i32* %219, i64 %222
+  store i32 %218, i32* %223, align 4
+  %224 = load i32, i32* %16, align 4
+  %225 = load i32*, i32** %10, align 8
+  %226 = load i32, i32* %12, align 4
+  %227 = sext i32 %226 to i64
+  %228 = getelementptr inbounds i32, i32* %225, i64 %227
+  store i32 %224, i32* %228, align 4
+  %229 = load i32*, i32** %10, align 8
+  %230 = load i32, i32* %11, align 4
+  %231 = load i32, i32* %18, align 4
+  %232 = load i32*, i32** %13, align 8
+  %233 = call i32 @fused_quickSort(i1 false, i32* %229, i32 %230, i32 %231, i32* %232, i32 0)
+  %234 = load i32*, i32** %13, align 8
+  %235 = load i32, i32* %234, align 4
+  %236 = icmp ne i32 %235, 0
+  br i1 %236, label %237, label %240
+
+237:                                              ; preds = %207
+  %238 = load i32, i32* @recursionDepth, align 4
+  %239 = add nsw i32 %238, -1
+  store i32 %239, i32* @recursionDepth, align 4
+  br label %269
+
+240:                                              ; preds = %207
+  %241 = load i32*, i32** %10, align 8
+  %242 = load i32, i32* %18, align 4
+  %243 = add nsw i32 %242, 2
+  %244 = load i32, i32* %12, align 4
+  %245 = load i32*, i32** %13, align 8
+  %246 = call i32 @fused_quickSort(i1 false, i32* %241, i32 %243, i32 %244, i32* %245, i32 0)
+  %247 = load i32*, i32** %13, align 8
+  %248 = load i32, i32* %247, align 4
+  %249 = icmp ne i32 %248, 0
+  br i1 %249, label %250, label %253
+
+250:                                              ; preds = %240
+  %251 = load i32, i32* @recursionDepth, align 4
+  %252 = add nsw i32 %251, -1
+  store i32 %252, i32* @recursionDepth, align 4
+  br label %269
+
+253:                                              ; preds = %240
+  br label %254
+
+254:                                              ; preds = %253, %53
+  %255 = load i32, i32* @recursionDepth, align 4
+  %256 = add nsw i32 %255, -1
+  store i32 %256, i32* @recursionDepth, align 4
+  br label %257
+
+257:                                              ; preds = %254, %260
+  %258 = load i32, i32* %7, align 4
+  %259 = icmp ne i32 %258, 0
+  br i1 %259, label %260, label %267
+
+260:                                              ; preds = %257
+  %261 = load i32, i32* %7, align 4
+  %262 = and i32 %261, 1
+  %263 = load i32, i32* %8, align 4
+  %264 = add nsw i32 %263, %262
+  store i32 %264, i32* %8, align 4
+  %265 = load i32, i32* %7, align 4
+  %266 = ashr i32 %265, 1
+  store i32 %266, i32* %7, align 4
+  br label %257
+
+267:                                              ; preds = %257
+  %268 = load i32, i32* %8, align 4
+  ret i32 %268
+
+269:                                              ; preds = %250, %237, %48, %31, %23
+  ret i32 0
+}
+
+define i32 @fused_performSimpleCalculations(i1 %0, i32* %1, i32 %2) {
+entry:
+  br label %3
+
+3:                                                ; preds = %entry
+  %4 = alloca i32*, align 8
+  %5 = alloca i32, align 4
+  %6 = alloca [100 x i32], align 16
+  %7 = alloca i32, align 4
+  %8 = alloca i32, align 4
+  %9 = alloca i32, align 4
+  %10 = alloca i32, align 4
+  %11 = alloca i32, align 4
+  store i32* %1, i32** %4, align 8
+  store i32 %2, i32* %5, align 4
+  store i32 0, i32* %7, align 4
+  br label %12
+
+12:                                               ; preds = %3
+  %13 = alloca i32, align 4
+  store i32 100, i32* %13, align 4
+  %14 = load i32, i32* %13, align 4
+  %15 = icmp sgt i32 %14, 50
+  br i1 %15, label %16, label %21
+
+16:                                               ; preds = %12
+  %17 = load i32, i32* %13, align 4
+  %18 = mul nsw i32 %17, 2
+  %19 = load i32, i32* @calculationResult, align 4
+  %20 = add nsw i32 %19, %18
+  store i32 %20, i32* @calculationResult, align 4
+  br label %38
+
+21:                                               ; preds = %12
+  %22 = load i32, i32* %13, align 4
+  %23 = sdiv i32 %22, 2
+  %24 = load i32, i32* @calculationResult, align 4
+  %25 = add nsw i32 %24, %23
+  store i32 %25, i32* @calculationResult, align 4
+  br label %26
+
+26:                                               ; preds = %21
+  %27 = load i32, i32* %7, align 4
+  %28 = load i32, i32* %5, align 4
+  %29 = icmp slt i32 %27, %28
+  br i1 %29, label %30, label %34
+
+30:                                               ; preds = %26
+  %31 = load i32, i32* %7, align 4
+  %32 = sext i32 %31 to i64
+  %33 = getelementptr inbounds [100 x i32], [100 x i32]* %6, i64 0, i64 %32
+  store i32 1, i32* %33, align 4
+  br label %35
+
+34:                                               ; preds = %26
+  store i32 1, i32* %8, align 4
+  br label %48
+
+35:                                               ; preds = %30
+  %36 = load i32, i32* %7, align 4
+  %37 = add nsw i32 %36, 1
+  store i32 %37, i32* %7, align 4
+  br label %38
+
+38:                                               ; preds = %16, %35
+  %39 = load i32, i32* %13, align 4
+  %40 = srem i32 %39, 3
+  %41 = icmp eq i32 %40, 0
+  br i1 %41, label %42, label %45
+
+42:                                               ; preds = %38
+  %43 = load i32, i32* @calculationResult, align 4
+  %44 = mul nsw i32 %43, 3
+  store i32 %44, i32* @calculationResult, align 4
+  br label %98
+
+45:                                               ; preds = %38
+  %46 = load i32, i32* @calculationResult, align 4
+  %47 = add nsw i32 %46, 3
+  store i32 %47, i32* @calculationResult, align 4
+  br label %48
+
+48:                                               ; preds = %45, %83, %34
+  %49 = load i32, i32* %8, align 4
+  %50 = load i32, i32* %5, align 4
+  %51 = icmp slt i32 %49, %50
+  br i1 %51, label %52, label %53
+
+52:                                               ; preds = %48
+  store i32 0, i32* %9, align 4
+  br label %54
+
+53:                                               ; preds = %48
+  store i32 0, i32* %10, align 4
+  store i32 0, i32* %11, align 4
+  br label %110
+
+54:                                               ; preds = %52
+  %55 = load i32, i32* %9, align 4
+  %56 = load i32, i32* %8, align 4
+  %57 = icmp slt i32 %55, %56
+  br i1 %57, label %58, label %70
+
+58:                                               ; preds = %54
+  %59 = load i32*, i32** %4, align 8
+  %60 = load i32, i32* %8, align 4
+  %61 = sext i32 %60 to i64
+  %62 = getelementptr inbounds i32, i32* %59, i64 %61
+  %63 = load i32, i32* %62, align 4
+  %64 = load i32*, i32** %4, align 8
+  %65 = load i32, i32* %9, align 4
+  %66 = sext i32 %65 to i64
+  %67 = getelementptr inbounds i32, i32* %64, i64 %66
+  %68 = load i32, i32* %67, align 4
+  %69 = icmp sgt i32 %63, %68
+  br i1 %69, label %71, label %82
+
+70:                                               ; preds = %54
+  br label %83
+
+71:                                               ; preds = %58
+  %72 = load i32, i32* %8, align 4
+  %73 = sext i32 %72 to i64
+  %74 = getelementptr inbounds [100 x i32], [100 x i32]* %6, i64 0, i64 %73
+  %75 = load i32, i32* %74, align 4
+  %76 = load i32, i32* %9, align 4
+  %77 = sext i32 %76 to i64
+  %78 = getelementptr inbounds [100 x i32], [100 x i32]* %6, i64 0, i64 %77
+  %79 = load i32, i32* %78, align 4
+  %80 = add nsw i32 %79, 1
+  %81 = icmp slt i32 %75, %80
+  br i1 %81, label %86, label %82
+
+82:                                               ; preds = %86, %71, %58
+  br label %95
+
+83:                                               ; preds = %70
+  %84 = load i32, i32* %8, align 4
+  %85 = add nsw i32 %84, 1
+  store i32 %85, i32* %8, align 4
+  br label %48
+
+86:                                               ; preds = %71
+  %87 = load i32, i32* %9, align 4
+  %88 = sext i32 %87 to i64
+  %89 = getelementptr inbounds [100 x i32], [100 x i32]* %6, i64 0, i64 %88
+  %90 = load i32, i32* %89, align 4
+  %91 = add nsw i32 %90, 1
+  %92 = load i32, i32* %8, align 4
+  %93 = sext i32 %92 to i64
+  %94 = getelementptr inbounds [100 x i32], [100 x i32]* %6, i64 0, i64 %93
+  store i32 %91, i32* %94, align 4
+  br label %82
+
+95:                                               ; preds = %82
+  %96 = load i32, i32* %9, align 4
+  %97 = add nsw i32 %96, 1
+  store i32 %97, i32* %9, align 4
+  br label %98
+
+98:                                               ; preds = %42, %95
+  %99 = load i32, i32* @calculationResult, align 4
+  %100 = icmp sge i32 %99, 150
+  br i1 %100, label %101, label %107
+
+101:                                              ; preds = %98
+  %102 = load i32, i32* @calculationResult, align 4
+  %103 = icmp sle i32 %102, 300
+  br i1 %103, label %104, label %107
+
+104:                                              ; preds = %101
+  %105 = load i32, i32* @calculationResult, align 4
+  %106 = sub nsw i32 %105, 50
+  store i32 %106, i32* @calculationResult, align 4
+  br label %132
+
+107:                                              ; preds = %101, %98
+  %108 = load i32, i32* @calculationResult, align 4
+  %109 = add nsw i32 %108, 50
+  store i32 %109, i32* @calculationResult, align 4
+  br label %110
+
+110:                                              ; preds = %107, %53
+  %111 = load i32, i32* %11, align 4
+  %112 = load i32, i32* %5, align 4
+  %113 = icmp slt i32 %111, %112
+  br i1 %113, label %114, label %121
+
+114:                                              ; preds = %110
+  %115 = load i32, i32* %10, align 4
+  %116 = load i32, i32* %11, align 4
+  %117 = sext i32 %116 to i64
+  %118 = getelementptr inbounds [100 x i32], [100 x i32]* %6, i64 0, i64 %117
+  %119 = load i32, i32* %118, align 4
+  %120 = icmp slt i32 %115, %119
+  br i1 %120, label %123, label %128
+
+121:                                              ; preds = %110
+  %122 = load i32, i32* %10, align 4
+  ret i32 %122
+
+123:                                              ; preds = %114
+  %124 = load i32, i32* %11, align 4
+  %125 = sext i32 %124 to i64
+  %126 = getelementptr inbounds [100 x i32], [100 x i32]* %6, i64 0, i64 %125
+  %127 = load i32, i32* %126, align 4
+  store i32 %127, i32* %10, align 4
+  br label %128
+
+128:                                              ; preds = %123, %114
+  br label %129
+
+129:                                              ; preds = %128
+  %130 = load i32, i32* %11, align 4
+  %131 = add nsw i32 %130, 1
+  store i32 %131, i32* %11, align 4
+  br label %132
+
+132:                                              ; preds = %104, %129
+  %133 = load i32, i32* @calculationResult, align 4
+  %134 = srem i32 %133, 2
+  %135 = icmp eq i32 %134, 0
+  br i1 %135, label %136, label %139
+
+136:                                              ; preds = %132
+  %137 = load i32, i32* @calculationResult, align 4
+  %138 = sdiv i32 %137, 2
+  store i32 %138, i32* @calculationResult, align 4
+  br label %142
+
+139:                                              ; preds = %132
+  %140 = load i32, i32* @calculationResult, align 4
+  %141 = mul nsw i32 %140, 2
+  store i32 %141, i32* @calculationResult, align 4
+  br label %142
+
+142:                                              ; preds = %139, %136
+  %143 = load i32, i32* @calculationResult, align 4
+  %144 = srem i32 %143, 10
+  %145 = icmp slt i32 %144, 5
+  br i1 %145, label %146, label %149
+
+146:                                              ; preds = %142
+  %147 = load i32, i32* @calculationResult, align 4
+  %148 = add nsw i32 %147, 5
+  store i32 %148, i32* @calculationResult, align 4
+  br label %152
+
+149:                                              ; preds = %142
+  %150 = load i32, i32* @calculationResult, align 4
+  %151 = sub nsw i32 %150, 5
+  store i32 %151, i32* @calculationResult, align 4
+  br label %152
+
+152:                                              ; preds = %149, %146
+  %153 = load i32, i32* @calculationResult, align 4
+  %154 = icmp sgt i32 %153, 1000
+  br i1 %154, label %155, label %156
+
+155:                                              ; preds = %152
+  store i32 1000, i32* @calculationResult, align 4
+  br label %159
+
+156:                                              ; preds = %152
+  %157 = load i32, i32* @calculationResult, align 4
+  %158 = add nsw i32 %157, 10
+  store i32 %158, i32* @calculationResult, align 4
+  br label %159
+
+159:                                              ; preds = %156, %155
+  %160 = load i32, i32* @calculationResult, align 4
+  %161 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([30 x i8], [30 x i8]* @.str.27, i64 0, i64 0), i32 %160)
+  ret i32 0
+}
+
+define %fused_return_projectA_main_memoizedFib @fused_projectA_main(i1 %0, i32 %1) {
+entry:
+  br label %2
+
+2:                                                ; preds = %entry
+  %3 = alloca i32, align 4
+  %4 = alloca i32, align 4
+  store i32 %1, i32* %4, align 4
+  %5 = load i32, i32* %4, align 4
+  %6 = sext i32 %5 to i64
+  %7 = getelementptr inbounds [100 x i32], [100 x i32]* @cache, i64 0, i64 %6
+  %8 = load i32, i32* %7, align 4
+  %9 = icmp ne i32 %8, -1
+  br i1 %9, label %10, label %15
+
+10:                                               ; preds = %2
+  %11 = load i32, i32* %4, align 4
+  %12 = sext i32 %11 to i64
+  %13 = getelementptr inbounds [100 x i32], [100 x i32]* @cache, i64 0, i64 %12
+  %14 = load i32, i32* %13, align 4
+  store i32 %14, i32* %3, align 4
+  br label %18
+
+15:                                               ; preds = %2
+  %16 = load i32, i32* %4, align 4
+  %17 = icmp sle i32 %16, 1
+  br i1 %17, label %20, label %22
+
+18:                                               ; preds = %20, %10
+  %19 = load i32, i32* %3, align 4
+  %struct.target = insertvalue %fused_return_projectA_main_memoizedFib zeroinitializer, i32 %19, 0
+  %struct.bunker1 = insertvalue %fused_return_projectA_main_memoizedFib %struct.target, i32 0, 1
+  ret %fused_return_projectA_main_memoizedFib %struct.bunker1
+
+20:                                               ; preds = %15
+  %21 = load i32, i32* %4, align 4
+  store i32 %21, i32* %3, align 4
+  br label %18
+
+22:                                               ; preds = %15
+  %23 = load i32, i32* %4, align 4
+  %24 = sub nsw i32 %23, 1
+  %25 = call %fused_return_projectA_main_memoizedFib @fused_projectA_main(i1 true, i32 %24)
+  %extracted_target_return2 = extractvalue %fused_return_projectA_main_memoizedFib %25, 0
+  %26 = load i32, i32* %4, align 4
+  %27 = sub nsw i32 %26, 2
+  %28 = call %fused_return_projectA_main_memoizedFib @fused_projectA_main(i1 true, i32 %27)
+  %extracted_target_return = extractvalue %fused_return_projectA_main_memoizedFib %28, 0
+  %29 = add nsw i32 %extracted_target_return2, %extracted_target_return
+  %30 = load i32, i32* %4, align 4
+  %31 = sext i32 %30 to i64
+  %32 = getelementptr inbounds [100 x i32], [100 x i32]* @cache, i64 0, i64 %31
+  store i32 %29, i32* %32, align 4
+  %33 = load i32, i32* %4, align 4
+  %34 = sext i32 %33 to i64
+  %35 = getelementptr inbounds [100 x i32], [100 x i32]* @cache, i64 0, i64 %34
+  %36 = load i32, i32* %35, align 4
+  store i32 %36, i32* %3, align 4
+  br label %37
+
+37:                                               ; preds = %22
+  %38 = alloca i32, align 4
+  %39 = alloca %struct.DynamicArray*, align 8
+  %40 = alloca i32, align 4
+  %41 = alloca %struct.Matrix*, align 8
+  %42 = alloca %struct.Matrix*, align 8
+  %43 = alloca i32, align 4
+  %44 = alloca i32, align 4
+  %45 = alloca %struct.Matrix*, align 8
+  %46 = alloca i32, align 4
+  %47 = alloca %struct.Node*, align 8
+  %48 = alloca i32, align 4
+  %49 = alloca i32, align 4
+  %50 = alloca %struct.Node*, align 8
+  %51 = alloca %struct.Node*, align 8
+  %52 = alloca i32, align 4
+  %53 = alloca %struct.Node*, align 8
+  %54 = alloca i32, align 4
+  %55 = alloca i32, align 4
+  %56 = alloca %struct.Node*, align 8
+  %57 = call i64 @time(i64* null) #7
+  %58 = trunc i64 %57 to i32
+  call void @srand(i32 %58) #7
+  %59 = call %fused_return_createDynamicArray_processMatrix @fused_createDynamicArray(i1 false, i32 10, [100 x i32]* null, i32 0)
+  %extracted_bunker_return = extractvalue %fused_return_createDynamicArray_processMatrix %59, 1
+  store %struct.DynamicArray* %extracted_bunker_return, %struct.DynamicArray** %39, align 8
+  %60 = load %struct.DynamicArray*, %struct.DynamicArray** %39, align 8
+  %61 = icmp ne %struct.DynamicArray* %60, null
+  br i1 %61, label %65, label %62
+
+62:                                               ; preds = %37
+  %63 = call i8* @getErrorMessage()
+  %64 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.28, i64 0, i64 0), i8* %63)
+  store i32 -1, i32* %38, align 4
+  br label %361
+
+65:                                               ; preds = %37
+  store i32 0, i32* %40, align 4
+  br label %66
+
+66:                                               ; preds = %79, %65
+  %67 = load i32, i32* %40, align 4
+  %68 = icmp slt i32 %67, 15
+  br i1 %68, label %69, label %82
+
+69:                                               ; preds = %66
+  %70 = load %struct.DynamicArray*, %struct.DynamicArray** %39, align 8
+  %71 = call i32 @rand() #7
+  %72 = srem i32 %71, 100
+  call void @pushBack(%struct.DynamicArray* %70, i32 %72)
+  %73 = load i8*, i8** @globalErrorMessage, align 8
+  %74 = icmp ne i8* %73, null
+  br i1 %74, label %75, label %78
+
+75:                                               ; preds = %69
+  %76 = call i8* @getErrorMessage()
+  %77 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([29 x i8], [29 x i8]* @.str.29, i64 0, i64 0), i8* %76)
+  br label %82
+
+78:                                               ; preds = %69
+  br label %79
+
+79:                                               ; preds = %78
+  %80 = load i32, i32* %40, align 4
+  %81 = add nsw i32 %80, 1
+  store i32 %81, i32* %40, align 4
+  br label %66
+
+82:                                               ; preds = %75, %66
+  %83 = call %struct.Matrix* @fused_createMatrix(i1 false, i32 3, i32 3, i8* null)
+  store %struct.Matrix* %83, %struct.Matrix** %41, align 8
+  %84 = call %struct.Matrix* @fused_createMatrix(i1 false, i32 3, i32 3, i8* null)
+  store %struct.Matrix* %84, %struct.Matrix** %42, align 8
+  %85 = load %struct.Matrix*, %struct.Matrix** %41, align 8
+  %86 = icmp ne %struct.Matrix* %85, null
+  br i1 %86, label %87, label %90
+
+87:                                               ; preds = %82
+  %88 = load %struct.Matrix*, %struct.Matrix** %42, align 8
+  %89 = icmp ne %struct.Matrix* %88, null
+  br i1 %89, label %111, label %90
+
+90:                                               ; preds = %87, %82
+  %91 = call i8* @getErrorMessage()
+  %92 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.28, i64 0, i64 0), i8* %91)
+  %93 = load %struct.Matrix*, %struct.Matrix** %41, align 8
+  %94 = icmp ne %struct.Matrix* %93, null
+  br i1 %94, label %95, label %98
+
+95:                                               ; preds = %90
+  %96 = load %struct.Matrix*, %struct.Matrix** %41, align 8
+  %97 = bitcast %struct.Matrix* %96 to i8*
+  call void @free(i8* %97) #7
+  br label %98
+
+98:                                               ; preds = %95, %90
+  %99 = load %struct.Matrix*, %struct.Matrix** %42, align 8
+  %100 = icmp ne %struct.Matrix* %99, null
+  br i1 %100, label %101, label %104
+
+101:                                              ; preds = %98
+  %102 = load %struct.Matrix*, %struct.Matrix** %42, align 8
+  %103 = bitcast %struct.Matrix* %102 to i8*
+  call void @free(i8* %103) #7
+  br label %104
+
+104:                                              ; preds = %101, %98
+  %105 = load %struct.DynamicArray*, %struct.DynamicArray** %39, align 8
+  %106 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %105, i32 0, i32 0
+  %107 = load i32*, i32** %106, align 8
+  %108 = bitcast i32* %107 to i8*
+  call void @free(i8* %108) #7
+  %109 = load %struct.DynamicArray*, %struct.DynamicArray** %39, align 8
+  %110 = bitcast %struct.DynamicArray* %109 to i8*
+  call void @free(i8* %110) #7
+  store i32 -1, i32* %38, align 4
+  br label %361
+
+111:                                              ; preds = %87
+  store i32 0, i32* %43, align 4
+  br label %112
+
+112:                                              ; preds = %148, %111
+  %113 = load i32, i32* %43, align 4
+  %114 = icmp slt i32 %113, 3
+  br i1 %114, label %115, label %151
+
+115:                                              ; preds = %112
+  store i32 0, i32* %44, align 4
+  br label %116
+
+116:                                              ; preds = %144, %115
+  %117 = load i32, i32* %44, align 4
+  %118 = icmp slt i32 %117, 3
+  br i1 %118, label %119, label %147
+
+119:                                              ; preds = %116
+  %120 = call i32 @rand() #7
+  %121 = srem i32 %120, 10
+  %122 = load %struct.Matrix*, %struct.Matrix** %41, align 8
+  %123 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %122, i32 0, i32 0
+  %124 = load i32**, i32*** %123, align 8
+  %125 = load i32, i32* %43, align 4
+  %126 = sext i32 %125 to i64
+  %127 = getelementptr inbounds i32*, i32** %124, i64 %126
+  %128 = load i32*, i32** %127, align 8
+  %129 = load i32, i32* %44, align 4
+  %130 = sext i32 %129 to i64
+  %131 = getelementptr inbounds i32, i32* %128, i64 %130
+  store i32 %121, i32* %131, align 4
+  %132 = call i32 @rand() #7
+  %133 = srem i32 %132, 10
+  %134 = load %struct.Matrix*, %struct.Matrix** %42, align 8
+  %135 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %134, i32 0, i32 0
+  %136 = load i32**, i32*** %135, align 8
+  %137 = load i32, i32* %43, align 4
+  %138 = sext i32 %137 to i64
+  %139 = getelementptr inbounds i32*, i32** %136, i64 %138
+  %140 = load i32*, i32** %139, align 8
+  %141 = load i32, i32* %44, align 4
+  %142 = sext i32 %141 to i64
+  %143 = getelementptr inbounds i32, i32* %140, i64 %142
+  store i32 %133, i32* %143, align 4
+  br label %144
+
+144:                                              ; preds = %119
+  %145 = load i32, i32* %44, align 4
+  %146 = add nsw i32 %145, 1
+  store i32 %146, i32* %44, align 4
+  br label %116
+
+147:                                              ; preds = %116
+  br label %148
+
+148:                                              ; preds = %147
+  %149 = load i32, i32* %43, align 4
+  %150 = add nsw i32 %149, 1
+  store i32 %150, i32* %43, align 4
+  br label %112
+
+151:                                              ; preds = %112
+  %152 = load %struct.Matrix*, %struct.Matrix** %41, align 8
+  %153 = load %struct.Matrix*, %struct.Matrix** %42, align 8
+  %154 = call %struct.Matrix* @multiplyMatrices(%struct.Matrix* %152, %struct.Matrix* %153)
+  store %struct.Matrix* %154, %struct.Matrix** %45, align 8
+  %155 = load %struct.Matrix*, %struct.Matrix** %45, align 8
+  %156 = icmp ne %struct.Matrix* %155, null
+  br i1 %156, label %205, label %157
+
+157:                                              ; preds = %151
+  %158 = call i8* @getErrorMessage()
+  %159 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.28, i64 0, i64 0), i8* %158)
+  store i32 0, i32* %46, align 4
+  br label %160
+
+160:                                              ; preds = %183, %157
+  %161 = load i32, i32* %46, align 4
+  %162 = load %struct.Matrix*, %struct.Matrix** %41, align 8
+  %163 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %162, i32 0, i32 1
+  %164 = load i32, i32* %163, align 8
+  %165 = icmp slt i32 %161, %164
+  br i1 %165, label %166, label %186
+
+166:                                              ; preds = %160
+  %167 = load %struct.Matrix*, %struct.Matrix** %41, align 8
+  %168 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %167, i32 0, i32 0
+  %169 = load i32**, i32*** %168, align 8
+  %170 = load i32, i32* %46, align 4
+  %171 = sext i32 %170 to i64
+  %172 = getelementptr inbounds i32*, i32** %169, i64 %171
+  %173 = load i32*, i32** %172, align 8
+  %174 = bitcast i32* %173 to i8*
+  call void @free(i8* %174) #7
+  %175 = load %struct.Matrix*, %struct.Matrix** %42, align 8
+  %176 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %175, i32 0, i32 0
+  %177 = load i32**, i32*** %176, align 8
+  %178 = load i32, i32* %46, align 4
+  %179 = sext i32 %178 to i64
+  %180 = getelementptr inbounds i32*, i32** %177, i64 %179
+  %181 = load i32*, i32** %180, align 8
+  %182 = bitcast i32* %181 to i8*
+  call void @free(i8* %182) #7
+  br label %183
+
+183:                                              ; preds = %166
+  %184 = load i32, i32* %46, align 4
+  %185 = add nsw i32 %184, 1
+  store i32 %185, i32* %46, align 4
+  br label %160
+
+186:                                              ; preds = %160
+  %187 = load %struct.Matrix*, %struct.Matrix** %41, align 8
+  %188 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %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.Matrix*, %struct.Matrix** %42, align 8
+  %192 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %191, i32 0, i32 0
+  %193 = load i32**, i32*** %192, align 8
+  %194 = bitcast i32** %193 to i8*
+  call void @free(i8* %194) #7
+  %195 = load %struct.Matrix*, %struct.Matrix** %41, align 8
+  %196 = bitcast %struct.Matrix* %195 to i8*
+  call void @free(i8* %196) #7
+  %197 = load %struct.Matrix*, %struct.Matrix** %42, align 8
+  %198 = bitcast %struct.Matrix* %197 to i8*
+  call void @free(i8* %198) #7
+  %199 = load %struct.DynamicArray*, %struct.DynamicArray** %39, align 8
+  %200 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %199, i32 0, i32 0
+  %201 = load i32*, i32** %200, align 8
+  %202 = bitcast i32* %201 to i8*
+  call void @free(i8* %202) #7
+  %203 = load %struct.DynamicArray*, %struct.DynamicArray** %39, align 8
+  %204 = bitcast %struct.DynamicArray* %203 to i8*
+  call void @free(i8* %204) #7
+  store i32 -1, i32* %38, align 4
+  br label %361
+
+205:                                              ; preds = %151
+  store %struct.Node* null, %struct.Node** %47, align 8
+  store i32 0, i32* %48, align 4
+  br label %206
+
+206:                                              ; preds = %220, %205
+  %207 = load i32, i32* %48, align 4
+  %208 = icmp slt i32 %207, 5
+  br i1 %208, label %209, label %223
+
+209:                                              ; preds = %206
+  %210 = load %struct.Node*, %struct.Node** %47, align 8
+  %211 = call i32 @rand() #7
+  %212 = srem i32 %211, 50
+  %213 = call %struct.Node* @insertNode(%struct.Node* %210, i32 %212)
+  store %struct.Node* %213, %struct.Node** %47, align 8
+  %214 = load i8*, i8** @globalErrorMessage, align 8
+  %215 = icmp ne i8* %214, null
+  br i1 %215, label %216, label %219
+
+216:                                              ; preds = %209
+  %217 = call i8* @getErrorMessage()
+  %218 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([33 x i8], [33 x i8]* @.str.30, i64 0, i64 0), i8* %217)
+  br label %223
+
+219:                                              ; preds = %209
+  br label %220
+
+220:                                              ; preds = %219
+  %221 = load i32, i32* %48, align 4
+  %222 = add nsw i32 %221, 1
+  store i32 %222, i32* %48, align 4
+  br label %206
+
+223:                                              ; preds = %216, %206
+  %224 = load %struct.DynamicArray*, %struct.DynamicArray** %39, align 8
+  %225 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %224, i32 0, i32 0
+  %226 = load i32*, i32** %225, align 8
+  %227 = bitcast i32* %226 to i8*
+  call void @free(i8* %227) #7
+  %228 = load %struct.DynamicArray*, %struct.DynamicArray** %39, align 8
+  %229 = bitcast %struct.DynamicArray* %228 to i8*
+  call void @free(i8* %229) #7
+  store i32 0, i32* %49, align 4
+  br label %230
+
+230:                                              ; preds = %261, %223
+  %231 = load i32, i32* %49, align 4
+  %232 = load %struct.Matrix*, %struct.Matrix** %41, align 8
+  %233 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %232, i32 0, i32 1
+  %234 = load i32, i32* %233, align 8
+  %235 = icmp slt i32 %231, %234
+  br i1 %235, label %236, label %264
+
+236:                                              ; preds = %230
+  %237 = load %struct.Matrix*, %struct.Matrix** %41, align 8
+  %238 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %237, i32 0, i32 0
+  %239 = load i32**, i32*** %238, align 8
+  %240 = load i32, i32* %49, align 4
+  %241 = sext i32 %240 to i64
+  %242 = getelementptr inbounds i32*, i32** %239, i64 %241
+  %243 = load i32*, i32** %242, align 8
+  %244 = bitcast i32* %243 to i8*
+  call void @free(i8* %244) #7
+  %245 = load %struct.Matrix*, %struct.Matrix** %42, align 8
+  %246 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %245, i32 0, i32 0
+  %247 = load i32**, i32*** %246, align 8
+  %248 = load i32, i32* %49, align 4
+  %249 = sext i32 %248 to i64
+  %250 = getelementptr inbounds i32*, i32** %247, i64 %249
+  %251 = load i32*, i32** %250, align 8
+  %252 = bitcast i32* %251 to i8*
+  call void @free(i8* %252) #7
+  %253 = load %struct.Matrix*, %struct.Matrix** %45, align 8
+  %254 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %253, i32 0, i32 0
+  %255 = load i32**, i32*** %254, align 8
+  %256 = load i32, i32* %49, align 4
+  %257 = sext i32 %256 to i64
+  %258 = getelementptr inbounds i32*, i32** %255, i64 %257
+  %259 = load i32*, i32** %258, align 8
+  %260 = bitcast i32* %259 to i8*
+  call void @free(i8* %260) #7
+  br label %261
+
+261:                                              ; preds = %236
+  %262 = load i32, i32* %49, align 4
+  %263 = add nsw i32 %262, 1
+  store i32 %263, i32* %49, align 4
+  br label %230
+
+264:                                              ; preds = %230
+  %265 = load %struct.Matrix*, %struct.Matrix** %41, align 8
+  %266 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %265, i32 0, i32 0
+  %267 = load i32**, i32*** %266, align 8
+  %268 = bitcast i32** %267 to i8*
+  call void @free(i8* %268) #7
+  %269 = load %struct.Matrix*, %struct.Matrix** %42, align 8
+  %270 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %269, i32 0, i32 0
+  %271 = load i32**, i32*** %270, align 8
+  %272 = bitcast i32** %271 to i8*
+  call void @free(i8* %272) #7
+  %273 = load %struct.Matrix*, %struct.Matrix** %45, align 8
+  %274 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %273, i32 0, i32 0
+  %275 = load i32**, i32*** %274, align 8
+  %276 = bitcast i32** %275 to i8*
+  call void @free(i8* %276) #7
+  %277 = load %struct.Matrix*, %struct.Matrix** %41, align 8
+  %278 = bitcast %struct.Matrix* %277 to i8*
+  call void @free(i8* %278) #7
+  %279 = load %struct.Matrix*, %struct.Matrix** %42, align 8
+  %280 = bitcast %struct.Matrix* %279 to i8*
+  call void @free(i8* %280) #7
+  %281 = load %struct.Matrix*, %struct.Matrix** %45, align 8
+  %282 = bitcast %struct.Matrix* %281 to i8*
+  call void @free(i8* %282) #7
+  %283 = load %struct.Node*, %struct.Node** %47, align 8
+  %284 = icmp ne %struct.Node* %283, null
+  br i1 %284, label %285, label %354
+
+285:                                              ; preds = %264
+  %286 = load %struct.Node*, %struct.Node** %47, align 8
+  store %struct.Node* %286, %struct.Node** %50, align 8
+  %287 = load %struct.Node*, %struct.Node** %47, align 8
+  store %struct.Node* %287, %struct.Node** %51, align 8
+  store i32 0, i32* %52, align 4
+  br label %288
+
+288:                                              ; preds = %311, %285
+  %289 = load %struct.Node*, %struct.Node** %51, align 8
+  %290 = icmp ne %struct.Node* %289, null
+  br i1 %290, label %291, label %296
+
+291:                                              ; preds = %288
+  %292 = load %struct.Node*, %struct.Node** %51, align 8
+  %293 = getelementptr inbounds %struct.Node, %struct.Node* %292, i32 0, i32 1
+  %294 = load %struct.Node*, %struct.Node** %293, align 8
+  %295 = icmp ne %struct.Node* %294, null
+  br label %296
+
+296:                                              ; preds = %291, %288
+  %297 = phi i1 [ false, %288 ], [ %295, %291 ]
+  br i1 %297, label %298, label %312
+
+298:                                              ; preds = %296
+  %299 = load %struct.Node*, %struct.Node** %50, align 8
+  %300 = getelementptr inbounds %struct.Node, %struct.Node* %299, i32 0, i32 1
+  %301 = load %struct.Node*, %struct.Node** %300, align 8
+  store %struct.Node* %301, %struct.Node** %50, align 8
+  %302 = load %struct.Node*, %struct.Node** %51, align 8
+  %303 = getelementptr inbounds %struct.Node, %struct.Node* %302, i32 0, i32 1
+  %304 = load %struct.Node*, %struct.Node** %303, align 8
+  %305 = getelementptr inbounds %struct.Node, %struct.Node* %304, i32 0, i32 1
+  %306 = load %struct.Node*, %struct.Node** %305, align 8
+  store %struct.Node* %306, %struct.Node** %51, align 8
+  %307 = load %struct.Node*, %struct.Node** %50, align 8
+  %308 = load %struct.Node*, %struct.Node** %51, align 8
+  %309 = icmp eq %struct.Node* %307, %308
+  br i1 %309, label %310, label %311
+
+310:                                              ; preds = %298
+  store i32 1, i32* %52, align 4
+  br label %312
+
+311:                                              ; preds = %298
+  br label %288
+
+312:                                              ; preds = %296, %310
+  %313 = load i32, i32* %52, align 4
+  %314 = icmp ne i32 %313, 0
+  br i1 %314, label %315, label %342
+
+315:                                              ; preds = %312
+  %316 = call i32 @fused_setErrorMessage(i1 false, i8* getelementptr inbounds ([43 x i8], [43 x i8]* @.str.31, i64 0, i64 0))
+  %317 = load %struct.Node*, %struct.Node** %47, align 8
+  store %struct.Node* %317, %struct.Node** %53, align 8
+  store i32 1000, i32* %54, align 4
+  store i32 0, i32* %55, align 4
+  br label %318
+
+318:                                              ; preds = %333, %315
+  %319 = load %struct.Node*, %struct.Node** %53, align 8
+  %320 = icmp ne %struct.Node* %319, null
+  br i1 %320, label %321, label %325
+
+321:                                              ; preds = %318
+  %322 = load i32, i32* %55, align 4
+  %323 = load i32, i32* %54, align 4
+  %324 = icmp slt i32 %322, %323
+  br label %325
+
+325:                                              ; preds = %321, %318
+  %326 = phi i1 [ false, %318 ], [ %324, %321 ]
+  br i1 %326, label %327, label %341
+
+327:                                              ; preds = %325
+  %328 = load %struct.Node*, %struct.Node** %53, align 8
+  %329 = getelementptr inbounds %struct.Node, %struct.Node* %328, i32 0, i32 3
+  %330 = load i32, i32* %329, align 8
+  %331 = icmp ne i32 %330, 0
+  br i1 %331, label %332, label %333
+
+332:                                              ; preds = %327
+  br label %341
+
+333:                                              ; preds = %327
+  %334 = load %struct.Node*, %struct.Node** %53, align 8
+  %335 = getelementptr inbounds %struct.Node, %struct.Node* %334, i32 0, i32 3
+  store i32 1, i32* %335, align 8
+  %336 = load %struct.Node*, %struct.Node** %53, align 8
+  %337 = getelementptr inbounds %struct.Node, %struct.Node* %336, i32 0, i32 1
+  %338 = load %struct.Node*, %struct.Node** %337, align 8
+  store %struct.Node* %338, %struct.Node** %53, align 8
+  %339 = load i32, i32* %55, align 4
+  %340 = add nsw i32 %339, 1
+  store i32 %340, i32* %55, align 4
+  br label %318
+
+341:                                              ; preds = %332, %325
+  br label %342
+
+342:                                              ; preds = %341, %312
+  br label %343
+
+343:                                              ; preds = %346, %342
+  %344 = load %struct.Node*, %struct.Node** %47, align 8
+  %345 = icmp ne %struct.Node* %344, null
+  br i1 %345, label %346, label %353
+
+346:                                              ; preds = %343
+  %347 = load %struct.Node*, %struct.Node** %47, align 8
+  store %struct.Node* %347, %struct.Node** %56, align 8
+  %348 = load %struct.Node*, %struct.Node** %47, align 8
+  %349 = getelementptr inbounds %struct.Node, %struct.Node* %348, i32 0, i32 1
+  %350 = load %struct.Node*, %struct.Node** %349, align 8
+  store %struct.Node* %350, %struct.Node** %47, align 8
+  %351 = load %struct.Node*, %struct.Node** %56, align 8
+  %352 = bitcast %struct.Node* %351 to i8*
+  call void @free(i8* %352) #7
+  br label %343
+
+353:                                              ; preds = %343
+  br label %354
+
+354:                                              ; preds = %353, %264
+  %355 = load i8*, i8** @globalErrorMessage, align 8
+  %356 = icmp ne i8* %355, null
+  br i1 %356, label %357, label %359
+
+357:                                              ; preds = %354
+  %358 = load i8*, i8** @globalErrorMessage, align 8
+  call void @free(i8* %358) #7
+  br label %359
+
+359:                                              ; preds = %357, %354
+  %360 = call i32 @fused_performSimpleCalculations(i1 false, i32* null, i32 0)
+  store i32 0, i32* %38, align 4
+  br label %361
+
+361:                                              ; preds = %359, %186, %104, %62
+  %362 = load i32, i32* %38, align 4
+  %struct.bunker = insertvalue %fused_return_projectA_main_memoizedFib { i32 0, i32 undef }, i32 %362, 1
+  ret %fused_return_projectA_main_memoizedFib %struct.bunker
+}
+
+define %fused_return_createDynamicArray_processMatrix @fused_createDynamicArray(i1 %0, i32 %1, [100 x i32]* %2, i32 %3) {
+entry:
+  br label %4
+
+4:                                                ; preds = %entry
+  %5 = alloca [100 x i32]*, align 8
+  %6 = alloca i32, align 4
+  %7 = alloca i32, align 4
+  %8 = alloca i32, align 4
+  %9 = alloca i32, align 4
+  store [100 x i32]* %2, [100 x i32]** %5, align 8
+  store i32 %3, i32* %6, align 4
+  store i32 0, i32* %7, align 4
+  store i32 0, i32* %8, align 4
+  br label %10
+
+10:                                               ; preds = %4
+  %11 = alloca %struct.DynamicArray*, align 8
+  %12 = alloca i32, align 4
+  %13 = alloca %struct.DynamicArray*, align 8
+  store i32 %1, i32* %12, align 4
+  %14 = load i32, i32* %12, align 4
+  %15 = icmp sle i32 %14, 0
+  br i1 %15, label %16, label %18
+
+16:                                               ; preds = %10
+  %17 = call i32 @fused_setErrorMessage(i1 false, i8* getelementptr inbounds ([25 x i8], [25 x i8]* @.str.6, i64 0, i64 0))
+  store %struct.DynamicArray* null, %struct.DynamicArray** %11, align 8
+  br label %131
+
+18:                                               ; preds = %10
+  %19 = load i32, i32* %12, align 4
+  %20 = icmp sgt i32 %19, 1000
+  br i1 %20, label %21, label %23
+
+21:                                               ; preds = %18
+  %22 = call i32 @fused_setErrorMessage(i1 false, i8* getelementptr inbounds ([46 x i8], [46 x i8]* @.str.7, i64 0, i64 0))
+  store %struct.DynamicArray* null, %struct.DynamicArray** %11, align 8
+  br label %131
+
+23:                                               ; preds = %18
+  %24 = call noalias i8* @malloc(i64 24) #7
+  %25 = bitcast i8* %24 to %struct.DynamicArray*
+  store %struct.DynamicArray* %25, %struct.DynamicArray** %13, align 8
+  %26 = load %struct.DynamicArray*, %struct.DynamicArray** %13, align 8
+  %27 = icmp ne %struct.DynamicArray* %26, null
+  br i1 %27, label %30, label %28
+
+28:                                               ; preds = %23
+  %29 = call i32 @fused_setErrorMessage(i1 false, i8* getelementptr inbounds ([49 x i8], [49 x i8]* @.str.8, i64 0, i64 0))
+  store %struct.DynamicArray* null, %struct.DynamicArray** %11, align 8
+  br label %131
+
+30:                                               ; preds = %23
+  %31 = load i32, i32* %12, align 4
+  %32 = sext i32 %31 to i64
+  %33 = mul i64 4, %32
+  %34 = call noalias i8* @malloc(i64 %33) #7
+  %35 = bitcast i8* %34 to i32*
+  %36 = load %struct.DynamicArray*, %struct.DynamicArray** %13, align 8
+  %37 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %36, i32 0, i32 0
+  store i32* %35, i32** %37, align 8
+  %38 = load %struct.DynamicArray*, %struct.DynamicArray** %13, align 8
+  %39 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %38, i32 0, i32 0
+  %40 = load i32*, i32** %39, align 8
+  %41 = icmp ne i32* %40, null
+  br i1 %41, label %46, label %42
+
+42:                                               ; preds = %30
+  %43 = load %struct.DynamicArray*, %struct.DynamicArray** %13, align 8
+  %44 = bitcast %struct.DynamicArray* %43 to i8*
+  call void @free(i8* %44) #7
+  %45 = call i32 @fused_setErrorMessage(i1 false, i8* getelementptr inbounds ([35 x i8], [35 x i8]* @.str.9, i64 0, i64 0))
+  store %struct.DynamicArray* null, %struct.DynamicArray** %11, align 8
+  br label %131
+
+46:                                               ; preds = %30
+  %47 = load %struct.DynamicArray*, %struct.DynamicArray** %13, align 8
+  %48 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %47, i32 0, i32 1
+  store i32 0, i32* %48, align 8
+  %49 = load i32, i32* %12, align 4
+  %50 = load %struct.DynamicArray*, %struct.DynamicArray** %13, align 8
+  %51 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %50, i32 0, i32 2
+  store i32 %49, i32* %51, align 4
+  %52 = load %struct.DynamicArray*, %struct.DynamicArray** %13, align 8
+  %53 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %52, i32 0, i32 3
+  store i32 1, i32* %53, align 8
+  %54 = load %struct.DynamicArray*, %struct.DynamicArray** %13, align 8
+  %55 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %54, i32 0, i32 4
+  store i32 0, i32* %55, align 4
+  %56 = load %struct.DynamicArray*, %struct.DynamicArray** %13, align 8
+  store %struct.DynamicArray* %56, %struct.DynamicArray** %11, align 8
+  br label %57
+
+57:                                               ; preds = %46, %88
+  %58 = load i32, i32* %8, align 4
+  %59 = load i32, i32* %6, align 4
+  %60 = icmp slt i32 %58, %59
+  br i1 %60, label %61, label %62
+
+61:                                               ; preds = %57
+  store i32 0, i32* %9, align 4
+  br label %64
+
+62:                                               ; preds = %57
+  %63 = load i32, i32* %7, align 4
+  %struct.target = insertvalue %fused_return_createDynamicArray_processMatrix zeroinitializer, i32 %63, 0
+  %struct.bunker1 = insertvalue %fused_return_createDynamicArray_processMatrix %struct.target, %struct.DynamicArray* null, 1
+  ret %fused_return_createDynamicArray_processMatrix %struct.bunker1
+
+64:                                               ; preds = %61
+  %65 = load i32, i32* %9, align 4
+  %66 = load i32, i32* %6, align 4
+  %67 = icmp slt i32 %65, %66
+  br i1 %67, label %68, label %72
+
+68:                                               ; preds = %64
+  %69 = load i32, i32* %8, align 4
+  %70 = load i32, i32* %9, align 4
+  %71 = icmp eq i32 %69, %70
+  br i1 %71, label %73, label %84
+
+72:                                               ; preds = %64
+  br label %88
+
+73:                                               ; preds = %68
+  %74 = load [100 x i32]*, [100 x i32]** %5, align 8
+  %75 = load i32, i32* %8, align 4
+  %76 = sext i32 %75 to i64
+  %77 = getelementptr inbounds [100 x i32], [100 x i32]* %74, i64 %76
+  %78 = load i32, i32* %9, align 4
+  %79 = sext i32 %78 to i64
+  %80 = getelementptr inbounds [100 x i32], [100 x i32]* %77, i64 0, i64 %79
+  %81 = load i32, i32* %80, align 4
+  %82 = srem i32 %81, 2
+  %83 = icmp eq i32 %82, 0
+  br i1 %83, label %91, label %102
+
+84:                                               ; preds = %68
+  %85 = load i32, i32* %8, align 4
+  %86 = load i32, i32* %9, align 4
+  %87 = icmp slt i32 %85, %86
+  br i1 %87, label %113, label %125
+
+88:                                               ; preds = %72
+  %89 = load i32, i32* %8, align 4
+  %90 = add nsw i32 %89, 1
+  store i32 %90, i32* %8, align 4
+  br label %57
+
+91:                                               ; preds = %73
+  %92 = load [100 x i32]*, [100 x i32]** %5, align 8
+  %93 = load i32, i32* %8, align 4
+  %94 = sext i32 %93 to i64
+  %95 = getelementptr inbounds [100 x i32], [100 x i32]* %92, i64 %94
+  %96 = load i32, i32* %9, align 4
+  %97 = sext i32 %96 to i64
+  %98 = getelementptr inbounds [100 x i32], [100 x i32]* %95, i64 0, i64 %97
+  %99 = load i32, i32* %98, align 4
+  %100 = load i32, i32* %7, align 4
+  %101 = add nsw i32 %100, %99
+  store i32 %101, i32* %7, align 4
+  br label %126
+
+102:                                              ; preds = %73
+  %103 = load [100 x i32]*, [100 x i32]** %5, align 8
+  %104 = load i32, i32* %8, align 4
+  %105 = sext i32 %104 to i64
+  %106 = getelementptr inbounds [100 x i32], [100 x i32]* %103, i64 %105
+  %107 = load i32, i32* %9, align 4
+  %108 = sext i32 %107 to i64
+  %109 = getelementptr inbounds [100 x i32], [100 x i32]* %106, i64 0, i64 %108
+  %110 = load i32, i32* %109, align 4
+  %111 = load i32, i32* %7, align 4
+  %112 = sub nsw i32 %111, %110
+  store i32 %112, i32* %7, align 4
+  br label %126
+
+113:                                              ; preds = %84
+  %114 = load [100 x i32]*, [100 x i32]** %5, align 8
+  %115 = load i32, i32* %8, align 4
+  %116 = sext i32 %115 to i64
+  %117 = getelementptr inbounds [100 x i32], [100 x i32]* %114, i64 %116
+  %118 = load i32, i32* %9, align 4
+  %119 = sext i32 %118 to i64
+  %120 = getelementptr inbounds [100 x i32], [100 x i32]* %117, i64 0, i64 %119
+  %121 = load i32, i32* %120, align 4
+  %122 = call i32 @fused_quickSort(i1 true, i32* null, i32 0, i32 0, i32* null, i32 %121)
+  %123 = load i32, i32* %7, align 4
+  %124 = add nsw i32 %123, %122
+  store i32 %124, i32* %7, align 4
+  br label %125
+
+125:                                              ; preds = %113, %84
+  br label %127
+
+126:                                              ; preds = %102, %91
+  br label %127
+
+127:                                              ; preds = %126, %125
+  br label %128
+
+128:                                              ; preds = %127
+  %129 = load i32, i32* %9, align 4
+  %130 = add nsw i32 %129, 1
+  store i32 %130, i32* %9, align 4
+  br label %131
+
+131:                                              ; preds = %42, %28, %16, %21, %128
+  %132 = load %struct.DynamicArray*, %struct.DynamicArray** %11, align 8
+  %struct.bunker = insertvalue %fused_return_createDynamicArray_processMatrix { i32 0, %struct.DynamicArray* undef }, %struct.DynamicArray* %132, 1
+  ret %fused_return_createDynamicArray_processMatrix %struct.bunker
+}
+
+define i32 @fused_setErrorMessage(i1 %0, i8* %1) {
+entry:
+  br label %2
+
+2:                                                ; preds = %entry
+  %3 = alloca [14 x i8], align 1
+  %4 = alloca [8 x i32], align 16
+  %5 = alloca i32, align 4
+  %6 = alloca i32, align 4
+  %7 = alloca [100 x [100 x i32]], align 16
+  %8 = alloca i32, align 4
+  %9 = alloca i32, align 4
+  %10 = alloca i32, align 4
+  %11 = call i32 @fused_removeDuplicates(i1 true, %struct.DynamicArray* null, i32 5)
+  call void @llvm.memset.p0i8.i64(i8* align 16 bitcast ([100 x i32]* @cache to i8*), i8 -1, i64 400, i1 false)
+  %12 = bitcast [14 x i8]* %3 to i8*
+  call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 1 %12, i8* align 1 getelementptr inbounds ([14 x i8], [14 x i8]* @__const.projectB_main.str, i32 0, i32 0), i64 14, i1 false)
+  %13 = getelementptr inbounds [14 x i8], [14 x i8]* %3, i64 0, i64 0
+  %14 = call %struct.Matrix* @fused_createMatrix(i1 true, i32 0, i32 0, i8* %13)
+  %15 = bitcast [8 x i32]* %4 to i8*
+  call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 16 %15, i8* align 16 bitcast ([8 x i32]* @__const.projectB_main.arr to i8*), i64 32, i1 false)
+  store i32 8, i32* %5, align 4
+  %16 = getelementptr inbounds [8 x i32], [8 x i32]* %4, i64 0, i64 0
+  %17 = load i32, i32* %5, align 4
+  %18 = call i32 @fused_performSimpleCalculations(i1 true, i32* %16, i32 %17)
+  store i32 %18, i32* %6, align 4
+  %19 = bitcast [100 x [100 x i32]]* %7 to i8*
+  call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 16 %19, 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)
+  %20 = getelementptr inbounds [100 x [100 x i32]], [100 x [100 x i32]]* %7, i64 0, i64 0
+  %21 = call %fused_return_createDynamicArray_processMatrix @fused_createDynamicArray(i1 true, i32 0, [100 x i32]* %20, i32 3)
+  %extracted_target_return2target_ = extractvalue %fused_return_createDynamicArray_processMatrix %21, 0
+  store i32 %extracted_target_return2target_, i32* %8, align 4
+  store i32 0, i32* %9, align 4
+  br label %22
+
+22:                                               ; preds = %2
+  %23 = alloca i8*, align 8
+  store i8* %1, i8** %23, align 8
+  %24 = load i8*, i8** @globalErrorMessage, align 8
+  %25 = icmp ne i8* %24, null
+  br i1 %25, label %26, label %36
+
+26:                                               ; preds = %22
+  %27 = load i8*, i8** @globalErrorMessage, align 8
+  call void @free(i8* %27) #7
+  br label %28
+
+28:                                               ; preds = %26
+  %29 = load i32, i32* %9, align 4
+  %30 = call %fused_return_projectA_main_memoizedFib @fused_projectA_main(i1 true, i32 %29)
+  %extracted_target_return1target_ = extractvalue %fused_return_projectA_main_memoizedFib %30, 0
+  %31 = load i32, i32* %9, align 4
+  %32 = add nsw i32 %31, 1
+  store i32 %32, i32* %9, align 4
+  br label %33
+
+33:                                               ; preds = %28
+  %34 = load i32, i32* %9, align 4
+  %35 = icmp slt i32 %34, 10
+  br label %36
+
+36:                                               ; preds = %22, %33
+  %37 = load i8*, i8** %23, align 8
+  %38 = icmp ne i8* %37, null
+  br i1 %38, label %39, label %48
+
+39:                                               ; preds = %36
+  %40 = load i8*, i8** %23, align 8
+  %41 = call noalias i8* @strdup(i8* %40) #7
+  store i8* %41, i8** @globalErrorMessage, align 8
+  %42 = load i8*, i8** @globalErrorMessage, align 8
+  %43 = icmp eq i8* %42, null
+  br i1 %43, label %44, label %47
+
+44:                                               ; preds = %39
+  %45 = load %struct._IO_FILE*, %struct._IO_FILE** @stderr, align 8
+  %46 = call i32 (%struct._IO_FILE*, i8*, ...) @fprintf(%struct._IO_FILE* %45, i8* getelementptr inbounds ([55 x i8], [55 x i8]* @.str.1, i64 0, i64 0))
+  br label %47
+
+47:                                               ; preds = %44, %39
+  br label %71
+
+48:                                               ; preds = %36
+  store i8* null, i8** @globalErrorMessage, align 8
+  br label %49
+
+49:                                               ; preds = %48
+  %50 = load i32, i32* %6, align 4
+  %51 = icmp sgt i32 %50, 5
+  br i1 %51, label %52, label %55
+
+52:                                               ; preds = %49
+  %53 = load i32, i32* %8, align 4
+  %54 = icmp sgt i32 %53, 0
+  br i1 %54, label %62, label %65
+
+55:                                               ; preds = %49
+  %56 = getelementptr inbounds [14 x i8], [14 x i8]* %3, i64 0, i64 0
+  %57 = call i64 @strlen(i8* %56) #10
+  %58 = load i32, i32* %8, align 4
+  %59 = sext i32 %58 to i64
+  %60 = add i64 %57, %59
+  %61 = trunc i64 %60 to i32
+  store i32 %61, i32* %10, align 4
+  br label %68
+
+62:                                               ; preds = %52
+  %63 = load i32, i32* %6, align 4
+  %64 = call %fused_return_projectA_main_memoizedFib @fused_projectA_main(i1 true, i32 %63)
+  %extracted_target_returntarget_ = extractvalue %fused_return_projectA_main_memoizedFib %64, 0
+  store i32 %extracted_target_returntarget_, i32* %10, align 4
+  br label %70
+
+65:                                               ; preds = %52
+  %66 = load i32, i32* %8, align 4
+  %67 = call i32 @fused_quickSort(i1 true, i32* null, i32 0, i32 0, i32* null, i32 %66)
+  store i32 %67, i32* %10, align 4
+  br label %70
+
+68:                                               ; preds = %55
+  %69 = load i32, i32* %10, align 4
+  ret i32 %69
+
+70:                                               ; preds = %65, %62
+  br label %71
+
+71:                                               ; preds = %47, %70
+  ret i32 0
+}
 
 
-declare i32 @fused_performSimpleCalculations(i1, i32*, i32)
+define %struct.Matrix* @fused_createMatrix(i1 %0, i32 %1, i32 %2, i8* %3) {
+entry:
+  br label %4
 
 
-declare %fused_return_projectA_main_memoizedFib @fused_projectA_main(i1, i32)
+4:                                                ; preds = %entry
+  %5 = alloca i8*, align 8
+  %6 = alloca i32, align 4
+  %7 = alloca i32, align 4
+  %8 = alloca i8, align 1
+  store i8* %3, i8** %5, align 8
+  %9 = load i8*, i8** %5, align 8
+  %10 = call i64 @strlen(i8* %9) #10
+  %11 = trunc i64 %10 to i32
+  store i32 %11, i32* %6, align 4
+  store i32 0, i32* %7, align 4
+  br label %12
+
+12:                                               ; preds = %4
+  %13 = alloca %struct.Matrix*, align 8
+  %14 = alloca i32, align 4
+  %15 = alloca i32, align 4
+  %16 = alloca %struct.Matrix*, align 8
+  %17 = alloca i32, align 4
+  %18 = alloca i32, align 4
+  store i32 %1, i32* %14, align 4
+  store i32 %2, i32* %15, align 4
+  %19 = load i32, i32* %14, align 4
+  %20 = icmp slt i32 %19, 1
+  br i1 %20, label %24, label %21
+
+21:                                               ; preds = %12
+  %22 = load i32, i32* %15, align 4
+  %23 = icmp slt i32 %22, 1
+  br i1 %23, label %24, label %26
+
+24:                                               ; preds = %21, %12
+  %25 = call i32 @fused_setErrorMessage(i1 false, i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.str.16, i64 0, i64 0))
+  store %struct.Matrix* null, %struct.Matrix** %13, align 8
+  br label %161
+
+26:                                               ; preds = %21
+  %27 = load i32, i32* %14, align 4
+  %28 = icmp sgt i32 %27, 100
+  br i1 %28, label %32, label %29
+
+29:                                               ; preds = %26
+  %30 = load i32, i32* %15, align 4
+  %31 = icmp sgt i32 %30, 100
+  br i1 %31, label %32, label %34
+
+32:                                               ; preds = %29, %26
+  %33 = call i32 @fused_setErrorMessage(i1 false, i8* getelementptr inbounds ([46 x i8], [46 x i8]* @.str.17, i64 0, i64 0))
+  store %struct.Matrix* null, %struct.Matrix** %13, align 8
+  br label %161
+
+34:                                               ; preds = %29
+  %35 = call noalias i8* @malloc(i64 32) #7
+  %36 = bitcast i8* %35 to %struct.Matrix*
+  store %struct.Matrix* %36, %struct.Matrix** %16, align 8
+  %37 = load %struct.Matrix*, %struct.Matrix** %16, align 8
+  %38 = icmp ne %struct.Matrix* %37, null
+  br i1 %38, label %41, label %39
+
+39:                                               ; preds = %34
+  %40 = call i32 @fused_setErrorMessage(i1 false, i8* getelementptr inbounds ([43 x i8], [43 x i8]* @.str.18, i64 0, i64 0))
+  store %struct.Matrix* null, %struct.Matrix** %13, align 8
+  br label %161
+
+41:                                               ; preds = %34
+  %42 = load i32, i32* %14, align 4
+  %43 = load %struct.Matrix*, %struct.Matrix** %16, align 8
+  %44 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %43, i32 0, i32 1
+  store i32 %42, i32* %44, align 8
+  %45 = load i32, i32* %15, align 4
+  %46 = load %struct.Matrix*, %struct.Matrix** %16, align 8
+  %47 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %46, i32 0, i32 2
+  store i32 %45, i32* %47, align 4
+  %48 = load i32, i32* %14, align 4
+  %49 = load i32, i32* %15, align 4
+  %50 = icmp eq i32 %48, %49
+  %51 = zext i1 %50 to i32
+  %52 = load %struct.Matrix*, %struct.Matrix** %16, align 8
+  %53 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %52, i32 0, i32 3
+  store i32 %51, i32* %53, align 8
+  %54 = load %struct.Matrix*, %struct.Matrix** %16, align 8
+  %55 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %54, i32 0, i32 4
+  store double 0.000000e+00, double* %55, align 8
+  %56 = load i32, i32* %14, align 4
+  %57 = sext i32 %56 to i64
+  %58 = mul i64 %57, 8
+  %59 = call noalias i8* @malloc(i64 %58) #7
+  %60 = bitcast i8* %59 to i32**
+  %61 = load %struct.Matrix*, %struct.Matrix** %16, align 8
+  %62 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %61, i32 0, i32 0
+  store i32** %60, i32*** %62, align 8
+  %63 = load %struct.Matrix*, %struct.Matrix** %16, align 8
+  %64 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %63, i32 0, i32 0
+  %65 = load i32**, i32*** %64, align 8
+  %66 = icmp ne i32** %65, null
+  br i1 %66, label %71, label %67
+
+67:                                               ; preds = %41
+  %68 = load %struct.Matrix*, %struct.Matrix** %16, align 8
+  %69 = bitcast %struct.Matrix* %68 to i8*
+  call void @free(i8* %69) #7
+  %70 = call i32 @fused_setErrorMessage(i1 false, i8* getelementptr inbounds ([41 x i8], [41 x i8]* @.str.19, i64 0, i64 0))
+  store %struct.Matrix* null, %struct.Matrix** %13, align 8
+  br label %161
+
+71:                                               ; preds = %41
+  store i32 0, i32* %17, align 4
+  br label %72
+
+72:                                               ; preds = %121, %71
+  %73 = load i32, i32* %17, align 4
+  %74 = load i32, i32* %14, align 4
+  %75 = icmp slt i32 %73, %74
+  br i1 %75, label %76, label %124
+
+76:                                               ; preds = %72
+  %77 = load i32, i32* %15, align 4
+  %78 = sext i32 %77 to i64
+  %79 = call noalias i8* @calloc(i64 %78, i64 4) #7
+  %80 = bitcast i8* %79 to i32*
+  %81 = load %struct.Matrix*, %struct.Matrix** %16, align 8
+  %82 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %81, i32 0, i32 0
+  %83 = load i32**, i32*** %82, align 8
+  %84 = load i32, i32* %17, align 4
+  %85 = sext i32 %84 to i64
+  %86 = getelementptr inbounds i32*, i32** %83, i64 %85
+  store i32* %80, i32** %86, align 8
+  %87 = load %struct.Matrix*, %struct.Matrix** %16, 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* %17, align 4
+  %91 = sext i32 %90 to i64
+  %92 = getelementptr inbounds i32*, i32** %89, i64 %91
+  %93 = load i32*, i32** %92, align 8
+  %94 = icmp ne i32* %93, null
+  br i1 %94, label %120, label %95
+
+95:                                               ; preds = %76
+  store i32 0, i32* %18, align 4
+  br label %96
+
+96:                                               ; preds = %109, %95
+  %97 = load i32, i32* %18, align 4
+  %98 = load i32, i32* %17, align 4
+  %99 = icmp slt i32 %97, %98
+  br i1 %99, label %100, label %112
+
+100:                                              ; preds = %96
+  %101 = load %struct.Matrix*, %struct.Matrix** %16, align 8
+  %102 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %101, i32 0, i32 0
+  %103 = load i32**, i32*** %102, align 8
+  %104 = load i32, i32* %18, align 4
+  %105 = sext i32 %104 to i64
+  %106 = getelementptr inbounds i32*, i32** %103, i64 %105
+  %107 = load i32*, i32** %106, align 8
+  %108 = bitcast i32* %107 to i8*
+  call void @free(i8* %108) #7
+  br label %109
+
+109:                                              ; preds = %100
+  %110 = load i32, i32* %18, align 4
+  %111 = add nsw i32 %110, 1
+  store i32 %111, i32* %18, align 4
+  br label %96
+
+112:                                              ; preds = %96
+  %113 = load %struct.Matrix*, %struct.Matrix** %16, align 8
+  %114 = getelementptr inbounds %struct.Matrix, %struct.Matrix* %113, i32 0, i32 0
+  %115 = load i32**, i32*** %114, align 8
+  %116 = bitcast i32** %115 to i8*
+  call void @free(i8* %116) #7
+  %117 = load %struct.Matrix*, %struct.Matrix** %16, align 8
+  %118 = bitcast %struct.Matrix* %117 to i8*
+  call void @free(i8* %118) #7
+  %119 = call i32 @fused_setErrorMessage(i1 false, i8* getelementptr inbounds ([44 x i8], [44 x i8]* @.str.20, i64 0, i64 0))
+  store %struct.Matrix* null, %struct.Matrix** %13, align 8
+  br label %161
+
+120:                                              ; preds = %76
+  br label %121
+
+121:                                              ; preds = %120
+  %122 = load i32, i32* %17, align 4
+  %123 = add nsw i32 %122, 1
+  store i32 %123, i32* %17, align 4
+  br label %72
+
+124:                                              ; preds = %72
+  %125 = load %struct.Matrix*, %struct.Matrix** %16, align 8
+  store %struct.Matrix* %125, %struct.Matrix** %13, align 8
+  br label %126
+
+126:                                              ; preds = %124
+  %127 = load i32, i32* %7, align 4
+  %128 = load i32, i32* %6, align 4
+  %129 = sdiv i32 %128, 2
+  %130 = icmp slt i32 %127, %129
+  br i1 %130, label %131, label %157
+
+131:                                              ; preds = %126
+  %132 = load i8*, i8** %5, align 8
+  %133 = load i32, i32* %7, align 4
+  %134 = sext i32 %133 to i64
+  %135 = getelementptr inbounds i8, i8* %132, i64 %134
+  %136 = load i8, i8* %135, align 1
+  store i8 %136, i8* %8, align 1
+  %137 = load i8*, i8** %5, align 8
+  %138 = load i32, i32* %6, align 4
+  %139 = sub nsw i32 %138, 1
+  %140 = load i32, i32* %7, align 4
+  %141 = sub nsw i32 %139, %140
+  %142 = sext i32 %141 to i64
+  %143 = getelementptr inbounds i8, i8* %137, i64 %142
+  %144 = load i8, i8* %143, align 1
+  %145 = load i8*, i8** %5, align 8
+  %146 = load i32, i32* %7, align 4
+  %147 = sext i32 %146 to i64
+  %148 = getelementptr inbounds i8, i8* %145, i64 %147
+  store i8 %144, i8* %148, align 1
+  %149 = load i8, i8* %8, align 1
+  %150 = load i8*, i8** %5, align 8
+  %151 = load i32, i32* %6, align 4
+  %152 = sub nsw i32 %151, 1
+  %153 = load i32, i32* %7, align 4
+  %154 = sub nsw i32 %152, %153
+  %155 = sext i32 %154 to i64
+  %156 = getelementptr inbounds i8, i8* %150, i64 %155
+  store i8 %149, i8* %156, align 1
+  br label %158
+
+157:                                              ; preds = %126
+  ret %struct.Matrix* null
+
+158:                                              ; preds = %131
+  %159 = load i32, i32* %7, align 4
+  %160 = add nsw i32 %159, 1
+  store i32 %160, i32* %7, align 4
+  br label %161
+
+161:                                              ; preds = %112, %67, %39, %32, %24, %158
+  %162 = load %struct.Matrix*, %struct.Matrix** %13, align 8
+  ret %struct.Matrix* %162
+}
 
 
-declare %fused_return_createDynamicArray_processMatrix @fused_createDynamicArray(i1, i32, [100 x i32]*, i32)
+define i32 @fused_removeDuplicates(i1 %0, %struct.DynamicArray* %1, i32 %2) {
+entry:
+  br label %3
 
 
-declare i32 @fused_setErrorMessage(i1, i8*)
+3:                                                ; preds = %entry
+  %4 = alloca i32, align 4
+  %5 = alloca i32, align 4
+  %6 = alloca i32, align 4
+  %7 = alloca i32, align 4
+  store i32 %2, i32* %5, align 4
+  store i32 0, i32* %6, align 4
+  store i32 1, i32* %7, align 4
+  br label %8
 
 
-declare %struct.Matrix* @fused_createMatrix(i1, i32, i32, i8*)
+8:                                                ; preds = %3
+  %9 = alloca %struct.DynamicArray*, align 8
+  %10 = alloca i32, align 4
+  %11 = alloca i32, align 4
+  %12 = alloca i32, align 4
+  store %struct.DynamicArray* %1, %struct.DynamicArray** %9, align 8
+  %13 = load %struct.DynamicArray*, %struct.DynamicArray** %9, align 8
+  %14 = icmp ne %struct.DynamicArray* %13, null
+  br i1 %14, label %15, label %20
+
+15:                                               ; preds = %8
+  %16 = load %struct.DynamicArray*, %struct.DynamicArray** %9, align 8
+  %17 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %16, i32 0, i32 0
+  %18 = load i32*, i32** %17, align 8
+  %19 = icmp ne i32* %18, null
+  br i1 %19, label %22, label %20
+
+20:                                               ; preds = %15, %8
+  %21 = call i32 @fused_setErrorMessage(i1 false, i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.49, i64 0, i64 0))
+  br label %107
+
+22:                                               ; preds = %15
+  %23 = load %struct.DynamicArray*, %struct.DynamicArray** %9, align 8
+  %24 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %23, i32 0, i32 1
+  %25 = load i32, i32* %24, align 8
+  %26 = icmp sle i32 %25, 1
+  br i1 %26, label %27, label %28
+
+27:                                               ; preds = %22
+  br label %107
 
 
-declare i32 @fused_removeDuplicates(i1, %struct.DynamicArray*, i32)
+28:                                               ; preds = %22
+  store i32 0, i32* %10, align 4
+  %29 = load %struct.DynamicArray*, %struct.DynamicArray** %9, align 8
+  %30 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %29, i32 0, i32 0
+  %31 = load i32*, i32** %30, align 8
+  %32 = load %struct.DynamicArray*, %struct.DynamicArray** %9, align 8
+  %33 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %32, i32 0, i32 1
+  %34 = load i32, i32* %33, align 8
+  %35 = sub nsw i32 %34, 1
+  %36 = call i32 @fused_quickSort(i1 false, i32* %31, i32 0, i32 %35, i32* %10, i32 0)
+  %37 = load i32, i32* %10, align 4
+  %38 = icmp ne i32 %37, 0
+  br i1 %38, label %39, label %40
+
+39:                                               ; preds = %28
+  br label %107
+
+40:                                               ; preds = %28
+  store i32 1, i32* %11, align 4
+  store i32 1, i32* %12, align 4
+  br label %41
+
+41:                                               ; preds = %81, %40
+  %42 = load i32, i32* %12, align 4
+  %43 = load %struct.DynamicArray*, %struct.DynamicArray** %9, align 8
+  %44 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %43, i32 0, i32 1
+  %45 = load i32, i32* %44, align 8
+  %46 = icmp slt i32 %42, %45
+  br i1 %46, label %47, label %84
+
+47:                                               ; preds = %41
+  %48 = load %struct.DynamicArray*, %struct.DynamicArray** %9, align 8
+  %49 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %48, i32 0, i32 0
+  %50 = load i32*, i32** %49, align 8
+  %51 = load i32, i32* %12, align 4
+  %52 = sext i32 %51 to i64
+  %53 = getelementptr inbounds i32, i32* %50, i64 %52
+  %54 = load i32, i32* %53, align 4
+  %55 = load %struct.DynamicArray*, %struct.DynamicArray** %9, align 8
+  %56 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %55, i32 0, i32 0
+  %57 = load i32*, i32** %56, align 8
+  %58 = load i32, i32* %12, align 4
+  %59 = sub nsw i32 %58, 1
+  %60 = sext i32 %59 to i64
+  %61 = getelementptr inbounds i32, i32* %57, i64 %60
+  %62 = load i32, i32* %61, align 4
+  %63 = icmp ne i32 %54, %62
+  br i1 %63, label %64, label %80
+
+64:                                               ; preds = %47
+  %65 = load %struct.DynamicArray*, %struct.DynamicArray** %9, align 8
+  %66 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %65, i32 0, i32 0
+  %67 = load i32*, i32** %66, align 8
+  %68 = load i32, i32* %12, align 4
+  %69 = sext i32 %68 to i64
+  %70 = getelementptr inbounds i32, i32* %67, i64 %69
+  %71 = load i32, i32* %70, align 4
+  %72 = load %struct.DynamicArray*, %struct.DynamicArray** %9, align 8
+  %73 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %72, i32 0, i32 0
+  %74 = load i32*, i32** %73, align 8
+  %75 = load i32, i32* %11, align 4
+  %76 = sext i32 %75 to i64
+  %77 = getelementptr inbounds i32, i32* %74, i64 %76
+  store i32 %71, i32* %77, align 4
+  %78 = load i32, i32* %11, align 4
+  %79 = add nsw i32 %78, 1
+  store i32 %79, i32* %11, align 4
+  br label %80
+
+80:                                               ; preds = %64, %47
+  br label %81
+
+81:                                               ; preds = %80
+  %82 = load i32, i32* %12, align 4
+  %83 = add nsw i32 %82, 1
+  store i32 %83, i32* %12, align 4
+  br label %41
+
+84:                                               ; preds = %41
+  %85 = load i32, i32* %11, align 4
+  %86 = load %struct.DynamicArray*, %struct.DynamicArray** %9, align 8
+  %87 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %86, i32 0, i32 1
+  store i32 %85, i32* %87, align 8
+  %88 = load %struct.DynamicArray*, %struct.DynamicArray** %9, align 8
+  %89 = getelementptr inbounds %struct.DynamicArray, %struct.DynamicArray* %88, i32 0, i32 3
+  store i32 1, i32* %89, align 8
+  br label %90
+
+90:                                               ; preds = %84
+  %91 = load i32, i32* %7, align 4
+  %92 = icmp slt i32 %91, 5
+  br i1 %92, label %93, label %98
+
+93:                                               ; preds = %90
+  %94 = load i32, i32* %6, align 4
+  %95 = add nsw i32 %94, 1
+  store i32 %95, i32* %6, align 4
+  %96 = load i32, i32* %5, align 4
+  %97 = icmp sgt i32 %96, 2
+  br i1 %97, label %100, label %101
+
+98:                                               ; preds = %90
+  %99 = load i32, i32* %6, align 4
+  store i32 %99, i32* %4, align 4
+  br label %102
+
+100:                                              ; preds = %93
+  store i32 23, i32* %4, align 4
+  br label %102
+
+101:                                              ; preds = %93
+  br label %104
+
+102:                                              ; preds = %100, %98
+  %103 = load i32, i32* %4, align 4
+  ret i32 %103
+
+104:                                              ; preds = %101
+  %105 = load i32, i32* %7, align 4
+  %106 = add nsw i32 %105, 1
+  store i32 %106, i32* %7, align 4
+  br label %107
+
+107:                                              ; preds = %39, %27, %20, %104
+  ret i32 0
+}
 
 
 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 #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 #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" }

+ 129 - 174
src/ModuleFusion.cpp

@@ -45,6 +45,13 @@ namespace {
             : name(n), isTarget(target), depth(0), points_num(0), slices_num(0) {}
             : name(n), isTarget(target), depth(0), points_num(0), slices_num(0) {}
     };
     };
 
 
+    struct SliceTransition {
+        BasicBlock* bunkerLastBlock;    // bunker分片的最后一个基本块
+        BasicBlock* targetFirstBlock;   // target分片的第一个基本块
+        BasicBlock* targetLastBlock;    // target分片的最后一个基本块
+        BasicBlock* nextBunkerBlock;    // 下一个bunker分片的第一个基本块
+    };
+
     struct CodeFusionPass : public ModulePass {
     struct CodeFusionPass : public ModulePass {
     public:
     public:
         static char ID;
         static char ID;
@@ -125,6 +132,8 @@ namespace {
         std::set<std::string> bunkerFunctions;
         std::set<std::string> bunkerFunctions;
         std::map<std::string, std::string> fusionPairs;
         std::map<std::string, std::string> fusionPairs;
 
 
+        std::vector<SliceTransition> sliceTransitions;
+
         size_t getRandomIndex(size_t max) {
         size_t getRandomIndex(size_t max) {
             static unsigned seed = 0;
             static unsigned seed = 0;
             seed = (seed * 1103515245 + 12345) & 0x7fffffff;
             seed = (seed * 1103515245 + 12345) & 0x7fffffff;
@@ -1118,34 +1127,74 @@ namespace {
 
 
 
 
                 // 遍历bunker函数的所有基本块
                 // 遍历bunker函数的所有基本块
+                BasicBlock* currentBunkerSliceStart = nullptr;
+                std::vector<BasicBlock*> currentBunkerSlice;
+                sliceTransitions.clear();
+
                 for (BasicBlock& BB : *bunkerFunc) {
                 for (BasicBlock& BB : *bunkerFunc) {
                     // 如果当前基本块是关键点且还有未插入的target分片
                     // 如果当前基本块是关键点且还有未插入的target分片
                     if (currentSliceIndex < targetSlices.size() && criticalPoints.count(&BB)) {
                     if (currentSliceIndex < targetSlices.size() && criticalPoints.count(&BB)) {
+                        // 记录当前bunker分片的最后一个基本块
+                        BasicBlock* lastBunkerBlock = nullptr;
+                        if (!currentBunkerSlice.empty()) {
+                            lastBunkerBlock = currentBunkerSlice.back();
+                        }
+                        
                         // 克隆并插入target分片的基本块
                         // 克隆并插入target分片的基本块
+                        std::vector<BasicBlock*> targetSliceBlocks;
                         for (BasicBlock* targetBB : targetSlices[currentSliceIndex].blocks) {
                         for (BasicBlock* targetBB : targetSlices[currentSliceIndex].blocks) {
                             BasicBlock* clonedTargetBB = CloneBasicBlock(targetBB, targetVMap, 
                             BasicBlock* clonedTargetBB = CloneBasicBlock(targetBB, targetVMap, 
                                 "target_" + targetBB->getName(), fusedFunc);
                                 "target_" + targetBB->getName(), fusedFunc);
                             targetBlockMap[targetBB] = clonedTargetBB;
                             targetBlockMap[targetBB] = clonedTargetBB;
                             allFusedBlocks.push_back(clonedTargetBB);
                             allFusedBlocks.push_back(clonedTargetBB);
+                            targetSliceBlocks.push_back(clonedTargetBB);
                         }
                         }
+                        
+                        // 克隆当前bunker基本块
+                        BasicBlock* clonedBunkerBB = CloneBasicBlock(&BB, bunkerVMap, 
+                            "bunker_" + BB.getName(), fusedFunc);
+                        bunkerBlockMap[&BB] = clonedBunkerBB;
+                        allFusedBlocks.push_back(clonedBunkerBB);
+                        
+                        // 记录分片转换信息
+                        SliceTransition transition;
+                        transition.bunkerLastBlock = lastBunkerBlock;
+                        transition.targetFirstBlock = targetSliceBlocks.front();
+                        transition.targetLastBlock = targetSliceBlocks.back();
+                        transition.nextBunkerBlock = clonedBunkerBB;
+                        sliceTransitions.push_back(transition);
+                        
+                        // 开始新的bunker分片
+                        currentBunkerSlice.clear();
+                        currentBunkerSlice.push_back(clonedBunkerBB);
+                        
                         currentSliceIndex++;
                         currentSliceIndex++;
+                    } else {
+                        // 克隆bunker基本块
+                        BasicBlock* clonedBunkerBB = CloneBasicBlock(&BB, bunkerVMap, 
+                            "bunker_" + BB.getName(), fusedFunc);
+                        bunkerBlockMap[&BB] = clonedBunkerBB;
+                        allFusedBlocks.push_back(clonedBunkerBB);
+                        currentBunkerSlice.push_back(clonedBunkerBB);
                     }
                     }
-                    // 克隆bunker基本块
-                    BasicBlock* clonedBunkerBB = CloneBasicBlock(&BB, bunkerVMap, 
-                        "bunker_" + BB.getName(), fusedFunc);
-                    bunkerBlockMap[&BB] = clonedBunkerBB;
-                    allFusedBlocks.push_back(clonedBunkerBB);
+                }
+
+                // 添加新的日志打印代码
+                if (fusedFunc->getName() == "fused_createDynamicArray") {
+                    LOG_INFO("performCodeFusion", "Listing all instructions after block cloning in function: {0}", 
+                        fusedFunc->getName().str());
+                    dumpControlFlowGraph(*fusedFunc);
                 }
                 }
 
 
                 // 修复target分片内的跳转
                 // 修复target分片内的跳转
                 for (const auto& slice : targetSlices) {
                 for (const auto& slice : targetSlices) {
                     for (BasicBlock* BB : slice.blocks) {
                     for (BasicBlock* BB : slice.blocks) {
                         BasicBlock* clonedBB = targetBlockMap[BB];
                         BasicBlock* clonedBB = targetBlockMap[BB];
-                        // 先修复所有非终结指令
+                        
+                        // 修复所有非终结指令
                         for (Instruction &I : make_range(clonedBB->begin(), --clonedBB->end())) {
                         for (Instruction &I : make_range(clonedBB->begin(), --clonedBB->end())) {
                             RemapInstruction(&I, targetVMap, RF_NoModuleLevelChanges);
                             RemapInstruction(&I, targetVMap, RF_NoModuleLevelChanges);
                             
                             
-                            // 特别处理PHI节点
                             if (PHINode* PHI = dyn_cast<PHINode>(&I)) {
                             if (PHINode* PHI = dyn_cast<PHINode>(&I)) {
                                 for (unsigned i = 0; i < PHI->getNumIncomingValues(); i++) {
                                 for (unsigned i = 0; i < PHI->getNumIncomingValues(); i++) {
                                     BasicBlock* incomingBlock = PHI->getIncomingBlock(i);
                                     BasicBlock* incomingBlock = PHI->getIncomingBlock(i);
@@ -1156,13 +1205,32 @@ namespace {
                             }
                             }
                         }
                         }
                         
                         
-                        // 单独处理终结指令
+                        // 处理终结指令
                         if (BranchInst* BI = dyn_cast<BranchInst>(clonedBB->getTerminator())) {
                         if (BranchInst* BI = dyn_cast<BranchInst>(clonedBB->getTerminator())) {
-                            RemapInstruction(BI, targetVMap, RF_NoModuleLevelChanges);
-                            for (unsigned i = 0; i < BI->getNumSuccessors(); i++) {
-                                BasicBlock* succ = BI->getSuccessor(i);
-                                if (targetBlockMap.count(succ)) {
-                                    BI->setSuccessor(i, targetBlockMap[succ]);
+                            // 检查是否是分片的最后一个基本块
+                            bool isLastInSlice = false;
+                            BasicBlock* nextBunkerBlock = nullptr;
+                            
+                            for (const auto& transition : sliceTransitions) {
+                                if (transition.targetLastBlock == clonedBB) {
+                                    isLastInSlice = true;
+                                    nextBunkerBlock = transition.nextBunkerBlock;
+                                    break;
+                                }
+                            }
+                            
+                            if (isLastInSlice && nextBunkerBlock) {
+                                // 替换为直接跳转到下一个bunker块
+                                BranchInst::Create(nextBunkerBlock, BI);
+                                BI->eraseFromParent();
+                            } else {
+                                // 正常修复跳转目标
+                                RemapInstruction(BI, targetVMap, RF_NoModuleLevelChanges);
+                                for (unsigned i = 0; i < BI->getNumSuccessors(); i++) {
+                                    BasicBlock* succ = BI->getSuccessor(i);
+                                    if (targetBlockMap.count(succ)) {
+                                        BI->setSuccessor(i, targetBlockMap[succ]);
+                                    }
                                 }
                                 }
                             }
                             }
                         }
                         }
@@ -1172,11 +1240,11 @@ namespace {
                 // 修复bunker块内的跳转
                 // 修复bunker块内的跳转
                 for (auto& pair : bunkerBlockMap) {
                 for (auto& pair : bunkerBlockMap) {
                     BasicBlock* clonedBB = pair.second;
                     BasicBlock* clonedBB = pair.second;
-                    // 先修复所有非终结指令
+                    
+                    // 修复所有非终结指令
                     for (Instruction &I : make_range(clonedBB->begin(), --clonedBB->end())) {
                     for (Instruction &I : make_range(clonedBB->begin(), --clonedBB->end())) {
                         RemapInstruction(&I, bunkerVMap, RF_NoModuleLevelChanges);
                         RemapInstruction(&I, bunkerVMap, RF_NoModuleLevelChanges);
                         
                         
-                        // 特别处理PHI节点
                         if (PHINode* PHI = dyn_cast<PHINode>(&I)) {
                         if (PHINode* PHI = dyn_cast<PHINode>(&I)) {
                             for (unsigned i = 0; i < PHI->getNumIncomingValues(); i++) {
                             for (unsigned i = 0; i < PHI->getNumIncomingValues(); i++) {
                                 BasicBlock* incomingBlock = PHI->getIncomingBlock(i);
                                 BasicBlock* incomingBlock = PHI->getIncomingBlock(i);
@@ -1187,18 +1255,44 @@ namespace {
                         }
                         }
                     }
                     }
                     
                     
-                    // 单独处理终结指令
+                    // 处理终结指令
                     if (BranchInst* BI = dyn_cast<BranchInst>(clonedBB->getTerminator())) {
                     if (BranchInst* BI = dyn_cast<BranchInst>(clonedBB->getTerminator())) {
-                        RemapInstruction(BI, bunkerVMap, RF_NoModuleLevelChanges);
-                        for (unsigned i = 0; i < BI->getNumSuccessors(); i++) {
-                            BasicBlock* succ = BI->getSuccessor(i);
-                            if (bunkerBlockMap.count(succ)) {
-                                BI->setSuccessor(i, bunkerBlockMap[succ]);
+                        // 检查是否是分片的最后一个基本块
+                        bool isLastInSlice = false;
+                        BasicBlock* nextTargetBlock = nullptr;
+                        
+                        for (const auto& transition : sliceTransitions) {
+                            if (transition.bunkerLastBlock == clonedBB) {
+                                isLastInSlice = true;
+                                nextTargetBlock = transition.targetFirstBlock;
+                                break;
+                            }
+                        }
+                        
+                        if (isLastInSlice && nextTargetBlock) {
+                            // 替换为直接跳转到下一个target块
+                            BranchInst::Create(nextTargetBlock, BI);
+                            BI->eraseFromParent();
+                        } else {
+                            // 正常修复跳转目标
+                            RemapInstruction(BI, bunkerVMap, RF_NoModuleLevelChanges);
+                            for (unsigned i = 0; i < BI->getNumSuccessors(); i++) {
+                                BasicBlock* succ = BI->getSuccessor(i);
+                                if (bunkerBlockMap.count(succ)) {
+                                    BI->setSuccessor(i, bunkerBlockMap[succ]);
+                                }
                             }
                             }
                         }
                         }
                     }
                     }
                 }
                 }
 
 
+                // 添加新的日志打印代码
+                if (fusedFunc->getName() == "fused_createDynamicArray") {
+                    LOG_INFO("performCodeFusion", "Listing all instructions after block cloning in function: {0}", 
+                        fusedFunc->getName().str());
+                    dumpControlFlowGraph(*fusedFunc);
+                }
+
                 // 从入口块创建跳转到第一个块
                 // 从入口块创建跳转到第一个块
                 Builder.CreateBr(allFusedBlocks.front());
                 Builder.CreateBr(allFusedBlocks.front());
 
 
@@ -1238,84 +1332,18 @@ namespace {
                                 LOG_DEBUG("performCodeFusion", "Setting default target return value");
                                 LOG_DEBUG("performCodeFusion", "Setting default target return value");
                                 Value* defaultTargetVal;
                                 Value* defaultTargetVal;
                                 if (targetType->isPointerTy()) {
                                 if (targetType->isPointerTy()) {
-                                    LOG_DEBUG("performCodeFusion", "Target type is pointer type, setting null pointer");
                                     defaultTargetVal = ConstantPointerNull::get(cast<PointerType>(targetType));
                                     defaultTargetVal = ConstantPointerNull::get(cast<PointerType>(targetType));
                                 } else if (targetType->isIntegerTy()) {
                                 } else if (targetType->isIntegerTy()) {
-                                    LOG_DEBUG("performCodeFusion", "Target type is integer type, setting to 0");
                                     defaultTargetVal = ConstantInt::get(targetType, 0);
                                     defaultTargetVal = ConstantInt::get(targetType, 0);
                                 } else if (targetType->isFloatingPointTy()) {
                                 } else if (targetType->isFloatingPointTy()) {
-                                    LOG_DEBUG("performCodeFusion", "Target type is floating point type, setting to 0.0");
                                     defaultTargetVal = ConstantFP::get(targetType, 0.0);
                                     defaultTargetVal = ConstantFP::get(targetType, 0.0);
                                 } else {
                                 } else {
-                                    // 为其他类型创建零初始化的常量
-                                    LOG_DEBUG("performCodeFusion", "Target type is other type, setting null value");
                                     defaultTargetVal = Constant::getNullValue(targetType);
                                     defaultTargetVal = Constant::getNullValue(targetType);
                                 }
                                 }
 
 
-                                // // 在插入之前验证结构体类型
-                                // if (!isa<StructType>(structVal->getType())) {
-                                //     LOG_ERROR("performCodeFusion", 
-                                //         "Expected struct type for return value, got {0}",
-                                //         getReadableTypeName(structVal->getType()));
-                                //     continue;
-                                // }
-
-                                // // 验证插入值的类型
-                                // if (!defaultTargetVal || defaultTargetVal->getType() != targetType) {
-                                //     LOG_ERROR("performCodeFusion", 
-                                //         "Invalid default target value type: expected {0}, got {1}",
-                                //         getReadableTypeName(targetType),
-                                //         defaultTargetVal ? getReadableTypeName(defaultTargetVal->getType()) : "null");
-                                //     continue;
-                                // }
-
-                                // 创建新的结构体值并插入target值
+                                Value* mappedBunkerRetVal = MapValue(bunkerRetVal, bunkerVMap);
                                 structVal = Builder.CreateInsertValue(structVal, defaultTargetVal, 0, "struct.target");
                                 structVal = Builder.CreateInsertValue(structVal, defaultTargetVal, 0, "struct.target");
-
-                                // // 设置bunker返回值
-                                // if (!bunkerRetVal) {
-                                //     LOG_DEBUG("performCodeFusion", "Setting default bunker return value");
-                                //     if (bunkerType->isPointerTy()) {
-                                //         LOG_DEBUG("performCodeFusion", "Bunker type is pointer type, setting null pointer");
-                                //         bunkerRetVal = ConstantPointerNull::get(cast<PointerType>(bunkerType));
-                                //     } else if (bunkerType->isIntegerTy()) {
-                                //         LOG_DEBUG("performCodeFusion", "Bunker type is integer type, setting to 0");
-                                //         bunkerRetVal = ConstantInt::get(bunkerType, 0);
-                                //     } else if (bunkerType->isFloatingPointTy()) {
-                                //         LOG_DEBUG("performCodeFusion", "Bunker type is floating point type, setting to 0.0");
-                                //         bunkerRetVal = ConstantFP::get(bunkerType, 0.0);
-                                //     } else {
-                                //         LOG_DEBUG("performCodeFusion", "Bunker type is other type, setting undef value");
-                                //         bunkerRetVal = UndefValue::get(bunkerType);
-                                //     }
-                                // } else {
-                                //     // 如果需要类型转换
-                                //     if (bunkerRetVal->getType() != bunkerType) {
-                                //         if (bunkerRetVal->getType()->isIntegerTy() && bunkerType->isIntegerTy()) {
-                                //             bunkerRetVal = Builder.CreateIntCast(bunkerRetVal, bunkerType, true);
-                                //         } else if (bunkerRetVal->getType()->isPointerTy() && bunkerType->isPointerTy()) {
-                                //             bunkerRetVal = Builder.CreateBitCast(bunkerRetVal, bunkerType);
-                                //         } else {
-                                //             LOG_ERROR("performCodeFusion", 
-                                //                 "Incompatible bunker return value type: cannot convert from {0} to {1}",
-                                //                 getReadableTypeName(bunkerRetVal->getType()),
-                                //                 getReadableTypeName(bunkerType));
-                                //             continue;
-                                //         }
-                                //     }
-                                // }
-                                
-                                // // 在插入之前验证类型
-                                // if (bunkerRetVal->getType() != bunkerType) {
-                                //     LOG_ERROR("performCodeFusion", 
-                                //         "Type mismatch for bunker value: expected {0}, got {1}",
-                                //         getReadableTypeName(bunkerType),
-                                //         getReadableTypeName(bunkerRetVal->getType()));
-                                //     continue;
-                                // }
-                                structVal = Builder.CreateInsertValue(structVal, bunkerRetVal, 1);
-                                
-                                // 创建新的返回指令
+                                structVal = Builder.CreateInsertValue(structVal, mappedBunkerRetVal, 1, "struct.bunker");
                                 ReturnInst* NewRI = ReturnInst::Create(M.getContext(), structVal, RI);
                                 ReturnInst* NewRI = ReturnInst::Create(M.getContext(), structVal, RI);
                                 ReplaceInstWithInst(RI, NewRI);
                                 ReplaceInstWithInst(RI, NewRI);
                                 
                                 
@@ -1337,10 +1365,10 @@ namespace {
                                 Value* targetRetVal = RI->getReturnValue();
                                 Value* targetRetVal = RI->getReturnValue();
                                 
                                 
                                 // 创建结构体实例并正确初始化
                                 // 创建结构体实例并正确初始化
-                                Value* structVal = UndefValue::get(STy);
+                                Value* structVal = ConstantAggregateZero::get(STy);
                                 Type* targetType = STy->getElementType(0);
                                 Type* targetType = STy->getElementType(0);
                                 Type* bunkerType = STy->getElementType(1);
                                 Type* bunkerType = STy->getElementType(1);
-
+                                
                                 // 设置bunker返回值位置为默认值
                                 // 设置bunker返回值位置为默认值
                                 Value* defaultBunkerVal;
                                 Value* defaultBunkerVal;
                                 if (bunkerType->isPointerTy()) {
                                 if (bunkerType->isPointerTy()) {
@@ -1350,69 +1378,13 @@ namespace {
                                 } else if (bunkerType->isFloatingPointTy()) {
                                 } else if (bunkerType->isFloatingPointTy()) {
                                     defaultBunkerVal = ConstantFP::get(bunkerType, 0.0);
                                     defaultBunkerVal = ConstantFP::get(bunkerType, 0.0);
                                 } else {
                                 } else {
-                                    // 为其他类型创建零初始化的常量
                                     defaultBunkerVal = Constant::getNullValue(bunkerType);
                                     defaultBunkerVal = Constant::getNullValue(bunkerType);
                                 }
                                 }
 
 
-                                // // 在插入之前验证结构体类型
-                                // if (!isa<StructType>(structVal->getType())) {
-                                //     LOG_ERROR("performCodeFusion", 
-                                //         "Expected struct type for return value, got {0}",
-                                //         getReadableTypeName(structVal->getType()));
-                                //     continue;
-                                // }
-
-                                // // 验证插入值的类型
-                                // if (!defaultBunkerVal || defaultBunkerVal->getType() != bunkerType) {
-                                //     LOG_ERROR("performCodeFusion", 
-                                //         "Invalid default bunker value type: expected {0}, got {1}",
-                                //         getReadableTypeName(bunkerType),
-                                //         defaultBunkerVal ? getReadableTypeName(defaultBunkerVal->getType()) : "null");
-                                //     continue;
-                                // }
-
-                                // 创建新的结构体值并插入bunker值
-                                structVal = Builder.CreateInsertValue(structVal, defaultBunkerVal, 1, "struct.bunker");
+                                Value* mappedTargetRetVal = MapValue(targetRetVal, targetVMap);
 
 
-                                // 设置target返回值
-                                // if (!targetRetVal) {
-                                //     if (targetType->isPointerTy()) {
-                                //         targetRetVal = ConstantPointerNull::get(cast<PointerType>(targetType));
-                                //     } else if (targetType->isIntegerTy()) {
-                                //         targetRetVal = ConstantInt::get(targetType, 0);
-                                //     } else if (targetType->isFloatingPointTy()) {
-                                //         targetRetVal = ConstantFP::get(targetType, 0.0);
-                                //     } else {
-                                //         targetRetVal = UndefValue::get(targetType);
-                                //     }
-                                // } else {
-                                //     // 如果需要类型转换
-                                //     if (targetRetVal->getType() != targetType) {
-                                //         if (targetRetVal->getType()->isIntegerTy() && targetType->isIntegerTy()) {
-                                //             targetRetVal = Builder.CreateIntCast(targetRetVal, targetType, true);
-                                //         } else if (targetRetVal->getType()->isPointerTy() && targetType->isPointerTy()) {
-                                //             targetRetVal = Builder.CreateBitCast(targetRetVal, targetType);
-                                //         } else {
-                                //             LOG_ERROR("performCodeFusion", 
-                                //                 "Incompatible target return value type: cannot convert from {0} to {1}",
-                                //                 getReadableTypeName(targetRetVal->getType()),
-                                //                 getReadableTypeName(targetType));
-                                //             continue;
-                                //         }
-                                //     }
-                                // }
-                                
-                                // // 在插入之前验证类型
-                                // if (targetRetVal->getType() != targetType) {
-                                //     LOG_ERROR("performCodeFusion", 
-                                //         "Type mismatch for target value: expected {0}, got {1}",
-                                //         getReadableTypeName(targetType),
-                                //         getReadableTypeName(targetRetVal->getType()));
-                                //     continue;
-                                // }
-                                structVal = Builder.CreateInsertValue(structVal, targetRetVal, 0);
-                                
-                                // 创建新的返回指令
+                                structVal = Builder.CreateInsertValue(structVal, mappedTargetRetVal, 0, "struct.target");
+                                structVal = Builder.CreateInsertValue(structVal, defaultBunkerVal, 1, "struct.bunker");
                                 ReturnInst* NewRI = ReturnInst::Create(M.getContext(), structVal, RI);
                                 ReturnInst* NewRI = ReturnInst::Create(M.getContext(), structVal, RI);
                                 ReplaceInstWithInst(RI, NewRI);
                                 ReplaceInstWithInst(RI, NewRI);
                                 
                                 
@@ -1557,7 +1529,6 @@ namespace {
                     }
                     }
                 }
                 }
 
 
-                // 更新调用点
                 for (CallInst* CI : bunkerCalls) {
                 for (CallInst* CI : bunkerCalls) {
                     updateCallSite(CI, fusedFunc, bunkerFunc, targetFunc, false);
                     updateCallSite(CI, fusedFunc, bunkerFunc, targetFunc, false);
                 }
                 }
@@ -1570,30 +1541,14 @@ namespace {
                 bunkerFunc->eraseFromParent();
                 bunkerFunc->eraseFromParent();
                 targetFunc->eraseFromParent();
                 targetFunc->eraseFromParent();
 
 
-                // 输出融合函数中的所有返回指令
-                LOG_INFO("performCodeFusion", "Listing all return instructions in fused function: {0}", 
-                    fusedFunc->getName().str());
-                    
-                for (BasicBlock &BB : *fusedFunc) {
-                    if (ReturnInst* RI = dyn_cast<ReturnInst>(BB.getTerminator())) {
-                        std::string retInstStr;
-                        raw_string_ostream retOS(retInstStr);
-                        RI->print(retOS);
-                        
-                        LOG_INFO("performCodeFusion", 
-                            "Return instruction in block {0}:\n  {1}", 
-                            BB.getName().str(),
-                            retInstStr);
-                            
-                        if (Value* RetVal = RI->getReturnValue()) {
-                            LOG_INFO("performCodeFusion", 
-                                "  Return value type: {0}", 
-                                getReadableTypeName(RetVal->getType()));
-                        } else {
-                            LOG_INFO("performCodeFusion", "  Void return");
-                        }
-                    }
+
+                // 添加新的日志打印代码
+                if (fusedFunc->getName() == "fused_createDynamicArray") {
+                    LOG_INFO("performCodeFusion", "Listing all instructions after block cloning in function: {0}", 
+                        fusedFunc->getName().str());
+                    dumpControlFlowGraph(*fusedFunc);
                 }
                 }
+
                 
                 
                 LOG_INFO("performCodeFusion", 
                 LOG_INFO("performCodeFusion", 
                     "Completed function fusion: {0}", 
                     "Completed function fusion: {0}", 

Some files were not shown because too many files changed in this diff