1 //===- VPlanTransforms.h - Utility VPlan to VPlan transforms --------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 /// 9 /// \file 10 /// This file provides utility VPlan to VPlan transformations. 11 //===----------------------------------------------------------------------===// 12 13 #ifndef LLVM_TRANSFORMS_VECTORIZE_VPLANTRANSFORMS_H 14 #define LLVM_TRANSFORMS_VECTORIZE_VPLANTRANSFORMS_H 15 16 #include "VPlan.h" 17 #include "llvm/ADT/STLFunctionalExtras.h" 18 19 namespace llvm { 20 21 class InductionDescriptor; 22 class Instruction; 23 class PHINode; 24 class ScalarEvolution; 25 class Loop; 26 27 struct VPlanTransforms { 28 /// Replaces the VPInstructions in \p Plan with corresponding 29 /// widen recipes. 30 static void 31 VPInstructionsToVPRecipes(Loop *OrigLoop, VPlanPtr &Plan, 32 function_ref<const InductionDescriptor *(PHINode *)> 33 GetIntOrFpInductionDescriptor, 34 SmallPtrSetImpl<Instruction *> &DeadInstructions, 35 ScalarEvolution &SE); 36 37 static bool sinkScalarOperands(VPlan &Plan); 38 39 static bool mergeReplicateRegions(VPlan &Plan); 40 41 /// Remove redundant casts of inductions. 42 /// 43 /// Such redundant casts are casts of induction variables that can be ignored, 44 /// because we already proved that the casted phi is equal to the uncasted phi 45 /// in the vectorized loop. There is no need to vectorize the cast - the same 46 /// value can be used for both the phi and casts in the vector loop. 47 static void removeRedundantInductionCasts(VPlan &Plan); 48 49 /// Try to replace VPWidenCanonicalIVRecipes with a widened canonical IV 50 /// recipe, if it exists. 51 static void removeRedundantCanonicalIVs(VPlan &Plan); 52 53 static void removeDeadRecipes(VPlan &Plan); 54 55 /// If any user of a VPWidenIntOrFpInductionRecipe needs scalar values, 56 /// provide them by building scalar steps off of the canonical scalar IV and 57 /// update the original IV's users. This is an optional optimization to reduce 58 /// the needs of vector extracts. 59 static void optimizeInductions(VPlan &Plan, ScalarEvolution &SE); 60 61 /// Remove redundant EpxandSCEVRecipes in \p Plan's entry block by replacing 62 /// them with already existing recipes expanding the same SCEV expression. 63 static void removeRedundantExpandSCEVRecipes(VPlan &Plan); 64 }; 65 66 } // namespace llvm 67 68 #endif // LLVM_TRANSFORMS_VECTORIZE_VPLANTRANSFORMS_H 69