[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