//===- SimplifyLibCalls.h - Library call simplifier -------------*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This file exposes an interface to build some C language libcalls for
// optimization passes that need to call the various functions.
//
//===----------------------------------------------------------------------===//

#ifndef LLVM_TRANSFORMS_UTILS_SIMPLIFYLIBCALLS_H
#define LLVM_TRANSFORMS_UTILS_SIMPLIFYLIBCALLS_H

namespace llvm {
  class Value;
  class CallInst;
  class DataLayout;
  class Instruction;
  class TargetLibraryInfo;
  class LibCallSimplifierImpl;

  /// LibCallSimplifier - This class implements a collection of optimizations
  /// that replace well formed calls to library functions with a more optimal
  /// form.  For example, replacing 'printf("Hello!")' with 'puts("Hello!")'.
  class LibCallSimplifier {
    /// Impl - A pointer to the actual implementation of the library call
    /// simplifier.
    LibCallSimplifierImpl *Impl;

  public:
    LibCallSimplifier(const DataLayout *TD, const TargetLibraryInfo *TLI,
                      bool UnsafeFPShrink);
    virtual ~LibCallSimplifier();

    /// optimizeCall - Take the given call instruction and return a more
    /// optimal value to replace the instruction with or 0 if a more
    /// optimal form can't be found.  Note that the returned value may
    /// be equal to the instruction being optimized.  In this case all
    /// other instructions that use the given instruction were modified
    /// and the given instruction is dead.
    Value *optimizeCall(CallInst *CI);

    /// replaceAllUsesWith - This method is used when the library call
    /// simplifier needs to replace instructions other than the library
    /// call being modified.
    virtual void replaceAllUsesWith(Instruction *I, Value *With) const;
  };
} // End llvm namespace

#endif
