diff --git a/hpvm/include/SupportHPVM/DFG2LLVM.h b/hpvm/include/SupportHPVM/DFG2LLVM.h
index c2270de3cffc4767b1220e0ea7cbaf11b8c9dc61..365fd2ebdde43a0a29494d6c3295cc36a9c9d740 100644
--- a/hpvm/include/SupportHPVM/DFG2LLVM.h
+++ b/hpvm/include/SupportHPVM/DFG2LLVM.h
@@ -168,15 +168,9 @@ bool CodeGenTraversal::checkPreferredTarget(DFNode *N, hpvm::Target T) {
   case hpvm::GPU_TARGET:
     HintNode = M->getOrInsertNamedMetadata("hpvm_hint_gpu");
     break;
-  case hpvm::SPIR_TARGET:
-    HintNode = M->getOrInsertNamedMetadata("hpvm_hint_spir");
-    break;
   case hpvm::CUDNN_TARGET:
     HintNode = M->getOrInsertNamedMetadata("hpvm_hint_cudnn");
     break;
-  case hpvm::PROMISE_TARGET:
-    HintNode = M->getOrInsertNamedMetadata("hpvm_hint_promise");
-    break;
   case hpvm::CPU_TARGET:
     HintNode = M->getOrInsertNamedMetadata("hpvm_hint_cpu");
     break;
@@ -207,10 +201,6 @@ bool CodeGenTraversal::preferredTargetIncludes(DFNode *N, hpvm::Target T) {
     HintNode.push_back(M->getOrInsertNamedMetadata("hpvm_hint_gpu"));
     HintNode.push_back(M->getOrInsertNamedMetadata("hpvm_hint_cpu_gpu"));
     break;
-  case hpvm::SPIR_TARGET:
-    HintNode.push_back(M->getOrInsertNamedMetadata("hpvm_hint_spir"));
-    HintNode.push_back(M->getOrInsertNamedMetadata("hpvm_hint_cpu_spir"));
-    break;
   case hpvm::CPU_TARGET:
     HintNode.push_back(M->getOrInsertNamedMetadata("hpvm_hint_cpu"));
     HintNode.push_back(M->getOrInsertNamedMetadata("hpvm_hint_cpu_gpu"));
@@ -219,12 +209,8 @@ bool CodeGenTraversal::preferredTargetIncludes(DFNode *N, hpvm::Target T) {
   case hpvm::CUDNN_TARGET:
     HintNode.push_back(M->getOrInsertNamedMetadata("hpvm_hint_cudnn"));
     break;
-  case hpvm::PROMISE_TARGET:
-    HintNode.push_back(M->getOrInsertNamedMetadata("hpvm_hint_promise"));
-    break;
   case hpvm::CPU_OR_GPU_TARGET:
-  case hpvm::CPU_OR_SPIR_TARGET:
-    assert(false && "Target should be one of CPU/GPU/SPIR\n");
+    assert(false && "Target should be one of CPU/GPU\n");
     break;
   default:
     llvm_unreachable("Target Not supported yet!");
diff --git a/hpvm/include/SupportHPVM/DFGraph.h b/hpvm/include/SupportHPVM/DFGraph.h
index e7f3c5bc78fff430f389c2e76cc168c8d3381ddf..fae04b7c8f9024b6122ba761261aed65e9b052d4 100644
--- a/hpvm/include/SupportHPVM/DFGraph.h
+++ b/hpvm/include/SupportHPVM/DFGraph.h
@@ -45,17 +45,13 @@ class DFGraph;
 struct TargetGenFunctions {
   Function *CPUGenFunc;
   Function *GPUGenFunc;
-  Function *SPIRGenFunc;
   Function *CUDNNGenFunc;
-  Function *PROMISEGenFunc;
 };
 
 struct TargetGenFuncInfo {
   bool cpu_hasCPUFunc;
   bool gpu_hasCPUFunc;
-  bool spir_hasCPUFunc;
   bool cudnn_hasCPUFunc;
-  bool promise_hasCPUFunc;
 };
 
 class DFGraph {
@@ -376,6 +372,8 @@ public:
       return GenFuncInfo.cpu_hasCPUFunc;
     case hpvm::GPU_TARGET:
       return GenFuncInfo.gpu_hasCPUFunc;
+    case hpvm::CUDNN_TARGET:
+      return GenFuncInfo.cudnn_hasCPUFunc;
     case hpvm::CPU_OR_GPU_TARGET:
       assert(false && "Single target expected (CPU/GPU/SPIR/CUDNN/PROMISE)\n");
     default:
@@ -421,6 +419,8 @@ public:
       return GenFuncs.CPUGenFunc;
     case hpvm::GPU_TARGET:
       return GenFuncs.GPUGenFunc;
+    case hpvm::CUDNN_TARGET:
+      return GenFuncs.CUDNNGenFunc;
     case hpvm::CPU_OR_GPU_TARGET:
       assert(false &&
              "Requesting genarated node function with dual tag instead of \
@@ -443,6 +443,10 @@ public:
       GenFuncs.GPUGenFunc = NULL;
       GenFuncInfo.gpu_hasCPUFunc = false;
       break;
+    case hpvm::CUDNN_TARGET:
+      GenFuncs.CUDNNGenFunc = NULL;
+      GenFuncInfo.cudnn_hasCPUFunc = false;
+      break;
     case hpvm::CPU_OR_GPU_TARGET:
       assert(false &&
              "Removing genarated node function with dual tag instead of \
@@ -686,14 +690,10 @@ DFNode::DFNode(IntrinsicInst *_II, Function *_FuncPointer, hpvm::Target _Hint,
   Tag = hpvm::None;
   GenFuncs.CPUGenFunc = NULL;
   GenFuncs.GPUGenFunc = NULL;
-  GenFuncs.SPIRGenFunc = NULL;
   GenFuncs.CUDNNGenFunc = NULL;
-  GenFuncs.PROMISEGenFunc = NULL;
 
   GenFuncInfo.cpu_hasCPUFunc = false;
   GenFuncInfo.gpu_hasCPUFunc = false;
-  GenFuncInfo.spir_hasCPUFunc = false;
-  GenFuncInfo.cudnn_hasCPUFunc = false;
   GenFuncInfo.cudnn_hasCPUFunc = false;
 }
 
diff --git a/hpvm/include/SupportHPVM/HPVMHint.h b/hpvm/include/SupportHPVM/HPVMHint.h
index 1ef4c6eb3b986328080caa9e99e96f444978c03e..b83d09db1bd296c13447efb6e802c4d81c50c89f 100644
--- a/hpvm/include/SupportHPVM/HPVMHint.h
+++ b/hpvm/include/SupportHPVM/HPVMHint.h
@@ -19,11 +19,8 @@ enum Target {
   None,
   CPU_TARGET,
   GPU_TARGET,
-  SPIR_TARGET,
   CUDNN_TARGET,
-  PROMISE_TARGET,
   CPU_OR_GPU_TARGET,
-  CPU_OR_SPIR_TARGET,
   //    ALL_TARGETS,
   NUM_TARGETS
 };
diff --git a/hpvm/include/SupportHPVM/HPVMUtils.h b/hpvm/include/SupportHPVM/HPVMUtils.h
index 537a92caec4a5c63b0fcc06b3714bddefc0a3fde..703ae78028fd76f75014031e974154ec2a2a2593 100644
--- a/hpvm/include/SupportHPVM/HPVMUtils.h
+++ b/hpvm/include/SupportHPVM/HPVMUtils.h
@@ -127,6 +127,7 @@ void fixHintMetadata(Module &M, Function *F, Function *G) {
   FixHint("hpvm_hint_gpu");
   FixHint("hpvm_hint_cpu");
   FixHint("hpvm_hint_cpu_gpu");
+  FixHint("hpvm_hint_cudnn");
 }
 
 // Assuming that the changed function is a node function, it is only used as a
@@ -392,18 +393,23 @@ bool tagIncludesTarget(hpvm::Target Tag, hpvm::Target T) {
         (T == hpvm::CPU_OR_GPU_TARGET))
       return true;
     return false;
+  case hpvm::CUDNN_TARGET:
+      if (T == hpvm::CUDNN_TARGET)
+        return true;
+      return false;
   default:
     assert(false && "Unknown Target\n");
   }
 }
 
 bool isSingleTargetTag(hpvm::Target T) {
-  return ((T == hpvm::CPU_TARGET) || (T == hpvm::GPU_TARGET));
+  return ((T == hpvm::CPU_TARGET) || (T == hpvm::GPU_TARGET) || (T == hpvm::CUDNN_TARGET));
 }
 
 // Add the specified target to the given tag
 hpvm::Target getUpdatedTag(hpvm::Target Tag, hpvm::Target T) {
-  assert(((T == hpvm::CPU_TARGET) || (T == hpvm::GPU_TARGET)) &&
+  assert(((T == hpvm::CPU_TARGET) || (T == hpvm::GPU_TARGET) 
+       || (T == hpvm::CUDNN_TARGET)) &&
          "The target is only allowed to be a single target: CPU, GPU, SPIR, "
          "CUDNN, PROMISE\n");
 
@@ -411,19 +417,23 @@ hpvm::Target getUpdatedTag(hpvm::Target Tag, hpvm::Target T) {
   case hpvm::None:
     return T;
   case hpvm::CPU_TARGET:
+    assert((T != hpvm::CUDNN_TARGET) && "Unsupported target combination\n");
     if (T == hpvm::CPU_TARGET)
       return hpvm::CPU_TARGET;
     if (T == hpvm::GPU_TARGET)
       return hpvm::CPU_OR_GPU_TARGET;
     return T;
   case hpvm::GPU_TARGET:
+    assert((T != hpvm::CUDNN_TARGET) && "Unsupported target combination\n");
     if (T == hpvm::CPU_TARGET)
       return hpvm::CPU_OR_GPU_TARGET;
     if (T == hpvm::GPU_TARGET)
       return hpvm::GPU_TARGET;
     return T;
   case hpvm::CPU_OR_GPU_TARGET:
+    assert((T != hpvm::CUDNN_TARGET) && "Unsupported target combination\n");
     return hpvm::CPU_OR_GPU_TARGET;
+  case 
   default:
     assert(false && "Unknown Target\n");
   }
@@ -451,6 +461,10 @@ void addHint(Function *F, hpvm::Target T) {
     DEBUG(errs() << "CPU or GPU Target\n");
     HintNode = M->getOrInsertNamedMetadata("hpvm_hint_cpu_gpu");
     break;
+  case hpvm::CUDNN_TARGET:
+      DEBUG(errs() << "CUDNN Target\n");
+      HintNode = M->getOrInsertNamedMetadata("hpvm_hint_cudnn");
+      break;
   default:
     llvm_unreachable("Unsupported Target Hint!");
     break;
@@ -481,6 +495,9 @@ void removeHint(Function *F, hpvm::Target T) {
   case hpvm::CPU_TARGET:
     HintNode = M->getOrInsertNamedMetadata("hpvm_hint_cpu");
     break;
+  case hpvm::CUDNN_TARGET:
+      HintNode = M->getOrInsertNamedMetadata("hpvm_hint_cudnn");
+      break;
   default:
     llvm_unreachable("Unsupported Target Hint!");
     break;
@@ -528,7 +545,8 @@ hpvm::Target getPreferredTarget(Function *F) {
     return hpvm::GPU_TARGET;
   if (FoundPrefTarget("hpvm_hint_cpu_gpu"))
     return hpvm::CPU_OR_GPU_TARGET;
-
+  if (FoundPrefTarget("hpvm_hint_cudnn"))
+    return hpvm::CUDNN_TARGET;
   return hpvm::None;
 }