diff --git a/hpvm/include/SupportVISC/DFG2LLVM.h b/hpvm/include/SupportVISC/DFG2LLVM.h
index 439b6307546a8f8a356ca822dbf0e27b448ca81d..057f1042200c2725c680a48ce83157e91c9d937e 100644
--- a/hpvm/include/SupportVISC/DFG2LLVM.h
+++ b/hpvm/include/SupportVISC/DFG2LLVM.h
@@ -182,66 +182,7 @@ bool CodeGenTraversal::checkPreferredTarget(DFNode* N, visc::Target T) {
 }
 
 visc::Target CodeGenTraversal::getPreferredTarget(DFNode *N) {
-
-  Function* F = N->getFuncPointer();
-  Module* M = F->getParent();
-  NamedMDNode* HintNode = M->getOrInsertNamedMetadata("visc_hint_cpu");
-  for (unsigned i = 0; i < HintNode->getNumOperands(); i++) {
-    MDNode* MetaNode = HintNode->getOperand(i);
-    Value* FHint = dyn_cast<ValueAsMetadata>(MetaNode->getOperand(0).get())->getValue();
-    if(F == FHint)
-      return visc::CPU_TARGET;
-  }
-
-  HintNode = M->getOrInsertNamedMetadata("visc_hint_gpu");
-  for (unsigned i = 0; i < HintNode->getNumOperands(); i++) {
-    MDNode* MetaNode = HintNode->getOperand(i);
-    Value* FHint = dyn_cast<ValueAsMetadata>(MetaNode->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* MetaNode = HintNode->getOperand(i);
-    Value* FHint = dyn_cast<ValueAsMetadata>(MetaNode->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* MetaNode = HintNode->getOperand(i);
-    Value* FHint = dyn_cast<ValueAsMetadata>(MetaNode->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* MetaNode = HintNode->getOperand(i);
-    Value* FHint = dyn_cast<ValueAsMetadata>(MetaNode->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* MetaNode = HintNode->getOperand(i);
-    Value* FHint = dyn_cast<ValueAsMetadata>(MetaNode->getOperand(0).get())->getValue();
-    if(F == FHint)
-      return visc::CPU_OR_GPU_TARGET;
-  }
-
-  HintNode = M->getOrInsertNamedMetadata("visc_hint_cpu_spir");
-  for (unsigned i = 0; i < HintNode->getNumOperands(); i++) {
-    MDNode* MetaNode = HintNode->getOperand(i);
-    Value* FHint = dyn_cast<ValueAsMetadata>(MetaNode->getOperand(0).get())->getValue();
-    if(F == FHint)
-      return visc::CPU_OR_SPIR_TARGET;
-  }
-
-  return visc::None;
+  return viscUtils::getPreferredTarget(N->getFuncPointer());
 }
 
 bool CodeGenTraversal::preferredTargetIncludes(DFNode* N, visc::Target T) {
@@ -431,16 +372,12 @@ std::vector<Value*> CodeGenTraversal::extractElements(Value* Aggregate,
 // Traverse the function F argument list to get argument at offset
 Argument* CodeGenTraversal::getArgumentAt(Function* F, unsigned offset) {
   DEBUG(errs() << "Finding argument " << offset << ":\n");
-  assert((F->getFunctionType()->getNumParams() > offset && offset >= 0)
+  assert((F->getFunctionType()->getNumParams() > offset)
          && "Invalid offset to access arguments!");
-  Argument* arg;
-  Function::arg_iterator i = F->arg_begin(), e = F->arg_end();
-  for(; offset != 0 && i!=e; i++) {
-    offset--;
-  }
-  arg = &*i;
-  DEBUG(errs() << "\t" << *arg <<"\n");
-  return arg;
+  
+  Function::arg_iterator ArgIt = F->arg_begin() + offset;
+  Argument *Arg = &*ArgIt;
+  return Arg;
 }
 
 void CodeGenTraversal::initTimerAPI() {