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;
 }