summaryrefslogtreecommitdiffstats
path: root/gnu/llvm/lib/CodeGen/ExpandReductions.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'gnu/llvm/lib/CodeGen/ExpandReductions.cpp')
-rw-r--r--gnu/llvm/lib/CodeGen/ExpandReductions.cpp170
1 files changed, 0 insertions, 170 deletions
diff --git a/gnu/llvm/lib/CodeGen/ExpandReductions.cpp b/gnu/llvm/lib/CodeGen/ExpandReductions.cpp
deleted file mode 100644
index 7552ba8cd85..00000000000
--- a/gnu/llvm/lib/CodeGen/ExpandReductions.cpp
+++ /dev/null
@@ -1,170 +0,0 @@
-//===--- ExpandReductions.cpp - Expand experimental reduction intrinsics --===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-//
-// This pass implements IR expansion for reduction intrinsics, allowing targets
-// to enable the experimental intrinsics until just before codegen.
-//
-//===----------------------------------------------------------------------===//
-
-#include "llvm/CodeGen/ExpandReductions.h"
-#include "llvm/Analysis/TargetTransformInfo.h"
-#include "llvm/CodeGen/Passes.h"
-#include "llvm/IR/Function.h"
-#include "llvm/IR/IRBuilder.h"
-#include "llvm/IR/InstIterator.h"
-#include "llvm/IR/IntrinsicInst.h"
-#include "llvm/IR/Intrinsics.h"
-#include "llvm/IR/Module.h"
-#include "llvm/Pass.h"
-#include "llvm/Transforms/Utils/LoopUtils.h"
-
-using namespace llvm;
-
-namespace {
-
-unsigned getOpcode(Intrinsic::ID ID) {
- switch (ID) {
- case Intrinsic::experimental_vector_reduce_fadd:
- return Instruction::FAdd;
- case Intrinsic::experimental_vector_reduce_fmul:
- return Instruction::FMul;
- case Intrinsic::experimental_vector_reduce_add:
- return Instruction::Add;
- case Intrinsic::experimental_vector_reduce_mul:
- return Instruction::Mul;
- case Intrinsic::experimental_vector_reduce_and:
- return Instruction::And;
- case Intrinsic::experimental_vector_reduce_or:
- return Instruction::Or;
- case Intrinsic::experimental_vector_reduce_xor:
- return Instruction::Xor;
- case Intrinsic::experimental_vector_reduce_smax:
- case Intrinsic::experimental_vector_reduce_smin:
- case Intrinsic::experimental_vector_reduce_umax:
- case Intrinsic::experimental_vector_reduce_umin:
- return Instruction::ICmp;
- case Intrinsic::experimental_vector_reduce_fmax:
- case Intrinsic::experimental_vector_reduce_fmin:
- return Instruction::FCmp;
- default:
- llvm_unreachable("Unexpected ID");
- }
-}
-
-RecurrenceDescriptor::MinMaxRecurrenceKind getMRK(Intrinsic::ID ID) {
- switch (ID) {
- case Intrinsic::experimental_vector_reduce_smax:
- return RecurrenceDescriptor::MRK_SIntMax;
- case Intrinsic::experimental_vector_reduce_smin:
- return RecurrenceDescriptor::MRK_SIntMin;
- case Intrinsic::experimental_vector_reduce_umax:
- return RecurrenceDescriptor::MRK_UIntMax;
- case Intrinsic::experimental_vector_reduce_umin:
- return RecurrenceDescriptor::MRK_UIntMin;
- case Intrinsic::experimental_vector_reduce_fmax:
- return RecurrenceDescriptor::MRK_FloatMax;
- case Intrinsic::experimental_vector_reduce_fmin:
- return RecurrenceDescriptor::MRK_FloatMin;
- default:
- return RecurrenceDescriptor::MRK_Invalid;
- }
-}
-
-bool expandReductions(Function &F, const TargetTransformInfo *TTI) {
- bool Changed = false;
- SmallVector<IntrinsicInst *, 4> Worklist;
- for (inst_iterator I = inst_begin(F), E = inst_end(F); I != E; ++I)
- if (auto II = dyn_cast<IntrinsicInst>(&*I))
- Worklist.push_back(II);
-
- for (auto *II : Worklist) {
- IRBuilder<> Builder(II);
- bool IsOrdered = false;
- Value *Acc = nullptr;
- Value *Vec = nullptr;
- auto ID = II->getIntrinsicID();
- auto MRK = RecurrenceDescriptor::MRK_Invalid;
- switch (ID) {
- case Intrinsic::experimental_vector_reduce_fadd:
- case Intrinsic::experimental_vector_reduce_fmul:
- // FMFs must be attached to the call, otherwise it's an ordered reduction
- // and it can't be handled by generating a shuffle sequence.
- if (!II->getFastMathFlags().isFast())
- IsOrdered = true;
- Acc = II->getArgOperand(0);
- Vec = II->getArgOperand(1);
- break;
- case Intrinsic::experimental_vector_reduce_add:
- case Intrinsic::experimental_vector_reduce_mul:
- case Intrinsic::experimental_vector_reduce_and:
- case Intrinsic::experimental_vector_reduce_or:
- case Intrinsic::experimental_vector_reduce_xor:
- case Intrinsic::experimental_vector_reduce_smax:
- case Intrinsic::experimental_vector_reduce_smin:
- case Intrinsic::experimental_vector_reduce_umax:
- case Intrinsic::experimental_vector_reduce_umin:
- case Intrinsic::experimental_vector_reduce_fmax:
- case Intrinsic::experimental_vector_reduce_fmin:
- Vec = II->getArgOperand(0);
- MRK = getMRK(ID);
- break;
- default:
- continue;
- }
- if (!TTI->shouldExpandReduction(II))
- continue;
- Value *Rdx =
- IsOrdered ? getOrderedReduction(Builder, Acc, Vec, getOpcode(ID), MRK)
- : getShuffleReduction(Builder, Vec, getOpcode(ID), MRK);
- II->replaceAllUsesWith(Rdx);
- II->eraseFromParent();
- Changed = true;
- }
- return Changed;
-}
-
-class ExpandReductions : public FunctionPass {
-public:
- static char ID;
- ExpandReductions() : FunctionPass(ID) {
- initializeExpandReductionsPass(*PassRegistry::getPassRegistry());
- }
-
- bool runOnFunction(Function &F) override {
- const auto *TTI =&getAnalysis<TargetTransformInfoWrapperPass>().getTTI(F);
- return expandReductions(F, TTI);
- }
-
- void getAnalysisUsage(AnalysisUsage &AU) const override {
- AU.addRequired<TargetTransformInfoWrapperPass>();
- AU.setPreservesCFG();
- }
-};
-}
-
-char ExpandReductions::ID;
-INITIALIZE_PASS_BEGIN(ExpandReductions, "expand-reductions",
- "Expand reduction intrinsics", false, false)
-INITIALIZE_PASS_DEPENDENCY(TargetTransformInfoWrapperPass)
-INITIALIZE_PASS_END(ExpandReductions, "expand-reductions",
- "Expand reduction intrinsics", false, false)
-
-FunctionPass *llvm::createExpandReductionsPass() {
- return new ExpandReductions();
-}
-
-PreservedAnalyses ExpandReductionsPass::run(Function &F,
- FunctionAnalysisManager &AM) {
- const auto &TTI = AM.getResult<TargetIRAnalysis>(F);
- if (!expandReductions(F, &TTI))
- return PreservedAnalyses::all();
- PreservedAnalyses PA;
- PA.preserveSet<CFGAnalyses>();
- return PA;
-}