SimplifyLibCalls.h revision b69bf6be1b042a5f06a623fc546107fc6d9f46c4
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;
335e8904576a5260cfd5b14596e338a4bb25b9817eMeador Inge  public:
345e8904576a5260cfd5b14596e338a4bb25b9817eMeador Inge    LibCallSimplifier(const DataLayout *TD, const TargetLibraryInfo *TLI);
355e8904576a5260cfd5b14596e338a4bb25b9817eMeador Inge    virtual ~LibCallSimplifier();
365e8904576a5260cfd5b14596e338a4bb25b9817eMeador Inge
375e8904576a5260cfd5b14596e338a4bb25b9817eMeador Inge    /// optimizeCall - Take the given call instruction and return a more
385e8904576a5260cfd5b14596e338a4bb25b9817eMeador Inge    /// optimal value to replace the instruction with or 0 if a more
39b69bf6be1b042a5f06a623fc546107fc6d9f46c4Meador Inge    /// optimal form can't be found.  Note that the returned value may
40b69bf6be1b042a5f06a623fc546107fc6d9f46c4Meador Inge    /// be equal to the instruction being optimized.  In this case all
41b69bf6be1b042a5f06a623fc546107fc6d9f46c4Meador Inge    /// other instructions that use the given instruction were modified
42b69bf6be1b042a5f06a623fc546107fc6d9f46c4Meador Inge    /// and the given instruction is dead.
435e8904576a5260cfd5b14596e338a4bb25b9817eMeador Inge    Value *optimizeCall(CallInst *CI);
44b69bf6be1b042a5f06a623fc546107fc6d9f46c4Meador Inge
45b69bf6be1b042a5f06a623fc546107fc6d9f46c4Meador Inge    /// replaceAllUsesWith - This method is used when the library call
46b69bf6be1b042a5f06a623fc546107fc6d9f46c4Meador Inge    /// simplifier needs to replace instructions other than the library
47b69bf6be1b042a5f06a623fc546107fc6d9f46c4Meador Inge    /// call being modified.
48b69bf6be1b042a5f06a623fc546107fc6d9f46c4Meador Inge    virtual void replaceAllUsesWith(Instruction *I, Value *With) const;
495e8904576a5260cfd5b14596e338a4bb25b9817eMeador Inge  };
505e8904576a5260cfd5b14596e338a4bb25b9817eMeador Inge} // End llvm namespace
515e8904576a5260cfd5b14596e338a4bb25b9817eMeador Inge
525e8904576a5260cfd5b14596e338a4bb25b9817eMeador Inge#endif
53