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