diff --git a/Android.mk b/Android.mk
index a01d620..94bd98c 100644
--- a/Android.mk
+++ b/Android.mk
@@ -19,6 +19,9 @@
 LOCAL_PATH := $(call my-dir)
 LLVM_ROOT_PATH := external/llvm
 
+USE_CACHE := true 
+USE_RELOCATE := false
+
 USE_DISASSEMBLER := true
 LLVM_ENABLE_ASSERTION := false
 
diff --git a/bcc.cpp b/bcc.cpp
index ac41041..94aed43 100644
--- a/bcc.cpp
+++ b/bcc.cpp
@@ -17,10 +17,19 @@
 // Bitcode compiler (bcc) for Android:
 //    This is an eager-compilation JIT running on Android.
 
-// Beginning of mmap region to generate EXE to and to load EXE from disk cache
-#define BCC_CODE_ADDR 0x7e00000
+// BCC_CODE_ADDR == Beginning of mmap region to generate EXE onto and
+//                  to load EXE from disk cache
+// Note: The static variable Compiler::BccCodeAddr = BCC_CODE_ADDR
+// I.e., Compiler::BccCodeAddr is used as "Compiler::UseCache"
+//
+#if (USE_CACHE)
+#   define BCC_CODE_ADDR 0x7e000000
+#else
+#   define BCC_CODE_ADDR 0
+#endif
 
-// Design of caching EXE
+// Design of caching EXE:
+// ======================
 // 1. Each process will have virtual address available starting at 0x7e00000.
 //    E.g., Books and Youtube all have its own 0x7e00000. Next, we should
 //    minimize the chance of needing to do relocation INSIDE an app too.
@@ -42,6 +51,42 @@
 //
 // If we are lucky, then we don't need relocation ever, since next time the
 // application gets run, the 3 scripts are likely created in the SAME order.
+//
+//
+// End-to-end algorithm on when to caching and when to JIT:
+// ========================================================
+// Prologue:
+// ---------
+// Assertion: bccReadBC() is always called and is before bccCompileBC(),
+// bccLoadBinary(), ...
+//
+// Key variable definitions: Normally,
+//  Compiler::BccCodeAddr: non-zero if (USE_CACHE)
+//  | (Stricter, because currently relocation doesn't work. So mUseCache only
+//  |  when BccCodeAddr is nonzero.)
+//  V
+//  mUseCache: In addition to (USE_CACHE), resName is non-zero
+//  Note: mUseCache will be set to false later on whenever we find that caching
+//        won't work. E.g., when mCodeDataAddr != mCacheHdr->cachedCodeDataAddr.
+//        This is because currently relocation doesn't work.
+//  | (Stricter, initially)
+//  V
+//  mCacheFd: In addition, >= 0 if openCacheFile() returns >= 0
+//  | (Stricter)
+//  V
+//  mCacheNew: In addition, mCacheFd's size is 0, so need to call genCacheFile()
+//             at the end of compile()
+//
+//
+// Main algorithm:
+// ---------------
+// #if !USE_RELOCATE
+// Case 1. ReadBC() doesn't detect a cache file:
+//   compile(), which calls genCacheFile() at the end.
+//   Note: mCacheNew will guard the invocation of genCacheFile()
+// Case 2. ReadBC() find a cache file
+//   loadCacheFile(). But if loadCacheFile() failed, should go to Case 1.
+// #endif
 
 #define LOG_TAG "bcc"
 #include <cutils/log.h>
@@ -321,7 +366,7 @@
   // is initialized in GlobalInitialization()
   //
   static bool GlobalInitialized;
-  static bool BccCodeAddrTaken;
+  static char *BccCodeAddr;
 
   // If given, this will be the name of the target triple to compile for.
   // If not given, the initial values defined in this file will be used.
@@ -355,7 +400,7 @@
     // Set Triple, CPU and Features here
     Triple = TARGET_TRIPLE_STRING;
 
-    // TODO(zonr): NEON for JIT
+    // TODO(sliao): NEON for JIT
     // Features.push_back("+neon");
     // Features.push_back("+vmlx");
     // Features.push_back("+neonfp");
@@ -465,13 +510,13 @@
     return;
   }
 
-  bool mNeverCache;       // Set by readBC()
+  bool mUseCache;       // Set by readBC()
   bool mCacheNew;         // Set by readBC()
   int mCacheFd;           // Set by readBC()
