A panic in CmmBuildInfoTables.bundle shouldn't be a panic (#9329)
authorSimon Marlow <marlowsd@gmail.com>
Thu, 31 Jul 2014 10:47:16 +0000 (11:47 +0100)
committerSimon Marlow <marlowsd@gmail.com>
Fri, 1 Aug 2014 11:45:41 +0000 (12:45 +0100)
Summary:
This code needs more comments, but I believe this is safe.  By
definition I can't have broken anything that was working by turning a
panic into a non-panic anyway.

Test Plan: validate

Reviewers: hvr, simonpj, austin

Subscribers: simonmar, relrod, ezyang, carter

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

GHC Trac Issues: #9329

compiler/cmm/CmmBuildInfoTables.hs
testsuite/tests/codeGen/should_compile/T9329.cmm [new file with mode: 0644]
testsuite/tests/codeGen/should_compile/all.T

index e10716a..6521a84 100644 (file)
@@ -286,7 +286,7 @@ bundle :: Map CLabel CAFSet
        -> (CAFEnv, CmmDecl)
        -> (CAFSet, Maybe CLabel)
        -> (BlockEnv CAFSet, CmmDecl)
-bundle flatmap (env, decl@(CmmProc infos lbl _ g)) (closure_cafs, mb_lbl)
+bundle flatmap (env, decl@(CmmProc infos _lbl _ g)) (closure_cafs, mb_lbl)
   = ( mapMapWithKey get_cafs (info_tbls infos), decl )
  where
   entry = g_entry g
@@ -297,9 +297,13 @@ bundle flatmap (env, decl@(CmmProc infos lbl _ g)) (closure_cafs, mb_lbl)
 
   get_cafs l _
     | l == entry = entry_cafs
-    | otherwise  = if not (mapMember l env)
-                      then pprPanic "bundle" (ppr l <+> ppr lbl <+> ppr (info_tbls infos) $$ ppr env $$ ppr decl)
-                      else flatten flatmap $ expectJust "bundle" $ mapLookup l env
+    | Just info <- mapLookup l env = flatten flatmap info
+    | otherwise  = Set.empty
+    -- the label might not be in the env if the code corresponding to
+    -- this info table was optimised away (perhaps because it was
+    -- unreachable).  In this case it doesn't matter what SRT we
+    -- infer, since the info table will not appear in the generated
+    -- code.  See #9329.
 
 bundle _flatmap (_, decl) _
   = ( mapEmpty, decl )
diff --git a/testsuite/tests/codeGen/should_compile/T9329.cmm b/testsuite/tests/codeGen/should_compile/T9329.cmm
new file mode 100644 (file)
index 0000000..da20069
--- /dev/null
@@ -0,0 +1,5 @@
+foo ()
+{
+  STK_CHK_GEN_N (8); /* panics */
+  return (0);
+}
index a3020fe..a6b6894 100644 (file)
@@ -24,3 +24,4 @@ test('T7574', [cmm_src, omit_ways(['llvm', 'optllvm'])], compile, [''])
 test('T8205', normal, compile, ['-O0'])
 test('T9155', normal, compile, ['-O2'])
 test('T9303', normal, compile, ['-O2'])
+test('T9329', [cmm_src], compile, [''])