Path: blob/main/contrib/llvm-project/llvm/lib/Target/SPIRV/SPIRVStripConvergentIntrinsics.cpp
35267 views
//===-- SPIRVStripConvergentIntrinsics.cpp ----------------------*- C++ -*-===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//7//8// This pass trims convergence intrinsics as those were only useful when9// modifying the CFG during IR passes.10//11//===----------------------------------------------------------------------===//1213#include "SPIRV.h"14#include "SPIRVSubtarget.h"15#include "SPIRVTargetMachine.h"16#include "SPIRVUtils.h"17#include "llvm/CodeGen/IntrinsicLowering.h"18#include "llvm/IR/IRBuilder.h"19#include "llvm/IR/IntrinsicInst.h"20#include "llvm/IR/Intrinsics.h"21#include "llvm/IR/IntrinsicsSPIRV.h"22#include "llvm/Transforms/Utils/Cloning.h"23#include "llvm/Transforms/Utils/LowerMemIntrinsics.h"2425using namespace llvm;2627namespace llvm {28void initializeSPIRVStripConvergentIntrinsicsPass(PassRegistry &);29}3031class SPIRVStripConvergentIntrinsics : public FunctionPass {32public:33static char ID;3435SPIRVStripConvergentIntrinsics() : FunctionPass(ID) {36initializeSPIRVStripConvergentIntrinsicsPass(37*PassRegistry::getPassRegistry());38};3940virtual bool runOnFunction(Function &F) override {41DenseSet<Instruction *> ToRemove;4243for (BasicBlock &BB : F) {44for (Instruction &I : BB) {45if (auto *II = dyn_cast<IntrinsicInst>(&I)) {46if (II->getIntrinsicID() !=47Intrinsic::experimental_convergence_entry &&48II->getIntrinsicID() !=49Intrinsic::experimental_convergence_loop &&50II->getIntrinsicID() !=51Intrinsic::experimental_convergence_anchor) {52continue;53}5455II->replaceAllUsesWith(UndefValue::get(II->getType()));56ToRemove.insert(II);57} else if (auto *CI = dyn_cast<CallInst>(&I)) {58auto OB = CI->getOperandBundle(LLVMContext::OB_convergencectrl);59if (!OB.has_value())60continue;6162auto *NewCall = CallBase::removeOperandBundle(63CI, LLVMContext::OB_convergencectrl, CI);64NewCall->copyMetadata(*CI);65CI->replaceAllUsesWith(NewCall);66ToRemove.insert(CI);67}68}69}7071// All usages must be removed before their definition is removed.72for (Instruction *I : ToRemove)73I->eraseFromParent();7475return ToRemove.size() != 0;76}77};7879char SPIRVStripConvergentIntrinsics::ID = 0;80INITIALIZE_PASS(SPIRVStripConvergentIntrinsics, "strip-convergent-intrinsics",81"SPIRV strip convergent intrinsics", false, false)8283FunctionPass *llvm::createSPIRVStripConvergenceIntrinsicsPass() {84return new SPIRVStripConvergentIntrinsics();85}868788