-  char *mCacheMapAddr;    // Set by loader() if mCacheNew is false
-  oBCCHeader *mCacheHdr;  // Set by loader()
-  size_t mCacheSize;      // Set by loader()
-  ptrdiff_t mCacheDiff;   // Set by loader()
+  char *mCacheMapAddr;    // Set by loadCacheFile() if mCacheNew is false
+  oBCCHeader *mCacheHdr;  // Set by loadCacheFile()
+  size_t mCacheSize;      // Set by loadCacheFile()
+  ptrdiff_t mCacheDiff;   // Set by loadCacheFile()
   char *mCodeDataAddr;    // Set by CodeMemoryManager if mCacheNew is true.
                           // Used by genCacheFile() for dumping
 
@@ -590,8 +635,8 @@
       reset();
       std::string ErrMsg;
 
-      if (!Compiler::BccCodeAddrTaken) {  // Try to use BCC_CODE_ADDR
-        mpCodeMem = mmap(reinterpret_cast<void*>(BCC_CODE_ADDR),
+      if (Compiler::BccCodeAddr) {  // Try to use BccCodeAddr
+        mpCodeMem = mmap(reinterpret_cast<void*>(Compiler::BccCodeAddr),
                          MaxCodeSize + MaxGlobalVarSize,
                          PROT_READ | PROT_EXEC | PROT_WRITE,
                          MAP_PRIVATE | MAP_ANON | MAP_FIXED,
@@ -601,13 +646,19 @@
           LOGE("Mmap mpCodeMem at %p failed with reason: %s.\n",
                reinterpret_cast<void *>(BCC_CODE_ADDR), strerror(errno));
           LOGE("Retry to mmap mpCodeMem at arbitary address\n");
+          // TODO(sliao): Future: Should we retry at
+          // BccCodeAddr + MaxCodeSize + MaxGlobalVarSize?
+
+        } else {
+          Compiler::BccCodeAddr += MaxCodeSize + MaxGlobalVarSize;
         }
       }
 
-      if (Compiler::BccCodeAddrTaken || mpCodeMem == MAP_FAILED) {
-        // If BCC_CODE_ADDR has been occuppied, or we can't allocate
+      if (!Compiler::BccCodeAddr || mpCodeMem == MAP_FAILED) {
+        // If no BccCodeAddr specified, or we can't allocate
         // mpCodeMem in previous mmap, then allocate them in arbitary
-        // location.
+        // location and rely on relocation.
+        // Note: Will incur time overhead in relocating when reloading from disk
 
         mpCodeMem = mmap(NULL,
                          MaxCodeSize + MaxGlobalVarSize,
@@ -622,9 +673,6 @@
         }
       }
 
-      // One instance of script is occupping BCC_CODE_ADDR
-      Compiler::BccCodeAddrTaken = true;
-
       // Set global variable pool
       mpGVMem = (void *) ((char *)mpCodeMem + MaxCodeSize);
 
@@ -2526,7 +2574,7 @@
 
  public:
   Compiler()
-      : mNeverCache(true),
+      : mUseCache(false),
         mCacheNew(false),
         mCacheFd(-1),
         mCacheMapAddr(NULL),
@@ -2563,17 +2611,25 @@
                  const BCCchar *resName) {
     GlobalInitialization();
 
-    if (resName) {
-      if (!BccCodeAddrTaken) {
-        // Turn off the default NeverCaching mode
-        mNeverCache = false;
+    if (Compiler::BccCodeAddr /* USE_CACHE */ && resName) {
+      // Turn on mUseCache mode iff
+      // 1. Has resName
+      // and, assuming USE_RELOCATE is false:
+      // 2. Later running code doesn't violate the following condition:
+      //    mCodeDataAddr (set in loadCacheFile()) ==
+      //        mCacheHdr->cachedCodeDataAddr
+      //
+      //    BTW, this condition is achievable only when in the earlier
+      //    cache-generating run,
+      //      mpCodeMem == BccCodeAddr - MaxCodeSize - MaxGlobalVarSize,
+      //      which means the mmap'ed is in the reserved area,
+      //
+      //    Note: Upon violation, mUseCache will be set back to false.
+      mUseCache = true;
 
-        mCacheFd = openCacheFile(resName, true /* createIfMissing */);
-        if (mCacheFd >= 0 && !mCacheNew) {  // Just use cache file
-          return -mCacheFd;
-        }
-      } else {
-        mNeverCache = true;
+      mCacheFd = openCacheFile(resName, true /* createIfMissing */);
+      if (mCacheFd >= 0 && !mCacheNew) {  // Just use cache file
+        return -mCacheFd;
       }
     }
 
@@ -2630,9 +2686,8 @@
     return hasError();
   }
 
-
   // interface for bccLoadBinary()
-  int loader() {
+  int loadCacheFile() {
     // Check File Descriptor
     if (mCacheFd < 0) {
       LOGE("loading cache from invalid mCacheFd = %d\n", (int)mCacheFd);
@@ -2663,7 +2718,7 @@
     {
       // Part 1. Deal with the non-codedata section first
       off_t heuristicCodeOffset = mCacheSize - MaxCodeSize - MaxGlobalVarSize;
-      LOGE("sliao@Loader: mCacheSize=%x, heuristicCodeOffset=%llx",
+      LOGW("TODO(sliao)@loadCacheFile: mCacheSize=%x, heuristicCodeOffset=%llx",
            (unsigned int)mCacheSize,
            (unsigned long long int)heuristicCodeOffset);
 
@@ -2687,11 +2742,11 @@
         LOGE("assertion failed: heuristic code offset is not correct.\n");
         goto bail;
       }
-      LOGE("sliao: mCacheHdr->cachedCodeDataAddr=%x", mCacheHdr->cachedCodeDataAddr);
-      LOGE("mCacheHdr->rootAddr=%x", mCacheHdr->rootAddr);
-      LOGE("mCacheHdr->initAddr=%x", mCacheHdr->initAddr);
-      LOGE("mCacheHdr->codeOffset=%x", mCacheHdr->codeOffset);
-      LOGE("mCacheHdr->codeSize=%x", mCacheHdr->codeSize);
+      LOGW("TODO(sliao): mCacheHdr->cachedCodeDataAddr=%x", mCacheHdr->cachedCodeDataAddr);
+      LOGW("mCacheHdr->rootAddr=%x", mCacheHdr->rootAddr);
+      LOGW("mCacheHdr->initAddr=%x", mCacheHdr->initAddr);
+      LOGW("mCacheHdr->codeOffset=%x", mCacheHdr->codeOffset);
+      LOGW("mCacheHdr->codeSize=%x", mCacheHdr->codeSize);
 
       // Verify the Cache File
       if (memcmp(mCacheHdr->magic, OBCC_MAGIC, 4) != 0) {
@@ -2749,10 +2804,11 @@
           mCodeDataAddr ==
           reinterpret_cast<char *>(mCacheHdr->cachedCodeDataAddr)) {
         // relocate is avoidable
-        BccCodeAddrTaken = true;
+
 
         flock(mCacheFd, LOCK_UN);
       } else {
+#if (USE_RELOCATE)
         mCacheMapAddr = (char *) mmap(0,
                                       mCacheSize,
                                       PROT_READ | PROT_EXEC | PROT_WRITE,
@@ -2767,15 +2823,20 @@
 
         flock(mCacheFd, LOCK_UN);
         mCodeDataAddr = mCacheMapAddr + mCacheHdr->codeOffset;
+#else
+        // TODO(sliao): XXX: Call Compile();
+        flock(mCacheFd, LOCK_UN);
+#endif
       }
     }
 
+#if (USE_RELOCATE)
     // Relocate
     {
       mCacheDiff = mCodeDataAddr -
                    reinterpret_cast<char *>(mCacheHdr->cachedCodeDataAddr);
 
-      if (!BccCodeAddrTaken) {  // To relocate
+      if (mCacheDiff) {  // To relocate
         if (mCacheHdr->rootAddr) {
           mCacheHdr->rootAddr += mCacheDiff;
         }
@@ -2844,9 +2905,11 @@
 
           delete TM;
         }
-      }  // End of if (!BccCodeAddrTaken)
+      }  // End of if (mCacheDiff)
     }
-
+#else
+    // TODO(sliao): XXX: Call Compile();
+#endif  // End of USE_RELOCATE
     return 0;
 
  bail:
@@ -2855,12 +2918,12 @@
       mCacheMapAddr = 0;
     }
 
-    if (BccCodeAddrTaken) {
-      if (munmap(mCodeDataAddr, MaxCodeSize + MaxGlobalVarSize) != 0) {
-        LOGE("munmap failed: %s\n", strerror(errno));
-      }
-      mCodeDataAddr = 0;
+    //    if (BccCodeAddrTaken) {
+    if (munmap(mCodeDataAddr, MaxCodeSize + MaxGlobalVarSize) != 0) {
+      LOGE("munmap failed: %s\n", strerror(errno));
     }
+    mCodeDataAddr = 0;
+    //}
 
  giveup:
     return 1;
@@ -3169,11 +3232,14 @@
       delete TM;
 
     if (mError.empty()) {
-      if (!mNeverCache && mCacheFd >= 0 && mCacheNew) {
+#if !USE_RELOCATE
+      if (mUseCache && mCacheFd >= 0 && mCacheNew) {
         genCacheFile();
         flock(mCacheFd, LOCK_UN);
       }
-
+#else
+      // TODO(sliao)
+#endif
       return false;
     }
 
@@ -3189,7 +3255,7 @@
   // interface for bccGetScriptLabel()
   void *lookup(const char *name) {
     void *addr = NULL;
-    if (!mNeverCache && mCacheFd >= 0 && !mCacheNew) {
+    if (mUseCache && mCacheFd >= 0 && !mCacheNew) {
       if (!strcmp(name, "root")) {
         addr = reinterpret_cast<void *>(mCacheHdr->rootAddr);
       } else if (!strcmp(name, "init")) {
@@ -3210,7 +3276,7 @@
                      BCCvoid **vars) {
     int varCount;
 
-    if (!mNeverCache && mCacheFd >= 0 && !mCacheNew) {
+    if (mUseCache && mCacheFd >= 0 && !mCacheNew) {
       varCount = static_cast<int>(mCacheHdr->exportVarsCount);
       if (actualVarCount)
         *actualVarCount = varCount;
@@ -3252,7 +3318,7 @@
                       BCCvoid **funcs) {
     int funcCount;
 
-    if (!mNeverCache && mCacheFd >= 0 && !mCacheNew) {
+    if (mUseCache && mCacheFd >= 0 && !mCacheNew) {
       funcCount = static_cast<int>(mCacheHdr->exportFuncsCount);
       if (actualFuncCount)
         *actualFuncCount = funcCount;
@@ -3293,7 +3359,7 @@
                   BCCsizei maxStringCount,
                   BCCchar **strings) {
     int stringCount;
-    if (!mNeverCache && mCacheFd >= 0 && !mCacheNew) {
+    if (mUseCache && mCacheFd >= 0 && !mCacheNew) {
       if (actualStringCount)
         *actualStringCount = 0;  // XXX
       return;
@@ -3350,7 +3416,7 @@
 
   ~Compiler() {
     if (!mCodeMemMgr.get()) {
-      // mCodeDataAddr and mCacheMapAddr are from loader and not
+      // mCodeDataAddr and mCacheMapAddr are from loadCacheFile and not
       // managed by CodeMemoryManager.
 
       if (mCodeDataAddr != 0 && mCodeDataAddr != MAP_FAILED) {
@@ -3374,7 +3440,7 @@
   }
 
  private:
-  // Note: loader() and genCacheFile() go hand in hand
+  // Note: loadCacheFile() and genCacheFile() go hand in hand
   void genCacheFile() {
     if (lseek(mCacheFd, 0, SEEK_SET) != 0) {
       LOGE("Unable to seek to 0: %s\n", strerror(errno));
@@ -3588,7 +3654,7 @@
         if (createIfMissing) {
           LOGW("Can't open bcc-cache '%s': %s\n",
                cacheFileName, strerror(errno));
-          mNeverCache = true;
+          mUseCache = false;
         }
         return fd;
       }
@@ -3885,7 +3951,7 @@
 
 bool Compiler::GlobalInitialized = false;
 
-bool Compiler::BccCodeAddrTaken = false;
+char *Compiler::BccCodeAddr = BCC_CODE_ADDR;
 
 // Code generation optimization level for the compiler
 llvm::CodeGenOpt::Level Compiler::CodeGenOptLevel;
@@ -3989,7 +4055,7 @@
 
 extern "C"
 void bccLoadBinary(BCCscript *script) {
-  int result = script->compiler.loader();
+  int result = script->compiler.loadCacheFile();
   if (result)
     script->setError(BCC_INVALID_OPERATION);
 }
