uType_defer: only call mkErrInfo if -ddump-tc-trace is on (#5631)
authorSimon Marlow <marlowsd@gmail.com>
Tue, 22 Nov 2011 14:09:05 +0000 (14:09 +0000)
committerSimon Marlow <marlowsd@gmail.com>
Tue, 22 Nov 2011 14:09:42 +0000 (14:09 +0000)
Profiling shows we're wasting a lot of time calling mkErrInfo and
tidying the context, work that is wasted if we're not tracing.

There is more to this compilation performance regression than this,
but this is one bug.

compiler/typecheck/TcUnify.lhs

index 7fbcc5c..e049a87 100644 (file)
@@ -59,6 +59,7 @@ import Var
 import VarSet
 import VarEnv
 import ErrUtils
+import DynFlags
 import BasicTypes
 import Maybes ( allMaybes )
 import Util
@@ -542,10 +543,14 @@ uType_defer (item : origin) ty1 ty2
        ; emitFlat (mkEvVarX eqv loc)
 
        -- Error trace only
-       ; ctxt <- getErrCtxt
-       ; doc <- mkErrInfo emptyTidyEnv ctxt
-       ; traceTc "utype_defer" (vcat [ppr eqv, ppr ty1, ppr ty2, ppr origin, doc])
-
+       -- NB. do *not* call mkErrInfo unless tracing is on, because
+       -- it is hugely expensive (#5631)
+       ; ifDOptM Opt_D_dump_tc_trace $ do
+            { ctxt <- getErrCtxt
+            ; doc <- mkErrInfo emptyTidyEnv ctxt
+            ; traceTc "utype_defer" (vcat [ppr eqv, ppr ty1,
+                                           ppr ty2, ppr origin, doc])
+            }
        ; return (mkEqVarLCo eqv) }
 uType_defer [] _ _
   = panic "uType_defer"