[llvm] r273747 - [PM] Port float2int to the new pass manager

Robinson, Paul via llvm-commits llvm-commits at lists.llvm.org
Mon Jun 27 17:06:03 PDT 2016



> -----Original Message-----
> From: llvm-commits [mailto:llvm-commits-bounces at lists.llvm.org] On Behalf
> Of Michael Kuperstein via llvm-commits
> Sent: Friday, June 24, 2016 4:32 PM
> To: llvm-commits at lists.llvm.org
> Subject: [llvm] r273747 - [PM] Port float2int to the new pass manager
> 
> Author: mkuper
> Date: Fri Jun 24 18:32:02 2016
> New Revision: 273747
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=273747&view=rev
> Log:
> [PM] Port float2int to the new pass manager
> 
> Differential Revision: http://reviews.llvm.org/D21704
> 
> Added:
>     llvm/trunk/include/llvm/Transforms/Scalar/Float2Int.h
> Modified:
>     llvm/trunk/include/llvm/InitializePasses.h
>     llvm/trunk/lib/Passes/PassBuilder.cpp
>     llvm/trunk/lib/Passes/PassRegistry.def
>     llvm/trunk/lib/Transforms/Scalar/Float2Int.cpp
>     llvm/trunk/lib/Transforms/Scalar/Scalar.cpp
>     llvm/trunk/test/Transforms/Float2Int/basic.ll
> 
> Modified: llvm/trunk/include/llvm/InitializePasses.h
> URL: http://llvm.org/viewvc/llvm-
> project/llvm/trunk/include/llvm/InitializePasses.h?rev=273747&r1=273746&r2
> =273747&view=diff
> ==========================================================================
> ====
> --- llvm/trunk/include/llvm/InitializePasses.h (original)
> +++ llvm/trunk/include/llvm/InitializePasses.h Fri Jun 24 18:32:02 2016
> @@ -124,7 +124,7 @@ void initializeExpandPostRAPass(PassRegi
>  void initializeExternalAAWrapperPassPass(PassRegistry&);
>  void initializeFinalizeMachineBundlesPass(PassRegistry&);
>  void initializeFlattenCFGPassPass(PassRegistry&);
> -void initializeFloat2IntPass(PassRegistry&);
> +void initializeFloat2IntLegacyPassPass(PassRegistry&);
>  void initializeForceFunctionAttrsLegacyPassPass(PassRegistry&);
>  void initializeForwardControlFlowIntegrityPass(PassRegistry&);
>  void initializeFuncletLayoutPass(PassRegistry &);
> 
> Added: llvm/trunk/include/llvm/Transforms/Scalar/Float2Int.h
> URL: http://llvm.org/viewvc/llvm-
> project/llvm/trunk/include/llvm/Transforms/Scalar/Float2Int.h?rev=273747&v
> iew=auto
> ==========================================================================
> ====
> --- llvm/trunk/include/llvm/Transforms/Scalar/Float2Int.h (added)
> +++ llvm/trunk/include/llvm/Transforms/Scalar/Float2Int.h Fri Jun 24
> 18:32:02 2016
> @@ -0,0 +1,52 @@
> +//===-- Float2Int.h - Demote floating point ops to work on integers -----
> --===//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
> +//===--------------------------------------------------------------------
> --===//
> +//
> +// This file provides the Float2Int pass, which aims to demote floating
> +// point operations to work on integers, where that is losslessly
> possible.
> +//
> +//===--------------------------------------------------------------------
> --===//
> +
> +#ifndef LLVM_TRANSFORMS_SCALAR_FLOAT2INT_H
> +#define LLVM_TRANSFORMS_SCALAR_FLOAT2INT_H
> +
> +#include "llvm/ADT/EquivalenceClasses.h"
> +#include "llvm/ADT/MapVector.h"
> +#include "llvm/IR/ConstantRange.h"
> +#include "llvm/IR/Function.h"
> +#include "llvm/IR/PassManager.h"
> +
> +namespace llvm {
> +/// Pass to remove unused function declarations.

Dangling comment?
--paulr

> +class Float2IntPass : public PassInfoMixin<Float2IntPass> {
> +public:
> +  PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);
> +
> +  // Glue for old PM.
> +  bool runImpl(Function &F);
> +
> +private:
> +  void findRoots(Function &F, SmallPtrSet<Instruction *, 8> &Roots);
> +  ConstantRange seen(Instruction *I, ConstantRange R);
> +  ConstantRange badRange();
> +  ConstantRange unknownRange();
> +  ConstantRange validateRange(ConstantRange R);
> +  void walkBackwards(const SmallPtrSetImpl<Instruction *> &Roots);
> +  void walkForwards();
> +  bool validateAndTransform();
> +  Value *convert(Instruction *I, Type *ToTy);
> +  void cleanup();
> +
> +  MapVector<Instruction *, ConstantRange> SeenInsts;
> +  SmallPtrSet<Instruction *, 8> Roots;
> +  EquivalenceClasses<Instruction *> ECs;
> +  MapVector<Instruction *, Value *> ConvertedInsts;
> +  LLVMContext *Ctx;
> +};
> +}
> +#endif // LLVM_TRANSFORMS_SCALAR_FLOAT2INT_H
> 
> Modified: llvm/trunk/lib/Passes/PassBuilder.cpp
> URL: http://llvm.org/viewvc/llvm-
> project/llvm/trunk/lib/Passes/PassBuilder.cpp?rev=273747&r1=273746&r2=2737
> 47&view=diff
> ==========================================================================
> ====
> --- llvm/trunk/lib/Passes/PassBuilder.cpp (original)
> +++ llvm/trunk/lib/Passes/PassBuilder.cpp Fri Jun 24 18:32:02 2016
> @@ -75,6 +75,7 @@
>  #include "llvm/Transforms/Scalar/DCE.h"
>  #include "llvm/Transforms/Scalar/DeadStoreElimination.h"
>  #include "llvm/Transforms/Scalar/EarlyCSE.h"
> +#include "llvm/Transforms/Scalar/Float2Int.h"
>  #include "llvm/Transforms/Scalar/GVN.h"
>  #include "llvm/Transforms/Scalar/GuardWidening.h"
>  #include "llvm/Transforms/Scalar/IndVarSimplify.h"
> 
> Modified: llvm/trunk/lib/Passes/PassRegistry.def
> URL: http://llvm.org/viewvc/llvm-
> project/llvm/trunk/lib/Passes/PassRegistry.def?rev=273747&r1=273746&r2=273
> 747&view=diff
> ==========================================================================
> ====
> --- llvm/trunk/lib/Passes/PassRegistry.def (original)
> +++ llvm/trunk/lib/Passes/PassRegistry.def Fri Jun 24 18:32:02 2016
> @@ -129,6 +129,7 @@ FUNCTION_PASS("dse", DSEPass())
>  FUNCTION_PASS("early-cse", EarlyCSEPass())
>  FUNCTION_PASS("instcombine", InstCombinePass())
>  FUNCTION_PASS("invalidate<all>", InvalidateAllAnalysesPass())
> +FUNCTION_PASS("float2int", Float2IntPass())
>  FUNCTION_PASS("no-op-function", NoOpFunctionPass())
>  FUNCTION_PASS("loweratomic", LowerAtomicPass())
>  FUNCTION_PASS("lower-expect", LowerExpectIntrinsicPass())
> 
> Modified: llvm/trunk/lib/Transforms/Scalar/Float2Int.cpp
> URL: http://llvm.org/viewvc/llvm-
> project/llvm/trunk/lib/Transforms/Scalar/Float2Int.cpp?rev=273747&r1=27374
> 6&r2=273747&view=diff
> ==========================================================================
> ====
> --- llvm/trunk/lib/Transforms/Scalar/Float2Int.cpp (original)
> +++ llvm/trunk/lib/Transforms/Scalar/Float2Int.cpp Fri Jun 24 18:32:02
> 2016
> @@ -13,14 +13,13 @@
>  //===--------------------------------------------------------------------
> --===//
> 
>  #define DEBUG_TYPE "float2int"
> +
> +#include "llvm/Transforms/Scalar/Float2Int.h"
>  #include "llvm/ADT/APInt.h"
>  #include "llvm/ADT/APSInt.h"
> -#include "llvm/ADT/EquivalenceClasses.h"
> -#include "llvm/ADT/MapVector.h"
>  #include "llvm/ADT/SmallVector.h"
>  #include "llvm/Analysis/AliasAnalysis.h"
>  #include "llvm/Analysis/GlobalsModRef.h"
> -#include "llvm/IR/ConstantRange.h"
>  #include "llvm/IR/Constants.h"
>  #include "llvm/IR/IRBuilder.h"
>  #include "llvm/IR/InstIterator.h"
> @@ -52,41 +51,31 @@ MaxIntegerBW("float2int-max-integer-bw",
>                        "(default=64)"));
> 
>  namespace {
> -  struct Float2Int : public FunctionPass {
> +  struct Float2IntLegacyPass : public FunctionPass {
>      static char ID; // Pass identification, replacement for typeid
> -    Float2Int() : FunctionPass(ID) {
> -      initializeFloat2IntPass(*PassRegistry::getPassRegistry());
> +    Float2IntLegacyPass() : FunctionPass(ID) {
> +
> initializeFloat2IntLegacyPassPass(*PassRegistry::getPassRegistry());
> +    }
> +
> +    bool runOnFunction(Function &F) override {
> +      if (skipFunction(F))
> +        return false;
> +
> +      return Impl.runImpl(F);
>      }
> 
> -    bool runOnFunction(Function &F) override;
>      void getAnalysisUsage(AnalysisUsage &AU) const override {
>        AU.setPreservesCFG();
>        AU.addPreserved<GlobalsAAWrapperPass>();
>      }
> 
> -    void findRoots(Function &F, SmallPtrSet<Instruction*,8> &Roots);
> -    ConstantRange seen(Instruction *I, ConstantRange R);
> -    ConstantRange badRange();
> -    ConstantRange unknownRange();
> -    ConstantRange validateRange(ConstantRange R);
> -    void walkBackwards(const SmallPtrSetImpl<Instruction*> &Roots);
> -    void walkForwards();
> -    bool validateAndTransform();
> -    Value *convert(Instruction *I, Type *ToTy);
> -    void cleanup();
> -
> -    MapVector<Instruction*, ConstantRange > SeenInsts;
> -    SmallPtrSet<Instruction*,8> Roots;
> -    EquivalenceClasses<Instruction*> ECs;
> -    MapVector<Instruction*, Value*> ConvertedInsts;
> -    LLVMContext *Ctx;
> +  private:
> +    Float2IntPass Impl;
>    };
>  }
> 
> -char Float2Int::ID = 0;
> -INITIALIZE_PASS_BEGIN(Float2Int, "float2int", "Float to int", false,
> false)
> -INITIALIZE_PASS_DEPENDENCY(GlobalsAAWrapperPass)
> -INITIALIZE_PASS_END(Float2Int, "float2int", "Float to int", false, false)
> +char Float2IntLegacyPass::ID = 0;
> +INITIALIZE_PASS(Float2IntLegacyPass, "float2int", "Float to int", false,
> false)
> 
>  // Given a FCmp predicate, return a matching ICmp predicate if one
>  // exists, otherwise return BAD_ICMP_PREDICATE.
> @@ -128,7 +117,7 @@ static Instruction::BinaryOps mapBinOpco
> 
>  // Find the roots - instructions that convert from the FP domain to
>  // integer domain.
> -void Float2Int::findRoots(Function &F, SmallPtrSet<Instruction*,8>
> &Roots) {
> +void Float2IntPass::findRoots(Function &F, SmallPtrSet<Instruction*,8>
> &Roots) {
>    for (auto &I : instructions(F)) {
>      if (isa<VectorType>(I.getType()))
>        continue;
> @@ -148,7 +137,7 @@ void Float2Int::findRoots(Function &F, S
>  }
> 
>  // Helper - mark I as having been traversed, having range R.
> -ConstantRange Float2Int::seen(Instruction *I, ConstantRange R) {
> +ConstantRange Float2IntPass::seen(Instruction *I, ConstantRange R) {
>    DEBUG(dbgs() << "F2I: " << *I << ":" << R << "\n");
>    if (SeenInsts.find(I) != SeenInsts.end())
>      SeenInsts.find(I)->second = R;
> @@ -158,13 +147,13 @@ ConstantRange Float2Int::seen(Instructio
>  }
> 
>  // Helper - get a range representing a poison value.
> -ConstantRange Float2Int::badRange() {
> +ConstantRange Float2IntPass::badRange() {
>    return ConstantRange(MaxIntegerBW + 1, true);
>  }
> -ConstantRange Float2Int::unknownRange() {
> +ConstantRange Float2IntPass::unknownRange() {
>    return ConstantRange(MaxIntegerBW + 1, false);
>  }
> -ConstantRange Float2Int::validateRange(ConstantRange R) {
> +ConstantRange Float2IntPass::validateRange(ConstantRange R) {
>    if (R.getBitWidth() > MaxIntegerBW + 1)
>      return badRange();
>    return R;
> @@ -184,7 +173,7 @@ ConstantRange Float2Int::validateRange(C
> 
>  // Breadth-first walk of the use-def graph; determine the set of nodes
>  // we care about and eagerly determine if some of them are poisonous.
> -void Float2Int::walkBackwards(const SmallPtrSetImpl<Instruction*> &Roots)
> {
> +void Float2IntPass::walkBackwards(const SmallPtrSetImpl<Instruction*>
> &Roots) {
>    std::deque<Instruction*> Worklist(Roots.begin(), Roots.end());
>    while (!Worklist.empty()) {
>      Instruction *I = Worklist.back();
> @@ -245,7 +234,7 @@ void Float2Int::walkBackwards(const Smal
> 
>  // Walk forwards down the list of seen instructions, so we visit defs
> before
>  // uses.
> -void Float2Int::walkForwards() {
> +void Float2IntPass::walkForwards() {
>    for (auto &It : reverse(SeenInsts)) {
>      if (It.second != unknownRange())
>        continue;
> @@ -356,7 +345,7 @@ void Float2Int::walkForwards() {
>  }
> 
>  // If there is a valid transform to be done, do it.
> -bool Float2Int::validateAndTransform() {
> +bool Float2IntPass::validateAndTransform() {
>    bool MadeChange = false;
> 
>    // Iterate over every disjoint partition of the def-use graph.
> @@ -438,7 +427,7 @@ bool Float2Int::validateAndTransform() {
>    return MadeChange;
>  }
> 
> -Value *Float2Int::convert(Instruction *I, Type *ToTy) {
> +Value *Float2IntPass::convert(Instruction *I, Type *ToTy) {
>    if (ConvertedInsts.find(I) != ConvertedInsts.end())
>      // Already converted this instruction.
>      return ConvertedInsts[I];
> @@ -510,15 +499,12 @@ Value *Float2Int::convert(Instruction *I
>  }
> 
>  // Perform dead code elimination on the instructions we just modified.
> -void Float2Int::cleanup() {
> +void Float2IntPass::cleanup() {
>    for (auto &I : reverse(ConvertedInsts))
>      I.first->eraseFromParent();
>  }
> 
> -bool Float2Int::runOnFunction(Function &F) {
> -  if (skipFunction(F))
> -    return false;
> -
> +bool Float2IntPass::runImpl(Function &F) {
>    DEBUG(dbgs() << "F2I: Looking at function " << F.getName() << "\n");
>    // Clear out all state.
>    ECs = EquivalenceClasses<Instruction*>();
> @@ -539,4 +525,17 @@ bool Float2Int::runOnFunction(Function &
>    return Modified;
>  }
> 
> -FunctionPass *llvm::createFloat2IntPass() { return new Float2Int(); }
> +namespace llvm {
> +FunctionPass *createFloat2IntPass() { return new Float2IntLegacyPass(); }
> +
> +PreservedAnalyses Float2IntPass::run(Function &F, FunctionAnalysisManager
> &) {
> +  if (!runImpl(F))
> +    return PreservedAnalyses::all();
> +  else {
> +    //FIXME: setPreservesCFG is not currently supported in the new PM.
> +    PreservedAnalyses PA;
> +    PA.preserve<GlobalsAA>();
> +    return PA;
> +  }
> +}
> +} // End namespace llvm
> 
> Modified: llvm/trunk/lib/Transforms/Scalar/Scalar.cpp
> URL: http://llvm.org/viewvc/llvm-
> project/llvm/trunk/lib/Transforms/Scalar/Scalar.cpp?rev=273747&r1=273746&r
> 2=273747&view=diff
> ==========================================================================
> ====
> --- llvm/trunk/lib/Transforms/Scalar/Scalar.cpp (original)
> +++ llvm/trunk/lib/Transforms/Scalar/Scalar.cpp Fri Jun 24 18:32:02 2016
> @@ -84,7 +84,7 @@ void llvm::initializeScalarOpts(PassRegi
>    initializeLoadCombinePass(Registry);
>    initializePlaceBackedgeSafepointsImplPass(Registry);
>    initializePlaceSafepointsPass(Registry);
> -  initializeFloat2IntPass(Registry);
> +  initializeFloat2IntLegacyPassPass(Registry);
>    initializeLoopDistributePass(Registry);
>    initializeLoopLoadEliminationPass(Registry);
>    initializeLoopSimplifyCFGLegacyPassPass(Registry);
> 
> Modified: llvm/trunk/test/Transforms/Float2Int/basic.ll
> URL: http://llvm.org/viewvc/llvm-
> project/llvm/trunk/test/Transforms/Float2Int/basic.ll?rev=273747&r1=273746
> &r2=273747&view=diff
> ==========================================================================
> ====
> --- llvm/trunk/test/Transforms/Float2Int/basic.ll (original)
> +++ llvm/trunk/test/Transforms/Float2Int/basic.ll Fri Jun 24 18:32:02 2016
> @@ -1,4 +1,5 @@
>  ; RUN: opt < %s -float2int -S | FileCheck %s
> +; RUN: opt < %s -passes='float2int' -S | FileCheck %s
> 
>  ;
>  ; Positive tests
> 
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits


More information about the llvm-commits mailing list