Make tickishContains faster
authorBartosz Nitka <niteria@gmail.com>
Mon, 23 Jan 2017 14:51:31 +0000 (09:51 -0500)
committerBen Gamari <ben@smart-cactus.org>
Mon, 23 Jan 2017 19:17:34 +0000 (14:17 -0500)
This just reorders some inequality checks to make the common case
cheaper.

The results are quite dramatic for #11095, but that's probably because
something else is causing it to do too much work.

Before (full https://phabricator.haskell.org/P136):
```
  13,589,495,832 bytes allocated in the heap
```

After (full https://phabricator.haskell.org/P137):
```
   7,885,575,872 bytes allocated in the heap
```

This is with `BuildFlavour = devel2`, so take it with a
a grain of salt.

For reference, with no `-g` I get:
```
155,703,112 bytes allocated in the heap
```
so we're still quite a way off.

Test Plan:
harbormaster
I still have to test locally

Reviewers: austin, bgamari

Subscribers: thomie, simonmar

Differential Revision: https://phabricator.haskell.org/D3001

GHC Trac Issues: #11095

compiler/basicTypes/SrcLoc.hs
compiler/coreSyn/CoreSyn.hs

index 45d92d0..af757f5 100644 (file)
@@ -344,11 +344,14 @@ isOneLineSpan (UnhelpfulSpan _) = False
 -- that it covers at least as much source code. True where spans are equal.
 containsSpan :: RealSrcSpan -> RealSrcSpan -> Bool
 containsSpan s1 s2
-  = srcSpanFile s1 == srcSpanFile s2
-    && (srcSpanStartLine s1, srcSpanStartCol s1)
-       <= (srcSpanStartLine s2, srcSpanStartCol s2)
-    && (srcSpanEndLine s1, srcSpanEndCol s1)
-       >= (srcSpanEndLine s2, srcSpanEndCol s2)
+  =  srcSpanEndCol s1 >= srcSpanEndCol s2
+  && srcSpanStartCol s1 <= srcSpanStartCol s2
+  && srcSpanEndLine s1 >= srcSpanEndLine s2
+  && srcSpanStartLine s1 <= srcSpanStartLine s2
+  && srcSpanFile s1 == srcSpanFile s2
+  -- ordered roughly by the likelihood of failing:
+  --   * we're more likely to be comparing source spans from the same file
+  --   * we're more likely to be comparing source spans on the same line
 
 {-
 %************************************************************************
index bcf9e6e..4ea913b 100644 (file)
@@ -809,7 +809,8 @@ tickishPlace SourceNote{}  = PlaceNonLam
 -- making the second tick redundant.
 tickishContains :: Eq b => Tickish b -> Tickish b -> Bool
 tickishContains (SourceNote sp1 n1) (SourceNote sp2 n2)
-  = n1 == n2 && containsSpan sp1 sp2
+  = containsSpan sp1 sp2 && n1 == n2
+    -- compare the String last
 tickishContains t1 t2
   = t1 == t2