diff --git a/compiler/main/DynFlags.hs b/compiler/main/DynFlags.hs
index 03bb5292dab5f42fedd121c26b56c6a9b5ebebb7..28c57e3ba82328effb75bdeb320b581c58be6f91 100644
--- a/compiler/main/DynFlags.hs
+++ b/compiler/main/DynFlags.hs
@@ -601,6 +601,7 @@ data GeneralFlag
    -- misc opts
    | Opt_Pp
    | Opt_ForceRecomp
+   | Opt_SkipRecompUnstableTH
    | Opt_IgnoreOptimChanges
    | Opt_IgnoreHpcChanges
    | Opt_ExcessPrecision
@@ -4228,6 +4229,7 @@ fFlagsDeps = [
   flagSpec "flat-cache"                       Opt_FlatCache,
   flagSpec "float-in"                         Opt_FloatIn,
   flagSpec "force-recomp"                     Opt_ForceRecomp,
+  flagSpec "skip-recomp-unstable-th"          Opt_SkipRecompUnstableTH,
   flagSpec "ignore-optim-changes"             Opt_IgnoreOptimChanges,
   flagSpec "ignore-hpc-changes"               Opt_IgnoreHpcChanges,
   flagSpec "full-laziness"                    Opt_FullLaziness,
diff --git a/compiler/main/HscMain.hs b/compiler/main/HscMain.hs
index 9bb6b4e3911803161bbda9da2c0022f6d57f323d..a2dfc58069ae4d0125a833c9d65d871143fcc7bf 100644
--- a/compiler/main/HscMain.hs
+++ b/compiler/main/HscMain.hs
@@ -661,6 +661,8 @@ hscIncrementalFrontend
                      SourceUnmodifiedAndStable -> True
                      _                         -> False
 
+        skipRecompUnstableTH = gopt Opt_SkipRecompUnstableTH (hsc_dflags hsc_env)
+
     case m_tc_result of
          Just tc_result
           | not always_do_basic_recompilation_check ->
@@ -692,7 +694,7 @@ hscIncrementalFrontend
                     -- one-shot mode.
                     case m_tc_result of
                     Nothing
-                     | mi_used_th iface && not stable ->
+                     | mi_used_th iface && not stable && not skipRecompUnstableTH ->
                         compile mb_old_hash (RecompBecause "TH")
                     _ ->
                         skip iface