Fix a bug in unboxed sum layout generation
authorÖmer Sinan Ağacan <omeragacan@gmail.com>
Tue, 9 Aug 2016 22:30:56 +0000 (22:30 +0000)
committerÖmer Sinan Ağacan <omeragacan@gmail.com>
Tue, 9 Aug 2016 22:30:56 +0000 (22:30 +0000)
We need to maintain the invariant that the layout fields are always sorted.

Two tests that were previously broken are added.

compiler/simplStg/RepType.hs
testsuite/tests/unboxedsums/unboxedsums_unit_tests.hs

index 7e42a86..ca8438e 100644 (file)
@@ -199,7 +199,9 @@ ubxSumRepType constrs0 =
       | Just s' <- s `fitsIn` es
       = -- found a slot, use it
         s' : merge ess ss
-
+      | s < es
+      = -- we need a new slot and this is the right place for it
+        s : merge (es : ess) ss
       | otherwise
       = -- keep searching for a slot
         es : merge ess (s : ss)
index 5c0b929..399e074 100644 (file)
@@ -42,7 +42,7 @@ uniq_tests = do
 
 layout_tests :: IO ()
 layout_tests = sequence_
-    [ layout1, layout2, layout3, enum_layout ]
+    [ layout1, layout2, layout3, layout4, layout5, enum_layout ]
   where
     assert_layout tn tys layout =
       let
@@ -75,6 +75,18 @@ layout_tests = sequence_
         , ubxtup [ intPrimTy, intTy, intPrimTy, intTy ] ]
         [ WordSlot, PtrSlot, PtrSlot, WordSlot, WordSlot ]
 
+    layout4 =
+      assert_layout "layout4"
+        [ ubxtup [ floatPrimTy, floatPrimTy ]
+        , ubxtup [ intPrimTy, intPrimTy ] ]
+        [ WordSlot, WordSlot, WordSlot, FloatSlot, FloatSlot ]
+
+    layout5 =
+      assert_layout "layout5"
+        [ ubxtup [ intPrimTy, intPrimTy ]
+        , ubxtup [ floatPrimTy, floatPrimTy ] ]
+        [ WordSlot, WordSlot, WordSlot, FloatSlot, FloatSlot ]
+
     enum_layout =
       assert_layout "enum"
         (replicate 10 (ubxtup []))