Phase 4 - LLVM: Finding loops and control dependences --- Step 1: We are interested in the loop pass that already exists in LLVM, and the output of this pass. Use the same fft1.c file from Phase 3 as a test case. Build the IR (without the mem2reg transformations) and run the loop analysis on it. After that, determine how many loops are found in the control-flow graphs for all C functions, as well as some information about these loops. Please implement a pass that uses the loop analysis API to compute (1) the number of loops in all functions in the input C file (2) the number of loops that are outermost loops (not nested in any other loops) (3) the total number of loop exit CFG edges for all loops (the source of the edge is in the loop body, but the target is not) --- Step 2: Invoke the post-dominator analysis already defined in LLVM (-postdomtree and the related -dot-postdom). Learn how to use the API of this analysis to access the post-dominator tree. Using this API, implement your own pass that finds all pairs of CFG nodes (c,x) such that x is control dependent on c. You should use the slightly modified algorithm from the last question of the second homework, rather than the one from the lecture notes. Your implementation should compute the number of all such pairs (c,x) in all CFGs. The product of your work should be a document containing: LOOPS: ... (number of loops in all functions) OUTERMOST LOOPS: ... (how many of these loops are outermost loops?) EXIT EDGES: ... (total number of loop exit edges in all loops) CONTROL DEP: ... (total number of pairs (c,x) where x is control-dep on c) By 11:59 pm on Monday, November 29, submit a single text file report.txt containing the information listed above. Submit your project using submit c788ac lab4 report.txt