1 //===- llvm/Transforms/Utils.h - Utility Transformations --------*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // This header file defines prototypes for accessor functions that expose passes 10 // in the Utils transformations library. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #ifndef LLVM_TRANSFORMS_UTILS_H 15 #define LLVM_TRANSFORMS_UTILS_H 16 17 namespace llvm { 18 19 class ModulePass; 20 class FunctionPass; 21 class Pass; 22 23 //===----------------------------------------------------------------------===// 24 // 25 // LowerInvoke - This pass removes invoke instructions, converting them to call 26 // instructions. 27 // 28 FunctionPass *createLowerInvokePass(); 29 extern char &LowerInvokePassID; 30 31 //===----------------------------------------------------------------------===// 32 // 33 // LowerSwitch - This pass converts SwitchInst instructions into a sequence of 34 // chained binary branch instructions. 35 // 36 FunctionPass *createLowerSwitchPass(); 37 extern char &LowerSwitchID; 38 39 //===----------------------------------------------------------------------===// 40 // 41 // BreakCriticalEdges - Break all of the critical edges in the CFG by inserting 42 // a dummy basic block. This pass may be "required" by passes that cannot deal 43 // with critical edges. For this usage, a pass must call: 44 // 45 // AU.addRequiredID(BreakCriticalEdgesID); 46 // 47 // This pass obviously invalidates the CFG, but can update forward dominator 48 // (set, immediate dominators, tree, and frontier) information. 49 // 50 FunctionPass *createBreakCriticalEdgesPass(); 51 extern char &BreakCriticalEdgesID; 52 53 //===----------------------------------------------------------------------===// 54 // 55 // LCSSA - This pass inserts phi nodes at loop boundaries to simplify other loop 56 // optimizations. 57 // 58 Pass *createLCSSAPass(); 59 extern char &LCSSAID; 60 61 //===----------------------------------------------------------------------===// 62 // 63 // PromoteMemoryToRegister - This pass is used to promote memory references to 64 // be register references. A simple example of the transformation performed by 65 // this pass is: 66 // 67 // FROM CODE TO CODE 68 // %X = alloca i32, i32 1 ret i32 42 69 // store i32 42, i32 *%X 70 // %Y = load i32* %X 71 // ret i32 %Y 72 // 73 FunctionPass *createPromoteMemoryToRegisterPass(bool IsForced = false); 74 75 //===----------------------------------------------------------------------===// 76 // 77 // LoopSimplify - Insert Pre-header blocks into the CFG for every function in 78 // the module. This pass updates dominator information, loop information, and 79 // does not add critical edges to the CFG. 80 // 81 // AU.addRequiredID(LoopSimplifyID); 82 // 83 Pass *createLoopSimplifyPass(); 84 extern char &LoopSimplifyID; 85 86 //===----------------------------------------------------------------------===// 87 // 88 // UnifyLoopExits - For each loop, creates a new block N such that all exiting 89 // blocks branch to N, and then N distributes control flow to all the original 90 // exit blocks. 91 // 92 FunctionPass *createUnifyLoopExitsPass(); 93 94 //===----------------------------------------------------------------------===// 95 // 96 // FixIrreducible - Convert each SCC with irreducible control-flow 97 // into a natural loop. 98 // 99 FunctionPass *createFixIrreduciblePass(); 100 101 //===----------------------------------------------------------------------===// 102 // 103 // CanonicalizeFreezeInLoops - Canonicalize freeze instructions in loops so they 104 // don't block SCEV. 105 // 106 Pass *createCanonicalizeFreezeInLoopsPass(); 107 108 //===----------------------------------------------------------------------===// 109 // LowerGlobalDtorsLegacy - Lower @llvm.global_dtors by creating wrapper 110 // functions that are registered in @llvm.global_ctors and which contain a call 111 // to `__cxa_atexit` to register their destructor functions. 112 ModulePass *createLowerGlobalDtorsLegacyPass(); 113 } // namespace llvm 114 115 #endif 116