# In-Class Exercise 5: LLVM-IR Optimizations ## Writing a Simple DCE Pass Implement a simple dead code elimination pass plug-in that works as follows. (Why does this algorithm work correctly?) - Traverse the blocks of the dominator tree in post-order: - Traverse instructions in reverse order: - Determine whether the instruction is trivially dead and thus safe to remove (i.e., no side effects and no users) and if so, erase it. Additional notes regarding the implementation: - You might find print-debugging (e.g., on an llvm::Value or an llvm::DominatorTree) helpful. - Get the `llvm::DominatorTree` from the `llvm::FunctionAnalysisManager`. - Consider using `llvm::post_order` for post-order traversal. - Be careful when iterating over instructions as you remove them. (Spoiler: `echo bGx2bTo6bWFrZV9lYXJseV9pbmNfcmFuZ2UK | base64 -d`) - Check for useful methods of llvm::Instruction to determine side effects. - Be sure to use the correct method for eliminating an instruction. Use the code snippet below as starting point. Compile and test with: c++ $(llvm-config --cppflags) -shared -g -o llvm-customdce.so llvm-customdce.cc -fPIC opt -load-pass-plugin=$PWD/llvm-customdce.so -passes=cdce input.ll Generate suitable LLVM-IR input files to test your code. You might find the following command helpful to generate SSA-based LLVM-IR functions from C code: clang -emit-llvm -o - -c test.c -Xclang -disable-O0-optnone | opt -passes=mem2reg | llvm-dis ## opt Run the following command to see the default -O3 pipeline: opt -passes="default" -print-pipeline-passes { public: llvm::PreservedAnalyses run(llvm::Function &F, llvm::FunctionAnalysisManager &AM) { return llvm::PreservedAnalyses::none(); } }; extern "C" ::llvm::PassPluginLibraryInfo LLVM_ATTRIBUTE_WEAK llvmGetPassPluginInfo() { return { LLVM_PLUGIN_API_VERSION, "CustomDCE", "v1", [] (llvm::PassBuilder &PB) { PB.registerPipelineParsingCallback( [] (llvm::StringRef Name, llvm::FunctionPassManager &FPM, llvm::ArrayRef) { if (Name == "cdce") { FPM.addPass(CustomDCE()); return true; } return false; } ); } }; } ## Example Input ``` base64 -d <