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