diff --git a/hpvm/include/SupportVISC/VISCUtils.h b/hpvm/include/SupportVISC/VISCUtils.h index 2b6575fbcbb5f75e020e7e2bd1cba17bf1440034..9625846c399271992501d18b8f95320e0de467e0 100644 --- a/hpvm/include/SupportVISC/VISCUtils.h +++ b/hpvm/include/SupportVISC/VISCUtils.h @@ -111,41 +111,21 @@ void fixHintMetadata(Module &M, Function* F, Function* G) { MDTuple* MDT_G = MDNode::get(F->getContext(), ArrayRef<Metadata*>(ValueAsMetadata::get(G))); DEBUG(errs() << "New Metadata: " << *MDT_G << "\n"); - NamedMDNode* HintNode = M.getOrInsertNamedMetadata("visc_hint_gpu"); - for(unsigned i = 0; i < HintNode->getNumOperands(); i++) { - if(HintNode->getOperand(i) == MDT_F) - HintNode->setOperand(i, MDT_G); - } - HintNode = M.getOrInsertNamedMetadata("visc_hint_spir"); - for(unsigned i = 0; i < HintNode->getNumOperands(); i++) { - if(HintNode->getOperand(i) == MDT_F) - HintNode->setOperand(i, MDT_G); - } - HintNode = M.getOrInsertNamedMetadata("visc_hint_cudnn"); - for(unsigned i = 0; i < HintNode->getNumOperands(); i++) { - if(HintNode->getOperand(i) == MDT_F) - HintNode->setOperand(i, MDT_G); - } - HintNode = M.getOrInsertNamedMetadata("visc_hint_promise"); - for(unsigned i = 0; i < HintNode->getNumOperands(); i++) { - if(HintNode->getOperand(i) == MDT_F) - HintNode->setOperand(i, MDT_G); - } - HintNode = M.getOrInsertNamedMetadata("visc_hint_cpu"); - for(unsigned i = 0; i < HintNode->getNumOperands(); i++) { - if(HintNode->getOperand(i) == MDT_F) - HintNode->setOperand(i, MDT_G); - } - HintNode = M.getOrInsertNamedMetadata("visc_hint_cpu_gpu"); - for(unsigned i = 0; i < HintNode->getNumOperands(); i++) { - if(HintNode->getOperand(i) == MDT_F) - HintNode->setOperand(i, MDT_G); - } - HintNode = M.getOrInsertNamedMetadata("visc_hint_cpu_spir"); - for(unsigned i = 0; i < HintNode->getNumOperands(); i++) { - if(HintNode->getOperand(i) == MDT_F) - HintNode->setOperand(i, MDT_G); - } + auto FixHint = [&](StringRef Name) { + NamedMDNode* HintNode = M.getOrInsertNamedMetadata(Name); + for(unsigned i = 0; i < HintNode->getNumOperands(); i++) { + if(HintNode->getOperand(i) == MDT_F) + HintNode->setOperand(i, MDT_G); + } + }; + + FixHint("visc_hint_gpu"); + FixHint("visc_hint_spir"); + FixHint("visc_hint_cudnn"); + FixHint("visc_hint_promise"); + FixHint("visc_hint_cpu"); + FixHint("visc_hint_cpu_gpu"); + FixHint("visc_hint_cpu_spir"); } // Assuming that the changed function is a node function, it is only used as a @@ -153,13 +133,12 @@ void fixHintMetadata(Module &M, Function* F, Function* G) { // calls in the program. void replaceNodeFunctionInIR(Module &M, Function* F, Function* G) { - for (Module::iterator mi = M.begin(), me = M.end(); mi != me; ++mi) { - Function* f = &*mi; - DEBUG(errs() << "Function: " << f->getName() << "\n"); + for (auto &Func : M) { + DEBUG(errs() << "Function: " << Func.getName() << "\n"); std::vector<Instruction*> toBeErased; - for (inst_iterator i = inst_begin(f), e = inst_end(f); i != e ; ++i) { + for (inst_iterator i = inst_begin(&Func), e = inst_end(&Func); i != e ; ++i) { Instruction* I = &*i; // Grab pointer to Instruction if (isViscCreateNodeIntrinsic(I)) { @@ -181,7 +160,7 @@ void replaceNodeFunctionInIR(Module &M, Function* F, Function* G) { continue; // skip it DEBUG(errs() << "Fixing use: " << *CI << "\n"); - DEBUG(errs() << "in function: " << f->getName() << "\n"); + DEBUG(errs() << "in function: " << Func.getName() << "\n"); // Replace use of F with use of G CI->setArgOperand(1, G); DEBUG(errs() << "Fixed use: " << *CI << "\n"); @@ -355,42 +334,35 @@ bool tagIncludesTarget(visc::Target Tag, visc::Target T) { case visc::CPU_TARGET: if (T == visc::CPU_TARGET) return true; - else - return false; + return false; case visc::GPU_TARGET: if (T == visc::GPU_TARGET) return true; - else - return false; + return false; case visc::SPIR_TARGET: if (T == visc::SPIR_TARGET) return true; - else - return false; + return false; case visc::CUDNN_TARGET: if (T == visc::CUDNN_TARGET) return true; - else - return false; + return false; case visc::PROMISE_TARGET: if (T == visc::PROMISE_TARGET) return true; - else - return false; + return false; case visc::CPU_OR_GPU_TARGET: if ((T == visc::CPU_TARGET) || (T == visc::GPU_TARGET) || (T == visc::CPU_OR_GPU_TARGET)) return true; - else - return false; + return false; case visc::CPU_OR_SPIR_TARGET: if ((T == visc::CPU_TARGET) || (T == visc::SPIR_TARGET) || (T == visc::CPU_OR_SPIR_TARGET)) return true; - else - return false; + return false; default: assert(false && "Unknown Target\n"); } @@ -566,53 +538,24 @@ void removeHint(Function* F, visc::Target T) { visc::Target getPreferredTarget(Function* F) { DEBUG(errs() << "Finding preferred target for " << F->getName() << "\n"); Module* M = F->getParent(); - NamedMDNode* HintNode = M->getOrInsertNamedMetadata("visc_hint_gpu"); - for(unsigned i = 0; i < HintNode->getNumOperands(); i++) { - MDNode* N = HintNode->getOperand(i); - Value* FHint = dyn_cast<ValueAsMetadata>(N->getOperand(0).get())->getValue(); - if(F == FHint) - return visc::GPU_TARGET; - } - - HintNode = M->getOrInsertNamedMetadata("visc_hint_spir"); - for(unsigned i = 0; i < HintNode->getNumOperands(); i++) { - MDNode* N = HintNode->getOperand(i); - Value* FHint = dyn_cast<ValueAsMetadata>(N->getOperand(0).get())->getValue(); - if(F == FHint) - return visc::SPIR_TARGET; - } - - HintNode = M->getOrInsertNamedMetadata("visc_hint_cudnn"); - for(unsigned i = 0; i < HintNode->getNumOperands(); i++) { - MDNode* N = HintNode->getOperand(i); - Value* FHint = dyn_cast<ValueAsMetadata>(N->getOperand(0).get())->getValue(); - if(F == FHint) - return visc::CUDNN_TARGET; - } - - HintNode = M->getOrInsertNamedMetadata("visc_hint_promise"); - for(unsigned i = 0; i < HintNode->getNumOperands(); i++) { - MDNode* N = HintNode->getOperand(i); - Value* FHint = dyn_cast<ValueAsMetadata>(N->getOperand(0).get())->getValue(); - if(F == FHint) - return visc::PROMISE_TARGET; - } - - HintNode = M->getOrInsertNamedMetadata("visc_hint_cpu_gpu"); - for(unsigned i = 0; i < HintNode->getNumOperands(); i++) { - MDNode* N = HintNode->getOperand(i); - Value* FHint = dyn_cast<ValueAsMetadata>(N->getOperand(0).get())->getValue(); - if(F == FHint) - return visc::CPU_OR_GPU_TARGET; - } + + auto PrefTarget = [=](StringRef Name) { + NamedMDNode* HintNode = M->getOrInsertNamedMetadata(Name); + for(unsigned i = 0; i < HintNode->getNumOperands(); i++) { + MDNode* N = HintNode->getOperand(i); + Value* FHint = dyn_cast<ValueAsMetadata>(N->getOperand(0).get())->getValue(); + if(F == FHint) + return true; + } + }; + + if(PrefTarget("visc_hint_gpu")) return visc::GPU_TARGET; + if(PrefTarget("visc_hint_spir")) return visc::SPIR_TARGET; + if(PrefTarget("visc_hint_cudnn")) return visc::CUDNN_TARGET; + if(PrefTarget("visc_hint_promise")) return visc::PROMISE_TARGET; + if(PrefTarget("visc_hint_cpu_gpu")) return visc::CPU_OR_GPU_TARGET; + if(PrefTarget("visc_hint_cpu_spir")) return visc::CPU_OR_SPIR_TARGET; - HintNode = M->getOrInsertNamedMetadata("visc_hint_cpu_spir"); - for(unsigned i = 0; i < HintNode->getNumOperands(); i++) { - MDNode* N = HintNode->getOperand(i); - Value* FHint = dyn_cast<ValueAsMetadata>(N->getOperand(0).get())->getValue(); - if(F == FHint) - return visc::CPU_OR_SPIR_TARGET; - } return visc::CPU_TARGET; }