summaryrefslogtreecommitdiffstats
path: root/gnu/llvm/tools/clang/lib/CodeGen/CGLoopInfo.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'gnu/llvm/tools/clang/lib/CodeGen/CGLoopInfo.cpp')
-rw-r--r--gnu/llvm/tools/clang/lib/CodeGen/CGLoopInfo.cpp402
1 files changed, 0 insertions, 402 deletions
diff --git a/gnu/llvm/tools/clang/lib/CodeGen/CGLoopInfo.cpp b/gnu/llvm/tools/clang/lib/CodeGen/CGLoopInfo.cpp
deleted file mode 100644
index fd0a9c773a2..00000000000
--- a/gnu/llvm/tools/clang/lib/CodeGen/CGLoopInfo.cpp
+++ /dev/null
@@ -1,402 +0,0 @@
-//===---- CGLoopInfo.cpp - LLVM CodeGen for loop metadata -*- C++ -*-------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#include "CGLoopInfo.h"
-#include "clang/AST/ASTContext.h"
-#include "clang/AST/Attr.h"
-#include "llvm/IR/BasicBlock.h"
-#include "llvm/IR/CFG.h"
-#include "llvm/IR/Constants.h"
-#include "llvm/IR/InstrTypes.h"
-#include "llvm/IR/Instructions.h"
-#include "llvm/IR/Metadata.h"
-using namespace clang::CodeGen;
-using namespace llvm;
-
-static MDNode *createMetadata(LLVMContext &Ctx, const LoopAttributes &Attrs,
- const llvm::DebugLoc &StartLoc,
- const llvm::DebugLoc &EndLoc, MDNode *&AccGroup) {
-
- if (!Attrs.IsParallel && Attrs.VectorizeWidth == 0 &&
- Attrs.InterleaveCount == 0 && Attrs.UnrollCount == 0 &&
- Attrs.UnrollAndJamCount == 0 && !Attrs.PipelineDisabled &&
- Attrs.PipelineInitiationInterval == 0 &&
- Attrs.VectorizeEnable == LoopAttributes::Unspecified &&
- Attrs.UnrollEnable == LoopAttributes::Unspecified &&
- Attrs.UnrollAndJamEnable == LoopAttributes::Unspecified &&
- Attrs.DistributeEnable == LoopAttributes::Unspecified && !StartLoc &&
- !EndLoc)
- return nullptr;
-
- SmallVector<Metadata *, 4> Args;
- // Reserve operand 0 for loop id self reference.
- auto TempNode = MDNode::getTemporary(Ctx, None);
- Args.push_back(TempNode.get());
-
- // If we have a valid start debug location for the loop, add it.
- if (StartLoc) {
- Args.push_back(StartLoc.getAsMDNode());
-
- // If we also have a valid end debug location for the loop, add it.
- if (EndLoc)
- Args.push_back(EndLoc.getAsMDNode());
- }
-
- // Setting vectorize.width
- if (Attrs.VectorizeWidth > 0) {
- Metadata *Vals[] = {MDString::get(Ctx, "llvm.loop.vectorize.width"),
- ConstantAsMetadata::get(ConstantInt::get(
- Type::getInt32Ty(Ctx), Attrs.VectorizeWidth))};
- Args.push_back(MDNode::get(Ctx, Vals));
- }
-
- // Setting interleave.count
- if (Attrs.InterleaveCount > 0) {
- Metadata *Vals[] = {MDString::get(Ctx, "llvm.loop.interleave.count"),
- ConstantAsMetadata::get(ConstantInt::get(
- Type::getInt32Ty(Ctx), Attrs.InterleaveCount))};
- Args.push_back(MDNode::get(Ctx, Vals));
- }
-
- // Setting unroll.count
- if (Attrs.UnrollCount > 0) {
- Metadata *Vals[] = {MDString::get(Ctx, "llvm.loop.unroll.count"),
- ConstantAsMetadata::get(ConstantInt::get(
- Type::getInt32Ty(Ctx), Attrs.UnrollCount))};
- Args.push_back(MDNode::get(Ctx, Vals));
- }
-
- // Setting unroll_and_jam.count
- if (Attrs.UnrollAndJamCount > 0) {
- Metadata *Vals[] = {MDString::get(Ctx, "llvm.loop.unroll_and_jam.count"),
- ConstantAsMetadata::get(ConstantInt::get(
- Type::getInt32Ty(Ctx), Attrs.UnrollAndJamCount))};
- Args.push_back(MDNode::get(Ctx, Vals));
- }
-
- // Setting vectorize.enable
- if (Attrs.VectorizeEnable != LoopAttributes::Unspecified) {
- Metadata *Vals[] = {MDString::get(Ctx, "llvm.loop.vectorize.enable"),
- ConstantAsMetadata::get(ConstantInt::get(
- Type::getInt1Ty(Ctx), (Attrs.VectorizeEnable ==
- LoopAttributes::Enable)))};
- Args.push_back(MDNode::get(Ctx, Vals));
- }
-
- // Setting unroll.full or unroll.disable
- if (Attrs.UnrollEnable != LoopAttributes::Unspecified) {
- std::string Name;
- if (Attrs.UnrollEnable == LoopAttributes::Enable)
- Name = "llvm.loop.unroll.enable";
- else if (Attrs.UnrollEnable == LoopAttributes::Full)
- Name = "llvm.loop.unroll.full";
- else
- Name = "llvm.loop.unroll.disable";
- Metadata *Vals[] = {MDString::get(Ctx, Name)};
- Args.push_back(MDNode::get(Ctx, Vals));
- }
-
- // Setting unroll_and_jam.full or unroll_and_jam.disable
- if (Attrs.UnrollAndJamEnable != LoopAttributes::Unspecified) {
- std::string Name;
- if (Attrs.UnrollAndJamEnable == LoopAttributes::Enable)
- Name = "llvm.loop.unroll_and_jam.enable";
- else if (Attrs.UnrollAndJamEnable == LoopAttributes::Full)
- Name = "llvm.loop.unroll_and_jam.full";
- else
- Name = "llvm.loop.unroll_and_jam.disable";
- Metadata *Vals[] = {MDString::get(Ctx, Name)};
- Args.push_back(MDNode::get(Ctx, Vals));
- }
-
- if (Attrs.DistributeEnable != LoopAttributes::Unspecified) {
- Metadata *Vals[] = {MDString::get(Ctx, "llvm.loop.distribute.enable"),
- ConstantAsMetadata::get(ConstantInt::get(
- Type::getInt1Ty(Ctx), (Attrs.DistributeEnable ==
- LoopAttributes::Enable)))};
- Args.push_back(MDNode::get(Ctx, Vals));
- }
-
- if (Attrs.IsParallel) {
- AccGroup = MDNode::getDistinct(Ctx, {});
- Args.push_back(MDNode::get(
- Ctx, {MDString::get(Ctx, "llvm.loop.parallel_accesses"), AccGroup}));
- }
-
- if (Attrs.PipelineDisabled) {
- Metadata *Vals[] = {
- MDString::get(Ctx, "llvm.loop.pipeline.disable"),
- ConstantAsMetadata::get(ConstantInt::get(
- Type::getInt1Ty(Ctx), (Attrs.PipelineDisabled == true)))};
- Args.push_back(MDNode::get(Ctx, Vals));
- }
-
- if (Attrs.PipelineInitiationInterval > 0) {
- Metadata *Vals[] = {
- MDString::get(Ctx, "llvm.loop.pipeline.initiationinterval"),
- ConstantAsMetadata::get(ConstantInt::get(
- Type::getInt32Ty(Ctx), Attrs.PipelineInitiationInterval))};
- Args.push_back(MDNode::get(Ctx, Vals));
- }
-
- // Set the first operand to itself.
- MDNode *LoopID = MDNode::get(Ctx, Args);
- LoopID->replaceOperandWith(0, LoopID);
- return LoopID;
-}
-
-LoopAttributes::LoopAttributes(bool IsParallel)
- : IsParallel(IsParallel), VectorizeEnable(LoopAttributes::Unspecified),
- UnrollEnable(LoopAttributes::Unspecified),
- UnrollAndJamEnable(LoopAttributes::Unspecified), VectorizeWidth(0),
- InterleaveCount(0), UnrollCount(0), UnrollAndJamCount(0),
- DistributeEnable(LoopAttributes::Unspecified), PipelineDisabled(false),
- PipelineInitiationInterval(0) {}
-
-void LoopAttributes::clear() {
- IsParallel = false;
- VectorizeWidth = 0;
- InterleaveCount = 0;
- UnrollCount = 0;
- UnrollAndJamCount = 0;
- VectorizeEnable = LoopAttributes::Unspecified;
- UnrollEnable = LoopAttributes::Unspecified;
- UnrollAndJamEnable = LoopAttributes::Unspecified;
- DistributeEnable = LoopAttributes::Unspecified;
- PipelineDisabled = false;
- PipelineInitiationInterval = 0;
-}
-
-LoopInfo::LoopInfo(BasicBlock *Header, const LoopAttributes &Attrs,
- const llvm::DebugLoc &StartLoc, const llvm::DebugLoc &EndLoc)
- : LoopID(nullptr), Header(Header), Attrs(Attrs) {
- LoopID =
- createMetadata(Header->getContext(), Attrs, StartLoc, EndLoc, AccGroup);
-}
-
-void LoopInfoStack::push(BasicBlock *Header, const llvm::DebugLoc &StartLoc,
- const llvm::DebugLoc &EndLoc) {
- Active.push_back(LoopInfo(Header, StagedAttrs, StartLoc, EndLoc));
- // Clear the attributes so nested loops do not inherit them.
- StagedAttrs.clear();
-}
-
-void LoopInfoStack::push(BasicBlock *Header, clang::ASTContext &Ctx,
- ArrayRef<const clang::Attr *> Attrs,
- const llvm::DebugLoc &StartLoc,
- const llvm::DebugLoc &EndLoc) {
-
- // Identify loop hint attributes from Attrs.
- for (const auto *Attr : Attrs) {
- const LoopHintAttr *LH = dyn_cast<LoopHintAttr>(Attr);
- const OpenCLUnrollHintAttr *OpenCLHint =
- dyn_cast<OpenCLUnrollHintAttr>(Attr);
-
- // Skip non loop hint attributes
- if (!LH && !OpenCLHint) {
- continue;
- }
-
- LoopHintAttr::OptionType Option = LoopHintAttr::Unroll;
- LoopHintAttr::LoopHintState State = LoopHintAttr::Disable;
- unsigned ValueInt = 1;
- // Translate opencl_unroll_hint attribute argument to
- // equivalent LoopHintAttr enums.
- // OpenCL v2.0 s6.11.5:
- // 0 - full unroll (no argument).
- // 1 - disable unroll.
- // other positive integer n - unroll by n.
- if (OpenCLHint) {
- ValueInt = OpenCLHint->getUnrollHint();
- if (ValueInt == 0) {
- State = LoopHintAttr::Full;
- } else if (ValueInt != 1) {
- Option = LoopHintAttr::UnrollCount;
- State = LoopHintAttr::Numeric;
- }
- } else if (LH) {
- auto *ValueExpr = LH->getValue();
- if (ValueExpr) {
- llvm::APSInt ValueAPS = ValueExpr->EvaluateKnownConstInt(Ctx);
- ValueInt = ValueAPS.getSExtValue();
- }
-
- Option = LH->getOption();
- State = LH->getState();
- }
- switch (State) {
- case LoopHintAttr::Disable:
- switch (Option) {
- case LoopHintAttr::Vectorize:
- // Disable vectorization by specifying a width of 1.
- setVectorizeWidth(1);
- break;
- case LoopHintAttr::Interleave:
- // Disable interleaving by speciyfing a count of 1.
- setInterleaveCount(1);
- break;
- case LoopHintAttr::Unroll:
- setUnrollState(LoopAttributes::Disable);
- break;
- case LoopHintAttr::UnrollAndJam:
- setUnrollAndJamState(LoopAttributes::Disable);
- break;
- case LoopHintAttr::Distribute:
- setDistributeState(false);
- break;
- case LoopHintAttr::PipelineDisabled:
- setPipelineDisabled(true);
- break;
- case LoopHintAttr::UnrollCount:
- case LoopHintAttr::UnrollAndJamCount:
- case LoopHintAttr::VectorizeWidth:
- case LoopHintAttr::InterleaveCount:
- case LoopHintAttr::PipelineInitiationInterval:
- llvm_unreachable("Options cannot be disabled.");
- break;
- }
- break;
- case LoopHintAttr::Enable:
- switch (Option) {
- case LoopHintAttr::Vectorize:
- case LoopHintAttr::Interleave:
- setVectorizeEnable(true);
- break;
- case LoopHintAttr::Unroll:
- setUnrollState(LoopAttributes::Enable);
- break;
- case LoopHintAttr::UnrollAndJam:
- setUnrollAndJamState(LoopAttributes::Enable);
- break;
- case LoopHintAttr::Distribute:
- setDistributeState(true);
- break;
- case LoopHintAttr::UnrollCount:
- case LoopHintAttr::UnrollAndJamCount:
- case LoopHintAttr::VectorizeWidth:
- case LoopHintAttr::InterleaveCount:
- case LoopHintAttr::PipelineDisabled:
- case LoopHintAttr::PipelineInitiationInterval:
- llvm_unreachable("Options cannot enabled.");
- break;
- }
- break;
- case LoopHintAttr::AssumeSafety:
- switch (Option) {
- case LoopHintAttr::Vectorize:
- case LoopHintAttr::Interleave:
- // Apply "llvm.mem.parallel_loop_access" metadata to load/stores.
- setParallel(true);
- setVectorizeEnable(true);
- break;
- case LoopHintAttr::Unroll:
- case LoopHintAttr::UnrollAndJam:
- case LoopHintAttr::UnrollCount:
- case LoopHintAttr::UnrollAndJamCount:
- case LoopHintAttr::VectorizeWidth:
- case LoopHintAttr::InterleaveCount:
- case LoopHintAttr::Distribute:
- case LoopHintAttr::PipelineDisabled:
- case LoopHintAttr::PipelineInitiationInterval:
- llvm_unreachable("Options cannot be used to assume mem safety.");
- break;
- }
- break;
- case LoopHintAttr::Full:
- switch (Option) {
- case LoopHintAttr::Unroll:
- setUnrollState(LoopAttributes::Full);
- break;
- case LoopHintAttr::UnrollAndJam:
- setUnrollAndJamState(LoopAttributes::Full);
- break;
- case LoopHintAttr::Vectorize:
- case LoopHintAttr::Interleave:
- case LoopHintAttr::UnrollCount:
- case LoopHintAttr::UnrollAndJamCount:
- case LoopHintAttr::VectorizeWidth:
- case LoopHintAttr::InterleaveCount:
- case LoopHintAttr::Distribute:
- case LoopHintAttr::PipelineDisabled:
- case LoopHintAttr::PipelineInitiationInterval:
- llvm_unreachable("Options cannot be used with 'full' hint.");
- break;
- }
- break;
- case LoopHintAttr::Numeric:
- switch (Option) {
- case LoopHintAttr::VectorizeWidth:
- setVectorizeWidth(ValueInt);
- break;
- case LoopHintAttr::InterleaveCount:
- setInterleaveCount(ValueInt);
- break;
- case LoopHintAttr::UnrollCount:
- setUnrollCount(ValueInt);
- break;
- case LoopHintAttr::UnrollAndJamCount:
- setUnrollAndJamCount(ValueInt);
- break;
- case LoopHintAttr::PipelineInitiationInterval:
- setPipelineInitiationInterval(ValueInt);
- break;
- case LoopHintAttr::Unroll:
- case LoopHintAttr::UnrollAndJam:
- case LoopHintAttr::Vectorize:
- case LoopHintAttr::Interleave:
- case LoopHintAttr::Distribute:
- case LoopHintAttr::PipelineDisabled:
- llvm_unreachable("Options cannot be assigned a value.");
- break;
- }
- break;
- }
- }
-
- /// Stage the attributes.
- push(Header, StartLoc, EndLoc);
-}
-
-void LoopInfoStack::pop() {
- assert(!Active.empty() && "No active loops to pop");
- Active.pop_back();
-}
-
-void LoopInfoStack::InsertHelper(Instruction *I) const {
- if (I->mayReadOrWriteMemory()) {
- SmallVector<Metadata *, 4> AccessGroups;
- for (const LoopInfo &AL : Active) {
- // Here we assume that every loop that has an access group is parallel.
- if (MDNode *Group = AL.getAccessGroup())
- AccessGroups.push_back(Group);
- }
- MDNode *UnionMD = nullptr;
- if (AccessGroups.size() == 1)
- UnionMD = cast<MDNode>(AccessGroups[0]);
- else if (AccessGroups.size() >= 2)
- UnionMD = MDNode::get(I->getContext(), AccessGroups);
- I->setMetadata("llvm.access.group", UnionMD);
- }
-
- if (!hasInfo())
- return;
-
- const LoopInfo &L = getInfo();
- if (!L.getLoopID())
- return;
-
- if (I->isTerminator()) {
- for (BasicBlock *Succ : successors(I))
- if (Succ == L.getHeader()) {
- I->setMetadata(llvm::LLVMContext::MD_loop, L.getLoopID());
- break;
- }
- return;
- }
-}