summaryrefslogtreecommitdiff
path: root/compiler/GHC/StgToCmm/Expr.hs
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/GHC/StgToCmm/Expr.hs')
-rw-r--r--compiler/GHC/StgToCmm/Expr.hs68
1 files changed, 0 insertions, 68 deletions
diff --git a/compiler/GHC/StgToCmm/Expr.hs b/compiler/GHC/StgToCmm/Expr.hs
index f39d02839c..3836aa3d2a 100644
--- a/compiler/GHC/StgToCmm/Expr.hs
+++ b/compiler/GHC/StgToCmm/Expr.hs
@@ -301,75 +301,7 @@ data GcPlan
-------------------------------------
cgCase :: CgStgExpr -> Id -> AltType -> [CgStgAlt] -> FCode ReturnKind
-cgCase (StgOpApp (StgPrimOp op) args _) bndr (AlgAlt tycon) alts
- | isEnumerationTyCon tycon -- Note [case on bool]
- = do { tag_expr <- do_enum_primop op args
-
- -- If the binder is not dead, convert the tag to a constructor
- -- and assign it. See Note [Dead-binder optimisation]
- ; unless (isDeadBinder bndr) $ do
- { dflags <- getDynFlags
- ; tmp_reg <- bindArgToReg (NonVoid bndr)
- ; emitAssign (CmmLocal tmp_reg)
- (tagToClosure dflags tycon tag_expr) }
-
- ; (mb_deflt, branches) <- cgAlgAltRhss (NoGcInAlts,AssignedDirectly)
- (NonVoid bndr) alts
- -- See Note [GC for conditionals]
- ; emitSwitch tag_expr branches mb_deflt 0 (tyConFamilySize tycon - 1)
- ; return AssignedDirectly
- }
- where
- do_enum_primop :: PrimOp -> [StgArg] -> FCode CmmExpr
- do_enum_primop TagToEnumOp [arg] -- No code!
- = getArgAmode (NonVoid arg)
- do_enum_primop primop args
- = do dflags <- getDynFlags
- tmp <- newTemp (bWord dflags)
- cgPrimOp [tmp] primop args
- return (CmmReg (CmmLocal tmp))
-
{-
-Note [case on bool]
-~~~~~~~~~~~~~~~~~~~
-This special case handles code like
-
- case a <# b of
- True ->
- False ->
-
---> case tagToEnum# (a <$# b) of
- True -> .. ; False -> ...
-
---> case (a <$# b) of r ->
- case tagToEnum# r of
- True -> .. ; False -> ...
-
-If we let the ordinary case code handle it, we'll get something like
-
- tmp1 = a < b
- tmp2 = Bool_closure_tbl[tmp1]
- if (tmp2 & 7 != 0) then ... // normal tagged case
-
-but this junk won't optimise away. What we really want is just an
-inline comparison:
-
- if (a < b) then ...
-
-So we add a special case to generate
-
- tmp1 = a < b
- if (tmp1 == 0) then ...
-
-and later optimisations will further improve this.
-
-Now that #6135 has been resolved it should be possible to remove that
-special case. The idea behind this special case and pre-6135 implementation
-of Bool-returning primops was that tagToEnum# was added implicitly in the
-codegen and then optimized away. Now the call to tagToEnum# is explicit
-in the source code, which allows to optimize it away at the earlier stages
-of compilation (i.e. at the Core level).
-
Note [Scrutinising VoidRep]
~~~~~~~~~~~~~~~~~~~~~~~~~~~
Suppose we have this STG code: