15e8904576a5260cfd5b14596e338a4bb25b9817eMeador Inge//===- SimplifyLibCalls.h - Library call simplifier -------------*- C++ -*-===// 25e8904576a5260cfd5b14596e338a4bb25b9817eMeador Inge// 35e8904576a5260cfd5b14596e338a4bb25b9817eMeador Inge// The LLVM Compiler Infrastructure 45e8904576a5260cfd5b14596e338a4bb25b9817eMeador Inge// 55e8904576a5260cfd5b14596e338a4bb25b9817eMeador Inge// This file is distributed under the University of Illinois Open Source 65e8904576a5260cfd5b14596e338a4bb25b9817eMeador Inge// License. See LICENSE.TXT for details. 75e8904576a5260cfd5b14596e338a4bb25b9817eMeador Inge// 85e8904576a5260cfd5b14596e338a4bb25b9817eMeador Inge//===----------------------------------------------------------------------===// 95e8904576a5260cfd5b14596e338a4bb25b9817eMeador Inge// 105e8904576a5260cfd5b14596e338a4bb25b9817eMeador Inge// This file exposes an interface to build some C language libcalls for 115e8904576a5260cfd5b14596e338a4bb25b9817eMeador Inge// optimization passes that need to call the various functions. 125e8904576a5260cfd5b14596e338a4bb25b9817eMeador Inge// 135e8904576a5260cfd5b14596e338a4bb25b9817eMeador Inge//===----------------------------------------------------------------------===// 145e8904576a5260cfd5b14596e338a4bb25b9817eMeador Inge 155e8904576a5260cfd5b14596e338a4bb25b9817eMeador Inge#ifndef LLVM_TRANSFORMS_UTILS_SIMPLIFYLIBCALLS_H 165e8904576a5260cfd5b14596e338a4bb25b9817eMeador Inge#define LLVM_TRANSFORMS_UTILS_SIMPLIFYLIBCALLS_H 175e8904576a5260cfd5b14596e338a4bb25b9817eMeador Inge 185e8904576a5260cfd5b14596e338a4bb25b9817eMeador Ingenamespace llvm { 195e8904576a5260cfd5b14596e338a4bb25b9817eMeador Inge class Value; 205e8904576a5260cfd5b14596e338a4bb25b9817eMeador Inge class CallInst; 215e8904576a5260cfd5b14596e338a4bb25b9817eMeador Inge class DataLayout; 22b69bf6be1b042a5f06a623fc546107fc6d9f46c4Meador Inge class Instruction; 235e8904576a5260cfd5b14596e338a4bb25b9817eMeador Inge class TargetLibraryInfo; 245e8904576a5260cfd5b14596e338a4bb25b9817eMeador Inge class LibCallSimplifierImpl; 255e8904576a5260cfd5b14596e338a4bb25b9817eMeador Inge 265e8904576a5260cfd5b14596e338a4bb25b9817eMeador Inge /// LibCallSimplifier - This class implements a collection of optimizations 275e8904576a5260cfd5b14596e338a4bb25b9817eMeador Inge /// that replace well formed calls to library functions with a more optimal 285e8904576a5260cfd5b14596e338a4bb25b9817eMeador Inge /// form. For example, replacing 'printf("Hello!")' with 'puts("Hello!")'. 295e8904576a5260cfd5b14596e338a4bb25b9817eMeador Inge class LibCallSimplifier { 305e8904576a5260cfd5b14596e338a4bb25b9817eMeador Inge /// Impl - A pointer to the actual implementation of the library call 315e8904576a5260cfd5b14596e338a4bb25b9817eMeador Inge /// simplifier. 325e8904576a5260cfd5b14596e338a4bb25b9817eMeador Inge LibCallSimplifierImpl *Impl; 33dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 345e8904576a5260cfd5b14596e338a4bb25b9817eMeador Inge public: 352920a71663b96f2c33b1fee09ca5ca9f5dc1cf12Meador Inge LibCallSimplifier(const DataLayout *TD, const TargetLibraryInfo *TLI, 362920a71663b96f2c33b1fee09ca5ca9f5dc1cf12Meador Inge bool UnsafeFPShrink); 375e8904576a5260cfd5b14596e338a4bb25b9817eMeador Inge virtual ~LibCallSimplifier(); 385e8904576a5260cfd5b14596e338a4bb25b9817eMeador Inge 395e8904576a5260cfd5b14596e338a4bb25b9817eMeador Inge /// optimizeCall - Take the given call instruction and return a more 405e8904576a5260cfd5b14596e338a4bb25b9817eMeador Inge /// optimal value to replace the instruction with or 0 if a more 41b69bf6be1b042a5f06a623fc546107fc6d9f46c4Meador Inge /// optimal form can't be found. Note that the returned value may 42b69bf6be1b042a5f06a623fc546107fc6d9f46c4Meador Inge /// be equal to the instruction being optimized. In this case all 43b69bf6be1b042a5f06a623fc546107fc6d9f46c4Meador Inge /// other instructions that use the given instruction were modified 44b69bf6be1b042a5f06a623fc546107fc6d9f46c4Meador Inge /// and the given instruction is dead. 455e8904576a5260cfd5b14596e338a4bb25b9817eMeador Inge Value *optimizeCall(CallInst *CI); 46b69bf6be1b042a5f06a623fc546107fc6d9f46c4Meador Inge 47b69bf6be1b042a5f06a623fc546107fc6d9f46c4Meador Inge /// replaceAllUsesWith - This method is used when the library call 48b69bf6be1b042a5f06a623fc546107fc6d9f46c4Meador Inge /// simplifier needs to replace instructions other than the library 49b69bf6be1b042a5f06a623fc546107fc6d9f46c4Meador Inge /// call being modified. 50b69bf6be1b042a5f06a623fc546107fc6d9f46c4Meador Inge virtual void replaceAllUsesWith(Instruction *I, Value *With) const; 515e8904576a5260cfd5b14596e338a4bb25b9817eMeador Inge }; 525e8904576a5260cfd5b14596e338a4bb25b9817eMeador Inge} // End llvm namespace 535e8904576a5260cfd5b14596e338a4bb25b9817eMeador Inge 545e8904576a5260cfd5b14596e338a4bb25b9817eMeador Inge#endif 55