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 24namespace llvm { 25class Float2IntPass : public PassInfoMixin<Float2IntPass> { 26public: 27 PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM); 28 29 // Glue for old PM. 30 bool runImpl(Function &F); 31 32private: 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