summaryrefslogtreecommitdiffstats
path: root/gnu/llvm/lib/Target/NVPTX/NVPTXImageOptimizer.cpp
diff options
context:
space:
mode:
authorpatrick <patrick@openbsd.org>2020-08-03 15:06:44 +0000
committerpatrick <patrick@openbsd.org>2020-08-03 15:06:44 +0000
commitb64793999546ed8adebaeebd9d8345d18db8927d (patch)
tree4357c27b561d73b0e089727c6ed659f2ceff5f47 /gnu/llvm/lib/Target/NVPTX/NVPTXImageOptimizer.cpp
parentAdd support for UTF-8 DISPLAY-HINTs with octet length. For now only (diff)
downloadwireguard-openbsd-b64793999546ed8adebaeebd9d8345d18db8927d.tar.xz
wireguard-openbsd-b64793999546ed8adebaeebd9d8345d18db8927d.zip
Remove LLVM 8.0.1 files.
Diffstat (limited to 'gnu/llvm/lib/Target/NVPTX/NVPTXImageOptimizer.cpp')
-rw-r--r--gnu/llvm/lib/Target/NVPTX/NVPTXImageOptimizer.cpp179
1 files changed, 0 insertions, 179 deletions
diff --git a/gnu/llvm/lib/Target/NVPTX/NVPTXImageOptimizer.cpp b/gnu/llvm/lib/Target/NVPTX/NVPTXImageOptimizer.cpp
deleted file mode 100644
index ad1d7cbb52f..00000000000
--- a/gnu/llvm/lib/Target/NVPTX/NVPTXImageOptimizer.cpp
+++ /dev/null
@@ -1,179 +0,0 @@
-//===-- NVPTXImageOptimizer.cpp - Image optimization pass -----------------===//
-//
-// 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-level optimizations of image access code,
-// including:
-//
-// 1. Eliminate istypep intrinsics when image access qualifier is known
-//
-//===----------------------------------------------------------------------===//
-
-#include "NVPTX.h"
-#include "NVPTXUtilities.h"
-#include "llvm/Analysis/ConstantFolding.h"
-#include "llvm/IR/Instructions.h"
-#include "llvm/IR/Intrinsics.h"
-#include "llvm/IR/Module.h"
-#include "llvm/Pass.h"
-
-using namespace llvm;
-
-namespace {
-class NVPTXImageOptimizer : public FunctionPass {
-private:
- static char ID;
- SmallVector<Instruction*, 4> InstrToDelete;
-
-public:
- NVPTXImageOptimizer();
-
- bool runOnFunction(Function &F) override;
-
-private:
- bool replaceIsTypePSampler(Instruction &I);
- bool replaceIsTypePSurface(Instruction &I);
- bool replaceIsTypePTexture(Instruction &I);
- Value *cleanupValue(Value *V);
- void replaceWith(Instruction *From, ConstantInt *To);
-};
-}
-
-char NVPTXImageOptimizer::ID = 0;
-
-NVPTXImageOptimizer::NVPTXImageOptimizer()
- : FunctionPass(ID) {}
-
-bool NVPTXImageOptimizer::runOnFunction(Function &F) {
- if (skipFunction(F))
- return false;
-
- bool Changed = false;
- InstrToDelete.clear();
-
- // Look for call instructions in the function
- for (Function::iterator BI = F.begin(), BE = F.end(); BI != BE;
- ++BI) {
- for (BasicBlock::iterator I = (*BI).begin(), E = (*BI).end();
- I != E; ++I) {
- Instruction &Instr = *I;
- if (CallInst *CI = dyn_cast<CallInst>(I)) {
- Function *CalledF = CI->getCalledFunction();
- if (CalledF && CalledF->isIntrinsic()) {
- // This is an intrinsic function call, check if its an istypep
- switch (CalledF->getIntrinsicID()) {
- default: break;
- case Intrinsic::nvvm_istypep_sampler:
- Changed |= replaceIsTypePSampler(Instr);
- break;
- case Intrinsic::nvvm_istypep_surface:
- Changed |= replaceIsTypePSurface(Instr);
- break;
- case Intrinsic::nvvm_istypep_texture:
- Changed |= replaceIsTypePTexture(Instr);
- break;
- }
- }
- }
- }
- }
-
- // Delete any istypep instances we replaced in the IR
- for (unsigned i = 0, e = InstrToDelete.size(); i != e; ++i)
- InstrToDelete[i]->eraseFromParent();
-
- return Changed;
-}
-
-bool NVPTXImageOptimizer::replaceIsTypePSampler(Instruction &I) {
- Value *TexHandle = cleanupValue(I.getOperand(0));
- if (isSampler(*TexHandle)) {
- // This is an OpenCL sampler, so it must be a samplerref
- replaceWith(&I, ConstantInt::getTrue(I.getContext()));
- return true;
- } else if (isImage(*TexHandle)) {
- // This is an OpenCL image, so it cannot be a samplerref
- replaceWith(&I, ConstantInt::getFalse(I.getContext()));
- return true;
- } else {
- // The image type is unknown, so we cannot eliminate the intrinsic
- return false;
- }
-}
-
-bool NVPTXImageOptimizer::replaceIsTypePSurface(Instruction &I) {
- Value *TexHandle = cleanupValue(I.getOperand(0));
- if (isImageReadWrite(*TexHandle) ||
- isImageWriteOnly(*TexHandle)) {
- // This is an OpenCL read-only/read-write image, so it must be a surfref
- replaceWith(&I, ConstantInt::getTrue(I.getContext()));
- return true;
- } else if (isImageReadOnly(*TexHandle) ||
- isSampler(*TexHandle)) {
- // This is an OpenCL read-only/ imageor sampler, so it cannot be
- // a surfref
- replaceWith(&I, ConstantInt::getFalse(I.getContext()));
- return true;
- } else {
- // The image type is unknown, so we cannot eliminate the intrinsic
- return false;
- }
-}
-
-bool NVPTXImageOptimizer::replaceIsTypePTexture(Instruction &I) {
- Value *TexHandle = cleanupValue(I.getOperand(0));
- if (isImageReadOnly(*TexHandle)) {
- // This is an OpenCL read-only image, so it must be a texref
- replaceWith(&I, ConstantInt::getTrue(I.getContext()));
- return true;
- } else if (isImageWriteOnly(*TexHandle) ||
- isImageReadWrite(*TexHandle) ||
- isSampler(*TexHandle)) {
- // This is an OpenCL read-write/write-only image or a sampler, so it
- // cannot be a texref
- replaceWith(&I, ConstantInt::getFalse(I.getContext()));
- return true;
- } else {
- // The image type is unknown, so we cannot eliminate the intrinsic
- return false;
- }
-}
-
-void NVPTXImageOptimizer::replaceWith(Instruction *From, ConstantInt *To) {
- // We implement "poor man's DCE" here to make sure any code that is no longer
- // live is actually unreachable and can be trivially eliminated by the
- // unreachable block elimination pass.
- for (CallInst::use_iterator UI = From->use_begin(), UE = From->use_end();
- UI != UE; ++UI) {
- if (BranchInst *BI = dyn_cast<BranchInst>(*UI)) {
- if (BI->isUnconditional()) continue;
- BasicBlock *Dest;
- if (To->isZero())
- // Get false block
- Dest = BI->getSuccessor(1);
- else
- // Get true block
- Dest = BI->getSuccessor(0);
- BranchInst::Create(Dest, BI);
- InstrToDelete.push_back(BI);
- }
- }
- From->replaceAllUsesWith(To);
- InstrToDelete.push_back(From);
-}
-
-Value *NVPTXImageOptimizer::cleanupValue(Value *V) {
- if (ExtractValueInst *EVI = dyn_cast<ExtractValueInst>(V)) {
- return cleanupValue(EVI->getAggregateOperand());
- }
- return V;
-}
-
-FunctionPass *llvm::createNVPTXImageOptimizerPass() {
- return new NVPTXImageOptimizer();
-}