diff --git a/lib/bcc/CacheReader.cpp b/lib/bcc/CacheReader.cpp
index e44f5b5..a820053 100644
--- a/lib/bcc/CacheReader.cpp
+++ b/lib/bcc/CacheReader.cpp
@@ -416,6 +416,7 @@
 
   if (!mpResult->mContext) {
     // Unable to allocate at cached address.  Give up.
+    mIsContextSlotNotAvail = true;
     return false;
 
     // TODO(logan): If relocation is fixed, we should try to allocate the
diff --git a/lib/bcc/CacheReader.h b/lib/bcc/CacheReader.h
index e66503e..fd3516d 100644
--- a/lib/bcc/CacheReader.h
+++ b/lib/bcc/CacheReader.h
@@ -49,10 +49,13 @@
     std::map<std::string,
              std::pair<uint32_t, unsigned char const *> > mDependencies;
 
+    bool mIsContextSlotNotAvail;
+
   public:
     CacheReader()
       : mFile(NULL), mFileSize(0), mpHeader(NULL),
-        mpCachedDependTable(NULL), mpPragmaList(NULL), mpFuncTable(NULL) {
+        mpCachedDependTable(NULL), mpPragmaList(NULL), mpFuncTable(NULL),
+        mIsContextSlotNotAvail(false) {
     }
 
     ~CacheReader();
@@ -66,6 +69,10 @@
 
     ScriptCached *readCacheFile(FileHandle *file, Script *s);
 
+    bool isContextSlotNotAvail() const {
+      return mIsContextSlotNotAvail;
+    }
+
   private:
     bool readHeader();
     bool readStringPool();
diff --git a/lib/bcc/ContextManager.cpp b/lib/bcc/ContextManager.cpp
index 8d173c1..e480480 100644
--- a/lib/bcc/ContextManager.cpp
+++ b/lib/bcc/ContextManager.cpp
@@ -36,6 +36,21 @@
 
 static android::Mutex gContextLock;
 
+
+ssize_t getSlotIndexFromAddress(char *addr) {
+  if (addr >= BCC_CONTEXT_FIXED_ADDR) {
+    size_t offset = (size_t)(addr - BCC_CONTEXT_FIXED_ADDR);
+    if (offset % BCC_CONTEXT_SIZE == 0) {
+      size_t slot = offset / BCC_CONTEXT_SIZE;
+      if (slot < BCC_CONTEXT_SLOT_COUNT) {
+        return slot;
+      }
+    }
+  }
+  return -1;
+}
+
+
 char *allocateContext() {
   android::AutoMutex _l(gContextLock);
 
@@ -80,18 +95,6 @@
   return (char *)result;
 }
 
-static ssize_t getSlotIndexFromAddress(char* addr) {
-  if (addr >= BCC_CONTEXT_FIXED_ADDR) {
-    size_t offset = (size_t)(addr - BCC_CONTEXT_FIXED_ADDR);
-    if (offset % BCC_CONTEXT_SIZE == 0) {
-      size_t slot = offset / BCC_CONTEXT_SIZE;
-      if (slot < BCC_CONTEXT_SLOT_COUNT) {
-        return slot;
-      }
-    }
-  }
-  return -1;
-}
 
 char *allocateContext(char *addr, int imageFd, off_t imageOffset) {
   android::AutoMutex _l(gContextLock);
diff --git a/lib/bcc/ContextManager.h b/lib/bcc/ContextManager.h
index e9a5860..461caff 100644
--- a/lib/bcc/ContextManager.h
+++ b/lib/bcc/ContextManager.h
@@ -32,6 +32,8 @@
 
 namespace bcc {
 
+  extern ssize_t getSlotIndexFromAddress(char *addr);
+
   extern char *allocateContext();
 
   extern char *allocateContext(char *addr, int imageFd, off_t imageOffset);
diff --git a/lib/bcc/Script.cpp b/lib/bcc/Script.cpp
index cb86ef5..23fe9cf 100644
--- a/lib/bcc/Script.cpp
+++ b/lib/bcc/Script.cpp
@@ -23,6 +23,7 @@
 
 #include "CacheReader.h"
 #include "CacheWriter.h"
+#include "ContextManager.h"
 #include "FileHandle.h"
 #include "ScriptCompiled.h"
 #include "ScriptCached.h"
@@ -183,6 +184,7 @@
   // Read cache file
   ScriptCached *cached = reader.readCacheFile(&file, this);
   if (!cached) {
+    mIsContextSlotNotAvail = reader.isContextSlotNotAvail();
     return 1;
   }
 
@@ -250,8 +252,18 @@
   }
 
 #if USE_CACHE
-  // TODO(logan): Write the cache out
-  if (mCachePath && !getBooleanProp("debug.bcc.nocache")) {
+  // Note: If we re-compile the script because the cached context slot not
+  // available, then we don't have to write the cache.
+
+  // Note: If the address of the context is not in the context slot, then
+  // we don't have to cache it.
+
+  char *addr = getContext();
+
+  if (mCachePath &&
+      !mIsContextSlotNotAvail && getSlotIndexFromAddress(addr) >= 0 &&
+      !getBooleanProp("debug.bcc.nocache")) {
+
     FileHandle file;
 
     // Remove the file if it already exists before writing the new file.
diff --git a/lib/bcc/Script.h b/lib/bcc/Script.h
index 64e4803..a8f8c4e 100644
--- a/lib/bcc/Script.h
+++ b/lib/bcc/Script.h
@@ -57,6 +57,8 @@
 
     char const *mCachePath;
 
+    bool mIsContextSlotNotAvail;
+
     // ReadBC
     char const *sourceBC;
     char const *sourceResName;
@@ -76,7 +78,7 @@
 
   public:
     Script() : mErrorCode(BCC_NO_ERROR), mStatus(ScriptStatus::Unknown),
-               mCachePath(NULL),
+               mCachePath(NULL), mIsContextSlotNotAvail(false),
                sourceBC(NULL), sourceResName(NULL), sourceSize(0),
                sourceModule(NULL), libraryBC(NULL), librarySize(0),
                mpExtSymbolLookupFn(NULL), mpExtSymbolLookupFnContext(NULL) {
