Index: /trunk/src/kObjCache/kObjCache.c
===================================================================
--- /trunk/src/kObjCache/kObjCache.c	(revision 2618)
+++ /trunk/src/kObjCache/kObjCache.c	(revision 2619)
@@ -1354,5 +1354,4 @@
 
 
-
 static size_t kOCCppRdOptFlush(PKOCCPPRD pCppRd, size_t offSrcCur, int fLineDirNext)
 {
@@ -1477,5 +1476,5 @@
 {
     size_t const offSrcLine = pCppRd->offSrcCur;
-    size_t const cchSrcLine = pszEol - pCppRd->pszBuf - pCppRd->offSrcCur;
+    size_t const cchSrcLine = pszEol - pCppRd->pszBuf - (pCppRd->fOptimize & 2 ? pCppRd->offSrcUnoptimized : pCppRd->offSrcCur);
     size_t const cbLeftAssert = *pcbLeft;
     char *pszNewFile;
@@ -1521,5 +1520,6 @@
                  */
                 size_t cchLineDir;
-                kOCCppRdOptFlush(pCppRd, offSrcLine, 1);
+                if (!(pCppRd->fOptimize & 2))
+                    kOCCppRdOptFlush(pCppRd, offSrcLine, 1);
 
                 cchLineDir = kOCCppRdOptFmtLine(pCppRd, uNewLineNo, NULL, 0) - 1; /* sans \n */
@@ -1537,5 +1537,6 @@
 
             kOCCppRdOptSetFile(pCppRd, pszNewFile, cchNewFile); /* save to do this early */
-            kOCCppRdOptFlush(pCppRd, offSrcLine, 1);
+            if (!(pCppRd->fOptimize & 2))
+                kOCCppRdOptFlush(pCppRd, offSrcLine, 1);
 
             cchLineDir = kOCCppRdOptFmtLine(pCppRd, uNewLineNo, pCppRd->pszFileNmBuf, cchNewFile) - 1; /* sans \n */
@@ -3837,9 +3838,17 @@
     if (!kOCSumHasEqualInChain(&pEntry->Old.SumHead, &pEntry->New.SumHead))
     {
-        InfoMsg(2, "no checksum match - comparing output\n");
-        if (!kOCEntryCompareOldAndNewOutput(pEntry))
+        if (pEntry->fOptimizeCpp & 2)
+        {
+            InfoMsg(2, "no checksum match - no need to compare output, -O2.\n");
             pEntry->fNeedCompiling = 1;
+        }
         else
-            kOCSumAddChain(&pEntry->New.SumHead, &pEntry->Old.SumHead);
+        {
+            InfoMsg(2, "no checksum match - comparing output\n");
+            if (!kOCEntryCompareOldAndNewOutput(pEntry))
+                pEntry->fNeedCompiling = 1;
+            else
+                kOCSumAddChain(&pEntry->New.SumHead, &pEntry->Old.SumHead);
+        }
     }
 }
@@ -5018,4 +5027,6 @@
         else if (!strcmp(argv[i], "-O1") || !strcmp(argv[i], "--optimize-1"))
             fOptimizePreprocessorOutput = 1;
+        else if (!strcmp(argv[i], "-O2") || !strcmp(argv[i], "--optimize-2"))
+            fOptimizePreprocessorOutput = 1 | 2;
         else if (!strcmp(argv[i], "-p") || !strcmp(argv[i], "--passthru"))
             fRedirPreCompStdOut = fRedirCompileStdIn = 1;
@@ -5159,6 +5170,6 @@
     if (fOptimizePreprocessorOutput)
     {
-        InfoMsg(1, "g_cbMemMoved=%#x (%d)\n", g_cbMemMoved, g_cbMemMoved);
-        InfoMsg(1, "g_cMemMoves=%#x (%d)\n", g_cMemMoves, g_cMemMoves);
+        InfoMsg(3, "g_cbMemMoved=%#x (%d)\n", g_cbMemMoved, g_cbMemMoved);
+        InfoMsg(3, "g_cMemMoves=%#x (%d)\n", g_cMemMoves, g_cMemMoves);
     }
 
