# In-Class Exercise 6: 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: - Print debugging is probably easiest, you can use e.g. `llvm::dbgs() << *value_ptr;` to print a value. - Get the `llvm::DominatorTree` from the `llvm::FunctionAnalysisManager` (`AM.getResult(F)`). - 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 -S 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 -S ## opt Run the following command to see the default -O3 pipeline: opt -S -O3 -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 <