Home | History | Annotate | Download | only in Scalar
      1 //===-- Float2Int.h - Demote floating point ops to work on integers -------===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 //
     10 // This file provides the Float2Int pass, which aims to demote floating
     11 // point operations to work on integers, where that is losslessly possible.
     12 //
     13 //===----------------------------------------------------------------------===//
     14 
     15 #ifndef LLVM_TRANSFORMS_SCALAR_FLOAT2INT_H
     16 #define LLVM_TRANSFORMS_SCALAR_FLOAT2INT_H
     17 
     18 #include "llvm/ADT/EquivalenceClasses.h"
     19 #include "llvm/ADT/MapVector.h"
     20 #include "llvm/IR/ConstantRange.h"
     21 #include "llvm/IR/Function.h"
     22 #include "llvm/IR/PassManager.h"
     23 
     24 namespace llvm {
     25 class Float2IntPass : public PassInfoMixin<Float2IntPass> {
     26 public:
     27   PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);
     28 
     29   // Glue for old PM.
     30   bool runImpl(Function &F);
     31 
     32 private:
     33   void findRoots(Function &F, SmallPtrSet<Instruction *, 8> &Roots);
     34   void seen(Instruction *I, ConstantRange R);
     35   ConstantRange badRange();
     36   ConstantRange unknownRange();
     37   ConstantRange validateRange(ConstantRange R);
     38   void walkBackwards(const SmallPtrSetImpl<Instruction *> &Roots);
     39   void walkForwards();
     40   bool validateAndTransform();
     41   Value *convert(Instruction *I, Type *ToTy);
     42   void cleanup();
     43 
     44   MapVector<Instruction *, ConstantRange> SeenInsts;
     45   SmallPtrSet<Instruction *, 8> Roots;
     46   EquivalenceClasses<Instruction *> ECs;
     47   MapVector<Instruction *, Value *> ConvertedInsts;
     48   LLVMContext *Ctx;
     49 };
     50 }
     51 #endif // LLVM_TRANSFORMS_SCALAR_FLOAT2INT_H
     52