ghc-lib-parser 0.20210701 → 0.20210801
raw patch · 67 files changed
+4260/−2283 lines, 67 filesdep −hpc
Dependencies removed: hpc
Files
- compiler/GHC/Builtin/Names.hs +8/−19
- compiler/GHC/Builtin/Types/Prim.hs +28/−14
- compiler/GHC/Cmm/MachOp.hs +35/−0
- compiler/GHC/Core/Coercion.hs +52/−13
- compiler/GHC/Core/Make.hs +27/−14
- compiler/GHC/Core/Opt/Arity.hs +239/−161
- compiler/GHC/Core/Opt/ConstantFold.hs +260/−35
- compiler/GHC/Core/Opt/OccurAnal.hs +248/−221
- compiler/GHC/Core/Predicate.hs +35/−0
- compiler/GHC/Core/SimpleOpt.hs +12/−2
- compiler/GHC/Core/Unfold.hs +5/−2
- compiler/GHC/Core/Unfold/Make.hs +3/−3
- compiler/GHC/Core/Unify.hs +2/−0
- compiler/GHC/Core/Utils.hs +52/−16
- compiler/GHC/Driver/Config/Finder.hs +26/−0
- compiler/GHC/Driver/Errors/Ppr.hs +90/−0
- compiler/GHC/Driver/Errors/Types.hs +138/−0
- compiler/GHC/Driver/Hooks.hs +2/−2
- compiler/GHC/Driver/Phases.hs +20/−21
- compiler/GHC/Driver/Pipeline/Monad.hs +55/−131
- compiler/GHC/Driver/Pipeline/Phases.hs +52/−0
- compiler/GHC/Driver/Session.hs +11/−10
- compiler/GHC/Hs/Expr.hs +5/−3
- compiler/GHC/HsToCore/Errors/Ppr.hs +3/−3
- compiler/GHC/HsToCore/Errors/Types.hs +0/−1
- compiler/GHC/Parser/Errors/Basic.hs +22/−0
- compiler/GHC/Parser/Errors/Ppr.hs +103/−115
- compiler/GHC/Parser/Errors/Types.hs +19/−12
- compiler/GHC/Parser/Header.hs +13/−13
- compiler/GHC/Platform/Ways.hs +11/−1
- compiler/GHC/Tc/Errors/Ppr.hs +101/−0
- compiler/GHC/Tc/Errors/Types.hs +172/−2
- compiler/GHC/Tc/Solver/Types.hs +5/−3
- compiler/GHC/Tc/Types/Evidence.hs +43/−22
- compiler/GHC/Tc/Types/Origin.hs +48/−6
- compiler/GHC/Tc/Utils/TcType.hs +1/−22
- compiler/GHC/Types/Error.hs +7/−0
- compiler/GHC/Types/Hint.hs +136/−4
- compiler/GHC/Types/Hint/Ppr.hs +43/−6
- compiler/GHC/Types/Id/Make.hs +14/−9
- compiler/GHC/Types/Literal.hs +23/−4
- compiler/GHC/Unit/Finder.hs +655/−0
- compiler/GHC/Unit/Info.hs +5/−6
- compiler/GHC/Unit/Module/ModSummary.hs +3/−0
- compiler/GHC/Unit/State.hs +25/−3
- compiler/GHC/Utils/Logger.hs +12/−3
- compiler/GHC/Utils/Monad.hs +19/−0
- compiler/GHC/Utils/Outputable.hs +20/−1
- compiler/GHC/Utils/Panic.hs +1/−4
- compiler/GHC/Utils/Panic/Plain.hs +1/−11
- compiler/GHC/Utils/TmpFs.hs +22/−26
- compiler/GHC/Utils/Trace.hs +10/−0
- compiler/cbits/genSym.c +1/−3
- ghc-lib-parser.cabal +5/−2
- ghc-lib/stage0/compiler/build/GHC/Parser/Lexer.hs +12/−11
- ghc-lib/stage0/compiler/build/primop-data-decl.hs-incl +0/−9
- ghc-lib/stage0/compiler/build/primop-list.hs-incl +0/−9
- ghc-lib/stage0/compiler/build/primop-primop-info.hs-incl +5/−14
- ghc-lib/stage0/compiler/build/primop-tag.hs-incl +1276/−1285
- ghc-lib/stage0/lib/ghcautoconf.h +3/−0
- ghc-lib/stage0/libraries/ghc-boot/build/GHC/Version.hs +4/−4
- libraries/ghc-boot-th/GHC/LanguageExtensions/Type.hs +1/−1
- libraries/ghci/GHCi/Message.hs +1/−1
- libraries/template-haskell/Language/Haskell/TH/Lib.hs +3/−0
- libraries/template-haskell/Language/Haskell/TH/Lib/Internal.hs +4/−0
- libraries/template-haskell/Language/Haskell/TH/Ppr.hs +2/−0
- libraries/template-haskell/Language/Haskell/TH/Syntax.hs +1/−0
compiler/GHC/Builtin/Names.hs view
@@ -517,7 +517,7 @@ k1TyConName, m1TyConName, sumTyConName, prodTyConName, compTyConName, rTyConName, dTyConName, cTyConName, sTyConName, rec0TyConName,- d1TyConName, c1TyConName, s1TyConName, noSelTyConName,+ d1TyConName, c1TyConName, s1TyConName, repTyConName, rep1TyConName, uRecTyConName, uAddrTyConName, uCharTyConName, uDoubleTyConName, uFloatTyConName, uIntTyConName, uWordTyConName,@@ -550,16 +550,16 @@ gHC_GHCI, gHC_GHCI_HELPERS, gHC_CSTRING, gHC_SHOW, gHC_READ, gHC_NUM, gHC_MAYBE, gHC_NUM_INTEGER, gHC_NUM_NATURAL, gHC_NUM_BIGNAT,- gHC_LIST, gHC_TUPLE, dATA_TUPLE, dATA_EITHER, dATA_LIST, dATA_STRING,+ gHC_LIST, gHC_TUPLE, dATA_EITHER, dATA_LIST, dATA_STRING, dATA_FOLDABLE, dATA_TRAVERSABLE, gHC_CONC, gHC_IO, gHC_IO_Exception, gHC_ST, gHC_IX, gHC_STABLE, gHC_PTR, gHC_ERR, gHC_REAL, gHC_FLOAT, gHC_TOP_HANDLER, sYSTEM_IO, dYNAMIC, tYPEABLE, tYPEABLE_INTERNAL, gENERICS, rEAD_PREC, lEX, gHC_INT, gHC_WORD, mONAD, mONAD_FIX, mONAD_ZIP, mONAD_FAIL,- aRROW, cONTROL_APPLICATIVE, gHC_DESUGAR, rANDOM, gHC_EXTS,+ aRROW, gHC_DESUGAR, rANDOM, gHC_EXTS, cONTROL_EXCEPTION_BASE, gHC_TYPELITS, gHC_TYPELITS_INTERNAL,- gHC_TYPENATS, gHC_TYPENATS_INTERNAL, dATA_TYPE_EQUALITY,+ gHC_TYPENATS, gHC_TYPENATS_INTERNAL, dATA_COERCE, dEBUG_TRACE, uNSAFE_COERCE :: Module gHC_PRIM = mkPrimModule (fsLit "GHC.Prim") -- Primitive types and values@@ -585,7 +585,6 @@ gHC_NUM_BIGNAT = mkBignumModule (fsLit "GHC.Num.BigNat") gHC_LIST = mkBaseModule (fsLit "GHC.List") gHC_TUPLE = mkPrimModule (fsLit "GHC.Tuple")-dATA_TUPLE = mkBaseModule (fsLit "Data.Tuple") dATA_EITHER = mkBaseModule (fsLit "Data.Either") dATA_LIST = mkBaseModule (fsLit "Data.List") dATA_STRING = mkBaseModule (fsLit "Data.String")@@ -616,7 +615,6 @@ mONAD_ZIP = mkBaseModule (fsLit "Control.Monad.Zip") mONAD_FAIL = mkBaseModule (fsLit "Control.Monad.Fail") aRROW = mkBaseModule (fsLit "Control.Arrow")-cONTROL_APPLICATIVE = mkBaseModule (fsLit "Control.Applicative") gHC_DESUGAR = mkBaseModule (fsLit "GHC.Desugar") rANDOM = mkBaseModule (fsLit "System.Random") gHC_EXTS = mkBaseModule (fsLit "GHC.Exts")@@ -626,7 +624,6 @@ gHC_TYPELITS_INTERNAL = mkBaseModule (fsLit "GHC.TypeLits.Internal") gHC_TYPENATS = mkBaseModule (fsLit "GHC.TypeNats") gHC_TYPENATS_INTERNAL = mkBaseModule (fsLit "GHC.TypeNats.Internal")-dATA_TYPE_EQUALITY = mkBaseModule (fsLit "Data.Type.Equality") dATA_COERCE = mkBaseModule (fsLit "Data.Coerce") dEBUG_TRACE = mkBaseModule (fsLit "Debug.Trace") uNSAFE_COERCE = mkBaseModule (fsLit "Unsafe.Coerce")@@ -664,10 +661,6 @@ pRELUDE_NAME = mkModuleNameFS (fsLit "Prelude") mAIN_NAME = mkModuleNameFS (fsLit "Main") -dATA_ARRAY_PARALLEL_NAME, dATA_ARRAY_PARALLEL_PRIM_NAME :: ModuleName-dATA_ARRAY_PARALLEL_NAME = mkModuleNameFS (fsLit "Data.Array.Parallel")-dATA_ARRAY_PARALLEL_PRIM_NAME = mkModuleNameFS (fsLit "Data.Array.Parallel.Prim")- mkPrimModule :: FastString -> Module mkPrimModule m = mkModule primUnit (mkModuleNameFS m) @@ -984,7 +977,7 @@ k1TyConName, m1TyConName, sumTyConName, prodTyConName, compTyConName, rTyConName, dTyConName, cTyConName, sTyConName, rec0TyConName,- d1TyConName, c1TyConName, s1TyConName, noSelTyConName,+ d1TyConName, c1TyConName, s1TyConName, repTyConName, rep1TyConName, uRecTyConName, uAddrTyConName, uCharTyConName, uDoubleTyConName, uFloatTyConName, uIntTyConName, uWordTyConName,@@ -1016,7 +1009,6 @@ d1TyConName = tcQual gHC_GENERICS (fsLit "D1") d1TyConKey c1TyConName = tcQual gHC_GENERICS (fsLit "C1") c1TyConKey s1TyConName = tcQual gHC_GENERICS (fsLit "S1") s1TyConKey-noSelTyConName = tcQual gHC_GENERICS (fsLit "NoSelector") noSelTyConKey repTyConName = tcQual gHC_GENERICS (fsLit "Rep") repTyConKey rep1TyConName = tcQual gHC_GENERICS (fsLit "Rep1") rep1TyConKey@@ -1889,7 +1881,7 @@ wordPrimTyConKey, wordTyConKey, word8PrimTyConKey, word8TyConKey, word16PrimTyConKey, word16TyConKey, word32PrimTyConKey, word32TyConKey, word64PrimTyConKey, word64TyConKey,- anyBoxConKey, kindConKey, boxityConKey,+ kindConKey, boxityConKey, typeConKey, threadIdPrimTyConKey, bcoPrimTyConKey, ptrTyConKey, funPtrTyConKey, tVarPrimTyConKey, eqPrimTyConKey, eqReprPrimTyConKey, eqPhantPrimTyConKey,@@ -1912,7 +1904,6 @@ word32TyConKey = mkPreludeTyConUnique 66 word64PrimTyConKey = mkPreludeTyConUnique 67 word64TyConKey = mkPreludeTyConUnique 68-anyBoxConKey = mkPreludeTyConUnique 71 kindConKey = mkPreludeTyConUnique 72 boxityConKey = mkPreludeTyConUnique 73 typeConKey = mkPreludeTyConUnique 74@@ -1951,7 +1942,7 @@ k1TyConKey, m1TyConKey, sumTyConKey, prodTyConKey, compTyConKey, rTyConKey, dTyConKey, cTyConKey, sTyConKey, rec0TyConKey,- d1TyConKey, c1TyConKey, s1TyConKey, noSelTyConKey,+ d1TyConKey, c1TyConKey, s1TyConKey, repTyConKey, rep1TyConKey, uRecTyConKey, uAddrTyConKey, uCharTyConKey, uDoubleTyConKey, uFloatTyConKey, uIntTyConKey, uWordTyConKey :: Unique@@ -1976,7 +1967,6 @@ d1TyConKey = mkPreludeTyConUnique 151 c1TyConKey = mkPreludeTyConUnique 152 s1TyConKey = mkPreludeTyConUnique 153-noSelTyConKey = mkPreludeTyConUnique 154 repTyConKey = mkPreludeTyConUnique 155 rep1TyConKey = mkPreludeTyConUnique 156@@ -2277,7 +2267,7 @@ -} wildCardKey, absentErrorIdKey, augmentIdKey, appendIdKey,- buildIdKey, errorIdKey, foldrIdKey, recSelErrorIdKey,+ buildIdKey, foldrIdKey, recSelErrorIdKey, seqIdKey, eqStringIdKey, noMethodBindingErrorIdKey, nonExhaustiveGuardsErrorIdKey, runtimeErrorIdKey, patErrorIdKey, voidPrimIdKey,@@ -2295,7 +2285,6 @@ augmentIdKey = mkPreludeMiscIdUnique 2 appendIdKey = mkPreludeMiscIdUnique 3 buildIdKey = mkPreludeMiscIdUnique 4-errorIdKey = mkPreludeMiscIdUnique 5 foldrIdKey = mkPreludeMiscIdUnique 6 recSelErrorIdKey = mkPreludeMiscIdUnique 7 seqIdKey = mkPreludeMiscIdUnique 8
compiler/GHC/Builtin/Types/Prim.hs view
@@ -28,13 +28,17 @@ runtimeRep1TyVar, runtimeRep2TyVar, runtimeRep3TyVar, runtimeRep1TyVarInf, runtimeRep2TyVarInf, runtimeRep1Ty, runtimeRep2Ty, runtimeRep3Ty,- levity1TyVar, levity1TyVarInf, levity1Ty,+ levity1TyVar, levity2TyVar,+ levity1TyVarInf, levity2TyVarInf,+ levity1Ty, levity2Ty, openAlphaTyVar, openBetaTyVar, openGammaTyVar, openAlphaTyVarSpec, openBetaTyVarSpec, openGammaTyVarSpec, openAlphaTy, openBetaTy, openGammaTy, - levPolyTyVar1, levPolyTyVar1Spec, levPolyTy1,+ levPolyAlphaTyVar, levPolyBetaTyVar,+ levPolyAlphaTyVarSpec, levPolyBetaTyVarSpec,+ levPolyAlphaTy, levPolyBetaTy, multiplicityTyVar1, multiplicityTyVar2, @@ -422,25 +426,35 @@ openBetaTy = mkTyVarTy openBetaTyVar openGammaTy = mkTyVarTy openGammaTyVar -levity1TyVar :: TyVar-(levity1TyVar : _)- = drop 11 (mkTemplateTyVars (repeat levityTy)) -- selects 'l'+levity1TyVar, levity2TyVar :: TyVar+(levity2TyVar : levity1TyVar : _) -- NB: levity2TyVar before levity1TyVar+ = drop 10 (mkTemplateTyVars (repeat levityTy)) -- selects 'k', 'l'+-- The ordering of levity2TyVar before levity1TyVar is chosen so that+-- the more common levity1TyVar uses the levity variable 'l'. -levity1TyVarInf :: TyVarBinder+levity1TyVarInf, levity2TyVarInf :: TyVarBinder levity1TyVarInf = mkTyVarBinder Inferred levity1TyVar+levity2TyVarInf = mkTyVarBinder Inferred levity2TyVar -levity1Ty :: Type+levity1Ty, levity2Ty :: Type levity1Ty = mkTyVarTy levity1TyVar+levity2Ty = mkTyVarTy levity2TyVar -levPolyTyVar1 :: TyVar-[levPolyTyVar1] = mkTemplateTyVars [tYPE (mkTyConApp boxedRepDataConTyCon [levity1Ty])]--- tv :: TYPE ('BoxedRep l)+levPolyAlphaTyVar, levPolyBetaTyVar :: TyVar+[levPolyAlphaTyVar, levPolyBetaTyVar] =+ mkTemplateTyVars+ [tYPE (mkTyConApp boxedRepDataConTyCon [levity1Ty])+ ,tYPE (mkTyConApp boxedRepDataConTyCon [levity2Ty])]+-- alpha :: TYPE ('BoxedRep l)+-- beta :: TYPE ('BoxedRep k) -levPolyTyVar1Spec :: TyVarBinder-levPolyTyVar1Spec = mkTyVarBinder Specified levPolyTyVar1+levPolyAlphaTyVarSpec, levPolyBetaTyVarSpec :: TyVarBinder+levPolyAlphaTyVarSpec = mkTyVarBinder Specified levPolyAlphaTyVar+levPolyBetaTyVarSpec = mkTyVarBinder Specified levPolyBetaTyVar -levPolyTy1 :: Type-levPolyTy1 = mkTyVarTy levPolyTyVar1+levPolyAlphaTy, levPolyBetaTy :: Type+levPolyAlphaTy = mkTyVarTy levPolyAlphaTyVar+levPolyBetaTy = mkTyVarTy levPolyBetaTyVar multiplicityTyVar1, multiplicityTyVar2 :: TyVar (multiplicityTyVar1 : multiplicityTyVar2 : _)
compiler/GHC/Cmm/MachOp.hs view
@@ -586,6 +586,41 @@ | MO_F32_Fabs | MO_F32_Sqrt + -- 64-bit int/word ops for when they exceed the native word size+ -- (i.e. on 32-bit architectures)+ | MO_I64_ToI+ | MO_I64_FromI+ | MO_W64_ToW+ | MO_W64_FromW++ | MO_x64_Neg+ | MO_x64_Add+ | MO_x64_Sub+ | MO_x64_Mul+ | MO_I64_Quot+ | MO_I64_Rem+ | MO_W64_Quot+ | MO_W64_Rem++ | MO_x64_And+ | MO_x64_Or+ | MO_x64_Xor+ | MO_x64_Not+ | MO_x64_Shl+ | MO_I64_Shr+ | MO_W64_Shr++ | MO_x64_Eq+ | MO_x64_Ne+ | MO_I64_Ge+ | MO_I64_Gt+ | MO_I64_Le+ | MO_I64_Lt+ | MO_W64_Ge+ | MO_W64_Gt+ | MO_W64_Le+ | MO_W64_Lt+ | MO_UF_Conv Width | MO_S_Mul2 Width
compiler/GHC/Core/Coercion.hs view
@@ -34,7 +34,7 @@ mkPiCo, mkPiCos, mkCoCast, mkSymCo, mkTransCo, mkNthCo, mkNthCoFunCo, nthCoRole, mkLRCo,- mkInstCo, mkAppCo, mkAppCos, mkTyConAppCo, mkFunCo,+ mkInstCo, mkAppCo, mkAppCos, mkTyConAppCo, mkFunCo, mkFunResCo, mkForAllCo, mkForAllCos, mkHomoForAllCos, mkPhantomCo, mkHoleCo, mkUnivCo, mkSubCo,@@ -71,7 +71,9 @@ isReflCoVar_maybe, isGReflMCo, mkGReflLeftMCo, mkGReflRightMCo, mkCoherenceRightMCo, - coToMCo, mkTransMCo, mkTransMCoL, mkCastTyMCo, mkSymMCo, isReflMCo,+ coToMCo, mkTransMCo, mkTransMCoL, mkTransMCoR, mkCastTyMCo, mkSymMCo,+ mkHomoForAllMCo, mkFunResMCo, mkPiMCos,+ isReflMCo, checkReflexiveMCo, -- ** Coercion variables mkCoVar, isCoVar, coVarName, setCoVarName, setCoVarUnique,@@ -309,6 +311,11 @@ coToMCo co | isReflCo co = MRefl | otherwise = MCo co +checkReflexiveMCo :: MCoercion -> MCoercion+checkReflexiveMCo MRefl = MRefl+checkReflexiveMCo (MCo co) | isReflexiveCo co = MRefl+ | otherwise = MCo co+ -- | Tests if this MCoercion is obviously generalized reflexive -- Guaranteed to work very quickly. isGReflMCo :: MCoercion -> Bool@@ -333,6 +340,10 @@ mkTransMCoL MRefl co2 = MCo co2 mkTransMCoL (MCo co1) co2 = MCo (mkTransCo co1 co2) +mkTransMCoR :: Coercion -> MCoercion -> MCoercion+mkTransMCoR co1 MRefl = coToMCo co1+mkTransMCoR co1 (MCo co2) = MCo (mkTransCo co1 co2)+ -- | Get the reverse of an 'MCoercion' mkSymMCo :: MCoercion -> MCoercion mkSymMCo MRefl = MRefl@@ -343,6 +354,18 @@ mkCastTyMCo ty MRefl = ty mkCastTyMCo ty (MCo co) = ty `mkCastTy` co +mkHomoForAllMCo :: TyCoVar -> MCoercion -> MCoercion+mkHomoForAllMCo _ MRefl = MRefl+mkHomoForAllMCo tcv (MCo co) = MCo (mkHomoForAllCos [tcv] co)++mkPiMCos :: [Var] -> MCoercion -> MCoercion+mkPiMCos _ MRefl = MRefl+mkPiMCos vs (MCo co) = MCo (mkPiCos Representational vs co)++mkFunResMCo :: Scaled Type -> MCoercionR -> MCoercionR+mkFunResMCo _ MRefl = MRefl+mkFunResMCo arg_ty (MCo co) = MCo (mkFunResCo Representational arg_ty co)+ mkGReflLeftMCo :: Role -> Type -> MCoercionN -> Coercion mkGReflLeftMCo r ty MRefl = mkReflCo r ty mkGReflLeftMCo r ty (MCo co) = mkGReflLeftCo r ty co@@ -402,6 +425,10 @@ -- Expects co :: (s1 -> t1) ~ (s2 -> t2) -- Returns (co1 :: s1~s2, co2 :: t1~t2) -- See Note [Function coercions] for the "3" and "4"++decomposeFunCo _ (FunCo _ w co1 co2) = (w, co1, co2)+ -- Short-circuits the calls to mkNthCo+ decomposeFunCo r co = assertPpr all_ok (ppr co) (mkNthCo Nominal 0 co, mkNthCo r 3 co, mkNthCo r 4 co) where@@ -1051,18 +1078,18 @@ -> Coercion mkNthCo r n co = assertPpr good_call bad_call_msg $- go r n co+ go n co where Pair ty1 ty2 = coercionKind co - go r 0 co+ go 0 co | Just (ty, _) <- isReflCo_maybe co , Just (tv, _) <- splitForAllTyCoVar_maybe ty = -- works for both tyvar and covar assert (r == Nominal) $ mkNomReflCo (varType tv) - go r n co+ go n co | Just (ty, r0) <- isReflCo_maybe co , let tc = tyConAppTyCon ty = assertPpr (ok_tc_app ty n) (ppr n $$ ppr ty) $@@ -1077,7 +1104,7 @@ | otherwise = False - go r 0 (ForAllCo _ kind_co _)+ go 0 (ForAllCo _ kind_co _) = assert (r == Nominal) kind_co -- If co :: (forall a1:k1. t1) ~ (forall a2:k2. t2)@@ -1085,10 +1112,10 @@ -- If co :: (forall a1:t1 ~ t2. t1) ~ (forall a2:t3 ~ t4. t2) -- then (nth 0 co :: (t1 ~ t2) ~N (t3 ~ t4)) - go _ n (FunCo _ w arg res)+ go n (FunCo _ w arg res) = mkNthCoFunCo n w arg res - go r n (TyConAppCo r0 tc arg_cos) = assertPpr (r == nthRole r0 tc n)+ go n (TyConAppCo r0 tc arg_cos) = assertPpr (r == nthRole r0 tc n) (vcat [ ppr tc , ppr arg_cos , ppr r0@@ -1096,9 +1123,12 @@ , ppr r ]) $ arg_cos `getNth` n - go r n co =- NthCo r n co+ go n (SymCo co) -- Recurse, hoping to get to a TyConAppCo or FunCo+ = mkSymCo (go n co) + go n co+ = NthCo r n co+ -- Assertion checking bad_call_msg = vcat [ text "Coercion =" <+> ppr co , text "LHS ty =" <+> ppr ty1@@ -1619,9 +1649,18 @@ -- want it to be r. It is only called in 'mkPiCos', which is -- only used in GHC.Core.Opt.Simplify.Utils, where we are sure for -- now (Aug 2018) v won't occur in co.- mkFunCo r (multToCo (varMult v)) (mkReflCo r (varType v)) co- | otherwise = mkFunCo r (multToCo (varMult v)) (mkReflCo r (varType v)) co+ mkFunResCo r scaled_ty co+ | otherwise = mkFunResCo r scaled_ty co+ where+ scaled_ty = Scaled (varMult v) (varType v) +mkFunResCo :: Role -> Scaled Type -> Coercion -> Coercion+-- Given res_co :: res1 -> res2,+-- mkFunResCo r m arg res_co :: (arg -> res1) ~r (arg -> res2)+-- Reflexive in the multiplicity argument+mkFunResCo role (Scaled mult arg_ty) res_co+ = mkFunCo role (multToCo mult) (mkReflCo role arg_ty) res_co+ -- mkCoCast (c :: s1 ~?r t1) (g :: (s1 ~?r t1) ~#R (s2 ~?r t2)) :: s2 ~?r t2 -- The first coercion might be lifted or unlifted; thus the ~? above -- Lifted and unlifted equalities take different numbers of arguments,@@ -1777,7 +1816,7 @@ -- -- > topNormaliseNewType_maybe rec_nts ty = Just (co, ty') ----- then (a) @co : ty0 ~ ty'@.+-- then (a) @co : ty ~ ty'@. -- (b) ty' is not a newtype. -- -- The function returns @Nothing@ for non-@newtypes@,
compiler/GHC/Core/Make.hs view
@@ -99,12 +99,13 @@ * * ************************************************************************ -}-sortQuantVars :: [Var] -> [Var]--- Sort the variables, putting type and covars first, in scoped order,+-- | Sort the variables, putting type and covars first, in scoped order, -- and then other Ids+-- -- It is a deterministic sort, meaining it doesn't look at the values of -- Uniques. For explanation why it's important See Note [Unique Determinism] -- in GHC.Types.Unique.+sortQuantVars :: [Var] -> [Var] sortQuantVars vs = sorted_tcvs ++ ids where (tcvs, ids) = partition (isTyVar <||> isCoVar) vs@@ -137,9 +138,12 @@ -- | Construct an expression which represents the application of a number of -- expressions to another. The leftmost expression in the list is applied first+-- -- Respects the let/app invariant by building a case expression where necessary -- See Note [Core let/app invariant] in "GHC.Core"-mkCoreApps :: CoreExpr -> [CoreExpr] -> CoreExpr+mkCoreApps :: CoreExpr -- ^ function+ -> [CoreExpr] -- ^ arguments+ -> CoreExpr mkCoreApps fun args = fst $ foldl' (mkCoreAppTyped doc_string) (fun, fun_ty) args@@ -149,9 +153,13 @@ -- | Construct an expression which represents the application of one expression -- to the other+-- -- Respects the let/app invariant by building a case expression where necessary -- See Note [Core let/app invariant] in "GHC.Core"-mkCoreApp :: SDoc -> CoreExpr -> CoreExpr -> CoreExpr+mkCoreApp :: SDoc+ -> CoreExpr -- ^ function+ -> CoreExpr -- ^ argument+ -> CoreExpr mkCoreApp s fun arg = fst $ mkCoreAppTyped s (fun, exprType fun) arg @@ -159,6 +167,7 @@ -- paired with its type to an argument. The result is paired with its type. This -- function is not exported and used in the definition of 'mkCoreApp' and -- 'mkCoreApps'.+-- -- Respects the let/app invariant by building a case expression where necessary -- See Note [Core let/app invariant] in "GHC.Core" mkCoreAppTyped :: SDoc -> (CoreExpr, Type) -> CoreExpr -> (CoreExpr, Type)@@ -172,11 +181,11 @@ where (mult, arg_ty, res_ty) = splitFunTy fun_ty -mkValApp :: CoreExpr -> CoreExpr -> Scaled Type -> Type -> CoreExpr--- Build an application (e1 e2),+-- | Build an application (e1 e2), -- or a strict binding (case e2 of x -> e1 x) -- using the latter when necessary to respect the let/app invariant -- See Note [Core let/app invariant] in GHC.Core+mkValApp :: CoreExpr -> CoreExpr -> Scaled Type -> Type -> CoreExpr mkValApp fun arg (Scaled w arg_ty) res_ty | not (needsCaseBinding arg_ty arg) = App fun arg -- The vastly common case@@ -196,20 +205,25 @@ -- that you expect to use only at a *binding* site. Do not use it at -- occurrence sites because it has a single, fixed unique, and it's very -- easy to get into difficulties with shadowing. That's why it is used so little.+-- -- See Note [WildCard binders] in "GHC.Core.Opt.Simplify.Env" mkWildValBinder :: Mult -> Type -> Id mkWildValBinder w ty = mkLocalIdOrCoVar wildCardName w ty -- "OrCoVar" since a coercion can be a scrutinee with -fdefer-type-errors -- (e.g. see test T15695). Ticket #17291 covers fixing this problem. -mkWildCase :: CoreExpr -> Scaled Type -> Type -> [CoreAlt] -> CoreExpr--- Make a case expression whose case binder is unused+-- | Make a case expression whose case binder is unused -- The alts and res_ty should not have any occurrences of WildId+mkWildCase :: CoreExpr -- ^ scrutinee+ -> Scaled Type+ -> Type -- ^ res_ty+ -> [CoreAlt] -- ^ alts+ -> CoreExpr mkWildCase scrut (Scaled w scrut_ty) res_ty alts = Case scrut (mkWildValBinder w scrut_ty) res_ty alts +-- | Build a strict application (case e2 of x -> e1 x) mkStrictApp :: CoreExpr -> CoreExpr -> Scaled Type -> Type -> CoreExpr--- Build a strict application (case e2 of x -> e1 x) mkStrictApp fun arg (Scaled w arg_ty) res_ty = Case arg arg_id res_ty [Alt DEFAULT [] (App fun (Var arg_id))] -- mkDefaultCase looks attractive here, and would be sound.@@ -227,7 +241,10 @@ -- expression that uses mkWildValBinder, of which there are not -- many), and pass a fragment of it as the fun part of a 'mkStrictApp'. -mkIfThenElse :: CoreExpr -> CoreExpr -> CoreExpr -> CoreExpr+mkIfThenElse :: CoreExpr -- ^ guard+ -> CoreExpr -- ^ then+ -> CoreExpr -- ^ else+ -> CoreExpr mkIfThenElse guard then_expr else_expr -- Not going to be refining, so okay to take the type of the "then" clause = mkWildCase guard (linear boolTy) (exprType then_expr)@@ -756,10 +773,6 @@ well shouldn't be yanked on, but if one is, then you will get a friendly message from @absentErr@ (rather than a totally random crash).--@parError@ is a special version of @error@ which the compiler does-not know to be a bottoming Id. It is used in the @_par_@ and @_seq_@-templates, but we don't ever expect to generate code for it. -} errorIds :: [Id]
compiler/GHC/Core/Opt/Arity.hs view
@@ -39,7 +39,7 @@ import GHC.Core.DataCon import GHC.Core.TyCon ( tyConArity ) import GHC.Core.TyCon.RecWalk ( initRecTc, checkRecTc )-import GHC.Core.Predicate ( isDictTy )+import GHC.Core.Predicate ( isDictTy, isCallStackPredTy ) import GHC.Core.Multiplicity -- We have two sorts of substitution:@@ -592,7 +592,7 @@ -- | True <=> eta-expansion will add at least one lambda expandableArityType :: ArityType -> Bool-expandableArityType at = arityTypeArity at /= 0+expandableArityType at = arityTypeArity at > 0 -- | See Note [Dead ends] in "GHC.Types.Demand". -- Bottom implies a dead end.@@ -667,6 +667,7 @@ where env = extendSigEnv (findRhsArityEnv dflags) bndr at + {- Note [Arity analysis] ~~~~~~~~~~~~~~~~~~~~~@@ -835,6 +836,17 @@ Historical note: long ago, we unconditionally switched to topDiv when we encountered a cast, but that is far too conservative: see #5475++Note [Eta expanding through CallStacks]+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+Just as it's good to eta-expand through dictionaries, so it is good to+do so through CallStacks. #20103 is a case in point, where we got+ foo :: HasCallStack => Int -> Int+ foo = \(d::CallStack). let d2 = pushCallStack blah d in+ \(x:Int). blah++We really want to eta-expand this! #20103 is quite convincing!+We do this regardless of -fdicts-cheap; it's not really a dictionary. -} ---------------------------@@ -866,6 +878,7 @@ , am_sigs :: !(IdEnv ArityType) } -- ^ Used for regular, fixed-point arity analysis ('findRhsArity'). -- See Note [Arity analysis] for details about fixed-point iteration.+ -- INVARIANT: Disjoint with 'ae_joins'. data ArityEnv = AE@@ -873,6 +886,7 @@ -- ^ The analysis mode. See 'AnalysisMode'. , ae_joins :: !IdSet -- ^ In-scope join points. See Note [Eta-expansion and join points]+ -- INVARIANT: Disjoint with the domain of 'am_sigs' (if present). } -- | The @ArityEnv@ used by 'exprBotStrictness_maybe'. Pedantic about bottoms@@ -895,15 +909,50 @@ , am_sigs = emptyVarEnv } , ae_joins = emptyVarSet } +-- First some internal functions in snake_case for deleting in certain VarEnvs+-- of the ArityType. Don't call these; call delInScope* instead!++modifySigEnv :: (IdEnv ArityType -> IdEnv ArityType) -> ArityEnv -> ArityEnv+modifySigEnv f env@AE { ae_mode = am@FindRhsArity{am_sigs = sigs} } =+ env { ae_mode = am { am_sigs = f sigs } }+modifySigEnv _ env = env+{-# INLINE modifySigEnv #-}++del_sig_env :: Id -> ArityEnv -> ArityEnv -- internal!+del_sig_env id = modifySigEnv (\sigs -> delVarEnv sigs id)+{-# INLINE del_sig_env #-}++del_sig_env_list :: [Id] -> ArityEnv -> ArityEnv -- internal!+del_sig_env_list ids = modifySigEnv (\sigs -> delVarEnvList sigs ids)+{-# INLINE del_sig_env_list #-}++del_join_env :: JoinId -> ArityEnv -> ArityEnv -- internal!+del_join_env id env@(AE { ae_joins = joins })+ = env { ae_joins = delVarSet joins id }+{-# INLINE del_join_env #-}++del_join_env_list :: [JoinId] -> ArityEnv -> ArityEnv -- internal!+del_join_env_list ids env@(AE { ae_joins = joins })+ = env { ae_joins = delVarSetList joins ids }+{-# INLINE del_join_env_list #-}++-- end of internal deletion functions+ extendJoinEnv :: ArityEnv -> [JoinId] -> ArityEnv extendJoinEnv env@(AE { ae_joins = joins }) join_ids- = env { ae_joins = joins `extendVarSetList` join_ids }+ = del_sig_env_list join_ids+ $ env { ae_joins = joins `extendVarSetList` join_ids } extendSigEnv :: ArityEnv -> Id -> ArityType -> ArityEnv-extendSigEnv env@AE { ae_mode = am@FindRhsArity{am_sigs = sigs} } id ar_ty =- env { ae_mode = am { am_sigs = extendVarEnv sigs id ar_ty } }-extendSigEnv env _ _ = env+extendSigEnv env id ar_ty+ = del_join_env id (modifySigEnv (\sigs -> extendVarEnv sigs id ar_ty) env) +delInScope :: ArityEnv -> Id -> ArityEnv+delInScope env id = del_join_env id $ del_sig_env id env++delInScopeList :: ArityEnv -> [Id] -> ArityEnv+delInScopeList env ids = del_join_env_list ids $ del_sig_env_list ids env+ lookupSigEnv :: ArityEnv -> Id -> Maybe ArityType lookupSigEnv AE{ ae_mode = mode } id = case mode of BotStrictness -> Nothing@@ -926,7 +975,13 @@ BotStrictness -> False _ -> cheap_dict || cheap_fun e where- cheap_dict = am_dicts_cheap mode && fmap isDictTy mb_ty == Just True+ cheap_dict = case mb_ty of+ Nothing -> False+ Just ty -> (am_dicts_cheap mode && isDictTy ty)+ || isCallStackPredTy ty+ -- See Note [Eta expanding through dictionaries]+ -- See Note [Eta expanding through CallStacks]+ cheap_fun e = case mode of #if __GLASGOW_HASKELL__ <= 900 BotStrictness -> panic "impossible"@@ -971,8 +1026,10 @@ -- Lambdas; increase arity arityType env (Lam x e)- | isId x = arityLam x (arityType env e)- | otherwise = arityType env e+ | isId x = arityLam x (arityType env' e)+ | otherwise = arityType env' e+ where+ env' = delInScope env x -- Applications; decrease arity, except for types arityType env (App fun (Type _))@@ -1000,7 +1057,9 @@ | otherwise -- In the remaining cases we may not push = takeWhileOneShot alts_type -- evaluation of the scrutinee in where- alts_type = foldr1 andArityType [arityType env rhs | Alt _ _ rhs <- alts]+ env' = delInScope env bndr+ arity_type_alt (Alt _con bndrs rhs) = arityType (delInScopeList env' bndrs) rhs+ alts_type = foldr1 andArityType (map arity_type_alt alts) arityType env (Let (NonRec j rhs) body) | Just join_arity <- isJoinId_maybe j@@ -1031,9 +1090,10 @@ env' = extendSigEnv env b (arityType env r) arityType env (Let (Rec prs) e)- = floatIn (all is_cheap prs) (arityType env e)+ = floatIn (all is_cheap prs) (arityType env' e) where- is_cheap (b,e) = myExprIsCheap env e (Just (idType b))+ env' = delInScopeList env (map fst prs)+ is_cheap (b,e) = myExprIsCheap env' e (Just (idType b)) arityType env (Tick t e) | not (tickishIsCode t) = arityType env e@@ -1234,15 +1294,26 @@ -- We should have that: -- -- > ty = exprType e = exprType e'-etaExpand :: Arity -> CoreExpr -> CoreExpr-etaExpandAT :: ArityType -> CoreExpr -> CoreExpr -etaExpand n orig_expr = eta_expand (replicate n NoOneShotInfo) orig_expr-etaExpandAT (AT oss _) orig_expr = eta_expand oss orig_expr- -- See Note [Eta expansion with ArityType]+etaExpand :: Arity -> CoreExpr -> CoreExpr+etaExpand n orig_expr+ = eta_expand in_scope (replicate n NoOneShotInfo) orig_expr+ where+ in_scope = {-#SCC "eta_expand:in-scopeX" #-}+ mkInScopeSet (exprFreeVars orig_expr) +etaExpandAT :: InScopeSet -> ArityType -> CoreExpr -> CoreExpr+-- See Note [Eta expansion with ArityType]+--+-- We pass in the InScopeSet from the simplifier to avoid recomputing+-- it here, which can be jolly expensive if the casts are big+-- In #18223 it took 10% of compile time just to do the exprFreeVars!+etaExpandAT in_scope (AT oss _) orig_expr+ = eta_expand in_scope oss orig_expr+ -- etaExpand arity e = res -- Then 'res' has at least 'arity' lambdas at the top+-- possibly with a cast wrapped around the outside -- See Note [Eta expansion with ArityType] -- -- etaExpand deals with for-alls. For example:@@ -1250,33 +1321,43 @@ -- where E :: forall a. a -> a -- would return -- (/\b. \y::a -> E b y)------ It deals with coerces too, though they are now rare--- so perhaps the extra code isn't worth it -eta_expand :: [OneShotInfo] -> CoreExpr -> CoreExpr-eta_expand one_shots orig_expr- = go one_shots orig_expr+eta_expand :: InScopeSet -> [OneShotInfo] -> CoreExpr -> CoreExpr+eta_expand in_scope one_shots (Cast expr co)+ = Cast (eta_expand in_scope one_shots expr) co++eta_expand in_scope one_shots orig_expr+ = go in_scope one_shots [] orig_expr where -- Strip off existing lambdas and casts before handing off to mkEtaWW+ -- This is mainly to avoid spending time cloning binders and substituting+ -- when there is actually nothing to do. It's slightly awkward to deal+ -- with casts here, apart from the topmost one, and they are rare, so+ -- if we find one we just hand off to mkEtaWW anyway -- Note [Eta expansion and SCCs]- go [] expr = expr- go oss@(_:oss1) (Lam v body) | isTyVar v = Lam v (go oss body)- | otherwise = Lam v (go oss1 body)- go oss (Cast expr co) = Cast (go oss expr) co+ go _ [] _ _ = orig_expr -- Already has the specified arity; no-op - go oss expr- = -- pprTrace "ee" (vcat [ppr orig_expr, ppr expr, pprEtaInfos etas]) $- retick $ etaInfoAbs etas (etaInfoApp in_scope' sexpr etas)+ go in_scope oss@(_:oss1) vs (Lam v body)+ | isTyVar v = go (in_scope `extendInScopeSet` v) oss (v:vs) body+ | otherwise = go (in_scope `extendInScopeSet` v) oss1 (v:vs) body++ go in_scope oss rev_vs expr+ = -- pprTrace "ee" (vcat [ppr in_scope', ppr top_bndrs, ppr eis]) $+ retick $+ etaInfoAbs top_eis $+ etaInfoApp in_scope' sexpr eis where- in_scope = mkInScopeSet (exprFreeVars expr)- (in_scope', etas) = mkEtaWW oss (ppr orig_expr) in_scope (exprType expr)+ (in_scope', eis@(EI eta_bndrs mco))+ = mkEtaWW oss (ppr orig_expr) in_scope (exprType expr)+ top_bndrs = reverse rev_vs+ top_eis = EI (top_bndrs ++ eta_bndrs) (mkPiMCos top_bndrs mco) -- Find ticks behind type apps. -- See Note [Eta expansion and source notes]+ -- I don't really understand this code SLPJ May 21 (expr', args) = collectArgs expr (ticks, expr'') = stripTicksTop tickishFloatable expr'- sexpr = foldl' App expr'' args+ sexpr = mkApps expr'' args retick expr = foldr mkTick expr ticks {- *********************************************************************@@ -1291,44 +1372,50 @@ Suppose we have (e :: ty) and we want to eta-expand it to arity N. This what eta_expand does. We do it in two steps: -1. mkEtaWW: from 'ty' and 'N' build a [EtaInfo] which describes+1. mkEtaWW: from 'ty' and 'N' build a EtaInfo which describes the shape of the expansion necessary to expand to arity N. 2. Build the term \ v1..vn. e v1 .. vn where those abstractions and applications are described by- the same [EtaInfo]. Specifically we build the term+ the same EtaInfo. Specifically we build the term etaInfoAbs etas (etaInfoApp in_scope e etas) - where etas :: [EtaInfo]#+ where etas :: EtaInfo etaInfoAbs builds the lambdas etaInfoApp builds the applictions - Note that the /same/ [EtaInfo] drives both etaInfoAbs and etaInfoApp+ Note that the /same/ EtaInfo drives both etaInfoAbs and etaInfoApp -To a first approximation [EtaInfo] is just [Var]. But+To a first approximation EtaInfo is just [Var]. But casts complicate the question. If we have newtype N a = MkN (S -> a)+ axN :: N a ~ S -> a and- ty = N (N Int)-then the eta-expansion must look like- (\x (\y. ((e |> co1) x) |> co2) y)- |> sym co2)- |> sym co1+ e :: N (N Int)+then the eta-expansion should look like+ (\(x::S) (y::S) -> e |> co x y) |> sym co where- co1 :: N (N Int) ~ S -> N Int- co2 :: N Int ~ S -> Int+ co :: N (N Int) ~ S -> S -> Int+ co = axN @(N Int) ; (S -> axN @Int) -Blimey! Look at all those casts. Moreover, if the type-is very deeply nested (as happens in #18223), the repetition+We want to get one cast, at the top, to account for all those+nested newtypes. This is expressed by the EtaInfo type:++ data EtaInfo = EI [Var] MCoercionR++Note [Check for reflexive casts in eta expansion]+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+It turns out that the casts created by teh above mechanism are often Refl.+When casts are very deeply nested (as happens in #18223), the repetition of types can make the overall term very large. So there is a big payoff in cancelling out casts aggressively wherever possible. (See also Note [No crap in eta-expanded code].) -This matters a lot in etaEInfoApp, where we+This matters particularly in etaInfoApp, where we * Do beta-reduction on the fly-* Use getARg_mabye to get a cast out of the way,+* Use getArg_maybe to get a cast out of the way, so that we can do beta reduction Together this makes a big difference. Consider when e is case x of@@ -1343,105 +1430,73 @@ #18223 was a dramatic example in which the intermediate term was grotesquely huge, even though the next Simplifier iteration squashed it. Better to kill it at birth.--} ----------------data EtaInfo -- Abstraction Application- = EtaVar Var -- /\a. [] [] a- -- (\x. []) [] x- | EtaCo CoercionR -- [] |> sym co [] |> co--instance Outputable EtaInfo where- ppr (EtaVar v) = text "EtaVar" <+> ppr v <+> dcolon <+> ppr (idType v)- ppr (EtaCo co) = text "EtaCo" <+> hang (ppr co) 2 (dcolon <+> ppr (coercionType co))---- Used in debug-printing--- pprEtaInfos :: [EtaInfo] -> SDoc--- pprEtaInfos eis = brackets $ vcat $ punctuate comma $ map ppr eis+The crucial spots in etaInfoApp are:+* `checkReflexiveMCo` in the (Cast e co) case of `go`+* `checkReflexiveMCo` in `pushCoArg`+* Less important: checkReflexiveMCo in the final case of `go`+Collectively these make a factor-of-5 difference to the total+allocation of T18223, so take care if you change this stuff! -pushCoercion :: Coercion -> [EtaInfo] -> [EtaInfo]--- Puts a EtaCo on the front of a [EtaInfo], but combining--- with an existing EtaCo if possible--- A minor improvement-pushCoercion co1 (EtaCo co2 : eis)- | isReflCo co = eis- | otherwise = EtaCo co : eis- where- co = co1 `mkTransCo` co2+Example:+ newtype N = MkN (Y->Z)+ f :: X -> N+ f = \(x::X). ((\(y::Y). blah) |> fco) -pushCoercion co eis- = EtaCo co : eis+where fco :: (Y->Z) ~ N -getArg_maybe :: [EtaInfo] -> Maybe (CoreArg, [EtaInfo])--- Get an argument to the front of the [EtaInfo], if possible,--- by pushing any EtaCo through the argument-getArg_maybe eis = go MRefl eis+mkEtaWW makes an EtaInfo of (EI [(eta1:X), (eta2:Y)] eta_co where- go :: MCoercion -> [EtaInfo] -> Maybe (CoreArg, [EtaInfo])- go _ [] = Nothing- go mco (EtaCo co2 : eis) = go (mkTransMCoL mco co2) eis- go MRefl (EtaVar v : eis) = Just (varToCoreExpr v, eis)- go (MCo co) (EtaVar v : eis)- | Just (arg, mco) <- pushCoArg co (varToCoreExpr v)- = case mco of- MRefl -> Just (arg, eis)- MCo co -> Just (arg, pushCoercion co eis)- | otherwise- = Nothing+ eta_co :: (X->N) ~ (X->Y->Z)+ eta_co = (<X> -> nco)+ nco :: N ~ (Y->Z) -- Comes from topNormaliseNewType_maybe -mkCastMCo :: CoreExpr -> MCoercionR -> CoreExpr-mkCastMCo e MRefl = e-mkCastMCo e (MCo co) = Cast e co- -- We are careful to use (MCo co) only when co is not reflexive- -- Hence (Cast e co) rather than (mkCast e co)+Now, when we push that eta_co inward in etaInfoApp:+* In the (Cast e co) case, the 'fco' and 'nco' will meet, and+ should cancel.+* When we meet the (\y.e) we want no cast on the y. -mkPiMCo :: Var -> MCoercionR -> MCoercionR-mkPiMCo _ MRefl = MRefl-mkPiMCo v (MCo co) = MCo (mkPiCo Representational v co)+-} ---------------etaInfoAbs :: [EtaInfo] -> CoreExpr -> CoreExpr--- See Note [The EtaInfo mechanism]-etaInfoAbs eis expr- | null eis = expr- | otherwise = case final_mco of- MRefl -> expr'- MCo co -> mkCast expr' co- where- (expr', final_mco) = foldr do_one (split_cast expr) eis+data EtaInfo = EI [Var] MCoercionR - do_one :: EtaInfo -> (CoreExpr, MCoercion) -> (CoreExpr, MCoercion)- -- Implements the "Abstraction" column in the comments for data EtaInfo- -- In both argument and result the pair (e,mco) denotes (e |> mco)- do_one (EtaVar v) (expr, mco) = (Lam v expr, mkPiMCo v mco)- do_one (EtaCo co) (expr, mco) = (expr, mco `mkTransMCoL` mkSymCo co)+-- (EI bs co) describes a particular eta-expansion, as follows:+-- Abstraction: (\b1 b2 .. bn. []) |> sym co+-- Application: ([] |> co) b1 b2 .. bn+--+-- e :: T co :: T ~ (t1 -> t2 -> .. -> tn -> tr)+-- e = (\b1 b2 ... bn. (e |> co) b1 b2 .. bn) |> sym co - split_cast :: CoreExpr -> (CoreExpr, MCoercion)- split_cast (Cast e co) = (e, MCo co)- split_cast e = (e, MRefl)- -- We could look in the body of lets, and the branches of a case- -- But then we would have to worry about whether the cast mentioned- -- any of the bound variables, which is tiresome. Later maybe.- -- Result: we may end up with- -- (\(x::Int). case x of { DEFAULT -> e1 |> co }) |> sym (<Int>->co)- -- and fail to optimise it away+instance Outputable EtaInfo where+ ppr (EI vs mco) = text "EI" <+> ppr vs <+> parens (ppr mco) ----------------etaInfoApp :: InScopeSet -> CoreExpr -> [EtaInfo] -> CoreExpr--- (etaInfoApp s e eis) returns something equivalent to--- (substExpr s e `appliedto` eis)++etaInfoApp :: InScopeSet -> CoreExpr -> EtaInfo -> CoreExpr+-- (etaInfoApp s e (EI bs mco) returns something equivalent to+-- ((substExpr s e) |> mco b1 .. bn) -- See Note [The EtaInfo mechanism]+--+-- NB: With very deeply nested casts, this function can be expensive+-- In T18223, this function alone costs 15% of allocation, all+-- spent in the calls to substExprSC and substBindSC etaInfoApp in_scope expr eis = go (mkEmptySubst in_scope) expr eis where- go :: Subst -> CoreExpr -> [EtaInfo] -> CoreExpr+ go :: Subst -> CoreExpr -> EtaInfo -> CoreExpr -- 'go' pushed down the eta-infos into the branch of a case -- and the body of a let; and does beta-reduction if possible+ -- go subst fun co [b1,..,bn] returns (subst(fun) |> co) b1 .. bn go subst (Tick t e) eis = Tick (substTickish subst t) (go subst e eis)- go subst (Cast e co) eis- = go subst e (pushCoercion (Core.substCo subst co) eis)++ go subst (Cast e co) (EI bs mco)+ = go subst e (EI bs mco')+ where+ mco' = checkReflexiveMCo (Core.substCo subst co `mkTransMCoR` mco)+ -- See Note [Check for reflexive casts in eta-expansion]+ go subst (Case e b ty alts) eis = Case (Core.substExprSC subst e) b1 ty' alts' where@@ -1450,37 +1505,43 @@ ty' = etaInfoAppTy (Core.substTy subst ty) eis subst_alt (Alt con bs rhs) = Alt con bs' (go subst2 rhs eis) where- (subst2,bs') = Core.substBndrs subst1 bs+ (subst2,bs') = Core.substBndrs subst1 bs+ go subst (Let b e) eis | not (isJoinBind b) -- See Note [Eta expansion for join points] = Let b' (go subst' e eis) where (subst', b') = Core.substBindSC subst b - -- Beta-reduction if possible, using getArg_maybe to push- -- any intervening casts past the argument- -- See Note [The EtaInfo mechansim]- go subst (Lam v e) eis- | Just (arg, eis') <- getArg_maybe eis- = go (Core.extendSubst subst v arg) e eis'+ -- Beta-reduction if possible, pushing any intervening casts past+ -- the argument. See Note [The EtaInfo mechansim]+ go subst (Lam v e) (EI (b:bs) mco)+ | Just (arg,mco') <- pushMCoArg mco (varToCoreExpr b)+ = go (Core.extendSubst subst v arg) e (EI bs mco') -- Stop pushing down; just wrap the expression up- go subst e eis = wrap (Core.substExprSC subst e) eis-- wrap e [] = e- wrap e (EtaVar v : eis) = wrap (App e (varToCoreExpr v)) eis- wrap e (EtaCo co : eis) = wrap (Cast e co) eis-+ -- See Note [Check for reflexive casts in eta expansion]+ go subst e (EI bs mco) = Core.substExprSC subst e+ `mkCastMCo` checkReflexiveMCo mco+ `mkVarApps` bs ---------------etaInfoAppTy :: Type -> [EtaInfo] -> Type+etaInfoAppTy :: Type -> EtaInfo -> Type -- If e :: ty -- then etaInfoApp e eis :: etaInfoApp ty eis-etaInfoAppTy ty [] = ty-etaInfoAppTy ty (EtaVar v : eis) = etaInfoAppTy (applyTypeToArg ty (varToCoreExpr v)) eis-etaInfoAppTy _ (EtaCo co : eis) = etaInfoAppTy (coercionRKind co) eis+etaInfoAppTy ty (EI bs mco)+ = applyTypeToArgs (text "etaInfoAppTy") ty1 (map varToCoreExpr bs)+ where+ ty1 = case mco of+ MRefl -> ty+ MCo co -> coercionRKind co --------------+etaInfoAbs :: EtaInfo -> CoreExpr -> CoreExpr+-- See Note [The EtaInfo mechanism]+etaInfoAbs (EI bs mco) expr = (mkLams bs expr) `mkCastMCo` mkSymMCo mco++-------------- -- | @mkEtaWW n _ fvs ty@ will compute the 'EtaInfo' necessary for eta-expanding -- an expression @e :: ty@ to take @n@ value arguments, where @fvs@ are the -- free variables of @e@.@@ -1496,26 +1557,28 @@ -> InScopeSet -- ^ A super-set of the free vars of the expression to eta-expand. -> Type- -> (InScopeSet, [EtaInfo])+ -> (InScopeSet, EtaInfo) -- ^ The variables in 'EtaInfo' are fresh wrt. to the incoming 'InScopeSet'. -- The outgoing 'InScopeSet' extends the incoming 'InScopeSet' with the -- fresh variables in 'EtaInfo'. mkEtaWW orig_oss ppr_orig_expr in_scope orig_ty- = go 0 orig_oss empty_subst orig_ty []+ = go 0 orig_oss empty_subst orig_ty where empty_subst = mkEmptyTCvSubst in_scope go :: Int -- For fresh names -> [OneShotInfo] -- Number of value args to expand to -> TCvSubst -> Type -- We are really looking at subst(ty)- -> [EtaInfo] -- Accumulating parameter- -> (InScopeSet, [EtaInfo])- go _ [] subst _ eis -- See Note [exprArity invariant]+ -> (InScopeSet, EtaInfo)+ -- (go [o1,..,on] subst ty) = (in_scope, EI [b1,..,bn] co)+ -- co :: subst(ty) ~ b1_ty -> ... -> bn_ty -> tr++ go _ [] subst _ -- See Note [exprArity invariant] ----------- Done! No more expansion needed- = (getTCvInScope subst, reverse eis)+ = (getTCvInScope subst, EI [] MRefl) - go n oss@(one_shot:oss1) subst ty eis -- See Note [exprArity invariant]+ go n oss@(one_shot:oss1) subst ty -- See Note [exprArity invariant] ----------- Forall types (forall a. ty) | Just (tcv,ty') <- splitForAllTyCoVar_maybe ty , (subst', tcv') <- Type.substVarBndr subst tcv@@ -1523,7 +1586,8 @@ | otherwise = oss1 -- A forall can bind a CoVar, in which case -- we consume one of the [OneShotInfo]- = go n oss' subst' ty' (EtaVar tcv' : eis)+ , (in_scope, EI bs mco) <- go n oss' subst' ty'+ = (in_scope, EI (tcv' : bs) (mkHomoForAllMCo tcv' mco)) ----------- Function types (t1 -> t2) | Just (mult, arg_ty, res_ty) <- splitFunTy_maybe ty@@ -1535,7 +1599,8 @@ -- Avoid free vars of the original expression , let eta_id' = eta_id `setIdOneShotInfo` one_shot- = go (n+1) oss1 subst' res_ty (EtaVar eta_id' : eis)+ , (in_scope, EI bs mco) <- go (n+1) oss1 subst' res_ty+ = (in_scope, EI (eta_id' : bs) (mkFunResMCo (idScaledType eta_id') mco)) ----------- Newtypes -- Given this:@@ -1545,17 +1610,20 @@ -- We want to get -- coerce T (\x::[T] -> (coerce ([T]->Int) e) x) | Just (co, ty') <- topNormaliseNewType_maybe ty- , let co' = Type.substCo subst co+ , -- co :: ty ~ ty'+ let co' = Type.substCo subst co -- Remember to apply the substitution to co (#16979) -- (or we could have applied to ty, but then -- we'd have had to zap it for the recursive call)- = go n oss subst ty' (pushCoercion co' eis)+ , (in_scope, EI bs mco) <- go n oss subst ty'+ -- mco :: subst(ty') ~ b1_ty -> ... -> bn_ty -> tr+ = (in_scope, EI bs (mkTransMCoR co' mco)) | otherwise -- We have an expression of arity > 0, -- but its type isn't a function, or a binder -- is representation-polymorphic = warnPprTrace True ((ppr orig_oss <+> ppr orig_ty) $$ ppr_orig_expr)- (getTCvInScope subst, reverse eis)+ (getTCvInScope subst, EI [] MRefl) -- This *can* legitimately happen: -- e.g. coerce Int (\x. x) Essentially the programmer is -- playing fast and loose with types (Happy does this a lot).@@ -1593,17 +1661,27 @@ ; return (arg':args', m_co2) } MRefl -> return (arg':args, MRefl) } +pushMCoArg :: MCoercionR -> CoreArg -> Maybe (CoreArg, MCoercion)+pushMCoArg MRefl arg = Just (arg, MRefl)+pushMCoArg (MCo co) arg = pushCoArg co arg+ pushCoArg :: CoercionR -> CoreArg -> Maybe (CoreArg, MCoercion) -- We have (fun |> co) arg, and we want to transform it to -- (fun arg) |> co -- This may fail, e.g. if (fun :: N) where N is a newtype -- C.f. simplCast in GHC.Core.Opt.Simplify -- 'co' is always Representational--- If the returned coercion is Nothing, then it would have been reflexive-pushCoArg co (Type ty) = do { (ty', m_co') <- pushCoTyArg co ty- ; return (Type ty', m_co') }-pushCoArg co val_arg = do { (arg_co, m_co') <- pushCoValArg co- ; return (val_arg `mkCastMCo` arg_co, m_co') }+pushCoArg co arg+ | Type ty <- arg+ = do { (ty', m_co') <- pushCoTyArg co ty+ ; return (Type ty', m_co') }+ | otherwise+ = do { (arg_mco, m_co') <- pushCoValArg co+ ; let arg_mco' = checkReflexiveMCo arg_mco+ -- checkReflexiveMCo: see Note [Check for reflexive casts in eta expansion]+ -- The coercion is very often (arg_co -> res_co), but without+ -- the argument coercion actually being ReflCo+ ; return (arg `mkCastMCo` arg_mco', m_co') } pushCoTyArg :: CoercionR -> Type -> Maybe (Type, MCoercionR) -- We have (fun |> co) @ty
compiler/GHC/Core/Opt/ConstantFold.hs view
@@ -10,6 +10,7 @@ (i1 + i2) only if it results in a valid Float. -} +{-# LANGUAGE CPP #-} {-# LANGUAGE AllowAmbiguousTypes #-} {-# LANGUAGE DeriveFunctor #-} {-# LANGUAGE LambdaCase #-}@@ -30,6 +31,8 @@ ) where +#include "MachDeps.h"+ import GHC.Prelude import GHC.Platform@@ -156,10 +159,14 @@ , equalArgs $> Lit zeroW8 ] Word8AndOp -> mkPrimOpRule nm 2 [ binaryLit (word8Op2 (.&.)) , idempotent- , zeroElem ]+ , zeroElem+ , sameArgIdempotentCommut Word8AndOp+ ] Word8OrOp -> mkPrimOpRule nm 2 [ binaryLit (word8Op2 (.|.)) , idempotent- , identity zeroW8 ]+ , identity zeroW8+ , sameArgIdempotentCommut Word8OrOp+ ] Word8XorOp -> mkPrimOpRule nm 2 [ binaryLit (word8Op2 xor) , identity zeroW8 , equalArgs $> Lit zeroW8 ]@@ -223,10 +230,14 @@ , equalArgs $> Lit zeroW16 ] Word16AndOp -> mkPrimOpRule nm 2 [ binaryLit (word16Op2 (.&.)) , idempotent- , zeroElem ]+ , zeroElem+ , sameArgIdempotentCommut Word16AndOp+ ] Word16OrOp -> mkPrimOpRule nm 2 [ binaryLit (word16Op2 (.|.)) , idempotent- , identity zeroW16 ]+ , identity zeroW16+ , sameArgIdempotentCommut Word16OrOp+ ] Word16XorOp -> mkPrimOpRule nm 2 [ binaryLit (word16Op2 xor) , identity zeroW16 , equalArgs $> Lit zeroW16 ]@@ -290,10 +301,14 @@ , equalArgs $> Lit zeroW32 ] Word32AndOp -> mkPrimOpRule nm 2 [ binaryLit (word32Op2 (.&.)) , idempotent- , zeroElem ]+ , zeroElem+ , sameArgIdempotentCommut Word32AndOp+ ] Word32OrOp -> mkPrimOpRule nm 2 [ binaryLit (word32Op2 (.|.)) , idempotent- , identity zeroW32 ]+ , identity zeroW32+ , sameArgIdempotentCommut Word32OrOp+ ] Word32XorOp -> mkPrimOpRule nm 2 [ binaryLit (word32Op2 xor) , identity zeroW32 , equalArgs $> Lit zeroW32 ]@@ -302,7 +317,78 @@ Word32SllOp -> mkPrimOpRule nm 2 [ shiftRule LitNumWord32 (const shiftL) ] Word32SrlOp -> mkPrimOpRule nm 2 [ shiftRule LitNumWord32 $ const $ shiftRightLogical @Word32 ] +#if WORD_SIZE_IN_BITS < 64+ -- Int64 operations+ Int64AddOp -> mkPrimOpRule nm 2 [ binaryLit (int64Op2 (+))+ , identity zeroI64+ , addFoldingRules Int64AddOp int64Ops+ ]+ Int64SubOp -> mkPrimOpRule nm 2 [ binaryLit (int64Op2 (-))+ , rightIdentity zeroI64+ , equalArgs $> Lit zeroI64+ , subFoldingRules Int64SubOp int64Ops+ ]+ Int64MulOp -> mkPrimOpRule nm 2 [ binaryLit (int64Op2 (*))+ , zeroElem+ , identity oneI64+ , mulFoldingRules Int64MulOp int64Ops+ ]+ Int64QuotOp -> mkPrimOpRule nm 2 [ nonZeroLit 1 >> binaryLit (int64Op2 quot)+ , leftZero+ , rightIdentity oneI64+ , equalArgs $> Lit oneI64 ]+ Int64RemOp -> mkPrimOpRule nm 2 [ nonZeroLit 1 >> binaryLit (int64Op2 rem)+ , leftZero+ , oneLit 1 $> Lit zeroI64+ , equalArgs $> Lit zeroI64 ]+ Int64NegOp -> mkPrimOpRule nm 1 [ unaryLit negOp+ , semiInversePrimOp Int64NegOp ]+ Int64SllOp -> mkPrimOpRule nm 2 [ shiftRule LitNumInt64 (const shiftL)+ , rightIdentity zeroI64 ]+ Int64SraOp -> mkPrimOpRule nm 2 [ shiftRule LitNumInt64 (const shiftR)+ , rightIdentity zeroI64 ]+ Int64SrlOp -> mkPrimOpRule nm 2 [ shiftRule LitNumInt64 $ const $ shiftRightLogical @Word64+ , rightIdentity zeroI64 ] + -- Word64 operations+ Word64AddOp -> mkPrimOpRule nm 2 [ binaryLit (word64Op2 (+))+ , identity zeroW64+ , addFoldingRules Word64AddOp word64Ops+ ]+ Word64SubOp -> mkPrimOpRule nm 2 [ binaryLit (word64Op2 (-))+ , rightIdentity zeroW64+ , equalArgs $> Lit zeroW64+ , subFoldingRules Word64SubOp word64Ops+ ]+ Word64MulOp -> mkPrimOpRule nm 2 [ binaryLit (word64Op2 (*))+ , identity oneW64+ , mulFoldingRules Word64MulOp word64Ops+ ]+ Word64QuotOp-> mkPrimOpRule nm 2 [ nonZeroLit 1 >> binaryLit (word64Op2 quot)+ , rightIdentity oneW64 ]+ Word64RemOp -> mkPrimOpRule nm 2 [ nonZeroLit 1 >> binaryLit (word64Op2 rem)+ , leftZero+ , oneLit 1 $> Lit zeroW64+ , equalArgs $> Lit zeroW64 ]+ Word64AndOp -> mkPrimOpRule nm 2 [ binaryLit (word64Op2 (.&.))+ , idempotent+ , zeroElem+ , sameArgIdempotentCommut Word64AndOp+ ]+ Word64OrOp -> mkPrimOpRule nm 2 [ binaryLit (word64Op2 (.|.))+ , idempotent+ , identity zeroW64+ , sameArgIdempotentCommut Word64OrOp+ ]+ Word64XorOp -> mkPrimOpRule nm 2 [ binaryLit (word64Op2 xor)+ , identity zeroW64+ , equalArgs $> Lit zeroW64 ]+ Word64NotOp -> mkPrimOpRule nm 1 [ unaryLit complementOp+ , semiInversePrimOp Word64NotOp ]+ Word64SllOp -> mkPrimOpRule nm 2 [ shiftRule LitNumWord64 (const shiftL) ]+ Word64SrlOp -> mkPrimOpRule nm 2 [ shiftRule LitNumWord64 $ const $ shiftRightLogical @Word64 ]+#endif+ -- Int operations IntAddOp -> mkPrimOpRule nm 2 [ binaryLit (intOp2 (+)) , identityPlatform zeroi@@ -333,10 +419,14 @@ , equalArgs >> retLit zeroi ] IntAndOp -> mkPrimOpRule nm 2 [ binaryLit (intOp2 (.&.)) , idempotent- , zeroElem ]+ , zeroElem+ , sameArgIdempotentCommut IntAndOp+ ] IntOrOp -> mkPrimOpRule nm 2 [ binaryLit (intOp2 (.|.)) , idempotent- , identityPlatform zeroi ]+ , identityPlatform zeroi+ , sameArgIdempotentCommut IntOrOp+ ] IntXorOp -> mkPrimOpRule nm 2 [ binaryLit (intOp2 xor) , identityPlatform zeroi , equalArgs >> retLit zeroi ]@@ -378,10 +468,14 @@ , equalArgs >> retLit zerow ] WordAndOp -> mkPrimOpRule nm 2 [ binaryLit (wordOp2 (.&.)) , idempotent- , zeroElem ]+ , zeroElem+ , sameArgIdempotentCommut WordAndOp+ ] WordOrOp -> mkPrimOpRule nm 2 [ binaryLit (wordOp2 (.|.)) , idempotent- , identityPlatform zerow ]+ , identityPlatform zerow+ , sameArgIdempotentCommut WordOrOp+ ] WordXorOp -> mkPrimOpRule nm 2 [ binaryLit (wordOp2 xor) , identityPlatform zerow , equalArgs >> retLit zerow ]@@ -395,6 +489,9 @@ Int8ToIntOp -> mkPrimOpRule nm 1 [ liftLitPlatform extendIntLit ] Int16ToIntOp -> mkPrimOpRule nm 1 [ liftLitPlatform extendIntLit ] Int32ToIntOp -> mkPrimOpRule nm 1 [ liftLitPlatform extendIntLit ]+#if WORD_SIZE_IN_BITS < 64+ Int64ToIntOp -> mkPrimOpRule nm 1 [ liftLitPlatform extendIntLit ]+#endif IntToInt8Op -> mkPrimOpRule nm 1 [ liftLit narrowInt8Lit , semiInversePrimOp Int8ToIntOp , narrowSubsumesAnd IntAndOp IntToInt8Op 8 ]@@ -404,6 +501,9 @@ IntToInt32Op -> mkPrimOpRule nm 1 [ liftLit narrowInt32Lit , semiInversePrimOp Int32ToIntOp , narrowSubsumesAnd IntAndOp IntToInt32Op 32 ]+#if WORD_SIZE_IN_BITS < 64+ IntToInt64Op -> mkPrimOpRule nm 1 [ liftLit narrowInt64Lit ]+#endif Word8ToWordOp -> mkPrimOpRule nm 1 [ liftLitPlatform extendWordLit , extendNarrowPassthrough WordToWord8Op 0xFF@@ -414,6 +514,10 @@ Word32ToWordOp -> mkPrimOpRule nm 1 [ liftLitPlatform extendWordLit , extendNarrowPassthrough WordToWord32Op 0xFFFFFFFF ]+#if WORD_SIZE_IN_BITS < 64+ Word64ToWordOp -> mkPrimOpRule nm 1 [ liftLitPlatform extendWordLit ]+#endif+ WordToWord8Op -> mkPrimOpRule nm 1 [ liftLit narrowWord8Lit , semiInversePrimOp Word8ToWordOp , narrowSubsumesAnd WordAndOp WordToWord8Op 8 ]@@ -423,7 +527,9 @@ WordToWord32Op -> mkPrimOpRule nm 1 [ liftLit narrowWord32Lit , semiInversePrimOp Word32ToWordOp , narrowSubsumesAnd WordAndOp WordToWord32Op 32 ]-+#if WORD_SIZE_IN_BITS < 64+ WordToWord64Op -> mkPrimOpRule nm 1 [ liftLit narrowWord64Lit ]+#endif Word8ToInt8Op -> mkPrimOpRule nm 1 [ liftLitPlatform (litNumCoerce LitNumInt8) , semiInversePrimOp Int8ToWord8Op ]@@ -437,6 +543,13 @@ , semiInversePrimOp Int32ToWord32Op ] Int32ToWord32Op-> mkPrimOpRule nm 1 [ liftLitPlatform (litNumCoerce LitNumWord32) , semiInversePrimOp Word32ToInt32Op ]+#if WORD_SIZE_IN_BITS < 64+ Word64ToInt64Op-> mkPrimOpRule nm 1 [ liftLitPlatform (litNumCoerce LitNumInt64)+ , semiInversePrimOp Int64ToWord64Op ]+ Int64ToWord64Op-> mkPrimOpRule nm 1 [ liftLitPlatform (litNumCoerce LitNumWord64)+ , semiInversePrimOp Word64ToInt64Op ]+#endif+ WordToIntOp -> mkPrimOpRule nm 1 [ liftLitPlatform (litNumCoerce LitNumInt) , semiInversePrimOp IntToWordOp ] IntToWordOp -> mkPrimOpRule nm 1 [ liftLitPlatform (litNumCoerce LitNumWord)@@ -704,6 +817,14 @@ zeroW32 = mkLitWord32 0 oneW32 = mkLitWord32 1 +#if WORD_SIZE_IN_BITS < 64+zeroI64, oneI64, zeroW64, oneW64 :: Literal+zeroI64 = mkLitInt64 0+oneI64 = mkLitInt64 1+zeroW64 = mkLitWord64 0+oneW64 = mkLitWord64 1+#endif+ zerof, onef, twof, zerod, oned, twod :: Literal zerof = mkLitFloat 0.0 onef = mkLitFloat 1.0@@ -769,6 +890,16 @@ int32Result (fromInteger i1 `op` fromInteger i2) int32Op2 _ _ _ _ = Nothing +#if WORD_SIZE_IN_BITS < 64+int64Op2+ :: (Integral a, Integral b)+ => (a -> b -> Integer)+ -> RuleOpts -> Literal -> Literal -> Maybe CoreExpr+int64Op2 op _ (LitNumber LitNumInt64 i1) (LitNumber LitNumInt64 i2) =+ int64Result (fromInteger i1 `op` fromInteger i2)+int64Op2 _ _ _ _ = Nothing+#endif+ intOp2 :: (Integral a, Integral b) => (a -> b -> Integer) -> RuleOpts -> Literal -> Literal -> Maybe CoreExpr@@ -819,7 +950,7 @@ -> RuleOpts -> Literal -> Literal -> Maybe CoreExpr word8Op2 op _ (LitNumber LitNumWord8 i1) (LitNumber LitNumWord8 i2) = word8Result (fromInteger i1 `op` fromInteger i2)-word8Op2 _ _ _ _ = Nothing -- Could find LitLit+word8Op2 _ _ _ _ = Nothing word16Op2 :: (Integral a, Integral b)@@ -827,7 +958,7 @@ -> RuleOpts -> Literal -> Literal -> Maybe CoreExpr word16Op2 op _ (LitNumber LitNumWord16 i1) (LitNumber LitNumWord16 i2) = word16Result (fromInteger i1 `op` fromInteger i2)-word16Op2 _ _ _ _ = Nothing -- Could find LitLit+word16Op2 _ _ _ _ = Nothing word32Op2 :: (Integral a, Integral b)@@ -835,8 +966,18 @@ -> RuleOpts -> Literal -> Literal -> Maybe CoreExpr word32Op2 op _ (LitNumber LitNumWord32 i1) (LitNumber LitNumWord32 i2) = word32Result (fromInteger i1 `op` fromInteger i2)-word32Op2 _ _ _ _ = Nothing -- Could find LitLit+word32Op2 _ _ _ _ = Nothing +#if WORD_SIZE_IN_BITS < 64+word64Op2+ :: (Integral a, Integral b)+ => (a -> b -> Integer)+ -> RuleOpts -> Literal -> Literal -> Maybe CoreExpr+word64Op2 op _ (LitNumber LitNumWord64 i1) (LitNumber LitNumWord64 i2) =+ word64Result (fromInteger i1 `op` fromInteger i2)+word64Op2 _ _ _ _ = Nothing+#endif+ wordOp2 :: (Integral a, Integral b) => (a -> b -> Integer) -> RuleOpts -> Literal -> Literal -> Maybe CoreExpr@@ -851,35 +992,42 @@ wordCResult (roPlatform env) (fromInteger w1 `op` fromInteger w2) wordOpC2 _ _ _ _ = Nothing -shiftRule :: LitNumType -- Type of the result, either LitNumInt or LitNumWord+shiftRule :: LitNumType -> (Platform -> Integer -> Int -> Integer) -> RuleM CoreExpr -- Shifts take an Int; hence third arg of op is Int -- Used for shift primops -- IntSllOp, IntSraOp, IntSrlOp :: Int# -> Int# -> Int# -- SllOp, SrlOp :: Word# -> Int# -> Word#-shiftRule lit_num_ty shift_op- = do { platform <- getPlatform- ; [e1, Lit (LitNumber LitNumInt shift_len)] <- getArgs- ; case e1 of- _ | shift_len == 0- -> return e1- -- See Note [Guarding against silly shifts]- | shift_len < 0 || shift_len > toInteger (platformWordSizeInBits platform)- -> return $ Lit $ mkLitNumberWrap platform lit_num_ty 0- -- Be sure to use lit_num_ty here, so we get a correctly typed zero- -- of type Int# or Word# resp. See #18589+shiftRule lit_num_ty shift_op = do+ platform <- getPlatform+ [e1, Lit (LitNumber LitNumInt shift_len)] <- getArgs - -- Do the shift at type Integer, but shift length is Int- Lit (LitNumber nt x)- | 0 < shift_len- , shift_len <= toInteger (platformWordSizeInBits platform)- -> let op = shift_op platform- y = x `op` fromInteger shift_len- in liftMaybe $ Just (Lit (mkLitNumberWrap platform nt y))+ bit_size <- case litNumBitSize platform lit_num_ty of+ Nothing -> mzero+ Just bs -> pure (toInteger bs) - _ -> mzero }+ case e1 of+ _ | shift_len == 0 -> pure e1 + -- See Note [Guarding against silly shifts]+ _ | shift_len < 0 || shift_len > bit_size+ -> pure $ Lit $ mkLitNumberWrap platform lit_num_ty 0+ -- Be sure to use lit_num_ty here, so we get a correctly typed zero.+ -- See #18589++ Lit (LitNumber nt x)+ | 0 < shift_len && shift_len <= bit_size+ -> assert (nt == lit_num_ty) $+ let op = shift_op platform+ -- Do the shift at type Integer, but shift length is Int.+ -- Using host's Int is ok even if target's Int has a different size+ -- because we test that shift_len <= bit_size (which is at most 64)+ y = x `op` fromInteger shift_len+ in pure $ Lit $ mkLitNumberWrap platform nt y++ _ -> mzero+ -------------------------- floatOp2 :: (Rational -> Rational -> Rational) -> RuleOpts -> Literal -> Literal@@ -1070,6 +1218,21 @@ (lit, b) = mkLitWordWrapC platform result c = if b then onei platform else zeroi platform +#if WORD_SIZE_IN_BITS < 64+int64Result :: Integer -> Maybe CoreExpr+int64Result result = Just (int64Result' result)++int64Result' :: Integer -> CoreExpr+int64Result' result = Lit (mkLitInt64Wrap result)++word64Result :: Integer -> Maybe CoreExpr+word64Result result = Just (word64Result' result)++word64Result' :: Integer -> CoreExpr+word64Result' result = Lit (mkLitWord64Wrap result)+#endif++ -- | 'ambiant (primop x) = x', but not nececesarily 'primop (ambient x) = x'. semiInversePrimOp :: PrimOp -> RuleM CoreExpr semiInversePrimOp primop = do@@ -1121,6 +1284,27 @@ guard $ cheapEqExpr e1 e2 return e1 +-- | Match+-- (op (op v e) e)+-- or (op e (op v e))+-- or (op (op e v) e)+-- or (op e (op e v))+-- and return the innermost (op v e) or (op e v).+sameArgIdempotentCommut :: PrimOp -> RuleM CoreExpr+sameArgIdempotentCommut op = do+ let is_op = \case+ BinOpApp v op' e | op == op' -> Just (v,e)+ _ -> Nothing+ [a,b] <- getArgs+ case (a,b) of+ (is_op -> Just (e1,e2), e3)+ | cheapEqExpr e2 e3 -> return a+ | cheapEqExpr e1 e3 -> return a+ (e3, is_op -> Just (e1,e2))+ | cheapEqExpr e2 e3 -> return b+ | cheapEqExpr e1 e3 -> return b+ _ -> mzero+ {- Note [Guarding against silly shifts] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~@@ -1878,7 +2062,9 @@ , id_passthrough "Word# -> Natural -> Word# (clamp)" naturalToWordClampName naturalNSName - -- identity passthrough with a conversion that can be done directly instead+ -- passthrough bignum small constructors with a conversion that can be done+ -- directly instead+ , small_passthrough "Int# -> Integer -> Word#" integerISName integerToWordName (mkPrimOpId IntToWordOp) , small_passthrough "Int# -> Integer -> Float#"@@ -1895,6 +2081,27 @@ , small_passthrough "Word# -> Natural -> Double#" naturalNSName naturalToDoubleName (mkPrimOpId WordToDoubleOp) +#if WORD_SIZE_IN_BITS < 64+ , id_passthrough "Int64# -> Integer -> Int64#"+ integerToInt64Name integerFromInt64Name+ , id_passthrough "Word64# -> Integer -> Word64#"+ integerToWord64Name integerFromWord64Name++ , small_passthrough "Int64# -> Integer -> Word64#"+ integerFromInt64Name integerToWord64Name (mkPrimOpId Int64ToWord64Op)+ , small_passthrough "Word64# -> Integer -> Int64#"+ integerFromWord64Name integerToInt64Name (mkPrimOpId Word64ToInt64Op)++ , small_passthrough "Word# -> Integer -> Word64#"+ integerFromWordName integerToWord64Name (mkPrimOpId WordToWord64Op)+ , small_passthrough "Word64# -> Integer -> Word#"+ integerFromWord64Name integerToWordName (mkPrimOpId Word64ToWordOp)+ , small_passthrough "Int# -> Integer -> Int64#"+ integerISName integerToInt64Name (mkPrimOpId IntToInt64Op)+ , small_passthrough "Int64# -> Integer -> Int#"+ integerFromInt64Name integerToIntName (mkPrimOpId Int64ToIntOp)+#endif+ -- Bits.bit , bignum_bit "integerBit" integerBitName mkLitInteger , bignum_bit "naturalBit" naturalBitName mkLitNatural@@ -2744,6 +2951,24 @@ , numMul = Word32MulOp , numLitType = LitNumWord32 }++#if WORD_SIZE_IN_BITS < 64+int64Ops :: NumOps+int64Ops = NumOps+ { numAdd = Int64AddOp+ , numSub = Int64SubOp+ , numMul = Int64MulOp+ , numLitType = LitNumInt64+ }++word64Ops :: NumOps+word64Ops = NumOps+ { numAdd = Word64AddOp+ , numSub = Word64SubOp+ , numMul = Word64MulOp+ , numLitType = LitNumWord64+ }+#endif intOps :: NumOps intOps = NumOps
compiler/GHC/Core/Opt/OccurAnal.hs view
@@ -66,10 +66,11 @@ Here's the externally-callable interface: -} +-- | Do occurrence analysis, and discard occurrence info returned occurAnalyseExpr :: CoreExpr -> CoreExpr--- Do occurrence analysis, and discard occurrence info returned-occurAnalyseExpr expr- = snd (occAnal initOccEnv expr)+occurAnalyseExpr expr = expr'+ where+ (WithUsageDetails _ expr') = occAnal initOccEnv expr occurAnalysePgm :: Module -- Used only in debug output -> (Id -> Bool) -- Active unfoldings@@ -88,8 +89,8 @@ init_env = initOccEnv { occ_rule_act = active_rule , occ_unf_act = active_unf } - (final_usage, occ_anald_binds) = go init_env binds- (_, occ_anald_glommed_binds) = occAnalRecBind init_env TopLevel+ (WithUsageDetails final_usage occ_anald_binds) = go init_env binds+ (WithUsageDetails _ occ_anald_glommed_binds) = occAnalRecBind init_env TopLevel imp_rule_edges (flattenBinds binds) initial_uds@@ -121,15 +122,14 @@ -- Not BuiltinRules; see Note [Plugin rules] , let rhs_fvs = exprFreeIds rhs `delVarSetList` bndrs ] - go :: OccEnv -> [CoreBind] -> (UsageDetails, [CoreBind])- go _ []- = (initial_uds, [])+ go :: OccEnv -> [CoreBind] -> WithUsageDetails [CoreBind]+ go !_ []+ = WithUsageDetails initial_uds [] go env (bind:binds)- = (final_usage, bind' ++ binds')+ = WithUsageDetails final_usage (bind' ++ binds') where- (bs_usage, binds') = go env binds- (final_usage, bind') = occAnalBind env TopLevel imp_rule_edges bind- bs_usage+ (WithUsageDetails bs_usage binds') = go env binds+ (WithUsageDetails final_usage bind') = occAnalBind env TopLevel imp_rule_edges bind bs_usage {- ********************************************************************* * *@@ -707,6 +707,9 @@ 'occAnalRec'.) -} ++data WithUsageDetails a = WithUsageDetails !UsageDetails !a+ ------------------------------------------------------------------ -- occAnalBind ------------------------------------------------------------------@@ -716,26 +719,25 @@ -> ImpRuleEdges -> CoreBind -> UsageDetails -- Usage details of scope- -> (UsageDetails, -- Of the whole let(rec)- [CoreBind])+ -> WithUsageDetails [CoreBind] -- Of the whole let(rec) -occAnalBind env lvl top_env (NonRec binder rhs) body_usage+occAnalBind !env lvl top_env (NonRec binder rhs) body_usage = occAnalNonRecBind env lvl top_env binder rhs body_usage occAnalBind env lvl top_env (Rec pairs) body_usage = occAnalRecBind env lvl top_env pairs body_usage ----------------- occAnalNonRecBind :: OccEnv -> TopLevelFlag -> ImpRuleEdges -> Var -> CoreExpr- -> UsageDetails -> (UsageDetails, [CoreBind])-occAnalNonRecBind env lvl imp_rule_edges bndr rhs body_usage+ -> UsageDetails -> WithUsageDetails [CoreBind]+occAnalNonRecBind !env lvl imp_rule_edges bndr rhs body_usage | isTyVar bndr -- A type let; we don't gather usage info- = (body_usage, [NonRec bndr rhs])+ = WithUsageDetails body_usage [NonRec bndr rhs] | not (bndr `usedIn` body_usage) -- It's not mentioned- = (body_usage, [])+ = WithUsageDetails body_usage [] | otherwise -- It's mentioned in the body- = (body_usage' `andUDs` rhs_usage, [NonRec final_bndr rhs'])+ = WithUsageDetails (body_usage' `andUDs` rhs_usage) [NonRec final_bndr rhs'] where (body_usage', tagged_bndr) = tagNonRecBinder lvl body_usage bndr final_bndr = tagged_bndr `setIdUnfolding` unf'@@ -754,12 +756,13 @@ -- See Note [Sources of one-shot information] rhs_env = env1 { occ_one_shots = argOneShots dmd }- (rhs_uds, rhs') = occAnalRhs rhs_env NonRecursive mb_join_arity rhs+ (WithUsageDetails rhs_uds rhs') = occAnalRhs rhs_env NonRecursive mb_join_arity rhs --------- Unfolding --------- -- See Note [Unfoldings and join points]- unf = idUnfolding bndr- (unf_uds, unf') = occAnalUnfolding rhs_env NonRecursive mb_join_arity unf+ unf | isId bndr = idUnfolding bndr+ | otherwise = NoUnfolding+ (WithUsageDetails unf_uds unf') = occAnalUnfolding rhs_env NonRecursive mb_join_arity unf --------- Rules --------- -- See Note [Rules are extra RHSs] and Note [Rule dependency info]@@ -791,14 +794,14 @@ ----------------- occAnalRecBind :: OccEnv -> TopLevelFlag -> ImpRuleEdges -> [(Var,CoreExpr)]- -> UsageDetails -> (UsageDetails, [CoreBind])+ -> UsageDetails -> WithUsageDetails [CoreBind] -- For a recursive group, we -- * occ-analyse all the RHSs -- * compute strongly-connected components -- * feed those components to occAnalRec -- See Note [Recursive bindings: the grand plan]-occAnalRecBind env lvl imp_rule_edges pairs body_usage- = foldr (occAnalRec rhs_env lvl) (body_usage, []) sccs+occAnalRecBind !env lvl imp_rule_edges pairs body_usage+ = foldr (occAnalRec rhs_env lvl) (WithUsageDetails body_usage []) sccs where sccs :: [SCC Details] sccs = {-# SCC "occAnalBind.scc" #-}@@ -816,19 +819,19 @@ ----------------------------- occAnalRec :: OccEnv -> TopLevelFlag -> SCC Details- -> (UsageDetails, [CoreBind])- -> (UsageDetails, [CoreBind])+ -> WithUsageDetails [CoreBind]+ -> WithUsageDetails [CoreBind] -- The NonRec case is just like a Let (NonRec ...) above-occAnalRec _ lvl (AcyclicSCC (ND { nd_bndr = bndr, nd_rhs = rhs+occAnalRec !_ lvl (AcyclicSCC (ND { nd_bndr = bndr, nd_rhs = rhs , nd_uds = rhs_uds, nd_rhs_bndrs = rhs_bndrs }))- (body_uds, binds)+ (WithUsageDetails body_uds binds) | not (bndr `usedIn` body_uds)- = (body_uds, binds) -- See Note [Dead code]+ = WithUsageDetails body_uds binds -- See Note [Dead code] | otherwise -- It's mentioned in the body- = (body_uds' `andUDs` rhs_uds',- NonRec tagged_bndr rhs : binds)+ = WithUsageDetails (body_uds' `andUDs` rhs_uds')+ (NonRec tagged_bndr rhs : binds) where (body_uds', tagged_bndr) = tagNonRecBinder lvl body_uds bndr rhs_uds' = adjustRhsUsage NonRecursive (willBeJoinId_maybe tagged_bndr)@@ -837,13 +840,13 @@ -- The Rec case is the interesting one -- See Note [Recursive bindings: the grand plan] -- See Note [Loop breaking]-occAnalRec env lvl (CyclicSCC details_s) (body_uds, binds)+occAnalRec env lvl (CyclicSCC details_s) (WithUsageDetails body_uds binds) | not (any (`usedIn` body_uds) bndrs) -- NB: look at body_uds, not total_uds- = (body_uds, binds) -- See Note [Dead code]+ = WithUsageDetails body_uds binds -- See Note [Dead code] | otherwise -- At this point we always build a single Rec = -- pprTrace "occAnalRec" (ppr loop_breaker_nodes)- (final_uds, Rec pairs : binds)+ WithUsageDetails final_uds (Rec pairs : binds) where bndrs = map nd_bndr details_s@@ -854,7 +857,7 @@ -- See Note [Choosing loop breakers] for loop_breaker_nodes final_uds :: UsageDetails loop_breaker_nodes :: [LetrecNode]- (final_uds, loop_breaker_nodes) = mkLoopBreakerNodes env lvl body_uds details_s+ (WithUsageDetails final_uds loop_breaker_nodes) = mkLoopBreakerNodes env lvl body_uds details_s ------------------------------ active_rule_fvs :: VarSet@@ -1354,7 +1357,7 @@ makeNode :: OccEnv -> ImpRuleEdges -> VarSet -> (Var, CoreExpr) -> LetrecNode -- See Note [Recursive bindings: the grand plan]-makeNode env imp_rule_edges bndr_set (bndr, rhs)+makeNode !env imp_rule_edges bndr_set (bndr, rhs) = DigraphNode { node_payload = details , node_key = varUnique bndr , node_dependencies = nonDetKeysUniqSet scope_fvs }@@ -1402,14 +1405,14 @@ -- the final answer for mb_join_arity (bndrs, body) = collectBinders rhs rhs_env = rhsCtxt env- (rhs_uds, bndrs', body') = occAnalLamOrRhs rhs_env bndrs body+ (WithUsageDetails rhs_uds (bndrs', body')) = occAnalLamOrRhs rhs_env bndrs body rhs' = mkLams bndrs' body' --------- Unfolding --------- -- See Note [Unfoldings and join points] unf = realIdUnfolding bndr -- realIdUnfolding: Ignore loop-breaker-ness -- here because that is what we are setting!- (unf_uds, unf') = occAnalUnfolding rhs_env Recursive mb_join_arity unf+ (WithUsageDetails unf_uds unf') = occAnalUnfolding rhs_env Recursive mb_join_arity unf --------- IMP-RULES -------- is_active = occ_rule_act env :: Activation -> Bool@@ -1436,8 +1439,7 @@ mkLoopBreakerNodes :: OccEnv -> TopLevelFlag -> UsageDetails -- for BODY of let -> [Details]- -> (UsageDetails, -- adjusted- [LetrecNode])+ -> WithUsageDetails [LetrecNode] -- adjusted -- See Note [Choosing loop breakers] -- This function primarily creates the Nodes for the -- loop-breaker SCC analysis. More specifically:@@ -1447,8 +1449,8 @@ -- the loop-breaker SCC analysis -- d) adjust each RHS's usage details according to -- the binder's (new) shotness and join-point-hood-mkLoopBreakerNodes env lvl body_uds details_s- = (final_uds, zipWithEqual "mkLoopBreakerNodes" mk_lb_node details_s bndrs')+mkLoopBreakerNodes !env lvl body_uds details_s+ = WithUsageDetails final_uds (zipWithEqual "mkLoopBreakerNodes" mk_lb_node details_s bndrs') where (final_uds, bndrs') = tagRecBinders lvl body_uds@@ -1503,7 +1505,7 @@ -> VarSet -- Loop-breaker dependencies -> Details -> NodeScore-nodeScore env new_bndr lb_deps+nodeScore !env new_bndr lb_deps (ND { nd_bndr = old_bndr, nd_rhs = bind_rhs }) | not (isId old_bndr) -- A type or coercion variable is never a loop breaker@@ -1709,54 +1711,55 @@ occAnalRhs :: OccEnv -> RecFlag -> Maybe JoinArity -> CoreExpr -- RHS- -> (UsageDetails, CoreExpr)-occAnalRhs env is_rec mb_join_arity rhs- = case occAnalLamOrRhs env bndrs body of { (body_usage, bndrs', body') ->- let final_bndrs | isRec is_rec = bndrs'- | otherwise = markJoinOneShots mb_join_arity bndrs'- -- For a /non-recursive/ join point we can mark all- -- its join-lambda as one-shot; and it's a good idea to do so-- -- Final adjustment- rhs_usage = adjustRhsUsage is_rec mb_join_arity final_bndrs body_usage+ -> WithUsageDetails CoreExpr+occAnalRhs !env is_rec mb_join_arity rhs+ = let+ (bndrs, body) = collectBinders rhs+ (WithUsageDetails body_usage (bndrs',body')) = occAnalLamOrRhs env bndrs body+ final_bndrs | isRec is_rec = bndrs'+ | otherwise = markJoinOneShots mb_join_arity bndrs'+ -- For a /non-recursive/ join point we can mark all+ -- its join-lambda as one-shot; and it's a good idea to do so - in (rhs_usage, mkLams final_bndrs body') }- where- (bndrs, body) = collectBinders rhs+ -- Final adjustment+ rhs_usage = adjustRhsUsage is_rec mb_join_arity final_bndrs body_usage+ in WithUsageDetails rhs_usage (mkLams final_bndrs body') occAnalUnfolding :: OccEnv -> RecFlag -> Maybe JoinArity -- See Note [Join points and unfoldings/rules] -> Unfolding- -> (UsageDetails, Unfolding)+ -> WithUsageDetails Unfolding -- Occurrence-analyse a stable unfolding; -- discard a non-stable one altogether.-occAnalUnfolding env is_rec mb_join_arity unf+occAnalUnfolding !env is_rec mb_join_arity unf = case unf of unf@(CoreUnfolding { uf_tmpl = rhs, uf_src = src })- | isStableSource src -> (markAllMany usage, unf')+ | isStableSource src ->+ let+ (WithUsageDetails usage rhs') = occAnalRhs env is_rec mb_join_arity rhs++ unf' | noBinderSwaps env = unf -- Note [Unfoldings and rules]+ | otherwise = unf { uf_tmpl = rhs' }+ in WithUsageDetails (markAllMany usage) unf' -- markAllMany: see Note [Occurrences in stable unfoldings]- | otherwise -> (emptyDetails, unf)+ | otherwise -> WithUsageDetails emptyDetails unf -- For non-Stable unfoldings we leave them undisturbed, but -- don't count their usage because the simplifier will discard them. -- We leave them undisturbed because nodeScore uses their size info -- to guide its decisions. It's ok to leave un-substituted -- expressions in the tree because all the variables that were in -- scope remain in scope; there is no cloning etc.- where- (usage, rhs') = occAnalRhs env is_rec mb_join_arity rhs - unf' | noBinderSwaps env = unf -- Note [Unfoldings and rules]- | otherwise = unf { uf_tmpl = rhs' }- unf@(DFunUnfolding { df_bndrs = bndrs, df_args = args })- -> ( final_usage, unf { df_args = args' } )+ -> WithUsageDetails final_usage (unf { df_args = args' }) where env' = env `addInScope` bndrs- (usage, args') = occAnalList env' args+ (WithUsageDetails usage args') = occAnalList env' args final_usage = markAllManyNonTail (delDetailsList usage bndrs)+ `addLamCoVarOccs` bndrs - unf -> (emptyDetails, unf)+ unf -> WithUsageDetails emptyDetails unf occAnalRules :: OccEnv -> Maybe JoinArity -- See Note [Join points and unfoldings/rules]@@ -1764,7 +1767,7 @@ -> [(CoreRule, -- Each (non-built-in) rule UsageDetails, -- Usage details for LHS UsageDetails)] -- Usage details for RHS-occAnalRules env mb_join_arity bndr+occAnalRules !env mb_join_arity bndr = map occ_anal_rule (idCoreRules bndr) where occ_anal_rule rule@(Rule { ru_bndrs = bndrs, ru_args = args, ru_rhs = rhs })@@ -1774,11 +1777,11 @@ rule' | noBinderSwaps env = rule -- Note [Unfoldings and rules] | otherwise = rule { ru_args = args', ru_rhs = rhs' } - (lhs_uds, args') = occAnalList env' args- lhs_uds' = markAllManyNonTail $- lhs_uds `delDetailsList` bndrs+ (WithUsageDetails lhs_uds args') = occAnalList env' args+ lhs_uds' = markAllManyNonTail (lhs_uds `delDetailsList` bndrs)+ `addLamCoVarOccs` bndrs - (rhs_uds, rhs') = occAnal env' rhs+ (WithUsageDetails rhs_uds rhs') = occAnal env' rhs -- Note [Rules are extra RHSs] -- Note [Rule dependency info] rhs_uds' = markAllNonTailIf (not exact_join) $@@ -1889,20 +1892,20 @@ ************************************************************************ -} -occAnalList :: OccEnv -> [CoreExpr] -> (UsageDetails, [CoreExpr])-occAnalList _ [] = (emptyDetails, [])-occAnalList env (e:es) = case occAnal env e of { (uds1, e') ->- case occAnalList env es of { (uds2, es') ->- (uds1 `andUDs` uds2, e' : es') } }+occAnalList :: OccEnv -> [CoreExpr] -> WithUsageDetails [CoreExpr]+occAnalList !_ [] = WithUsageDetails emptyDetails []+occAnalList env (e:es) = let+ (WithUsageDetails uds1 e') = occAnal env e+ (WithUsageDetails uds2 es') = occAnalList env es+ in WithUsageDetails (uds1 `andUDs` uds2) (e' : es') occAnal :: OccEnv -> CoreExpr- -> (UsageDetails, -- Gives info only about the "interesting" Ids- CoreExpr)+ -> WithUsageDetails CoreExpr -- Gives info only about the "interesting" Ids -occAnal _ expr@(Type _) = (emptyDetails, expr)-occAnal _ expr@(Lit _) = (emptyDetails, expr)-occAnal env expr@(Var _) = occAnalApp env (expr, [], [])+occAnal !_ expr@(Lit _) = WithUsageDetails emptyDetails expr++occAnal env expr@(Var _) = occAnalApp env (expr, [], []) -- At one stage, I gathered the idRuleVars for the variable here too, -- which in a way is the right thing to do. -- But that went wrong right after specialisation, when@@ -1910,35 +1913,74 @@ -- rules in them, so the *specialised* versions looked as if they -- weren't used at all. -occAnal _ (Coercion co)- = (addManyOccs emptyDetails (coVarsOfCo co), Coercion co)+occAnal _ expr@(Type ty)+ = WithUsageDetails (addManyOccs emptyDetails (coVarsOfType ty)) expr+occAnal _ expr@(Coercion co)+ = WithUsageDetails (addManyOccs emptyDetails (coVarsOfCo co)) expr -- See Note [Gather occurrences of coercion variables] -{--Note [Gather occurrences of coercion variables]+{- Note [Gather occurrences of coercion variables] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~-We need to gather info about what coercion variables appear, so that-we can sort them into the right place when doing dependency analysis.+We need to gather info about what coercion variables appear, for two reasons:++1. So that we can sort them into the right place when doing dependency analysis.++2. So that we know when they are surely dead.++It is useful to know when they a coercion variable is surely dead,+when we want to discard a case-expression, in GHC.Core.Opt.Simplify.rebuildCase.+For example (#20143):++ case unsafeEqualityProof @blah of+ UnsafeRefl cv -> ...no use of cv...++Here we can discard the case, since unsafeEqualityProof always terminates.+But only if the coercion variable 'cv' is unused.++Another example from #15696: we had something like+ case eq_sel d of co -> ...(typeError @(...co...) "urk")...+Then 'd' was substituted by a dictionary, so the expression+simpified to+ case (Coercion <blah>) of cv -> ...(typeError @(...cv...) "urk")...++We can only drop the case altogether if 'cv' is unused, which is not+the case here.++Conclusion: we need accurate dead-ness info for CoVars.+We gather CoVar occurrences from:++ * The (Type ty) and (Coercion co) cases of occAnal++ * The type 'ty' of a lambda-binder (\(x:ty). blah)+ See addLamCoVarOccs++But it is not necessary to gather CoVars from the types of other binders.++* For let-binders, if the type mentions a CoVar, so will the RHS (since+ it has the same type)++* For case-alt binders, if the type mentions a CoVar, so will the scrutinee+ (since it has the same type) -} occAnal env (Tick tickish body) | SourceNote{} <- tickish- = (usage, Tick tickish body')+ = WithUsageDetails usage (Tick tickish body') -- SourceNotes are best-effort; so we just proceed as usual. -- If we drop a tick due to the issues described below it's -- not the end of the world. | tickish `tickishScopesLike` SoftScope- = (markAllNonTail usage, Tick tickish body')+ = WithUsageDetails (markAllNonTail usage) (Tick tickish body') | Breakpoint _ _ ids <- tickish- = (usage_lam `andUDs` foldr addManyOcc emptyDetails ids, Tick tickish body')+ = WithUsageDetails (usage_lam `andUDs` foldr addManyOcc emptyDetails ids) (Tick tickish body') -- never substitute for any of the Ids in a Breakpoint | otherwise- = (usage_lam, Tick tickish body')+ = WithUsageDetails usage_lam (Tick tickish body') where- !(usage,body') = occAnal env body+ (WithUsageDetails usage body') = occAnal env body -- for a non-soft tick scope, we can inline lambdas only usage_lam = markAllNonTail (markAllInsideLam usage) -- TODO There may be ways to make ticks and join points play@@ -1950,15 +1992,15 @@ -- See #14242. occAnal env (Cast expr co)- = case occAnal env expr of { (usage, expr') ->- let usage1 = markAllManyNonTailIf (isRhsEnv env) usage+ = let+ (WithUsageDetails usage expr') = occAnal env expr+ usage1 = markAllManyNonTailIf (isRhsEnv env) usage -- usage1: if we see let x = y `cast` co -- then mark y as 'Many' so that we don't -- immediately inline y again.- usage2 = addManyOccs usage1 (coVarsOfCo co)+ usage2 = addManyOccs usage1 (coVarsOfCo co) -- usage2: see Note [Gather occurrences of coercion variables]- in (markAllNonTail usage2, Cast expr' co)- }+ in WithUsageDetails (markAllNonTail usage2) (Cast expr' co) occAnal env app@(App _ _) = occAnalApp env (collectArgsTicks tickishFloatable app)@@ -1969,9 +2011,9 @@ occAnal env (Lam x body) | isTyVar x- = case occAnal env body of { (body_usage, body') ->- (markAllNonTail body_usage, Lam x body')- }+ = let+ (WithUsageDetails body_usage body') = occAnal env body+ in WithUsageDetails (markAllNonTail body_usage) (Lam x body') {- Note [Occurrence analysis for lambda binders] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~@@ -1991,53 +2033,49 @@ occAnal env expr@(Lam _ _) = -- See Note [Occurrence analysis for lambda binders]- case occAnalLamOrRhs env bndrs body of { (usage, tagged_bndrs, body') -> let- expr' = mkLams tagged_bndrs body'- usage1 = markAllNonTail usage- one_shot_gp = all isOneShotBndr tagged_bndrs- final_usage = markAllInsideLamIf (not one_shot_gp) usage1- in- (final_usage, expr') }- where- (bndrs, body) = collectBinders expr+ (bndrs, body) = collectBinders expr+ (WithUsageDetails usage (tagged_bndrs, body')) = occAnalLamOrRhs env bndrs body+ expr' = mkLams tagged_bndrs body'+ usage1 = markAllNonTail usage+ one_shot_gp = all isOneShotBndr tagged_bndrs+ final_usage = markAllInsideLamIf (not one_shot_gp) usage1+ `addLamCoVarOccs` bndrs+ -- See Note [Gather occurrences of coercion variables]+ in WithUsageDetails final_usage expr' occAnal env (Case scrut bndr ty alts)- = case occAnal (scrutCtxt env alts) scrut of { (scrut_usage, scrut') ->- let alt_env = addBndrSwap scrut' bndr $- env { occ_encl = OccVanilla } `addInScope` [bndr]- in- case mapAndUnzip (occAnalAlt alt_env) alts of { (alts_usage_s, alts') ->- let- alts_usage = foldr orUDs emptyDetails alts_usage_s- (alts_usage1, tagged_bndr) = tagLamBinder alts_usage bndr- total_usage = markAllNonTail scrut_usage `andUDs` alts_usage1- -- Alts can have tail calls, but the scrutinee can't- in- total_usage `seq` (total_usage, Case scrut' tagged_bndr ty alts') }}+ = let+ (WithUsageDetails scrut_usage scrut') = occAnal (scrutCtxt env alts) scrut+ alt_env = addBndrSwap scrut' bndr $ env { occ_encl = OccVanilla } `addInScope` [bndr]+ (alts_usage_s, alts') = mapAndUnzip ((\(WithUsageDetails uds a) -> (uds,a)) . occAnalAlt alt_env) alts+ alts_usage = foldr orUDs emptyDetails alts_usage_s+ (alts_usage1, tagged_bndr) = tagLamBinder alts_usage bndr+ total_usage = markAllNonTail scrut_usage `andUDs` alts_usage1+ -- Alts can have tail calls, but the scrutinee can't+ in WithUsageDetails total_usage (Case scrut' tagged_bndr ty alts') occAnal env (Let bind body)- = case occAnal (env `addInScope` bindersOf bind)- body of { (body_usage, body') ->- case occAnalBind env NotTopLevel- noImpRuleEdges bind- body_usage of { (final_usage, new_binds) ->- (final_usage, mkLets new_binds body') }}--occAnalArgs :: OccEnv -> [CoreExpr] -> [OneShots] -> (UsageDetails, [CoreExpr])-occAnalArgs _ [] _- = (emptyDetails, [])--occAnalArgs env (arg:args) one_shots- | isTypeArg arg- = case occAnalArgs env args one_shots of { (uds, args') ->- (uds, arg:args') }+ = let+ (WithUsageDetails body_usage body') = occAnal (env `addInScope` bindersOf bind) body+ (WithUsageDetails final_usage new_binds) = occAnalBind env NotTopLevel+ noImpRuleEdges bind body_usage+ in WithUsageDetails final_usage (mkLets new_binds body') - | otherwise- = case argCtxt env one_shots of { (arg_env, one_shots') ->- case occAnal arg_env arg of { (uds1, arg') ->- case occAnalArgs env args one_shots' of { (uds2, args') ->- (uds1 `andUDs` uds2, arg':args') }}}+occAnalArgs :: OccEnv -> CoreExpr -> [CoreExpr] -> [OneShots] -> WithUsageDetails CoreExpr+-- The `fun` argument is just an accumulating parameter,+-- the base for building the application we return+occAnalArgs !env fun args !one_shots+ = go emptyDetails fun args one_shots+ where+ go uds fun [] _ = WithUsageDetails uds fun+ go uds fun (arg:args) one_shots+ = go (uds `andUDs` arg_uds) (fun `App` arg') args one_shots'+ where+ !(WithUsageDetails arg_uds arg') = occAnal arg_env arg+ !(arg_env, one_shots')+ | isTypeArg arg = (env, one_shots)+ | otherwise = valArgCtxt env one_shots {- Applications are dealt with specially because we want@@ -2058,9 +2096,9 @@ occAnalApp :: OccEnv -> (Expr CoreBndr, [Arg CoreBndr], [CoreTickish])- -> (UsageDetails, Expr CoreBndr)+ -> WithUsageDetails (Expr CoreBndr) -- Naked variables (not applied) end up here too-occAnalApp env (Var fun, args, ticks)+occAnalApp !env (Var fun, args, ticks) -- Account for join arity of runRW# continuation -- See Note [Simplification of runRW#] --@@ -2071,13 +2109,17 @@ -- This caused #18296 | fun `hasKey` runRWKey , [t1, t2, arg] <- args- , let (usage, arg') = occAnalRhs env NonRecursive (Just 1) arg- = (usage, mkTicks ticks $ mkApps (Var fun) [t1, t2, arg'])+ , let (WithUsageDetails usage arg') = occAnalRhs env NonRecursive (Just 1) arg+ = WithUsageDetails usage (mkTicks ticks $ mkApps (Var fun) [t1, t2, arg']) occAnalApp env (Var fun_id, args, ticks)- = (all_uds, mkTicks ticks $ mkApps fun' args')+ = WithUsageDetails all_uds (mkTicks ticks app') where- (fun', fun_id') = lookupBndrSwap env fun_id+ -- Lots of banged bindings: this is a very heavily bit of code,+ -- so it pays not to make lots of thunks here, all of which+ -- will ultimately be forced.+ !(fun', fun_id') = lookupBndrSwap env fun_id+ !(WithUsageDetails args_uds app') = occAnalArgs env fun' args one_shots fun_uds = mkOneOcc fun_id' int_cxt n_args -- NB: fun_uds is computed for fun_id', not fun_id@@ -2085,8 +2127,7 @@ all_uds = fun_uds `andUDs` final_args_uds - !(args_uds, args') = occAnalArgs env args one_shots- !final_args_uds = markAllNonTail $+ !final_args_uds = markAllNonTail $ markAllInsideLamIf (isRhsEnv env && is_exp) $ args_uds -- We mark the free vars of the argument of a constructor or PAP@@ -2099,14 +2140,14 @@ -- This is the *whole point* of the isRhsEnv predicate -- See Note [Arguments of let-bound constructors] - n_val_args = valArgCount args- n_args = length args- int_cxt = case occ_encl env of+ !n_val_args = valArgCount args+ !n_args = length args+ !int_cxt = case occ_encl env of OccScrut -> IsInteresting _other | n_val_args > 0 -> IsInteresting | otherwise -> NotInteresting - is_exp = isExpandableApp fun_id n_val_args+ !is_exp = isExpandableApp fun_id n_val_args -- See Note [CONLIKE pragma] in GHC.Types.Basic -- The definition of is_exp should match that in GHC.Core.Opt.Simplify.prepareRhs @@ -2116,17 +2157,17 @@ -- See Note [Sources of one-shot information], bullet point A'] occAnalApp env (fun, args, ticks)- = (markAllNonTail (fun_uds `andUDs` args_uds),- mkTicks ticks $ mkApps fun' args')+ = WithUsageDetails (markAllNonTail (fun_uds `andUDs` args_uds))+ (mkTicks ticks app') where- !(fun_uds, fun') = occAnal (addAppCtxt env args) fun+ !(WithUsageDetails args_uds app') = occAnalArgs env fun' args []+ !(WithUsageDetails fun_uds fun') = occAnal (addAppCtxt env args) fun -- The addAppCtxt is a bit cunning. One iteration of the simplifier -- often leaves behind beta redexs like -- (\x y -> e) a1 a2 -- Here we would like to mark x,y as one-shot, and treat the whole -- thing much like a let. We do this by pushing some OneShotLam items -- onto the context stack.- !(args_uds, args') = occAnalArgs env args [] addAppCtxt :: OccEnv -> [Arg CoreBndr] -> OccEnv addAppCtxt env@(OccEnv { occ_one_shots = ctxt }) args@@ -2230,11 +2271,12 @@ -} occAnalLamOrRhs :: OccEnv -> [CoreBndr] -> CoreExpr- -> (UsageDetails, [CoreBndr], CoreExpr)+ -> WithUsageDetails ([CoreBndr], CoreExpr) -- Tags the returned binders with their OccInfo, but does -- not do any markInsideLam to the returned usage details-occAnalLamOrRhs env [] body- = case occAnal env body of (body_usage, body') -> (body_usage, [], body')+occAnalLamOrRhs !env [] body+ = let (WithUsageDetails body_usage body') = occAnal env body+ in WithUsageDetails body_usage ([], body') -- RHS of thunk or nullary join point occAnalLamOrRhs env (bndr:bndrs) body@@ -2242,28 +2284,29 @@ = -- Important: Keep the environment so that we don't inline into an RHS like -- \(@ x) -> C @x (f @x) -- (see the beginning of Note [Cascading inlines]).- case occAnalLamOrRhs env bndrs body of- (body_usage, bndrs', body') -> (body_usage, bndr:bndrs', body')+ let+ (WithUsageDetails body_usage (bndrs',body')) = occAnalLamOrRhs env bndrs body+ in WithUsageDetails body_usage (bndr:bndrs', body') occAnalLamOrRhs env binders body- = case occAnal env_body body of { (body_usage, body') ->- let- (final_usage, tagged_binders) = tagLamBinders body_usage binders'+ = let+ (WithUsageDetails body_usage body') = occAnal env_body body+ (final_usage, tagged_binders) = tagLamBinders body_usage binders' -- Use binders' to put one-shot info on the lambdas in- (final_usage, tagged_binders, body') }+ WithUsageDetails final_usage (tagged_binders, body') where env1 = env `addInScope` binders (env_body, binders') = oneShotGroup env1 binders occAnalAlt :: OccEnv- -> CoreAlt -> (UsageDetails, Alt IdWithOccInfo)-occAnalAlt env (Alt con bndrs rhs)- = case occAnal (env `addInScope` bndrs) rhs of { (rhs_usage1, rhs1) ->- let+ -> CoreAlt -> WithUsageDetails (Alt IdWithOccInfo)+occAnalAlt !env (Alt con bndrs rhs)+ = let+ (WithUsageDetails rhs_usage1 rhs1) = occAnal (env `addInScope` bndrs) rhs (alt_usg, tagged_bndrs) = tagLamBinders rhs_usage1 bndrs in -- See Note [Binders in case alternatives]- (alt_usg, Alt con tagged_bndrs rhs1) }+ WithUsageDetails alt_usg (Alt con tagged_bndrs rhs1) {- ************************************************************************@@ -2284,8 +2327,8 @@ -- If x :-> (y, co) is in the env, -- then please replace x by (y |> sym mco) -- Invariant of course: idType x = exprType (y |> sym mco)- , occ_bs_env :: VarEnv (OutId, MCoercion)- , occ_bs_rng :: VarSet -- Vars free in the range of occ_bs_env+ , occ_bs_env :: !(VarEnv (OutId, MCoercion))+ , occ_bs_rng :: !VarSet -- Vars free in the range of occ_bs_env -- Domain is Global and Local Ids -- Range is just Local Ids }@@ -2337,7 +2380,7 @@ noBinderSwaps (OccEnv { occ_bs_env = bs_env }) = isEmptyVarEnv bs_env scrutCtxt :: OccEnv -> [CoreAlt] -> OccEnv-scrutCtxt env alts+scrutCtxt !env alts | interesting_alts = env { occ_encl = OccScrut, occ_one_shots = [] } | otherwise = env { occ_encl = OccVanilla, occ_one_shots = [] } where@@ -2350,12 +2393,12 @@ -- pre/postInlineUnconditionally. Grep for "occ_int_cxt"! rhsCtxt :: OccEnv -> OccEnv-rhsCtxt env = env { occ_encl = OccRhs, occ_one_shots = [] }+rhsCtxt !env = env { occ_encl = OccRhs, occ_one_shots = [] } -argCtxt :: OccEnv -> [OneShots] -> (OccEnv, [OneShots])-argCtxt env []+valArgCtxt :: OccEnv -> [OneShots] -> (OccEnv, [OneShots])+valArgCtxt !env [] = (env { occ_encl = OccVanilla, occ_one_shots = [] }, [])-argCtxt env (one_shots:one_shots_s)+valArgCtxt env (one_shots:one_shots_s) = (env { occ_encl = OccVanilla, occ_one_shots = one_shots }, one_shots_s) isRhsEnv :: OccEnv -> Bool@@ -2783,9 +2826,9 @@ data UsageDetails = UD { ud_env :: !OccInfoEnv- , ud_z_many :: ZappedSet -- apply 'markMany' to these- , ud_z_in_lam :: ZappedSet -- apply 'markInsideLam' to these- , ud_z_no_tail :: ZappedSet } -- apply 'markNonTail' to these+ , ud_z_many :: !ZappedSet -- apply 'markMany' to these+ , ud_z_in_lam :: !ZappedSet -- apply 'markInsideLam' to these+ , ud_z_no_tail :: !ZappedSet } -- apply 'markNonTail' to these -- INVARIANT: All three zapped sets are subsets of the OccInfoEnv instance Outputable UsageDetails where@@ -2829,6 +2872,12 @@ addManyOccs usage id_set = nonDetStrictFoldUniqSet addManyOcc usage id_set -- It's OK to use nonDetStrictFoldUniqSet here because addManyOcc commutes +addLamCoVarOccs :: UsageDetails -> [Var] -> UsageDetails+-- Add any CoVars free in the type of a lambda-binder+-- See Note [Gather occurrences of coercion variables]+addLamCoVarOccs uds bndrs+ = uds `addManyOccs` coVarsOfTypes (map varType bndrs)+ delDetails :: UsageDetails -> Id -> UsageDetails delDetails ud bndr = ud `alterUsageDetails` (`delVarEnv` bndr)@@ -2871,10 +2920,6 @@ lookupDetails :: UsageDetails -> Id -> OccInfo lookupDetails ud id- | isCoVar id -- We do not currently gather occurrence info (from types)- = noOccInfo -- for CoVars, so we must conservatively mark them as used- -- See Note [DoO not mark CoVars as dead]- | otherwise = case lookupVarEnv (ud_env ud) id of Just occ -> doZapping ud id occ Nothing -> IAmDead@@ -2889,25 +2934,6 @@ restrictFreeVars :: VarSet -> OccInfoEnv -> VarSet restrictFreeVars bndrs fvs = restrictUniqSetToUFM bndrs fvs -{- Note [Do not mark CoVars as dead]-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~-It's obviously wrong to mark CoVars as dead if they are used.-Currently we don't traverse types to gather usage info for CoVars,-so we had better treat them as having noOccInfo.--This showed up in #15696 we had something like- case eq_sel d of co -> ...(typeError @(...co...) "urk")...--Then 'd' was substituted by a dictionary, so the expression-simpified to- case (Coercion <blah>) of co -> ...(typeError @(...co...) "urk")...--But then the "drop the case altogether" equation of rebuildCase-thought that 'co' was dead, and discarded the entire case. Urk!--I have no idea how we managed to avoid this pitfall for so long!--}- ------------------- -- Auxiliary functions for UsageDetails implementation @@ -2939,20 +2965,19 @@ occ2 | uniq `elemVarEnvByKey` no_tail = markNonTail occ1 | otherwise = occ1 -alterZappedSets :: UsageDetails -> (ZappedSet -> ZappedSet) -> UsageDetails-alterZappedSets ud f- = ud { ud_z_many = f (ud_z_many ud)+alterUsageDetails :: UsageDetails -> (OccInfoEnv -> OccInfoEnv) -> UsageDetails+alterUsageDetails !ud f+ = UD { ud_env = f (ud_env ud)+ , ud_z_many = f (ud_z_many ud) , ud_z_in_lam = f (ud_z_in_lam ud) , ud_z_no_tail = f (ud_z_no_tail ud) } -alterUsageDetails :: UsageDetails -> (OccInfoEnv -> OccInfoEnv) -> UsageDetails-alterUsageDetails ud f- = ud { ud_env = f (ud_env ud) } `alterZappedSets` f- flattenUsageDetails :: UsageDetails -> UsageDetails-flattenUsageDetails ud- = ud { ud_env = mapUFM_Directly (doZappingByUnique ud) (ud_env ud) }- `alterZappedSets` const emptyVarEnv+flattenUsageDetails ud@(UD { ud_env = env })+ = UD { ud_env = mapUFM_Directly (doZappingByUnique ud) env+ , ud_z_many = emptyVarEnv+ , ud_z_in_lam = emptyVarEnv+ , ud_z_no_tail = emptyVarEnv } ------------------- -- See Note [Adjusting right-hand sides]@@ -3150,9 +3175,11 @@ willBeJoinId_maybe :: CoreBndr -> Maybe JoinArity willBeJoinId_maybe bndr- = case tailCallInfo (idOccInfo bndr) of- AlwaysTailCalled arity -> Just arity- _ -> isJoinId_maybe bndr+ | isId bndr+ , AlwaysTailCalled arity <- tailCallInfo (idOccInfo bndr)+ = Just arity+ | otherwise+ = isJoinId_maybe bndr {- Note [Join points and INLINE pragmas]
compiler/GHC/Core/Predicate.hs view
@@ -24,6 +24,7 @@ -- Implicit parameters isIPLikePred, hasIPSuperClasses, isIPTyCon, isIPClass,+ isCallStackTy, isCallStackPred, isCallStackPredTy, -- Evidence variables DictId, isEvVar, isDictId@@ -44,6 +45,7 @@ import GHC.Utils.Outputable import GHC.Utils.Misc import GHC.Utils.Panic+import GHC.Data.FastString( FastString ) -- | A predicate in the solver. The solver tries to prove Wanted predicates@@ -256,6 +258,39 @@ initIPRecTc :: RecTcChecker initIPRecTc = setRecTcMaxBound 1 initRecTc++-- --------------------- CallStack predicates ---------------------------------++isCallStackPredTy :: Type -> Bool+-- True of HasCallStack, or IP "blah" CallStack+isCallStackPredTy ty+ | Just (tc, tys) <- splitTyConApp_maybe ty+ , Just cls <- tyConClass_maybe tc+ , Just {} <- isCallStackPred cls tys+ = True+ | otherwise+ = False++-- | Is a 'PredType' a 'CallStack' implicit parameter?+--+-- If so, return the name of the parameter.+isCallStackPred :: Class -> [Type] -> Maybe FastString+isCallStackPred cls tys+ | [ty1, ty2] <- tys+ , isIPClass cls+ , isCallStackTy ty2+ = isStrLitTy ty1+ | otherwise+ = Nothing++-- | Is a type a 'CallStack'?+isCallStackTy :: Type -> Bool+isCallStackTy ty+ | Just tc <- tyConAppTyCon_maybe ty+ = tc `hasKey` callStackTyConKey+ | otherwise+ = False+ {- Note [Local implicit parameters] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
compiler/GHC/Core/SimpleOpt.hs view
@@ -1174,7 +1174,12 @@ -- Look through dictionary functions; see Note [Unfolding DFuns] | DFunUnfolding { df_bndrs = bndrs, df_con = con, df_args = dfun_args } <- unfolding , bndrs `equalLength` args -- See Note [DFun arity check]- , let subst = mkOpenSubst in_scope (bndrs `zip` args)+ , let in_scope' = extend_in_scope (exprsFreeVars dfun_args)+ subst = mkOpenSubst in_scope' (bndrs `zip` args)+ -- We extend the in-scope set here to silence warnings from+ -- substExpr when it finds not-in-scope Ids in dfun_args.+ -- simplOptExpr initialises the in-scope set with exprFreeVars,+ -- but that doesn't account for DFun unfoldings = succeedWith in_scope floats $ pushCoDataCon con (map (substExpr subst) dfun_args) co @@ -1185,7 +1190,7 @@ -- CPR'd workers getting inlined back into their wrappers, | idArity fun == 0 , Just rhs <- expandUnfolding_maybe unfolding- , let in_scope' = extendInScopeSetSet in_scope (exprFreeVars rhs)+ , let in_scope' = extend_in_scope (exprFreeVars rhs) = go (Left in_scope') floats rhs cont -- See Note [exprIsConApp_maybe on literal strings]@@ -1197,6 +1202,11 @@ dealWithStringLiteral fun str co where unfolding = id_unf fun+ extend_in_scope unf_fvs+ | isLocalId fun = in_scope `extendInScopeSetSet` unf_fvs+ | otherwise = in_scope+ -- A GlobalId has no (LocalId) free variables; and the+ -- in-scope set tracks only LocalIds go _ _ _ _ = Nothing
compiler/GHC/Core/Unfold.hs view
@@ -954,8 +954,11 @@ ---------------- smallEnoughToInline :: UnfoldingOpts -> Unfolding -> Bool-smallEnoughToInline opts (CoreUnfolding {uf_guidance = UnfIfGoodArgs {ug_size = size}})- = size <= unfoldingUseThreshold opts+smallEnoughToInline opts (CoreUnfolding {uf_guidance = guidance})+ = case guidance of+ UnfIfGoodArgs {ug_size = size} -> size <= unfoldingUseThreshold opts+ UnfWhen {} -> True+ UnfNever -> False smallEnoughToInline _ _ = False
compiler/GHC/Core/Unfold/Make.hs view
@@ -169,14 +169,14 @@ , uf_is_top = top_lvl , uf_guidance = old_guidance }) | isStableSource src -- See Note [Specialising unfoldings]- , UnfWhen { ug_arity = old_arity } <- old_guidance+ , UnfWhen { ug_arity = old_arity } <- old_guidance = mkCoreUnfolding src top_lvl new_tmpl (old_guidance { ug_arity = old_arity - arity_decrease }) where new_tmpl = simpleOptExpr opts $- mkLams spec_bndrs $+ mkLams spec_bndrs $ spec_app tmpl -- The beta-redexes created by spec_app- -- will besimplified away by simplOptExpr+ -- will be simplified away by simplOptExpr arity_decrease = count isValArg rule_lhs_args - count isId spec_bndrs
compiler/GHC/Core/Unify.hs view
@@ -1393,6 +1393,8 @@ (<*>) = ap instance Monad UM where+ {-# INLINE (>>=) #-}+ -- See Note [INLINE pragmas and (>>)] in GHC.Utils.Monad m >>= k = UM (\state -> do { (state', v) <- unUM m state ; unUM (k v) state' })
compiler/GHC/Core/Utils.hs view
@@ -9,7 +9,7 @@ -- | Commonly useful utilities for manipulating the Core language module GHC.Core.Utils ( -- * Constructing expressions- mkCast,+ mkCast, mkCastMCo, mkPiMCo, mkTick, mkTicks, mkTickNoHNF, tickHNFArgs, bindNonRec, needsCaseBinding, mkAltExpr, mkDefaultCase, mkSingleAltCase,@@ -79,7 +79,7 @@ import GHC.Core.TyCon import GHC.Core.Multiplicity -import GHC.Builtin.Names (makeStaticName, unsafeEqualityProofName)+import GHC.Builtin.Names ( makeStaticName, unsafeEqualityProofIdKey ) import GHC.Builtin.PrimOps import GHC.Types.Var@@ -139,7 +139,7 @@ exprType (Lam binder expr) = mkLamType binder (exprType expr) exprType e@(App _ _) = case collectArgs e of- (fun, args) -> applyTypeToArgs e (exprType fun) args+ (fun, args) -> applyTypeToArgs (pprCoreExpr e) (exprType fun) args exprType other = pprPanic "exprType" (pprCoreExpr other) @@ -268,10 +268,10 @@ -} -- Not defined with applyTypeToArg because you can't print from GHC.Core.-applyTypeToArgs :: CoreExpr -> Type -> [CoreExpr] -> Type+applyTypeToArgs :: SDoc -> Type -> [CoreExpr] -> Type -- ^ A more efficient version of 'applyTypeToArg' when we have several arguments. -- The first argument is just for debugging, and gives some context-applyTypeToArgs e op_ty args+applyTypeToArgs pp_e op_ty args = go op_ty args where go op_ty [] = op_ty@@ -290,12 +290,21 @@ go_ty_args op_ty rev_tys args = go (piResultTys op_ty (reverse rev_tys)) args - panic_msg as = vcat [ text "Expression:" <+> pprCoreExpr e- , text "Type:" <+> ppr op_ty- , text "Args:" <+> ppr args- , text "Args':" <+> ppr as ]+ panic_msg as = vcat [ text "Expression:" <+> pp_e+ , text "Type:" <+> ppr op_ty+ , text "Args:" <+> ppr args+ , text "Args':" <+> ppr as ] +mkCastMCo :: CoreExpr -> MCoercionR -> CoreExpr+mkCastMCo e MRefl = e+mkCastMCo e (MCo co) = Cast e co+ -- We are careful to use (MCo co) only when co is not reflexive+ -- Hence (Cast e co) rather than (mkCast e co) +mkPiMCo :: Var -> MCoercionR -> MCoercionR+mkPiMCo _ MRefl = MRefl+mkPiMCo v (MCo co) = MCo (mkPiCo Representational v co)+ {- ************************************************************************ * *@@ -1661,14 +1670,28 @@ -> primop_ok op -- Check the primop itself && and (zipWith primop_arg_ok arg_tys args) -- Check the arguments - _other -> isUnliftedType (idType fun) -- c.f. the Var case of exprIsHNF- || idArity fun > n_val_args -- Partial apps+ _ -- Unlifted types+ -- c.f. the Var case of exprIsHNF+ | isUnliftedType (idType fun)+ -> assertPpr (n_val_args == 0) (ppr fun $$ ppr args)+ True -- Our only unlifted types are Int# etc, so will have+ -- no value args. The assert is just to check this.+ -- If we added unlifted function types this would change,+ -- and we'd need to actually test n_val_args == 0.++ -- Partial applications+ | idArity fun > n_val_args -> True++ -- Functions that terminate fast without raising exceptions etc+ -- See Note [Discarding unnecessary unsafeEqualityProofs]+ | fun `hasKey` unsafeEqualityProofIdKey -> True++ | otherwise -> False -- NB: even in the nullary case, do /not/ check -- for evaluated-ness of the fun; -- see Note [exprOkForSpeculation and evaluated variables]- where- n_val_args = valArgCount args where+ n_val_args = valArgCount args (arg_tys, _) = splitPiTys (idType fun) primop_arg_ok :: TyBinder -> CoreExpr -> Bool@@ -1841,6 +1864,20 @@ Note that exprIsHNF /can/ and does take advantage of evaluated-ness; it doesn't have the trickiness of the let/app invariant to worry about. +Note [Discarding unnecessary unsafeEqualityProofs]+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+In #20143 we found+ case unsafeEqualityProof @t1 @t2 of UnsafeRefl cv[dead] -> blah+where 'blah' didn't mention 'cv'. We'd like to discard this+redundant use of unsafeEqualityProof, via GHC.Core.Opt.Simplify.rebuildCase.+To do this we need to know+ (a) that cv is unused (done by OccAnal), and+ (b) that unsafeEqualityProof terminates rapidly without side effects.++At the moment we check that explicitly here in exprOkForSideEffects,+but one might imagine a more systematic check in future.++ ************************************************************************ * * exprIsHNF, exprIsConLike@@ -2494,8 +2531,7 @@ , let mult = idMult bndr , Just (fun_mult, _, _) <- splitFunTy_maybe fun_ty , mult `eqType` fun_mult -- There is no change in multiplicity, otherwise we must abort- = let reflCo = mkRepReflCo (idType bndr)- in Just (mkFunCo Representational (multToCo mult) reflCo co, [])+ = Just (mkFunResCo Representational (idScaledType bndr) co, []) ok_arg bndr (Cast e co_arg) co fun_ty | (ticks, Var v) <- stripTicksTop tickishFloatable e , Just (fun_mult, _, _) <- splitFunTy_maybe fun_ty@@ -2656,6 +2692,6 @@ -- Note [Implementing unsafeCoerce] in base:Unsafe.Coerce isUnsafeEqualityProof e | Var v `App` Type _ `App` Type _ `App` Type _ <- e- = idName v == unsafeEqualityProofName+ = v `hasKey` unsafeEqualityProofIdKey | otherwise = False
+ compiler/GHC/Driver/Config/Finder.hs view
@@ -0,0 +1,26 @@+module GHC.Driver.Config.Finder (+ FinderOpts(..),+ initFinderOpts+ ) where++import GHC.Prelude++import GHC.Driver.Session+import GHC.Unit.Finder++-- | Create a new 'FinderOpts' from DynFlags.+initFinderOpts :: DynFlags -> FinderOpts+initFinderOpts flags = FinderOpts+ { finder_importPaths = importPaths flags+ , finder_lookupHomeInterfaces = isOneShot (ghcMode flags)+ , finder_bypassHiFileCheck = MkDepend == (ghcMode flags)+ , finder_ways = ways flags+ , finder_enableSuggestions = gopt Opt_HelpfulErrors flags+ , finder_hieDir = hieDir flags+ , finder_hieSuf = hieSuf flags+ , finder_hiDir = hiDir flags+ , finder_hiSuf = hiSuf flags+ , finder_objectDir = objectDir flags+ , finder_objectSuf = objectSuf flags+ , finder_stubDir = stubDir flags+ }
compiler/GHC/Driver/Errors/Ppr.hs view
@@ -16,8 +16,12 @@ import GHC.Unit.Types import GHC.Utils.Outputable import GHC.Unit.Module+import GHC.Unit.State import GHC.Types.Hint+import GHC.Types.SrcLoc +import Language.Haskell.Syntax.Decls (RuleDecl(..))+ -- -- Suggestions --@@ -121,6 +125,52 @@ -> mkSimpleDecorated (text "StaticPointers is not supported in GHCi interactive expressions.") DriverBackpackModuleNotFound modname -> mkSimpleDecorated (text "module" <+> ppr modname <+> text "was not found")+ DriverUserDefinedRuleIgnored (HsRule { rd_name = n })+ -> mkSimpleDecorated $+ text "Rule \"" <> ftext (snd $ unLoc n) <> text "\" ignored" $+$+ text "User defined rules are disabled under Safe Haskell"+ DriverMixedSafetyImport modName+ -> mkSimpleDecorated $+ text "Module" <+> ppr modName <+> text ("is imported both as a safe and unsafe import!")+ DriverCannotLoadInterfaceFile m+ -> mkSimpleDecorated $+ text "Can't load the interface file for" <+> ppr m+ <> text ", to check that it can be safely imported"+ DriverInferredSafeModule m+ -> mkSimpleDecorated $+ quotes (ppr $ moduleName m) <+> text "has been inferred as safe!"+ DriverInferredSafeImport m+ -> mkSimpleDecorated $+ sep+ [ text "Importing Safe-Inferred module "+ <> ppr (moduleName m)+ <> text " from explicitly Safe module"+ ]+ DriverMarkedTrustworthyButInferredSafe m+ -> mkSimpleDecorated $+ quotes (ppr $ moduleName m) <+> text "is marked as Trustworthy but has been inferred as safe!"+ DriverCannotImportUnsafeModule m+ -> mkSimpleDecorated $+ sep [ ppr (moduleName m)+ <> text ": Can't be safely imported!"+ , text "The module itself isn't safe." ]+ DriverMissingSafeHaskellMode modName+ -> mkSimpleDecorated $+ ppr modName <+> text "is missing Safe Haskell mode"+ DriverPackageNotTrusted state pkg+ -> mkSimpleDecorated $+ pprWithUnitState state+ $ text "The package ("+ <> ppr pkg+ <> text ") is required to be trusted but it isn't!"+ DriverCannotImportFromUntrustedPackage state m+ -> mkSimpleDecorated $+ sep [ ppr (moduleName m)+ <> text ": Can't be safely imported!"+ , text "The package ("+ <> (pprWithUnitState state $ ppr (moduleUnit m))+ <> text ") the module resides in isn't trusted."+ ] diagnosticReason = \case DriverUnknownMessage m@@ -147,6 +197,26 @@ -> WarningWithoutFlag DriverBackpackModuleNotFound{} -> ErrorWithoutFlag+ DriverUserDefinedRuleIgnored{}+ -> WarningWithoutFlag+ DriverMixedSafetyImport{}+ -> ErrorWithoutFlag+ DriverCannotLoadInterfaceFile{}+ -> ErrorWithoutFlag+ DriverInferredSafeModule{}+ -> WarningWithFlag Opt_WarnSafe+ DriverMarkedTrustworthyButInferredSafe{}+ ->WarningWithFlag Opt_WarnTrustworthySafe+ DriverInferredSafeImport{}+ -> WarningWithFlag Opt_WarnInferredSafeImports+ DriverCannotImportUnsafeModule{}+ -> ErrorWithoutFlag+ DriverMissingSafeHaskellMode{}+ -> WarningWithFlag Opt_WarnMissingSafeHaskellMode+ DriverPackageNotTrusted{}+ -> ErrorWithoutFlag+ DriverCannotImportFromUntrustedPackage{}+ -> ErrorWithoutFlag diagnosticHints = \case DriverUnknownMessage m@@ -174,4 +244,24 @@ DriverStaticPointersNotSupported -> noHints DriverBackpackModuleNotFound{}+ -> noHints+ DriverUserDefinedRuleIgnored{}+ -> noHints+ DriverMixedSafetyImport{}+ -> noHints+ DriverCannotLoadInterfaceFile{}+ -> noHints+ DriverInferredSafeModule{}+ -> noHints+ DriverInferredSafeImport{}+ -> noHints+ DriverCannotImportUnsafeModule{}+ -> noHints+ DriverMissingSafeHaskellMode{}+ -> noHints+ DriverPackageNotTrusted{}+ -> noHints+ DriverMarkedTrustworthyButInferredSafe{}+ -> noHints+ DriverCannotImportFromUntrustedPackage{} -> noHints
compiler/GHC/Driver/Errors/Types.hs view
@@ -23,11 +23,15 @@ import GHC.Driver.Session import GHC.Types.Error import GHC.Unit.Module+import GHC.Unit.State import GHC.Parser.Errors.Types ( PsMessage(PsHeaderMessage) ) import GHC.Tc.Errors.Types ( TcRnMessage ) import GHC.HsToCore.Errors.Types ( DsMessage )+import GHC.Hs.Extension (GhcTc) +import Language.Haskell.Syntax.Decls (RuleDecl)+ -- | A collection of warning messages. -- /INVARIANT/: Each 'GhcMessage' in the collection should have 'SevWarning' severity. type WarningMessages = Messages GhcMessage@@ -198,6 +202,140 @@ Test cases: - -} DriverBackpackModuleNotFound :: !ModuleName -> DriverMessage++ {-| DriverUserDefinedRuleIgnored is a warning that occurs when user-defined rules+ are ignored. This typically happens when Safe Haskell.++ Test cases:++ tests/safeHaskell/safeInfered/UnsafeWarn05+ tests/safeHaskell/safeInfered/UnsafeWarn06+ tests/safeHaskell/safeInfered/UnsafeWarn07+ tests/safeHaskell/safeInfered/UnsafeInfered11+ tests/safeHaskell/safeLanguage/SafeLang03+ -}+ DriverUserDefinedRuleIgnored :: !(RuleDecl GhcTc) -> DriverMessage++ {-| DriverMixedSafetyImport is an error that occurs when a module is imported+ both as safe and unsafe.++ Test cases:++ tests/safeHaskell/safeInfered/Mixed03+ tests/safeHaskell/safeInfered/Mixed02++ -}+ DriverMixedSafetyImport :: !ModuleName -> DriverMessage++ {-| DriverCannotLoadInterfaceFile is an error that occurs when we cannot load the interface+ file for a particular module. This can happen for example in the context of Safe Haskell,+ when we have to load a module to check if it can be safely imported.++ Test cases: None.++ -}+ DriverCannotLoadInterfaceFile :: !Module -> DriverMessage++ {-| DriverInferredSafeImport is a warning (controlled by the Opt_WarnSafe flag)+ that occurs when a module is inferred safe.++ Test cases: None.++ -}+ DriverInferredSafeModule :: !Module -> DriverMessage++ {-| DriverMarkedTrustworthyButInferredSafe is a warning (controlled by the Opt_WarnTrustworthySafe flag)+ that occurs when a module is marked trustworthy in SafeHaskell but it has been inferred safe.++ Test cases:+ tests/safeHaskell/safeInfered/TrustworthySafe02+ tests/safeHaskell/safeInfered/TrustworthySafe03++ -}+ DriverMarkedTrustworthyButInferredSafe :: !Module -> DriverMessage++ {-| DriverInferredSafeImport is a warning (controlled by the Opt_WarnInferredSafeImports flag)+ that occurs when a safe-inferred module is imported from a safe module.++ Test cases: None.++ -}+ DriverInferredSafeImport :: !Module -> DriverMessage++ {-| DriverCannotImportUnsafeModule is an error that occurs when an usafe module+ is being imported from a safe one.++ Test cases: None.++ -}+ DriverCannotImportUnsafeModule :: !Module -> DriverMessage++ {-| DriverMissingSafeHaskellMode is a warning (controlled by the Opt_WarnMissingSafeHaskellMode flag)+ that occurs when a module is using SafeHaskell features but SafeHaskell mode is not enabled.++ Test cases: None.++ -}+ DriverMissingSafeHaskellMode :: !Module -> DriverMessage++ {-| DriverPackageNotTrusted is an error that occurs when a package is required to be trusted+ but it isn't.++ Test cases:+ tests/safeHaskell/check/Check01+ tests/safeHaskell/check/Check08+ tests/safeHaskell/check/Check06+ tests/safeHaskell/check/pkg01/ImpSafeOnly09+ tests/safeHaskell/check/pkg01/ImpSafe03+ tests/safeHaskell/check/pkg01/ImpSafeOnly07+ tests/safeHaskell/check/pkg01/ImpSafeOnly08++ -}+ DriverPackageNotTrusted :: !UnitState -> !UnitId -> DriverMessage++ {-| DriverCannotImportFromUntrustedPackage is an error that occurs in the context of+ Safe Haskell when trying to import a module coming from an untrusted package.++ Test cases:+ tests/safeHaskell/check/Check09+ tests/safeHaskell/check/pkg01/ImpSafe01+ tests/safeHaskell/check/pkg01/ImpSafe04+ tests/safeHaskell/check/pkg01/ImpSafeOnly03+ tests/safeHaskell/check/pkg01/ImpSafeOnly05+ tests/safeHaskell/flags/SafeFlags17+ tests/safeHaskell/flags/SafeFlags22+ tests/safeHaskell/flags/SafeFlags23+ tests/safeHaskell/ghci/p11+ tests/safeHaskell/ghci/p12+ tests/safeHaskell/ghci/p17+ tests/safeHaskell/ghci/p3+ tests/safeHaskell/safeInfered/UnsafeInfered01+ tests/safeHaskell/safeInfered/UnsafeInfered02+ tests/safeHaskell/safeInfered/UnsafeInfered02+ tests/safeHaskell/safeInfered/UnsafeInfered03+ tests/safeHaskell/safeInfered/UnsafeInfered05+ tests/safeHaskell/safeInfered/UnsafeInfered06+ tests/safeHaskell/safeInfered/UnsafeInfered09+ tests/safeHaskell/safeInfered/UnsafeInfered10+ tests/safeHaskell/safeInfered/UnsafeInfered11+ tests/safeHaskell/safeInfered/UnsafeWarn01+ tests/safeHaskell/safeInfered/UnsafeWarn03+ tests/safeHaskell/safeInfered/UnsafeWarn04+ tests/safeHaskell/safeInfered/UnsafeWarn05+ tests/safeHaskell/unsafeLibs/BadImport01+ tests/safeHaskell/unsafeLibs/BadImport06+ tests/safeHaskell/unsafeLibs/BadImport07+ tests/safeHaskell/unsafeLibs/BadImport08+ tests/safeHaskell/unsafeLibs/BadImport09+ tests/safeHaskell/unsafeLibs/Dep05+ tests/safeHaskell/unsafeLibs/Dep06+ tests/safeHaskell/unsafeLibs/Dep07+ tests/safeHaskell/unsafeLibs/Dep08+ tests/safeHaskell/unsafeLibs/Dep09+ tests/safeHaskell/unsafeLibs/Dep10++ -}+ DriverCannotImportFromUntrustedPackage :: !UnitState -> !Module -> DriverMessage -- | Pass to a 'DriverMessage' the information whether or not the -- '-fbuilding-cabal-package' flag is set.
compiler/GHC/Driver/Hooks.hs view
@@ -33,7 +33,7 @@ import GHC.Driver.Env import GHC.Driver.Session-import GHC.Driver.Pipeline.Monad+import GHC.Driver.Pipeline.Phases import GHC.Hs.Decls import GHC.Hs.Binds@@ -137,7 +137,7 @@ , hscCompileCoreExprHook :: !(Maybe (HscEnv -> (SrcSpan, Maybe ModuleNameWithIsBoot) -> CoreExpr -> IO ForeignHValue)) , ghcPrimIfaceHook :: !(Maybe ModIface)- , runPhaseHook :: !(Maybe (PhasePlus -> FilePath -> CompPipeline (PhasePlus, FilePath)))+ , runPhaseHook :: !(Maybe PhaseHook) , runMetaHook :: !(Maybe (MetaHook TcM)) , linkHook :: !(Maybe (GhcLink -> DynFlags -> Bool -> HomePackageTable -> IO SuccessFlag))
compiler/GHC/Driver/Phases.hs view
@@ -1,5 +1,3 @@-- ----------------------------------------------------------------------------- -- -- GHC Driver@@ -10,10 +8,13 @@ module GHC.Driver.Phases ( Phase(..),- happensBefore, eqPhase, anyHsc, isStopLn,+ happensBefore, eqPhase, isStopLn, startPhase, phaseInputExt, + StopPhase(..),+ stopPhaseToPhase,+ isHaskellishSuffix, isHaskellSrcSuffix, isBackpackishSuffix,@@ -67,6 +68,19 @@ linker | other | - | a.out -} +-- Phases we can actually stop after+data StopPhase = StopPreprocess -- -E+ | StopC -- -C+ | StopAs -- -S+ | NoStop -- -c++stopPhaseToPhase :: StopPhase -> Phase+stopPhaseToPhase StopPreprocess = anyHsc+stopPhaseToPhase StopC = HCc+stopPhaseToPhase StopAs = As False+stopPhaseToPhase NoStop = StopLn++-- | Untyped Phase description data Phase = Unlit HscSource | Cpp HscSource@@ -86,7 +100,6 @@ | MergeForeign -- merge in the foreign object files -- The final phase is a pseudo-phase that tells the pipeline to stop.- -- There is no runPhase case for it. | StopLn -- Stop, but linking will follow, so generate .o file deriving (Eq, Show) @@ -122,22 +135,8 @@ eqPhase Cobjcxx Cobjcxx = True eqPhase _ _ = False -{- Note [Partial ordering on phases]--We want to know which phases will occur before which others. This is used for-sanity checking, to ensure that the pipeline will stop at some point (see-GHC.Driver.Pipeline.runPipeline).--A < B iff A occurs before B in a normal compilation pipeline.--There is explicitly not a total ordering on phases, because in registerised-builds, the phase `HsC` doesn't happen before nor after any other phase.--Although we check that a normal user doesn't set the stop_phase to HsC through-use of -C with registerised builds (in Main.checkOptions), it is still-possible for a ghc-api user to do so. So be careful when using the function-happensBefore, and don't think that `not (a <= b)` implies `b < a`.--}+-- MP: happensBefore is only used in preprocessPipeline, that usage should+-- be refactored and this usage removed. happensBefore :: Platform -> Phase -> Phase -> Bool happensBefore platform p1 p2 = p1 `happensBefore'` p2 where StopLn `happensBefore'` _ = False@@ -211,7 +210,7 @@ phaseInputExt (HsPp _) = "hscpp" -- intermediate only phaseInputExt (Hsc _) = "hspp" -- intermediate only -- NB: as things stand, phaseInputExt (Hsc x) must not evaluate x- -- because runPipeline uses the StopBefore phase to pick the+ -- because runPhase uses the StopBefore phase to pick the -- output filename. That could be fixed, but watch out. phaseInputExt HCc = "hc" phaseInputExt Ccxx = "cpp"
compiler/GHC/Driver/Pipeline/Monad.hs view
@@ -1,116 +1,78 @@-{-# LANGUAGE DeriveFunctor #-}--- | The CompPipeline monad and associated ops------ Defined in separate module so that it can safely be imported from Hooks+{-# LANGUAGE KindSignatures #-}+{-# LANGUAGE ConstraintKinds #-}+{-# LANGUAGE MultiParamTypeClasses #-}+-- | The 'TPipelineClass' and 'MonadUse' classes and associated types module GHC.Driver.Pipeline.Monad (- CompPipeline(..), evalP- , PhasePlus(..), HscBackendAction (..)- , PipeEnv(..), PipeState(..), PipelineOutput(..)- , getPipeEnv, getPipeState, getPipeSession- , setDynFlags, setModLocation, setForeignOs, setIface- , pipeStateDynFlags, pipeStateModIface, pipeStateLinkable, setPlugins, setLinkable+ TPipelineClass, MonadUse(..)++ , PipeEnv(..)+ , PipelineOutput(..)+ , getLocation ) where import GHC.Prelude--import GHC.Utils.Fingerprint-import GHC.Utils.Monad-import GHC.Utils.Outputable-import GHC.Utils.Logger--import GHC.Driver.Session+import Control.Monad.IO.Class+import qualified Data.Kind as K import GHC.Driver.Phases-import GHC.Driver.Env-import GHC.Driver.Plugins--import GHC.Linker.Types--import GHC.Utils.TmpFs (TempFileLifetime)--import GHC.Types.Error-+import GHC.Driver.Config.Finder+import GHC.Utils.TmpFs+import GHC.Driver.Session+import GHC.Types.SourceFile import GHC.Unit.Module-import GHC.Unit.Module.ModIface-import GHC.Unit.Module.ModSummary-import GHC.Unit.Module.Status--import GHC.Driver.Errors.Types ( GhcMessage )--import GHC.Tc.Types--import Control.Monad--newtype CompPipeline a = P { unP :: PipeEnv -> PipeState -> IO (PipeState, a) }- deriving (Functor)--evalP :: CompPipeline a -> PipeEnv -> PipeState -> IO (PipeState, a)-evalP (P f) env st = f env st--instance Applicative CompPipeline where- pure a = P $ \_env state -> return (state, a)- (<*>) = ap--instance Monad CompPipeline where- P m >>= k = P $ \env state -> do (state',a) <- m env state- unP (k a) env state'--instance MonadIO CompPipeline where- liftIO m = P $ \_env state -> do a <- m; return (state, a)--data PhasePlus = RealPhase Phase- -- | Runs the pipeline post typechecking, till the end- | HscPostTc ModSummary FrontendResult (Messages GhcMessage) (Maybe Fingerprint)- -- | The backend phase runs the code-gen. This may be run twice in- -- the case of -dynamic-too- | HscBackend ModSummary HscBackendAction-+import GHC.Unit.Finder -instance Outputable PhasePlus where- ppr (RealPhase p) = ppr p- ppr (HscPostTc {}) = text "HscPostTc"- ppr (HscBackend {}) = text "HscBackend"+-- The interface that the pipeline monad must implement.+type TPipelineClass (f :: K.Type -> K.Type) (m :: K.Type -> K.Type)+ = (Functor m, MonadIO m, Applicative m, Monad m, MonadUse f m) --- -------------------------------------------------------------------------------- The pipeline uses a monad to carry around various bits of information+-- | Lift a `f` action into an `m` action.+class MonadUse f m where+ use :: f a -> m a --- PipeEnv: invariant information passed down+-- PipeEnv: invariant information passed down through the pipeline data PipeEnv = PipeEnv {- stop_phase :: Phase, -- ^ Stop just before this phase+ stop_phase :: StopPhase, -- ^ Stop just after this phase src_filename :: String, -- ^ basename of original input source src_basename :: String, -- ^ basename of original input source src_suffix :: String, -- ^ its extension output_spec :: PipelineOutput -- ^ says where to put the pipeline output } --- PipeState: information that might change during a pipeline run-data PipeState = PipeState {- hsc_env :: HscEnv,- -- ^ only the DynFlags and the Plugins change in the HscEnv. The- -- DynFlags change at various points, for example when we read the- -- OPTIONS_GHC pragmas in the Cpp phase.- maybe_loc :: Maybe ModLocation,- -- ^ the ModLocation. This is discovered during compilation,- -- in the Hsc phase where we read the module header.- foreign_os :: [FilePath],- -- ^ additional object files resulting from compiling foreign- -- code. They come from two sources: foreign stubs, and- -- add{C,Cxx,Objc,Objcxx}File from template haskell- iface :: Maybe ModIface,- -- ^ Interface generated by HscBackend phase. Only available after the- -- phase runs.- maybe_linkable :: Maybe Linkable- -- ^ Linkable generated by HscBackend phase, for the Interpreter backend.- }+-- | Calculate the ModLocation from the provided DynFlags+getLocation :: PipeEnv -> DynFlags -> HscSource -> ModuleName -> IO ModLocation+getLocation pipe_env dflags src_flavour mod_name = do+ let PipeEnv{ src_basename=basename,+ src_suffix=suff } = pipe_env+ location1 <- mkHomeModLocation2 fopts mod_name basename suff -pipeStateDynFlags :: PipeState -> DynFlags-pipeStateDynFlags = hsc_dflags . hsc_env+ -- Boot-ify it if necessary+ let location2+ | HsBootFile <- src_flavour = addBootSuffixLocnOut location1+ | otherwise = location1 -pipeStateModIface :: PipeState -> Maybe ModIface-pipeStateModIface = iface -pipeStateLinkable :: PipeState -> Maybe Linkable-pipeStateLinkable = maybe_linkable+ -- Take -ohi into account if present+ -- This can't be done in mkHomeModuleLocation because+ -- it only applies to the module being compiles+ let ohi = outputHi dflags+ location3 | Just fn <- ohi = location2{ ml_hi_file = fn }+ | otherwise = location2 + -- Take -o into account if present+ -- Very like -ohi, but we must *only* do this if we aren't linking+ -- (If we're linking then the -o applies to the linked thing, not to+ -- the object file for one module.)+ -- Note the nasty duplication with the same computation in compileFile+ -- above+ let expl_o_file = outputFile dflags+ location4 | Just ofile <- expl_o_file+ , isNoLink (ghcLink dflags)+ = location3 { ml_obj_file = ofile }+ | otherwise = location3+ return location4+ where+ fopts = initFinderOpts dflags+ data PipelineOutput = Temporary TempFileLifetime -- ^ Output should be to a temporary file: we're going to@@ -126,41 +88,3 @@ | NoOutputFile -- ^ No output should be created, like in Interpreter or NoBackend. deriving Show--getPipeEnv :: CompPipeline PipeEnv-getPipeEnv = P $ \env state -> return (state, env)--getPipeState :: CompPipeline PipeState-getPipeState = P $ \_env state -> return (state, state)--getPipeSession :: CompPipeline HscEnv-getPipeSession = P $ \_env state -> return (state, hsc_env state)--instance HasDynFlags CompPipeline where- getDynFlags = P $ \_env state -> return (state, hsc_dflags (hsc_env state))--instance HasLogger CompPipeline where- getLogger = P $ \_env state -> return (state, hsc_logger (hsc_env state))--setDynFlags :: DynFlags -> CompPipeline ()-setDynFlags dflags = P $ \_env state ->- return (state{ hsc_env = hscSetFlags dflags (hsc_env state)}, ())--setPlugins :: [LoadedPlugin] -> [StaticPlugin] -> CompPipeline ()-setPlugins dyn static = P $ \_env state ->- let hsc_env' = (hsc_env state){ hsc_plugins = dyn, hsc_static_plugins = static }- in return (state{hsc_env = hsc_env'}, ())--setModLocation :: ModLocation -> CompPipeline ()-setModLocation loc = P $ \_env state ->- return (state{ maybe_loc = Just loc }, ())--setForeignOs :: [FilePath] -> CompPipeline ()-setForeignOs os = P $ \_env state ->- return (state{ foreign_os = os }, ())--setIface :: ModIface -> CompPipeline ()-setIface iface = P $ \_env state -> return (state{ iface = Just iface }, ())--setLinkable :: Linkable -> CompPipeline ()-setLinkable l = P $ \_env state -> return (state{ maybe_linkable = Just l }, ())
+ compiler/GHC/Driver/Pipeline/Phases.hs view
@@ -0,0 +1,52 @@+{-# LANGUAGE GADTs #-}+{-# LANGUAGE RankNTypes #-}++module GHC.Driver.Pipeline.Phases (TPhase(..), PhaseHook(..)) where++import GHC.Prelude+import GHC.Driver.Pipeline.Monad+import GHC.Driver.Env.Types+import GHC.Driver.Session+import GHC.Driver.CmdLine+import GHC.Types.SourceFile+import GHC.Unit.Module.ModSummary+import GHC.Unit.Module.Status+import GHC.Tc.Types ( FrontendResult )+import GHC.Types.Error+import GHC.Driver.Errors.Types+import GHC.Fingerprint.Type+import GHC.Unit.Module.Location ( ModLocation )+import GHC.Unit.Module.Name ( ModuleName )+import GHC.Unit.Module.ModIface+import GHC.Linker.Types+import GHC.Driver.Phases++-- Typed Pipeline Phases+-- MP: TODO: We need to refine the arguments to each of these phases so recompilation+-- can be smarter. For example, rather than passing a whole HscEnv, just pass the options+-- which each phase depends on, then recompilation checking can decide to only rerun each+-- phase if the inputs have been modified.+data TPhase res where+ T_Unlit :: PipeEnv -> HscEnv -> FilePath -> TPhase FilePath+ T_FileArgs :: HscEnv -> FilePath -> TPhase (DynFlags, [Warn])+ T_Cpp :: PipeEnv -> HscEnv -> FilePath -> TPhase FilePath+ T_HsPp :: PipeEnv -> HscEnv -> FilePath -> FilePath -> TPhase FilePath+ T_HscRecomp :: PipeEnv -> HscEnv -> FilePath -> HscSource -> TPhase (HscEnv, ModSummary, HscRecompStatus)+ T_Hsc :: HscEnv -> ModSummary -> TPhase (FrontendResult, Messages GhcMessage)+ T_HscPostTc :: HscEnv -> ModSummary+ -> FrontendResult+ -> Messages GhcMessage+ -> Maybe Fingerprint+ -> TPhase HscBackendAction+ T_HscBackend :: PipeEnv -> HscEnv -> ModuleName -> HscSource -> ModLocation -> HscBackendAction -> TPhase ([FilePath], ModIface, Maybe Linkable, FilePath)+ T_CmmCpp :: PipeEnv -> HscEnv -> FilePath -> TPhase FilePath+ T_Cmm :: PipeEnv -> HscEnv -> FilePath -> TPhase ([FilePath], FilePath)+ T_Cc :: Phase -> PipeEnv -> HscEnv -> FilePath -> TPhase FilePath+ T_As :: Bool -> PipeEnv -> HscEnv -> Maybe ModLocation -> FilePath -> TPhase FilePath+ T_LlvmOpt :: PipeEnv -> HscEnv -> FilePath -> TPhase FilePath+ T_LlvmLlc :: PipeEnv -> HscEnv -> FilePath -> TPhase FilePath+ T_LlvmMangle :: PipeEnv -> HscEnv -> FilePath -> TPhase FilePath+ T_MergeForeign :: PipeEnv -> HscEnv -> Maybe ModLocation -> FilePath -> [FilePath] -> TPhase FilePath++-- | A wrapper around the interpretation function for phases.+data PhaseHook = PhaseHook (forall a . TPhase a -> IO a)
compiler/GHC/Driver/Session.hs view
@@ -250,6 +250,7 @@ import GHC.Types.Basic ( Alignment, alignmentOf, IntWithInf, treatZeroAsInf ) import qualified GHC.Types.FieldLabel as FieldLabel import GHC.Data.FastString+import GHC.Utils.TmpFs import GHC.Utils.Fingerprint import GHC.Utils.Outputable import GHC.Settings@@ -546,11 +547,11 @@ -- used to query the appropriate fields -- (outputFile/dynOutputFile, ways, etc.) - -- | This is set by 'GHC.Driver.Pipeline.runPipeline'+ -- | This is set by 'GHC.Driver.Pipeline.setDumpPrefix' -- or 'ghc.GHCi.UI.runStmt' based on where its output is going. dumpPrefix :: Maybe FilePath, - -- | Override the 'dumpPrefix' set by 'GHC.Driver.Pipeline.runPipeline'+ -- | Override the 'dumpPrefix' set by 'GHC.Driver.Pipeline.setDumpPrefix' -- or 'ghc.GHCi.UI.runStmt'. -- Set by @-ddump-file-prefix@ dumpPrefixForce :: Maybe FilePath,@@ -792,8 +793,8 @@ toolDir dflags = fileSettings_toolDir $ fileSettings dflags topDir :: DynFlags -> FilePath topDir dflags = fileSettings_topDir $ fileSettings dflags-tmpDir :: DynFlags -> String-tmpDir dflags = fileSettings_tmpDir $ fileSettings dflags+tmpDir :: DynFlags -> TempDir+tmpDir dflags = TempDir (fileSettings_tmpDir $ fileSettings dflags) extraGccViaCFlags :: DynFlags -> [String] extraGccViaCFlags dflags = toolSettings_extraGccViaCFlags $ toolSettings dflags globalPackageDatabasePath :: DynFlags -> FilePath@@ -1399,7 +1400,7 @@ LangExt.InstanceSigs, LangExt.KindSignatures, LangExt.MultiParamTypeClasses,- LangExt.RecordPuns,+ LangExt.NamedFieldPuns, LangExt.NamedWildCards, LangExt.NumericUnderscores, LangExt.PolyKinds,@@ -3595,7 +3596,7 @@ flagSpec "MultiWayIf" LangExt.MultiWayIf, flagSpec "NumericUnderscores" LangExt.NumericUnderscores, flagSpec "NPlusKPatterns" LangExt.NPlusKPatterns,- flagSpec "NamedFieldPuns" LangExt.RecordPuns,+ flagSpec "NamedFieldPuns" LangExt.NamedFieldPuns, flagSpec "NamedWildCards" LangExt.NamedWildCards, flagSpec "NegativeLiterals" LangExt.NegativeLiterals, flagSpec "HexFloatLiterals" LangExt.HexFloatLiterals,@@ -3628,7 +3629,7 @@ flagSpec "RebindableSyntax" LangExt.RebindableSyntax, flagSpec "OverloadedRecordDot" LangExt.OverloadedRecordDot, flagSpec "OverloadedRecordUpdate" LangExt.OverloadedRecordUpdate,- depFlagSpec' "RecordPuns" LangExt.RecordPuns+ depFlagSpec' "RecordPuns" LangExt.NamedFieldPuns (deprecatedForExtension "NamedFieldPuns"), flagSpec "RecordWildCards" LangExt.RecordWildCards, flagSpec "RecursiveDo" LangExt.RecursiveDo,@@ -4053,7 +4054,7 @@ in dflags3 removeWayDyn :: DynP ()-removeWayDyn = upd (\dfs -> dfs { targetWays_ = Set.filter (WayDyn /=) (targetWays_ dfs) })+removeWayDyn = upd (\dfs -> dfs { targetWays_ = removeWay WayDyn (targetWays_ dfs) }) -------------------------- setGeneralFlag, unSetGeneralFlag :: GeneralFlag -> DynP ()@@ -4470,7 +4471,7 @@ -- correctly. They need to reference data in the Haskell -- objects, but can't without -fPIC. See -- https://gitlab.haskell.org/ghc/ghc/wikis/commentary/position-independent-code- | gopt Opt_PIC dflags || WayDyn `Set.member` ways dflags ->+ | gopt Opt_PIC dflags || ways dflags `hasWay` WayDyn -> ["-fPIC", "-U__PIC__", "-D__PIC__"] -- gcc may be configured to have PIC on by default, let's be -- explicit here, see #15847@@ -4653,7 +4654,7 @@ , not (gopt Opt_ExternalInterpreter dflags) , hostIsProfiled , backendProducesObject (backend dflags)- , WayProf `Set.notMember` ways dflags+ , ways dflags `hasNotWay` WayProf = loop dflags{targetWays_ = addWay WayProf (targetWays_ dflags)} "Enabling -prof, because -fobject-code is enabled and GHCi is profiled"
compiler/GHC/Hs/Expr.hs view
@@ -1050,13 +1050,15 @@ -} -- See Note [Rebindable syntax and HsExpansion] just above.-data HsExpansion a b- = HsExpanded a b+data HsExpansion orig expanded+ = HsExpanded orig expanded deriving Data -- | Just print the original expression (the @a@). instance (Outputable a, Outputable b) => Outputable (HsExpansion a b) where- ppr (HsExpanded a b) = ifPprDebug (vcat [ppr a, ppr b]) (ppr a)+ ppr (HsExpanded orig expanded)+ = ifPprDebug (vcat [ppr orig, braces (text "Expansion:" <+> ppr expanded)])+ (ppr orig) {-
compiler/GHC/HsToCore/Errors/Ppr.hs view
@@ -163,8 +163,6 @@ ThWarningAndDeprecationPragmas decl -> mkMsg "WARNING and DEPRECATION pragmas" $ text "Pragma for declaration of" <+> ppr decl- ThDefaultDeclarations decl- -> mkMsg "Default declarations" (ppr decl) ThSplicesWithinDeclBrackets -> mkMsg "Splices within declaration brackets" empty where@@ -282,7 +280,9 @@ -> case (bounds, usingNegLiterals) of (Just (MinBound minB, MaxBound _), NotUsingNegLiterals) | minB == -i -- Note [Suggest NegativeLiterals]- , i > 0 -> [SuggestExtension LangExt.NegativeLiterals]+ , i > 0+ -> [ suggestExtensionWithInfo (text "If you are trying to write a large negative literal")+ LangExt.NegativeLiterals ] _ -> noHints DsRedundantBangPatterns{} -> noHints DsOverlappingPatterns{} -> noHints
compiler/GHC/HsToCore/Errors/Types.hs view
@@ -191,7 +191,6 @@ | ThNegativeOverloadedPatterns !(Pat GhcRn) | ThHaddockDocumentation | ThWarningAndDeprecationPragmas [LIdP GhcRn]- | ThDefaultDeclarations !(DefaultDecl GhcRn) | ThSplicesWithinDeclBrackets data NegLiteralExtEnabled
+ compiler/GHC/Parser/Errors/Basic.hs view
@@ -0,0 +1,22 @@+{-# LANGUAGE LambdaCase #-}+module GHC.Parser.Errors.Basic where++import GHC.Utils.Outputable ( SDoc, text )++-- | The operator symbol in the 'PsOperatorWhitespaceExtConflictMessage' diagnostic.+data OperatorWhitespaceSymbol+ = OperatorWhitespaceSymbol_PrefixPercent+ | OperatorWhitespaceSymbol_PrefixDollar+ | OperatorWhitespaceSymbol_PrefixDollarDollar++pprOperatorWhitespaceSymbol :: OperatorWhitespaceSymbol -> SDoc+pprOperatorWhitespaceSymbol = \case+ OperatorWhitespaceSymbol_PrefixPercent -> text "%"+ OperatorWhitespaceSymbol_PrefixDollar -> text "$"+ OperatorWhitespaceSymbol_PrefixDollarDollar -> text "$$"++-- | The operator occurrence type in the 'PsOperatorWhitespaceMessage' diagnostic.+data OperatorWhitespaceOccurrence+ = OperatorWhitespaceOccurrence_Prefix+ | OperatorWhitespaceOccurrence_Suffix+ | OperatorWhitespaceOccurrence_TightInfix
compiler/GHC/Parser/Errors/Ppr.hs view
@@ -1,4 +1,5 @@ {-# LANGUAGE RecordWildCards #-}+{-# LANGUAGE MultiWayIf #-} {-# LANGUAGE LambdaCase #-} {-# LANGUAGE GADTs #-} {-# LANGUAGE FlexibleContexts #-}@@ -9,6 +10,7 @@ import GHC.Prelude import GHC.Driver.Flags+import GHC.Parser.Errors.Basic import GHC.Parser.Errors.Types import GHC.Parser.Types import GHC.Types.Basic@@ -57,23 +59,20 @@ TransLayout_Pipe -> "`|' at the same depth as implicit layout block" ) PsWarnOperatorWhitespaceExtConflict sym- -> let mk_prefix_msg operator_symbol extension_name syntax_meaning =- text "The prefix use of a" <+> quotes (text operator_symbol)+ -> let mk_prefix_msg extension_name syntax_meaning =+ text "The prefix use of a" <+> quotes (pprOperatorWhitespaceSymbol sym) <+> text "would denote" <+> text syntax_meaning $$ nest 2 (text "were the" <+> text extension_name <+> text "extension enabled.")- $$ text "Suggested fix: add whitespace after the"- <+> quotes (text operator_symbol) <> char '.' in mkSimpleDecorated $ case sym of- OperatorWhitespaceSymbol_PrefixPercent -> mk_prefix_msg "%" "LinearTypes" "a multiplicity annotation"- OperatorWhitespaceSymbol_PrefixDollar -> mk_prefix_msg "$" "TemplateHaskell" "an untyped splice"- OperatorWhitespaceSymbol_PrefixDollarDollar -> mk_prefix_msg "$$" "TemplateHaskell" "a typed splice"+ OperatorWhitespaceSymbol_PrefixPercent -> mk_prefix_msg "LinearTypes" "a multiplicity annotation"+ OperatorWhitespaceSymbol_PrefixDollar -> mk_prefix_msg "TemplateHaskell" "an untyped splice"+ OperatorWhitespaceSymbol_PrefixDollarDollar -> mk_prefix_msg "TemplateHaskell" "a typed splice" PsWarnOperatorWhitespace sym occ_type -> let mk_msg occ_type_str = text "The" <+> text occ_type_str <+> text "use of a" <+> quotes (ftext sym) <+> text "might be repurposed as special syntax" $$ nest 2 (text "by a future language extension.")- $$ text "Suggested fix: add whitespace around it." in mkSimpleDecorated $ case occ_type of OperatorWhitespaceOccurrence_Prefix -> mk_msg "prefix"@@ -83,9 +82,6 @@ -> mkSimpleDecorated $ text "Found binding occurrence of" <+> quotes (text "*") <+> text "yet StarIsType is enabled."- $$ text "NB. To use (or export) this operator in"- <+> text "modules with StarIsType,"- $$ text " including the definition module, you must qualify it." PsWarnStarIsType -> mkSimpleDecorated $ text "Using" <+> quotes (text "*")@@ -93,17 +89,12 @@ <+> quotes (text "Data.Kind.Type") $$ text "relies on the StarIsType extension, which will become" $$ text "deprecated in the future."- $$ text "Suggested fix: use" <+> quotes (text "Type")- <+> text "from" <+> quotes (text "Data.Kind") <+> text "instead." PsWarnUnrecognisedPragma -> mkSimpleDecorated $ text "Unrecognised pragma" PsWarnImportPreQualified -> mkSimpleDecorated $ text "Found" <+> quotes (text "qualified") <+> text "in prepositive position"- $$ text "Suggested fix: place " <+> quotes (text "qualified")- <+> text "after the module name instead."- $$ text "To allow this, enable language extension 'ImportQualifiedPost'" PsErrLexer err kind -> mkSimpleDecorated $ hcat@@ -161,55 +152,41 @@ -> mkSimpleDecorated $ text "Expected a hyphen" PsErrSpaceInSCC -> mkSimpleDecorated $ text "Spaces are not allowed in SCCs"- PsErrEmptyDoubleQuotes th_on- -> mkSimpleDecorated $ if th_on then vcat (msg ++ th_msg) else vcat msg+ PsErrEmptyDoubleQuotes _th_on+ -> mkSimpleDecorated $ vcat msg where msg = [ text "Parser error on `''`" , text "Character literals may not be empty" ]- th_msg = [ text "Or perhaps you intended to use quotation syntax of TemplateHaskell,"- , text "but the type variable or constructor is missing"- ]- PsErrLambdaCase- -> mkSimpleDecorated $ text "Illegal lambda-case (use LambdaCase)"+ -> mkSimpleDecorated $ text "Illegal lambda-case" PsErrEmptyLambda -> mkSimpleDecorated $ text "A lambda requires at least one parameter" PsErrLinearFunction- -> mkSimpleDecorated $ text "Enable LinearTypes to allow linear functions"+ -> mkSimpleDecorated $ text "Illegal use of linear functions" PsErrOverloadedRecordUpdateNotEnabled- -> mkSimpleDecorated $ text "OverloadedRecordUpdate needs to be enabled"+ -> mkSimpleDecorated $ text "Illegal overloaded record update" PsErrMultiWayIf- -> mkSimpleDecorated $ text "Multi-way if-expressions need MultiWayIf turned on"+ -> mkSimpleDecorated $ text "Illegal multi-way if-expression" PsErrNumUnderscores reason -> mkSimpleDecorated $ text $ case reason of- NumUnderscore_Integral -> "Use NumericUnderscores to allow underscores in integer literals"- NumUnderscore_Float -> "Use NumericUnderscores to allow underscores in floating literals"+ NumUnderscore_Integral -> "Illegal underscores in integer literals"+ NumUnderscore_Float -> "Illegal underscores in floating literals" PsErrIllegalBangPattern e- -> mkSimpleDecorated $ text "Illegal bang-pattern (use BangPatterns):" $$ ppr e+ -> mkSimpleDecorated $ text "Illegal bang-pattern" $$ ppr e PsErrOverloadedRecordDotInvalid -> mkSimpleDecorated $ text "Use of OverloadedRecordDot '.' not valid ('.' isn't allowed when constructing records or in record patterns)" PsErrIllegalPatSynExport- -> mkSimpleDecorated $ text "Illegal export form (use PatternSynonyms to enable)"+ -> mkSimpleDecorated $ text "Illegal export form" PsErrOverloadedRecordUpdateNoQualifiedFields -> mkSimpleDecorated $ text "Fields cannot be qualified when OverloadedRecordUpdate is enabled" PsErrExplicitForall is_unicode- -> mkSimpleDecorated $ vcat- [ text "Illegal symbol" <+> quotes (forallSym is_unicode) <+> text "in type"- , text "Perhaps you intended to use RankNTypes or a similar language"- , text "extension to enable explicit-forall syntax:" <+>- forallSym is_unicode <+> text "<tvs>. <type>"- ]- where- forallSym True = text "∀"- forallSym False = text "forall"+ -> mkSimpleDecorated $ text "Illegal symbol" <+> quotes (forallSym is_unicode) <+> text "in type" PsErrIllegalQualifiedDo qdoDoc- -> mkSimpleDecorated $ vcat- [ text "Illegal qualified" <+> quotes qdoDoc <+> text "block"- , text "Perhaps you intended to use QualifiedDo"- ]+ -> mkSimpleDecorated $+ text "Illegal qualified" <+> quotes qdoDoc <+> text "block" PsErrQualifiedDoInCmd m -> mkSimpleDecorated $ hang (text "Parse error in command:") 2 $@@ -245,7 +222,7 @@ ] PsErrIllegalExplicitNamespace -> mkSimpleDecorated $- text "Illegal keyword 'type' (use ExplicitNamespaces to enable)"+ text "Illegal keyword 'type'" PsErrUnallowedPragma prag -> mkSimpleDecorated $@@ -255,7 +232,6 @@ -> mkSimpleDecorated $ text "Found" <+> quotes (text "qualified") <+> text "in postpositive position. "- $$ text "To allow this, enable language extension 'ImportQualifiedPost'" PsErrImportQualifiedTwice -> mkSimpleDecorated $ text "Multiple occurrences of 'qualified'" PsErrIllegalImportBundleForm@@ -374,15 +350,10 @@ -> mkSimpleDecorated $ text "Malformed head of type or class declaration:" <+> ppr ty PsErrIllegalWhereInDataDecl- -> mkSimpleDecorated $- vcat- [ text "Illegal keyword 'where' in data declaration"- , text "Perhaps you intended to use GADTs or a similar language"- , text "extension to enable syntax: data T where"- ]+ -> mkSimpleDecorated $ text "Illegal keyword 'where' in data declaration" PsErrIllegalDataTypeContext c -> mkSimpleDecorated $- text "Illegal datatype context (use DatatypeContexts):"+ text "Illegal datatype context:" <+> pprLHsContext (Just c) PsErrPrimStringInvalidChar -> mkSimpleDecorated $ text "primitive string literal must contain only characters <= \'\\xFF\'"@@ -395,7 +366,6 @@ -> mkSimpleDecorated $ text "Unexpected semi-colons in conditional:" $$ nest 4 expr- $$ text "Perhaps you meant to use DoAndIfThenElse?" where pprOptSemi True = semi pprOptSemi False = empty@@ -406,7 +376,6 @@ -> mkSimpleDecorated $ text "Unexpected semi-colons in conditional:" $$ nest 4 expr- $$ text "Perhaps you meant to use DoAndIfThenElse?" where pprOptSemi True = semi pprOptSemi False = empty@@ -439,7 +408,7 @@ -> mkSimpleDecorated $ text "Inferred type variables are not allowed here" PsErrIllegalTraditionalRecordSyntax s -> mkSimpleDecorated $- text "Illegal record syntax (use TraditionalRecordSyntax):" <+> s+ text "Illegal record syntax:" <+> s PsErrParseErrorInCmd s -> mkSimpleDecorated $ hang (text "Parse error in command:") 2 s PsErrInPat s details@@ -463,43 +432,14 @@ in mkSimpleDecorated $ msg <+> body PsErrParseRightOpSectionInPat infixOcc s -> mkSimpleDecorated $ parse_error_in_pat <+> pprInfixOcc infixOcc <> ppr s- PsErrIllegalRoleName role nearby+ PsErrIllegalRoleName role _nearby -> mkSimpleDecorated $ text "Illegal role name" <+> quotes (ppr role)- $$ case nearby of- [] -> empty- [r] -> text "Perhaps you meant" <+> quotes (ppr r)- -- will this last case ever happen??- _ -> hang (text "Perhaps you meant one of these:")- 2 (pprWithCommas (quotes . ppr) nearby) PsErrInvalidTypeSignature lhs -> mkSimpleDecorated $ text "Invalid type signature:" <+> ppr lhs <+> text ":: ..."- $$ text hint- where- hint | foreign_RDR `looks_like` lhs- = "Perhaps you meant to use ForeignFunctionInterface?"- | default_RDR `looks_like` lhs- = "Perhaps you meant to use DefaultSignatures?"- | pattern_RDR `looks_like` lhs- = "Perhaps you meant to use PatternSynonyms?"- | otherwise- = "Should be of form <variable> :: <type>"-- -- A common error is to forget the ForeignFunctionInterface flag- -- so check for that, and suggest. cf #3805- -- Sadly 'foreign import' still barfs 'parse error' because- -- 'import' is a keyword- -- looks_like :: RdrName -> LHsExpr GhcPsErr -> Bool -- AZ- looks_like s (L _ (HsVar _ (L _ v))) = v == s- looks_like s (L _ (HsApp _ lhs _)) = looks_like s lhs- looks_like _ _ = False-- foreign_RDR = mkUnqual varName (fsLit "foreign")- default_RDR = mkUnqual varName (fsLit "default")- pattern_RDR = mkUnqual varName (fsLit "pattern") PsErrUnexpectedTypeInDecl t what tc tparms equals_or_where -> mkSimpleDecorated $ vcat [ text "Unexpected type" <+> quotes (ppr t)@@ -532,7 +472,7 @@ diagnosticReason = \case PsUnknownMessage m -> diagnosticReason m- PsHeaderMessage _ -> ErrorWithoutFlag+ PsHeaderMessage m -> psHeaderMessageReason m PsWarnTab{} -> WarningWithFlag Opt_WarnTabs PsWarnTransitionalLayout{} -> WarningWithFlag Opt_WarnAlternativeLayoutRuleTransitional PsWarnOperatorWhitespaceExtConflict{} -> WarningWithFlag Opt_WarnOperatorWhitespaceExtConflict@@ -646,25 +586,27 @@ PsHeaderMessage m -> psHeaderMessageHints m PsWarnTab{} -> [SuggestUseSpaces] PsWarnTransitionalLayout{} -> noHints- PsWarnOperatorWhitespaceExtConflict{} -> noHints- PsWarnOperatorWhitespace{} -> noHints+ PsWarnOperatorWhitespaceExtConflict sym -> [SuggestUseWhitespaceAfter sym]+ PsWarnOperatorWhitespace sym occ -> [SuggestUseWhitespaceAround (unpackFS sym) occ] PsWarnHaddockInvalidPos -> noHints PsWarnHaddockIgnoreMulti -> noHints- PsWarnStarBinder -> noHints- PsWarnStarIsType -> noHints+ PsWarnStarBinder -> [SuggestQualifyStarOperator]+ PsWarnStarIsType -> [SuggestUseTypeFromDataKind] PsWarnUnrecognisedPragma -> noHints- PsWarnImportPreQualified -> noHints+ PsWarnImportPreQualified -> [ SuggestQualifiedAfterModuleName+ , suggestExtension LangExt.ImportQualifiedPost] PsErrLexer{} -> noHints PsErrCmmLexer -> noHints PsErrCmmParser{} -> noHints PsErrParse token PsErrParseDetails{..} -> case token of "" -> []- "$" | not ped_th_enabled -> [SuggestExtension LangExt.TemplateHaskell] -- #7396- "<-" | ped_mdo_in_last_100 -> [SuggestExtension LangExt.RecursiveDo]+ "$" | not ped_th_enabled -> [suggestExtension LangExt.TemplateHaskell] -- #7396+ "$$" | not ped_th_enabled -> [suggestExtension LangExt.TemplateHaskell] -- #20157+ "<-" | ped_mdo_in_last_100 -> [suggestExtension LangExt.RecursiveDo] | otherwise -> [SuggestMissingDo] "=" | ped_do_in_last_100 -> [SuggestLetInDo] -- #15849 _ | not ped_pat_syn_enabled- , ped_pattern_parsed -> [SuggestExtension LangExt.PatternSynonyms] -- #12429+ , ped_pattern_parsed -> [suggestExtension LangExt.PatternSynonyms] -- #12429 | otherwise -> [] PsErrTypeAppWithoutSpace{} -> noHints PsErrLazyPatWithoutSpace{} -> noHints@@ -672,19 +614,23 @@ PsErrInvalidInfixHole -> noHints PsErrExpectedHyphen -> noHints PsErrSpaceInSCC -> noHints- PsErrEmptyDoubleQuotes{} -> noHints- PsErrLambdaCase{} -> noHints+ PsErrEmptyDoubleQuotes th_on | th_on -> [SuggestThQuotationSyntax]+ | otherwise -> noHints+ PsErrLambdaCase{} -> [suggestExtension LangExt.LambdaCase] PsErrEmptyLambda{} -> noHints- PsErrLinearFunction{} -> noHints- PsErrMultiWayIf{} -> noHints- PsErrOverloadedRecordUpdateNotEnabled{} -> noHints- PsErrNumUnderscores{} -> noHints- PsErrIllegalBangPattern{} -> noHints+ PsErrLinearFunction{} -> [suggestExtension LangExt.LinearTypes]+ PsErrMultiWayIf{} -> [suggestExtension LangExt.MultiWayIf]+ PsErrOverloadedRecordUpdateNotEnabled{} -> [suggestExtension LangExt.OverloadedRecordUpdate]+ PsErrNumUnderscores{} -> [suggestExtension LangExt.NumericUnderscores]+ PsErrIllegalBangPattern{} -> [suggestExtension LangExt.BangPatterns] PsErrOverloadedRecordDotInvalid{} -> noHints- PsErrIllegalPatSynExport -> noHints+ PsErrIllegalPatSynExport -> [suggestExtension LangExt.PatternSynonyms] PsErrOverloadedRecordUpdateNoQualifiedFields -> noHints- PsErrExplicitForall{} -> noHints- PsErrIllegalQualifiedDo{} -> noHints+ PsErrExplicitForall is_unicode ->+ let info = text "or a similar language extension to enable explicit-forall syntax:" <+>+ forallSym is_unicode <+> text "<tvs>. <type>"+ in [ suggestExtensionWithInfo info LangExt.RankNTypes ]+ PsErrIllegalQualifiedDo{} -> [suggestExtension LangExt.QualifiedDo] PsErrQualifiedDoInCmd{} -> noHints PsErrRecordSyntaxInPatSynDecl{} -> noHints PsErrEmptyWhereInPatSynDecl{} -> noHints@@ -692,9 +638,9 @@ PsErrNoSingleWhereBindInPatSynDecl{} -> noHints PsErrDeclSpliceNotAtTopLevel{} -> noHints PsErrMultipleNamesInStandaloneKindSignature{} -> noHints- PsErrIllegalExplicitNamespace -> noHints+ PsErrIllegalExplicitNamespace -> [suggestExtension LangExt.ExplicitNamespaces] PsErrUnallowedPragma{} -> noHints- PsErrImportPostQualified -> noHints+ PsErrImportPostQualified -> [suggestExtension LangExt.ImportQualifiedPost] PsErrImportQualifiedTwice -> noHints PsErrIllegalImportBundleForm -> noHints PsErrInvalidRuleActivationMarker -> noHints@@ -737,20 +683,22 @@ PsErrIfInFunAppExpr{} -> suggestParensAndBlockArgs PsErrProcInFunAppExpr{} -> suggestParensAndBlockArgs PsErrMalformedTyOrClDecl{} -> noHints- PsErrIllegalWhereInDataDecl -> noHints- PsErrIllegalDataTypeContext{} -> noHints+ PsErrIllegalWhereInDataDecl ->+ [ suggestExtensionWithInfo (text "or a similar language extension to enable syntax: data T where")+ LangExt.GADTs ]+ PsErrIllegalDataTypeContext{} -> [suggestExtension LangExt.DatatypeContexts] PsErrPrimStringInvalidChar -> noHints PsErrSuffixAT -> noHints PsErrPrecedenceOutOfRange{} -> noHints- PsErrSemiColonsInCondExpr{} -> noHints- PsErrSemiColonsInCondCmd{} -> noHints+ PsErrSemiColonsInCondExpr{} -> [suggestExtension LangExt.DoAndIfThenElse]+ PsErrSemiColonsInCondCmd{} -> [suggestExtension LangExt.DoAndIfThenElse] PsErrAtInPatPos -> noHints PsErrParseErrorOnInput{} -> noHints PsErrMalformedDecl{} -> noHints PsErrUnexpectedTypeAppInDecl{} -> noHints PsErrNotADataCon{} -> noHints PsErrInferredTypeVarNotAllowed -> noHints- PsErrIllegalTraditionalRecordSyntax{} -> noHints+ PsErrIllegalTraditionalRecordSyntax{} -> [suggestExtension LangExt.TraditionalRecordSyntax] PsErrParseErrorInCmd{} -> noHints PsErrInPat _ details -> case details of PEIP_RecPattern args YesPatIsRecursive ctx@@ -759,12 +707,33 @@ PEIP_OtherPatDetails ctx -> catMaybes [sug_missingdo ctx] _ -> [] where- sug_recdo = Just (SuggestExtension LangExt.RecursiveDo)+ sug_recdo = Just (suggestExtension LangExt.RecursiveDo) sug_missingdo (ParseContext _ YesIncompleteDoBlock) = Just SuggestMissingDo sug_missingdo _ = Nothing PsErrParseRightOpSectionInPat{} -> noHints- PsErrIllegalRoleName{} -> noHints- PsErrInvalidTypeSignature{} -> noHints+ PsErrIllegalRoleName _ nearby -> [SuggestRoles nearby]+ PsErrInvalidTypeSignature lhs ->+ if | foreign_RDR `looks_like` lhs+ -> [suggestExtension LangExt.ForeignFunctionInterface]+ | default_RDR `looks_like` lhs+ -> [suggestExtension LangExt.DefaultSignatures]+ | pattern_RDR `looks_like` lhs+ -> [suggestExtension LangExt.PatternSynonyms]+ | otherwise+ -> [SuggestTypeSignatureForm]+ where+ -- A common error is to forget the ForeignFunctionInterface flag+ -- so check for that, and suggest. cf #3805+ -- Sadly 'foreign import' still barfs 'parse error' because+ -- 'import' is a keyword+ -- looks_like :: RdrName -> LHsExpr GhcPsErr -> Bool -- AZ+ looks_like s (L _ (HsVar _ (L _ v))) = v == s+ looks_like s (L _ (HsApp _ lhs _)) = looks_like s lhs+ looks_like _ _ = False++ foreign_RDR = mkUnqual varName (fsLit "foreign")+ default_RDR = mkUnqual varName (fsLit "default")+ pattern_RDR = mkUnqual varName (fsLit "pattern") PsErrUnexpectedTypeInDecl{} -> noHints PsErrInvalidPackageName{} -> noHints PsErrIllegalGadtRecordMultiplicity{} -> noHints@@ -785,7 +754,20 @@ , text "Expecting whitespace-separated list of GHC options." , text " E.g. {-# OPTIONS_GHC -Wall -O2 #-}" , text ("Input was: " ++ show str) ]+ PsErrUnknownOptionsPragma flag+ -> mkSimpleDecorated $ text "Unknown flag in {-# OPTIONS_GHC #-} pragma:" <+> text flag +psHeaderMessageReason :: PsHeaderMessage -> DiagnosticReason+psHeaderMessageReason = \case+ PsErrParseLanguagePragma+ -> ErrorWithoutFlag+ PsErrUnsupportedExt{}+ -> ErrorWithoutFlag+ PsErrParseOptionsPragma{}+ -> ErrorWithoutFlag+ PsErrUnknownOptionsPragma{}+ -> ErrorWithoutFlag+ psHeaderMessageHints :: PsHeaderMessage -> [GhcHint] psHeaderMessageHints = \case PsErrParseLanguagePragma@@ -802,11 +784,13 @@ suggestions = fuzzyMatch unsup supported PsErrParseOptionsPragma{} -> noHints+ PsErrUnknownOptionsPragma{}+ -> noHints suggestParensAndBlockArgs :: [GhcHint] suggestParensAndBlockArgs =- [SuggestParentheses, SuggestExtension LangExt.BlockArguments]+ [SuggestParentheses, suggestExtension LangExt.BlockArguments] pp_unexpected_fun_app :: Outputable a => SDoc -> a -> SDoc pp_unexpected_fun_app e a =@@ -815,3 +799,7 @@ parse_error_in_pat :: SDoc parse_error_in_pat = text "Parse error in pattern:"++forallSym :: Bool -> SDoc+forallSym True = text "∀"+forallSym False = text "forall"
compiler/GHC/Parser/Errors/Types.hs view
@@ -10,6 +10,7 @@ import GHC.Data.FastString import GHC.Hs import GHC.Parser.Types+import GHC.Parser.Errors.Basic import GHC.Types.Error import GHC.Types.Name.Occurrence (OccName) import GHC.Types.Name.Reader@@ -39,7 +40,25 @@ | PsErrUnsupportedExt !String ![String] | PsErrParseOptionsPragma !String + {-| PsErrUnsupportedOptionsPragma is an error that occurs when an unknown+ OPTIONS_GHC pragma is supplied is found. + Example(s):+ {-# OPTIONS_GHC foo #-}++ Test case(s):++ tests/safeHaskell/flags/SafeFlags28+ tests/safeHaskell/flags/SafeFlags19+ tests/safeHaskell/flags/SafeFlags29+ tests/parser/should_fail/T19923c+ tests/parser/should_fail/T19923b+ tests/parser/should_fail/readFail044+ tests/driver/T2499+ -}+ | PsErrUnknownOptionsPragma !String++ data PsMessage = {-| An \"unknown\" message from the parser. This type constructor allows@@ -510,18 +529,6 @@ | CmmUnknownCConv !String -- ^ Unknown calling convention | CmmUnrecognisedSafety !String -- ^ Unrecognised safety | CmmUnrecognisedHint !String -- ^ Unrecognised hint---- | The operator symbol in the 'PsOperatorWhitespaceExtConflictMessage' diagnostic.-data OperatorWhitespaceSymbol- = OperatorWhitespaceSymbol_PrefixPercent- | OperatorWhitespaceSymbol_PrefixDollar- | OperatorWhitespaceSymbol_PrefixDollarDollar---- | The operator occurrence type in the 'PsOperatorWhitespaceMessage' diagnostic.-data OperatorWhitespaceOccurrence- = OperatorWhitespaceOccurrence_Prefix- | OperatorWhitespaceOccurrence_Suffix- | OperatorWhitespaceOccurrence_TightInfix data TransLayoutReason = TransLayout_Where -- ^ "`where' clause at the same depth as implicit layout block"
compiler/GHC/Parser/Header.hs view
@@ -33,13 +33,12 @@ import GHC.Unit.Module import GHC.Builtin.Names -import GHC.Types.Error hiding ( getErrorMessages, getWarningMessages, getMessages )+import GHC.Types.Error import GHC.Types.SrcLoc import GHC.Types.SourceError import GHC.Types.SourceText import GHC.Utils.Misc-import GHC.Utils.Outputable as Outputable import GHC.Utils.Panic import GHC.Utils.Monad import GHC.Utils.Error@@ -75,6 +74,7 @@ (Messages PsMessage) ([(Maybe FastString, Located ModuleName)], [(Maybe FastString, Located ModuleName)],+ Bool, -- Is GHC.Prim imported or not Located ModuleName)) -- ^ The source imports and normal imports (with optional package -- names from -XPackageImports), and the module name.@@ -83,9 +83,9 @@ case unP parseHeader (initParserState popts buf loc) of PFailed pst -> -- assuming we're not logging warnings here as per below- return $ Left $ getErrorMessages pst+ return $ Left $ getPsErrorMessages pst POk pst rdr_module -> fmap Right $ do- let (_warns, errs) = getMessages pst+ let (_warns, errs) = getPsMessages pst -- don't log warnings: they'll be reported when we parse the file -- for real. See #2500. if not (isEmptyMessages errs)@@ -100,17 +100,19 @@ (src_idecls, ord_idecls) = partition ((== IsBoot) . ideclSource . unLoc) imps -- GHC.Prim doesn't exist physically, so don't go looking for it.- ordinary_imps = filter ((/= moduleName gHC_PRIM) . unLoc- . ideclName . unLoc)- ord_idecls+ (ordinary_imps, ghc_prim_import)+ = partition ((/= moduleName gHC_PRIM) . unLoc+ . ideclName . unLoc)+ ord_idecls implicit_imports = mkPrelImports (unLoc mod) main_loc implicit_prelude imps convImport (L _ i) = (fmap sl_fs (ideclPkgQual i), ideclName i) in- return (map convImport src_idecls,- map convImport (implicit_imports ++ ordinary_imps),- mod)+ return (map convImport src_idecls+ , map convImport (implicit_imports ++ ordinary_imps)+ , not (null ghc_prim_import)+ , mod) mkPrelImports :: ModuleName -> SrcSpan -- Attribute the "import Prelude" to this location@@ -419,9 +421,7 @@ liftIO $ throwErrors $ foldMap (singleMessage . mkMsg) flags where mkMsg (L loc flag) = mkPlainErrorMsgEnvelope loc $- GhcDriverMessage $ DriverUnknownMessage $ mkPlainError noHints $- text "unknown flag in {-# OPTIONS_GHC #-} pragma:" <+>- text flag+ GhcPsMessage $ PsHeaderMessage $ PsErrUnknownOptionsPragma flag -----------------------------------------------------------------------------
compiler/GHC/Platform/Ways.hs view
@@ -24,7 +24,9 @@ ( Way(..) , Ways , hasWay+ , hasNotWay , addWay+ , removeWay , allowed_combination , wayGeneralFlags , wayUnsetGeneralFlags@@ -72,13 +74,21 @@ type Ways = Set Way --- | Test if a ways is enabled+-- | Test if a way is enabled hasWay :: Ways -> Way -> Bool hasWay ws w = Set.member w ws +-- | Test if a way is not enabled+hasNotWay :: Ways -> Way -> Bool+hasNotWay ws w = Set.notMember w ws+ -- | Add a way addWay :: Way -> Ways -> Ways addWay = Set.insert++-- | Remove a way+removeWay :: Way -> Ways -> Ways+removeWay = Set.delete -- | Check if a combination of ways is allowed allowed_combination :: Ways -> Bool
compiler/GHC/Tc/Errors/Ppr.hs view
@@ -13,11 +13,14 @@ import GHC.Core.Type import GHC.Tc.Errors.Types import GHC.Types.Error+import GHC.Types.Name.Reader (pprNameProvenance) import GHC.Types.Var.Env (emptyTidyEnv) import GHC.Driver.Flags import GHC.Hs import GHC.Utils.Outputable import GHC.Unit.State (pprWithUnitState, UnitState)+import qualified GHC.LanguageExtensions as LangExt+import qualified Data.List.NonEmpty as NE instance Diagnostic TcRnMessage where@@ -49,6 +52,49 @@ -> mkDecorated [text "Use of plugins makes the module unsafe"] TcRnModMissingRealSrcSpan mod -> mkDecorated [text "Module does not have a RealSrcSpan:" <+> ppr mod]+ TcRnShadowedName occ provenance+ -> let shadowed_locs = case provenance of+ ShadowedNameProvenanceLocal n -> [text "bound at" <+> ppr n]+ ShadowedNameProvenanceGlobal gres -> map pprNameProvenance gres+ in mkSimpleDecorated $+ sep [text "This binding for" <+> quotes (ppr occ)+ <+> text "shadows the existing binding" <> plural shadowed_locs,+ nest 2 (vcat shadowed_locs)]+ TcRnDuplicateWarningDecls d rdr_name+ -> mkSimpleDecorated $+ vcat [text "Multiple warning declarations for" <+> quotes (ppr rdr_name),+ text "also at " <+> ppr (getLocA d)]+ TcRnSimplifierTooManyIterations limit wc+ -> mkSimpleDecorated $+ hang (text "solveWanteds: too many iterations"+ <+> parens (text "limit =" <+> ppr limit))+ 2 (text "Unsolved:" <+> ppr wc)+ TcRnIllegalPatSynDecl rdrname+ -> mkSimpleDecorated $+ hang (text "Illegal pattern synonym declaration for" <+> quotes (ppr rdrname))+ 2 (text "Pattern synonym declarations are only valid at top level")+ TcRnLinearPatSyn ty+ -> mkSimpleDecorated $+ hang (text "Pattern synonyms do not support linear fields (GHC #18806):") 2 (ppr ty)+ TcRnEmptyRecordUpdate+ -> mkSimpleDecorated $ text "Empty record update"+ TcRnIllegalFieldPunning fld+ -> mkSimpleDecorated $ text "Illegal use of punning for field" <+> quotes (ppr fld)+ TcRnIllegalWildcardsInRecord fld_part+ -> mkSimpleDecorated $ text "Illegal `..' in record" <+> pprRecordFieldPart fld_part+ TcRnDuplicateFieldName fld_part dups+ -> mkSimpleDecorated $+ hsep [text "duplicate field name",+ quotes (ppr (NE.head dups)),+ text "in record", pprRecordFieldPart fld_part]+ TcRnIllegalViewPattern pat+ -> mkSimpleDecorated $ vcat [text "Illegal view pattern: " <+> ppr pat]+ TcRnCharLiteralOutOfRange c+ -> mkSimpleDecorated $ text "character literal out of range: '\\" <> char c <> char '\''+ TcRnIllegalWildcardsInConstructor con+ -> mkSimpleDecorated $+ vcat [ text "Illegal `..' notation for constructor" <+> quotes (ppr con)+ , nest 2 (text "The constructor has no labelled fields") ] diagnosticReason = \case TcRnUnknownMessage m@@ -72,6 +118,30 @@ -> WarningWithoutFlag TcRnModMissingRealSrcSpan{} -> ErrorWithoutFlag+ TcRnShadowedName{}+ -> WarningWithFlag Opt_WarnNameShadowing+ TcRnDuplicateWarningDecls{}+ -> ErrorWithoutFlag+ TcRnSimplifierTooManyIterations{}+ -> ErrorWithoutFlag+ TcRnIllegalPatSynDecl{}+ -> ErrorWithoutFlag+ TcRnLinearPatSyn{}+ -> ErrorWithoutFlag+ TcRnEmptyRecordUpdate+ -> ErrorWithoutFlag+ TcRnIllegalFieldPunning{}+ -> ErrorWithoutFlag+ TcRnIllegalWildcardsInRecord{}+ -> ErrorWithoutFlag+ TcRnDuplicateFieldName{}+ -> ErrorWithoutFlag+ TcRnIllegalViewPattern{}+ -> ErrorWithoutFlag+ TcRnCharLiteralOutOfRange{}+ -> ErrorWithoutFlag+ TcRnIllegalWildcardsInConstructor{}+ -> ErrorWithoutFlag diagnosticHints = \case TcRnUnknownMessage m@@ -95,6 +165,30 @@ -> noHints TcRnModMissingRealSrcSpan{} -> noHints+ TcRnShadowedName{}+ -> noHints+ TcRnDuplicateWarningDecls{}+ -> noHints+ TcRnSimplifierTooManyIterations{}+ -> [SuggestIncreaseSimplifierIterations]+ TcRnIllegalPatSynDecl{}+ -> noHints+ TcRnLinearPatSyn{}+ -> noHints+ TcRnEmptyRecordUpdate{}+ -> noHints+ TcRnIllegalFieldPunning{}+ -> [suggestExtension LangExt.NamedFieldPuns]+ TcRnIllegalWildcardsInRecord{}+ -> [suggestExtension LangExt.RecordWildCards]+ TcRnDuplicateFieldName{}+ -> noHints+ TcRnIllegalViewPattern{}+ -> [suggestExtension LangExt.ViewPatterns]+ TcRnCharLiteralOutOfRange{}+ -> noHints+ TcRnIllegalWildcardsInConstructor{}+ -> noHints messageWithInfoDiagnosticMessage :: UnitState -> ErrInfo@@ -159,3 +253,10 @@ LevityCheckInValidClass -> empty in formatLevPolyErr ty $$ extra+++pprRecordFieldPart :: RecordFieldPart -> SDoc+pprRecordFieldPart = \case+ RecordFieldConstructor{} -> text "construction"+ RecordFieldPattern{} -> text "pattern"+ RecordFieldUpdate -> text "update"
compiler/GHC/Tc/Errors/Types.hs view
@@ -6,18 +6,27 @@ , TcRnMessageDetailed(..) , ErrInfo(..) , LevityCheckProvenance(..)+ , ShadowedNameProvenance(..)+ , RecordFieldPart(..) ) where +import GHC.Prelude+ import GHC.Hs+import GHC.Tc.Types.Constraint import GHC.Types.Error-import GHC.Types.Name (Name)+import GHC.Types.Name (Name, OccName) import GHC.Types.Name.Reader+import GHC.Types.SrcLoc import GHC.Unit.Types (Module) import GHC.Utils.Outputable-import Data.Typeable import GHC.Core.Type (Type, Var) import GHC.Unit.State (UnitState)+import GHC.Types.Basic +import qualified Data.List.NonEmpty as NE+import Data.Typeable+ {- Note [Migrating TcM Messages] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~@@ -163,6 +172,167 @@ -} TcRnModMissingRealSrcSpan :: Module -> TcRnMessage ++ {-| TcRnShadowedName is a warning (controlled by -Wname-shadowing) that occurs whenever+ an inner-scope value has the same name as an outer-scope value, i.e. the inner+ value shadows the outer one. This can catch typographical errors that turn into+ hard-to-find bugs. The warning is suppressed for names beginning with an underscore.++ Examples(s):+ f = ... let f = id in ... f ... -- NOT OK, 'f' is shadowed+ f x = do { _ignore <- this; _ignore <- that; return (the other) } -- suppressed via underscore++ Test cases: typecheck/should_compile/T10971a+ rename/should_compile/rn039+ rename/should_compile/rn064+ rename/should_compile/T1972+ rename/should_fail/T2723+ rename/should_compile/T3262+ driver/werror+ -}+ TcRnShadowedName :: OccName -> ShadowedNameProvenance -> TcRnMessage++ {-| TcRnDuplicateWarningDecls is an error that occurs whenever+ a warning is declared twice.++ Examples(s):+ None.++ Test cases:+ None.+ -}+ TcRnDuplicateWarningDecls :: !(LocatedN RdrName) -> !RdrName -> TcRnMessage++ {-| TcRnDuplicateWarningDecls is an error that occurs whenever+ the constraint solver in the simplifier hits the iterations' limit.++ Examples(s):+ None.++ Test cases:+ None.+ -}+ TcRnSimplifierTooManyIterations :: !IntWithInf+ -- ^ The limit.+ -> WantedConstraints+ -> TcRnMessage++ {-| TcRnIllegalPatSynDecl is an error that occurs whenever+ there is an illegal pattern synonym declaration.++ Examples(s):++ varWithLocalPatSyn x = case x of+ P -> ()+ where+ pattern P = () -- not valid, it can't be local, it must be defined at top-level.++ Test cases: patsyn/should_fail/local+ -}+ TcRnIllegalPatSynDecl :: !(LIdP GhcPs) -> TcRnMessage++ {-| TcRnLinearPatSyn is an error that occurs whenever a pattern+ synonym signature uses a field that is not unrestricted.++ Example(s): None++ Test cases: linear/should_fail/LinearPatSyn2+ -}+ TcRnLinearPatSyn :: !Type -> TcRnMessage++ {-| TcRnEmptyRecordUpdate is an error that occurs whenever+ a record is updated without specifying any field.++ Examples(s):++ $(deriveJSON defaultOptions{} ''Bad) -- not ok, no fields selected for update of defaultOptions++ Test cases: th/T12788+ -}+ TcRnEmptyRecordUpdate :: TcRnMessage++ {-| TcRnIllegalFieldPunning is an error that occurs whenever+ field punning is used without the 'NamedFieldPuns' extension enabled.++ Examples(s):++ data Foo = Foo { a :: Int }++ foo :: Foo -> Int+ foo Foo{a} = a -- Not ok, punning used without extension.++ Test cases: parser/should_fail/RecordDotSyntaxFail12+ -}+ TcRnIllegalFieldPunning :: !(Located RdrName) -> TcRnMessage++ {-| TcRnIllegalWildcardsInRecord is an error that occurs whenever+ wildcards (..) are used in a record without the relevant+ extension being enabled.++ Examples(s):++ data Foo = Foo { a :: Int }++ foo :: Foo -> Int+ foo Foo{..} = a -- Not ok, wildcards used without extension.++ Test cases: parser/should_fail/RecordWildCardsFail+ -}+ TcRnIllegalWildcardsInRecord :: !RecordFieldPart -> TcRnMessage++ {-| TcRnDuplicateFieldName is an error that occurs whenever+ there are duplicate field names in a record.++ Examples(s): None.++ Test cases: None.+ -}+ TcRnDuplicateFieldName :: !RecordFieldPart -> NE.NonEmpty RdrName -> TcRnMessage++ {-| TcRnIllegalViewPattern is an error that occurs whenever+ the ViewPatterns syntax is used but the ViewPatterns language extension+ is not enabled.++ Examples(s):+ data Foo = Foo { a :: Int }++ foo :: Foo -> Int+ foo (a -> l) = l -- not OK, the 'ViewPattern' extension is not enabled.++ Test cases: parser/should_fail/ViewPatternsFail+ -}+ TcRnIllegalViewPattern :: !(Pat GhcPs) -> TcRnMessage++ {-| TcRnCharLiteralOutOfRange is an error that occurs whenever+ a character is out of range.++ Examples(s): None++ Test cases: None+ -}+ TcRnCharLiteralOutOfRange :: !Char -> TcRnMessage++ {-| TcRnIllegalWildcardsInConstructor is an error that occurs whenever+ the record wildcards '..' are used inside a constructor without labeled fields.++ Examples(s): None++ Test cases: None+ -}+ TcRnIllegalWildcardsInConstructor :: !Name -> TcRnMessage++-- | Which parts of a record field are affected by a particular error or warning.+data RecordFieldPart+ = RecordFieldConstructor !Name+ | RecordFieldPattern !Name+ | RecordFieldUpdate++-- | Where a shadowed name comes from+data ShadowedNameProvenance+ = ShadowedNameProvenanceLocal !SrcLoc+ -- ^ The shadowed name is local to the module+ | ShadowedNameProvenanceGlobal [GlobalRdrElt]+ -- ^ The shadowed name is global, typically imported from elsewhere. -- | Where the levity checking for the input type originated data LevityCheckProvenance
compiler/GHC/Tc/Solver/Types.hs view
@@ -138,7 +138,7 @@ = Nothing | Just {} <- isCallStackPred cls tys- , OccurrenceOf {} <- ctLocOrigin loc+ , isPushCallStackOrigin (ctLocOrigin loc) = Nothing -- See Note [Solving CallStack constraints] | otherwise@@ -219,13 +219,15 @@ Note [Solving CallStack constraints] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+See also Note [Overview of implicit CallStacks] in GHc.Tc.Types.Evidence.+ Suppose f :: HasCallStack => blah. Then * Each call to 'f' gives rise to [W] s1 :: IP "callStack" CallStack -- CtOrigin = OccurrenceOf f with a CtOrigin that says "OccurrenceOf f". Remember that HasCallStack is just shorthand for- IP "callStack CallStack+ IP "callStack" CallStack See Note [Overview of implicit CallStacks] in GHC.Tc.Types.Evidence * We cannonicalise such constraints, in GHC.Tc.Solver.Canonical.canClassNC, by@@ -239,7 +241,7 @@ So we must be careful /not/ to solve 's1' from the Givens. Again, we ensure this by arranging that findDict always misses when looking-up souch constraints.+up such constraints. -} {- *********************************************************************
compiler/GHC/Tc/Types/Evidence.hs view
@@ -77,7 +77,6 @@ import GHC.Types.Var.Env import GHC.Types.Var.Set import GHC.Core.Predicate-import GHC.Types.Name import GHC.Data.Pair import GHC.Types.Basic @@ -90,6 +89,8 @@ import GHC.Utils.Outputable import GHC.Data.Bag+import GHC.Data.FastString+ import qualified Data.Data as Data import GHC.Types.SrcLoc import Data.IORef( IORef )@@ -654,9 +655,14 @@ data EvCallStack -- See Note [Overview of implicit CallStacks] = EvCsEmpty- | EvCsPushCall Name RealSrcSpan EvExpr- -- ^ @EvCsPushCall name loc stk@ represents a call to @name@, occurring at- -- @loc@, in a calling context @stk@.+ | EvCsPushCall+ FastString -- Usually the name of the function being called+ -- but can also be "the literal 42"+ -- or "an if-then-else expression", etc+ RealSrcSpan -- Location of the call+ EvExpr -- Rest of the stack+ -- ^ @EvCsPushCall origin loc stk@ represents a call from @origin@,+ -- occurring at @loc@, in a calling context @stk@. deriving Data.Data {-@@ -740,7 +746,7 @@ Note [Overview of implicit CallStacks]-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (See https://gitlab.haskell.org/ghc/ghc/wikis/explicit-call-stack/implicit-locations) The goal of CallStack evidence terms is to reify locations@@ -753,9 +759,12 @@ Implicit parameters of type GHC.Stack.Types.CallStack (the name is not important) are solved in three steps: -1. Occurrences of CallStack IPs are solved directly from the given IP,- just like a regular IP. For example, the occurrence of `?stk` in+1. Explicit, user-written occurrences of `?stk :: CallStack`+ which have IPOccOrigin, are solved directly from the given IP,+ just like a regular IP; see GHC.Tc.Solver.Interact.interactDict. + For example, the occurrence of `?stk` in+ error :: (?stk :: CallStack) => String -> a error s = raise (ErrorCall (s ++ prettyCallStack ?stk)) @@ -765,30 +774,42 @@ append the current call-site to it. For example, consider a call to the callstack-aware `error` above. - undefined :: (?stk :: CallStack) => a- undefined = error "undefined!"+ foo :: (?stk :: CallStack) => a+ foo = error "undefined!" Here we want to take the given `?stk` and append the current call-site, before passing it to `error`. In essence, we want to- rewrite `error "undefined!"` to+ rewrite `foo "undefined!"` to - let ?stk = pushCallStack <error's location> ?stk- in error "undefined!"+ let ?stk = pushCallStack <foo's location> ?stk+ in foo "undefined!" - We achieve this effect by emitting a NEW wanted+ We achieve this as follows: - [W] d :: IP "stk" CallStack+ * At a call of foo :: (?stk :: CallStack) => blah+ we emit a Wanted+ [W] d1 : IP "stk" CallStack+ with CtOrigin = OccurrenceOf "foo" - from which we build the evidence term+ * We /solve/ this constraint, in GHC.Tc.Solver.Canonical.canClassNC+ by emitting a NEW Wanted+ [W] d2 :: IP "stk" CallStack+ with CtOrigin = IPOccOrigin - EvCsPushCall "error" <error's location> (EvId d)+ and solve d1 = EvCsPushCall "foo" <foo's location> (EvId d1) - that we use to solve the call to `error`. The new wanted `d` will- then be solved per rule (1), ie as a regular IP.+ * The new Wanted, for `d2` will be solved per rule (1), ie as a regular IP. - (see GHC.Tc.Solver.Interact.interactDict)+3. We use the predicate isPushCallStackOrigin to identify whether we+ want to do (1) solve directly, or (2) push and then solve directly.+ Key point (see #19918): the CtOrigin where we want to push an item on the+ call stack can include IfThenElseOrigin etc, when RebindableSyntax is+ involved. See the defn of fun_orig in GHC.Tc.Gen.App.tcInstFun; it is+ this CtOrigin that is pinned on the constraints generated by functions+ in the "expansion" for rebindable syntax. c.f. GHC.Rename.Expr+ Note [Handling overloaded and rebindable constructs] -3. We default any insoluble CallStacks to the empty CallStack. Suppose+4. We default any insoluble CallStacks to the empty CallStack. Suppose `undefined` did not request a CallStack, ie undefinedNoStk :: a@@ -1042,8 +1063,8 @@ instance Outputable EvCallStack where ppr EvCsEmpty = text "[]"- ppr (EvCsPushCall name loc tm)- = ppr (name,loc) <+> text ":" <+> ppr tm+ ppr (EvCsPushCall orig loc tm)+ = ppr (orig,loc) <+> text ":" <+> ppr tm instance Outputable EvTypeable where ppr (EvTypeableTyCon ts _) = text "TyCon" <+> ppr ts
compiler/GHC/Tc/Types/Origin.hs view
@@ -18,11 +18,15 @@ -- CtOrigin CtOrigin(..), exprCtOrigin, lexprCtOrigin, matchesCtOrigin, grhssCtOrigin, isVisibleOrigin, toInvisibleOrigin,- pprCtOrigin, isGivenOrigin+ pprCtOrigin, isGivenOrigin, + -- CtOrigin and CallStack+ isPushCallStackOrigin, callStackOriginFS+ ) where import GHC.Prelude+import GHC.Utils.Misc (HasCallStack) import GHC.Tc.Utils.TcType @@ -432,7 +436,6 @@ | MCompOrigin -- Arising from a monad comprehension | MCompPatOrigin (LPat GhcRn) -- Arising from a failable pattern in a -- monad comprehension- | IfOrigin -- Arising from an if statement | ProcOrigin -- Arising from a proc expression | AnnOrigin -- An annotation @@ -450,6 +453,7 @@ | TypeHoleOrigin OccName -- from a type hole (partial type signature) | PatCheckOrigin -- normalisation of a type during pattern-match checking | ListOrigin -- An overloaded list+ | IfThenElseOrigin -- An if-then-else expression | BracketOrigin -- An overloaded quotation bracket | StaticOrigin -- A static form | Shouldn'tHappenOrigin String@@ -521,7 +525,7 @@ exprCtOrigin (ExplicitTuple {}) = Shouldn'tHappenOrigin "explicit tuple" exprCtOrigin ExplicitSum{} = Shouldn'tHappenOrigin "explicit sum" exprCtOrigin (HsCase _ _ matches) = matchesCtOrigin matches-exprCtOrigin (HsIf {}) = Shouldn'tHappenOrigin "if expression"+exprCtOrigin (HsIf {}) = IfThenElseOrigin exprCtOrigin (HsMultiIf _ rhs) = lGRHSCtOrigin rhs exprCtOrigin (HsLet _ _ e) = lexprCtOrigin e exprCtOrigin (HsDo {}) = DoOrigin@@ -639,7 +643,7 @@ = ctoHerald <+> pprCtO simple_origin -- | Short one-liners-pprCtO :: CtOrigin -> SDoc+pprCtO :: HasCallStack => CtOrigin -> SDoc pprCtO (OccurrenceOf name) = hsep [text "a use of", quotes (ppr name)] pprCtO (OccurrenceOfRecSel name) = hsep [text "a use of", quotes (ppr name)] pprCtO AppOrigin = text "an application"@@ -651,7 +655,6 @@ pprCtO PatSigOrigin = text "a pattern type signature" pprCtO PatOrigin = text "a pattern" pprCtO ViewPatOrigin = text "a view pattern"-pprCtO IfOrigin = text "an if expression" pprCtO (LiteralOrigin lit) = hsep [text "the literal", quotes (ppr lit)] pprCtO (ArithSeqOrigin seq) = hsep [text "the arithmetic sequence", quotes (ppr seq)] pprCtO SectionOrigin = text "an operator section"@@ -672,8 +675,47 @@ pprCtO (TypeHoleOrigin occ) = text "a use of wildcard" <+> quotes (ppr occ) pprCtO PatCheckOrigin = text "a pattern-match completeness check" pprCtO ListOrigin = text "an overloaded list"+pprCtO IfThenElseOrigin = text "an if-then-else expression" pprCtO StaticOrigin = text "a static form" pprCtO NonLinearPatternOrigin = text "a non-linear pattern" pprCtO (UsageEnvironmentOf x) = hsep [text "multiplicity of", quotes (ppr x)] pprCtO BracketOrigin = text "a quotation bracket"-pprCtO _ = panic "pprCtOrigin"++-- These ones are handled by pprCtOrigin, but we nevertheless sometimes+-- get here via callStackOriginFS, when doing ambiguity checks+-- A bit silly, but no great harm+pprCtO (GivenOrigin {}) = text "a given constraint"+pprCtO (SpecPragOrigin {}) = text "a SPECIALISE pragma"+pprCtO (FunDepOrigin1 {}) = text "a functional dependency"+pprCtO (FunDepOrigin2 {}) = text "a functional dependency"+pprCtO (TypeEqOrigin {}) = text "a type equality"+pprCtO (KindEqOrigin {}) = text "a kind equality"+pprCtO (DerivOriginDC {}) = text "a deriving clause"+pprCtO (DerivOriginCoerce {}) = text "a derived method"+pprCtO (DoPatOrigin {}) = text "a do statement"+pprCtO (MCompPatOrigin {}) = text "a monad comprehension pattern"+pprCtO (Shouldn'tHappenOrigin note) = text note+pprCtO (ProvCtxtOrigin {}) = text "a provided constraint"+pprCtO (InstProvidedOrigin {}) = text "a provided constraint"+pprCtO (CycleBreakerOrigin orig) = pprCtO orig++{- *********************************************************************+* *+ CallStacks and CtOrigin++ See Note [Overview of implicit CallStacks] in GHC.Tc.Types.Evidence+* *+********************************************************************* -}++isPushCallStackOrigin :: CtOrigin -> Bool+-- Do we want to solve this IP constraint directly (return False)+-- or push the call site (return True)+-- See Note [Overview of implicit CallStacks] in GHc.Tc.Types.Evidence+isPushCallStackOrigin (IPOccOrigin {}) = False+isPushCallStackOrigin _ = True+++callStackOriginFS :: CtOrigin -> FastString+-- This is the string that appears in the CallStack+callStackOriginFS (OccurrenceOf fun) = occNameFS (getOccName fun)+callStackOriginFS orig = mkFastString (showSDocUnsafe (pprCtO orig))
compiler/GHC/Tc/Utils/TcType.hs view
@@ -80,7 +80,7 @@ isSigmaTy, isRhoTy, isRhoExpTy, isOverloadedTy, isFloatingTy, isDoubleTy, isFloatTy, isIntTy, isWordTy, isStringTy, isIntegerTy, isNaturalTy,- isBoolTy, isUnitTy, isCharTy, isCallStackTy, isCallStackPred,+ isBoolTy, isUnitTy, isCharTy, isTauTy, isTauTyCon, tcIsTyVarTy, tcIsForAllTy, isPredTy, isTyVarClassPred, checkValidClsArgs, hasTyVarHead,@@ -228,7 +228,6 @@ import GHC.Utils.Outputable import GHC.Utils.Panic import GHC.Utils.Panic.Plain-import GHC.Data.FastString import GHC.Utils.Error( Validity(..), isValid ) import qualified GHC.LanguageExtensions as LangExt @@ -2119,26 +2118,6 @@ = case tcSplitTyConApp_maybe ty of Just (tc, [arg_ty]) -> tc == listTyCon && isCharTy arg_ty _ -> False---- | Is a type a 'CallStack'?-isCallStackTy :: Type -> Bool-isCallStackTy ty- | Just tc <- tyConAppTyCon_maybe ty- = tc `hasKey` callStackTyConKey- | otherwise- = False---- | Is a 'PredType' a 'CallStack' implicit parameter?------ If so, return the name of the parameter.-isCallStackPred :: Class -> [Type] -> Maybe FastString-isCallStackPred cls tys- | [ty1, ty2] <- tys- , isIPClass cls- , isCallStackTy ty2- = isStrLitTy ty1- | otherwise- = Nothing is_tc :: Unique -> Type -> Bool -- Newtypes are opaque to this
compiler/GHC/Types/Error.hs view
@@ -33,6 +33,13 @@ -- * Hints and refactoring actions , GhcHint (..)+ , LanguageExtensionHint(..)+ , suggestExtension+ , suggestExtensionWithInfo+ , suggestExtensions+ , suggestExtensionsWithInfo+ , suggestAnyExtension+ , suggestAnyExtensionWithInfo , noHints -- * Rendering Messages
compiler/GHC/Types/Hint.hs view
@@ -1,21 +1,77 @@ {-# LANGUAGE ExistentialQuantification #-} module GHC.Types.Hint (- GhcHint(..),- InstantiationSuggestion(..)+ GhcHint(..)+ , InstantiationSuggestion(..)+ , LanguageExtensionHint(..)+ , suggestExtension+ , suggestExtensionWithInfo+ , suggestExtensions+ , suggestExtensionsWithInfo+ , suggestAnyExtension+ , suggestAnyExtensionWithInfo ) where +import GHC.Prelude+ import GHC.Utils.Outputable import qualified GHC.LanguageExtensions as LangExt import Data.Typeable import GHC.Unit.Module (ModuleName, Module) import GHC.Hs.Extension (GhcTc)-import GHC.Types.Var (Var)+import GHC.Core.Coercion import GHC.Types.Basic (Activation, RuleName)+import GHC.Parser.Errors.Basic import {-# SOURCE #-} Language.Haskell.Syntax.Expr -- This {-# SOURCE #-} import should be removable once -- 'Language.Haskell.Syntax.Bind' no longer depends on 'GHC.Tc.Types.Evidence'. ++data LanguageExtensionHint+ = -- | Suggest to enable the input extension. If the input 'SDoc'+ -- is not empty, it will contain some extra information about the+ -- why the extension is required, but it's totally irrelevant/redundant+ -- for IDEs and other tools.+ SuggestSingleExtension !SDoc !LangExt.Extension+ -- | Suggest to enable the input extensions. The list+ -- is to be intended as /disjuctive/ i.e. the user is+ -- suggested to enable /any/ of the extensions listed. If+ -- the input 'SDoc' is not empty, it will contain some extra+ -- information about the why the extensions are required, but+ -- it's totally irrelevant/redundant for IDEs and other tools.+ | SuggestAnyExtension !SDoc [LangExt.Extension]+ -- | Suggest to enable the input extensions. The list+ -- is to be intended as /conjunctive/ i.e. the user is+ -- suggested to enable /all/ the extensions listed. If+ -- the input 'SDoc' is not empty, it will contain some extra+ -- information about the why the extensions are required, but+ -- it's totally irrelevant/redundant for IDEs and other tools.+ | SuggestExtensions !SDoc [LangExt.Extension]++-- | Suggests a single extension without extra user info.+suggestExtension :: LangExt.Extension -> GhcHint+suggestExtension ext = SuggestExtension (SuggestSingleExtension empty ext)++-- | Like 'suggestExtension' but allows supplying extra info for the user.+suggestExtensionWithInfo :: SDoc -> LangExt.Extension -> GhcHint+suggestExtensionWithInfo extraInfo ext = SuggestExtension (SuggestSingleExtension extraInfo ext)++-- | Suggests to enable /every/ extension in the list.+suggestExtensions :: [LangExt.Extension] -> GhcHint+suggestExtensions exts = SuggestExtension (SuggestExtensions empty exts)++-- | Like 'suggestExtensions' but allows supplying extra info for the user.+suggestExtensionsWithInfo :: SDoc -> [LangExt.Extension] -> GhcHint+suggestExtensionsWithInfo extraInfo exts = SuggestExtension (SuggestExtensions extraInfo exts)++-- | Suggests to enable /any/ extension in the list.+suggestAnyExtension :: [LangExt.Extension] -> GhcHint+suggestAnyExtension exts = SuggestExtension (SuggestAnyExtension empty exts)++-- | Like 'suggestAnyExtension' but allows supplying extra info for the user.+suggestAnyExtensionWithInfo :: SDoc -> [LangExt.Extension] -> GhcHint+suggestAnyExtensionWithInfo extraInfo exts = SuggestExtension (SuggestAnyExtension extraInfo exts)+ -- | A type for hints emitted by GHC. -- A /hint/ suggests a possible way to deal with a particular warning or error. data GhcHint@@ -36,7 +92,7 @@ parser/should_fail/T18251e, ... (and many more) -}- | SuggestExtension !LangExt.Extension+ | SuggestExtension !LanguageExtensionHint {-| Suggests that a monadic code block is probably missing a \"do\" keyword. Example:@@ -83,6 +139,25 @@ Test Case(s): None -} | SuggestUseSpaces+ {-| Suggests adding a whitespace after the given symbol.++ Examples: None+ Test Case(s): parser/should_compile/T18834a.hs+ -}+ | SuggestUseWhitespaceAfter !OperatorWhitespaceSymbol+ {-| Suggests adding a whitespace around the given operator symbol,+ as it might be repurposed as special syntax by a future language extension.+ The second parameter is how such operator occurred, if in a prefix, suffix+ or tight infix position.++ Triggered by: 'GHC.Parser.Errors.Types.PsWarnOperatorWhitespace'.++ Example:+ h a b = a+b -- not OK, no spaces around '+'.++ Test Case(s): parser/should_compile/T18834b.hs+ -}+ | SuggestUseWhitespaceAround !String !OperatorWhitespaceOccurrence {-| Suggests wrapping an expression in parentheses Examples: None@@ -115,6 +190,63 @@ | SuggestAddInlineOrNoInlinePragma !Var !Activation | SuggestAddPhaseToCompetingRule !RuleName+ {-| Suggests increasing the limit for the number of iterations in the simplifier.++ -}+ | SuggestIncreaseSimplifierIterations+ {-| Suggests to explicitly import 'Type' from the 'Data.Kind' module, because+ using "*" to mean 'Data.Kind.Type' relies on the StarIsType extension, which+ will become deprecated in the future.++ Triggered by: 'GHC.Parser.Errors.Types.PsWarnStarIsType'+ Example: None+ Test case(s): wcompat-warnings/WCompatWarningsOn.hs++ -}+ | SuggestUseTypeFromDataKind++ {-| Suggests placing the 'qualified' keyword /after/ the module name.++ Triggered by: 'GHC.Parser.Errors.Types.PsWarnImportPreQualified'+ Example: None+ Test case(s): module/mod184.hs++ -}+ | SuggestQualifiedAfterModuleName++ {-| Suggests using TemplateHaskell quotation syntax.++ Triggered by: 'GHC.Parser.Errors.Types.PsErrEmptyDoubleQuotes' only if TemplateHaskell+ is enabled.+ Example: None+ Test case(s): parser/should_fail/T13450TH.hs++ -}+ | SuggestThQuotationSyntax++ {-| Suggests alternative roles in case we found an illegal one.++ Triggered by: 'GHC.Parser.Errors.Types.PsErrIllegalRoleName'+ Example: None+ Test case(s): roles/should_fail/Roles7.hs++ -}+ | SuggestRoles [Role]++ {-| Suggests qualifying the '*' operator in modules where StarIsType is enabled.++ Triggered by: 'GHC.Parser.Errors.Types.PsWarnStarBinder'+ Test case(s): warnings/should_compile/StarBinder.hs+ -}+ | SuggestQualifyStarOperator++ {-| Suggests that a type signature should have form <variable> :: <type>+ in order to be accepted by GHC.++ Triggered by: 'GHC.Parser.Errors.Types.PsErrInvalidTypeSignature'+ Test case(s): parser/should_fail/T3811+ -}+ | SuggestTypeSignatureForm -- | An 'InstantiationSuggestion' for a '.hsig' file. This is generated -- by GHC in case of a 'DriverUnexpectedSignature' and suggests a way
compiler/GHC/Types/Hint/Ppr.hs view
@@ -9,22 +9,29 @@ import GHC.Prelude +import GHC.Parser.Errors.Basic import GHC.Types.Hint import GHC.Hs.Expr () -- instance Outputable import GHC.Types.Id import GHC.Utils.Outputable-import qualified GHC.LanguageExtensions as LangExt +import Data.List (intersperse)+ instance Outputable GhcHint where ppr = \case UnknownHint m -> ppr m- SuggestExtension ext- -> case ext of- LangExt.NegativeLiterals- -> text "If you are trying to write a large negative literal, use NegativeLiterals"- _ -> text "Perhaps you intended to use" <+> ppr ext+ SuggestExtension extHint+ -> case extHint of+ SuggestSingleExtension extraUserInfo ext ->+ (text "Perhaps you intended to use" <+> ppr ext) $$ extraUserInfo+ SuggestAnyExtension extraUserInfo exts ->+ let header = text "Enable any of the following extensions:"+ in header <+> hsep (intersperse (char ',') (map ppr exts)) $$ extraUserInfo+ SuggestExtensions extraUserInfo exts ->+ let header = text "Enable all of the following extensions:"+ in header <+> hsep (intersperse (char ',') (map ppr exts)) $$ extraUserInfo SuggestMissingDo -> text "Possibly caused by a missing 'do'?" SuggestLetInDo@@ -46,6 +53,11 @@ text "replacing <" <> ppr pi_mod_name <> text "> as necessary." SuggestUseSpaces -> text "Please use spaces instead."+ SuggestUseWhitespaceAfter sym+ -> text "Add whitespace after the"+ <+> quotes (pprOperatorWhitespaceSymbol sym) <> char '.'+ SuggestUseWhitespaceAround sym _occurrence+ -> text "Add whitespace around" <+> quotes (text sym) <> char '.' SuggestParentheses -> text "Use parentheses." SuggestIncreaseMaxPmCheckModels@@ -61,6 +73,31 @@ SuggestAddPhaseToCompetingRule bad_rule -> vcat [ text "Add phase [n] or [~n] to the competing rule" , whenPprDebug (ppr bad_rule) ]+ SuggestIncreaseSimplifierIterations+ -> text "Set limit with -fconstraint-solver-iterations=n; n=0 for no limit"+ SuggestUseTypeFromDataKind+ -> text "Use" <+> quotes (text "Type")+ <+> text "from" <+> quotes (text "Data.Kind") <+> text "instead."+ SuggestQualifiedAfterModuleName+ -> text "Place" <+> quotes (text "qualified")+ <+> text "after the module name."+ SuggestThQuotationSyntax+ -> vcat [ text "Perhaps you intended to use quotation syntax of TemplateHaskell,"+ , text "but the type variable or constructor is missing"+ ]+ SuggestRoles nearby+ -> case nearby of+ [] -> empty+ [r] -> text "Perhaps you meant" <+> quotes (ppr r)+ -- will this last case ever happen??+ _ -> hang (text "Perhaps you meant one of these:")+ 2 (pprWithCommas (quotes . ppr) nearby)+ SuggestQualifyStarOperator+ -> text "To use (or export) this operator in"+ <+> text "modules with StarIsType,"+ $$ text " including the definition module, you must qualify it."+ SuggestTypeSignatureForm+ -> text "A type signature should be of form <variables> :: <type>" perhapsAsPat :: SDoc perhapsAsPat = text "Perhaps you meant an as-pattern, which must not be surrounded by whitespace"
compiler/GHC/Types/Id/Make.hs view
@@ -696,7 +696,7 @@ = return NoDataConRep | otherwise- = do { wrap_args <- mapM newLocal wrap_arg_tys+ = do { wrap_args <- mapM (newLocal (fsLit "conrep")) wrap_arg_tys ; wrap_body <- mk_rep_app (wrap_args `zip` dropList eq_spec unboxers) initial_wrap_app @@ -986,12 +986,17 @@ -} --------------------------newLocal :: Scaled Type -> UniqSM Var-newLocal (Scaled w ty) = do { uniq <- getUniqueM- ; return (mkSysLocalOrCoVar (fsLit "dt") uniq w ty) }- -- We should not have "OrCoVar" here, this is a bug (#17545) +-- | Conjure a fresh local binder.+newLocal :: FastString -- ^ a string which will form part of the 'Var'\'s name+ -> Scaled Type -- ^ the type of the 'Var'+ -> UniqSM Var+newLocal name_stem (Scaled w ty) =+ do { uniq <- getUniqueM+ ; return (mkSysLocalOrCoVar name_stem uniq w ty) }+ -- We should not have "OrCoVar" here, this is a bug (#17545) + -- | Unpack/Strictness decisions from source module. -- -- This function should only ever be invoked for data constructor fields, and@@ -1072,14 +1077,14 @@ wrapCo co rep_ty (unbox_rep, box_rep) -- co :: arg_ty ~ rep_ty = (unboxer, boxer) where- unboxer arg_id = do { rep_id <- newLocal (Scaled (idMult arg_id) rep_ty)+ unboxer arg_id = do { rep_id <- newLocal (fsLit "cowrap_unbx") (Scaled (idMult arg_id) rep_ty) ; (rep_ids, rep_fn) <- unbox_rep rep_id ; let co_bind = NonRec rep_id (Var arg_id `Cast` co) ; return (rep_ids, Let co_bind . rep_fn) } boxer = Boxer $ \ subst -> do { (rep_ids, rep_expr) <- case box_rep of- UnitBox -> do { rep_id <- newLocal (linear $ TcType.substTy subst rep_ty)+ UnitBox -> do { rep_id <- newLocal (fsLit "cowrap_bx") (linear $ TcType.substTy subst rep_ty) ; return ([rep_id], Var rep_id) } Boxer boxer -> boxer subst ; let sco = substCoUnchecked subst co@@ -1112,7 +1117,7 @@ -- Note [Unpacking GADTs and existentials] ( rep_tys `zip` dataConRepStrictness con ,( \ arg_id ->- do { rep_ids <- mapM newLocal rep_tys+ do { rep_ids <- mapM (newLocal (fsLit "unbx")) rep_tys ; let r_mult = idMult arg_id ; let rep_ids' = map (scaleIdBy r_mult) rep_ids ; let unbox_fn body@@ -1120,7 +1125,7 @@ (DataAlt con) rep_ids' body ; return (rep_ids, unbox_fn) } , Boxer $ \ subst ->- do { rep_ids <- mapM (newLocal . TcType.substScaledTyUnchecked subst) rep_tys+ do { rep_ids <- mapM (newLocal (fsLit "bx") . TcType.substScaledTyUnchecked subst) rep_tys ; return (rep_ids, Var (dataConWorkId con) `mkTyApps` (substTysUnchecked subst tc_args) `mkVarApps` rep_ids ) } ) )
compiler/GHC/Types/Literal.hs view
@@ -42,6 +42,7 @@ , litNumWrap , litNumCoerce , litNumNarrow+ , litNumBitSize , isMinBound , isMaxBound @@ -54,8 +55,8 @@ , isLitValue_maybe, isLitRubbish -- ** Coercions- , narrowInt8Lit, narrowInt16Lit, narrowInt32Lit- , narrowWord8Lit, narrowWord16Lit, narrowWord32Lit+ , narrowInt8Lit, narrowInt16Lit, narrowInt32Lit, narrowInt64Lit+ , narrowWord8Lit, narrowWord16Lit, narrowWord32Lit, narrowWord64Lit , extendIntLit, extendWordLit , charToIntLit, intToCharLit , floatToIntLit, intToFloatLit, doubleToIntLit, intToDoubleLit@@ -190,6 +191,22 @@ LitNumWord32 -> False LitNumWord64 -> False +-- | Number of bits+litNumBitSize :: Platform -> LitNumType -> Maybe Word+litNumBitSize platform nt = case nt of+ LitNumInteger -> Nothing+ LitNumNatural -> Nothing+ LitNumInt -> Just (fromIntegral (platformWordSizeInBits platform))+ LitNumInt8 -> Just 8+ LitNumInt16 -> Just 16+ LitNumInt32 -> Just 32+ LitNumInt64 -> Just 64+ LitNumWord -> Just (fromIntegral (platformWordSizeInBits platform))+ LitNumWord8 -> Just 8+ LitNumWord16 -> Just 16+ LitNumWord32 -> Just 32+ LitNumWord64 -> Just 64+ instance Binary LitNumType where put_ bh numTyp = putByte bh (fromIntegral (fromEnum numTyp)) get bh = do@@ -652,14 +669,16 @@ narrowLit' nt' (LitNumber _ i) = LitNumber nt' (toInteger (fromInteger i :: a)) narrowLit' _ l = pprPanic "narrowLit" (ppr l) -narrowInt8Lit, narrowInt16Lit, narrowInt32Lit,- narrowWord8Lit, narrowWord16Lit, narrowWord32Lit :: Literal -> Literal+narrowInt8Lit, narrowInt16Lit, narrowInt32Lit, narrowInt64Lit,+ narrowWord8Lit, narrowWord16Lit, narrowWord32Lit, narrowWord64Lit :: Literal -> Literal narrowInt8Lit = narrowLit' @Int8 LitNumInt8 narrowInt16Lit = narrowLit' @Int16 LitNumInt16 narrowInt32Lit = narrowLit' @Int32 LitNumInt32+narrowInt64Lit = narrowLit' @Int64 LitNumInt64 narrowWord8Lit = narrowLit' @Word8 LitNumWord8 narrowWord16Lit = narrowLit' @Word16 LitNumWord16 narrowWord32Lit = narrowLit' @Word32 LitNumWord32+narrowWord64Lit = narrowLit' @Word64 LitNumWord64 -- | Extend a fixed-width literal (e.g. 'Int16#') to a word-sized literal (e.g. -- 'Int#').
+ compiler/GHC/Unit/Finder.hs view
@@ -0,0 +1,655 @@+{-+(c) The University of Glasgow, 2000-2006++-}+++{-# LANGUAGE FlexibleContexts #-}++-- | Module finder+module GHC.Unit.Finder (+ FindResult(..),+ InstalledFindResult(..),+ FinderOpts(..),+ FinderCache,+ initFinderCache,+ flushFinderCaches,+ findImportedModule,+ findPluginModule,+ findExactModule,+ findHomeModule,+ findExposedPackageModule,+ mkHomeModLocation,+ mkHomeModLocation2,+ mkHiOnlyModLocation,+ mkHiPath,+ mkObjPath,+ addHomeModuleToFinder,+ uncacheModule,+ mkStubPaths,++ findObjectLinkableMaybe,+ findObjectLinkable,++ -- Hash cache+ lookupFileCache+ ) where++import GHC.Prelude++import GHC.Platform.Ways++import GHC.Builtin.Names ( gHC_PRIM )++import GHC.Unit.Types+import GHC.Unit.Module+import GHC.Unit.Home+import GHC.Unit.State+import GHC.Unit.Finder.Types++import GHC.Data.FastString+import GHC.Data.Maybe ( expectJust )+import qualified GHC.Data.ShortText as ST++import GHC.Utils.Misc+import GHC.Utils.Outputable as Outputable+import GHC.Utils.Panic++import GHC.Linker.Types++import GHC.Fingerprint+import Data.IORef+import System.Directory+import System.FilePath+import Control.Monad+import Data.Time+import qualified Data.Map as M+++type FileExt = String -- Filename extension+type BaseName = String -- Basename of file++-- -----------------------------------------------------------------------------+-- The Finder++-- The Finder provides a thin filesystem abstraction to the rest of+-- the compiler. For a given module, it can tell you where the+-- source, interface, and object files for that module live.++-- It does *not* know which particular package a module lives in. Use+-- Packages.lookupModuleInAllUnits for that.++-- -----------------------------------------------------------------------------+-- The finder's cache+++initFinderCache :: IO FinderCache+initFinderCache = FinderCache <$> newIORef emptyInstalledModuleEnv+ <*> newIORef M.empty++-- remove all the home modules from the cache; package modules are+-- assumed to not move around during a session; also flush the file hash+-- cache+flushFinderCaches :: FinderCache -> HomeUnit -> IO ()+flushFinderCaches (FinderCache ref file_ref) home_unit = do+ atomicModifyIORef' ref $ \fm -> (filterInstalledModuleEnv is_ext fm, ())+ atomicModifyIORef' file_ref $ \_ -> (M.empty, ())+ where+ is_ext mod _ = not (isHomeInstalledModule home_unit mod)++addToFinderCache :: FinderCache -> InstalledModule -> InstalledFindResult -> IO ()+addToFinderCache (FinderCache ref _) key val =+ atomicModifyIORef' ref $ \c -> (extendInstalledModuleEnv c key val, ())++removeFromFinderCache :: FinderCache -> InstalledModule -> IO ()+removeFromFinderCache (FinderCache ref _) key =+ atomicModifyIORef' ref $ \c -> (delInstalledModuleEnv c key, ())++lookupFinderCache :: FinderCache -> InstalledModule -> IO (Maybe InstalledFindResult)+lookupFinderCache (FinderCache ref _) key = do+ c <- readIORef ref+ return $! lookupInstalledModuleEnv c key++lookupFileCache :: FinderCache -> FilePath -> IO Fingerprint+lookupFileCache (FinderCache _ ref) key = do+ c <- readIORef ref+ case M.lookup key c of+ Nothing -> do+ hash <- getFileHash key+ atomicModifyIORef' ref $ \c -> (M.insert key hash c, ())+ return hash+ Just fp -> return fp++-- -----------------------------------------------------------------------------+-- The three external entry points++-- | Locations and information the finder cares about.+--+-- Should be taken from 'DynFlags' via 'initFinderOpts'.+data FinderOpts = FinderOpts+ { finder_importPaths :: [FilePath]+ -- ^ Where are we allowed to look for Modules and Source files+ , finder_lookupHomeInterfaces :: Bool+ -- ^ When looking up a home module:+ --+ -- * 'True': search interface files (e.g. in '-c' mode)+ -- * 'False': search source files (e.g. in '--make' mode)++ , finder_bypassHiFileCheck :: Bool+ -- ^ Don't check that an imported interface file actually exists+ -- if it can only be at one location. The interface will be reported+ -- as `InstalledFound` even if the file doesn't exist, so this is+ -- only useful in specific cases (e.g. to generate dependencies+ -- with `ghc -M`)+ , finder_ways :: Ways+ , finder_enableSuggestions :: Bool+ -- ^ If we encounter unknown modules, should we suggest modules+ -- that have a similar name.+ , finder_hieDir :: Maybe FilePath+ , finder_hieSuf :: String+ , finder_hiDir :: Maybe FilePath+ , finder_hiSuf :: String+ , finder_objectDir :: Maybe FilePath+ , finder_objectSuf :: String+ , finder_stubDir :: Maybe FilePath+ }+++-- | Locate a module that was imported by the user. We have the+-- module's name, and possibly a package name. Without a package+-- name, this function will use the search path and the known exposed+-- packages to find the module, if a package is specified then only+-- that package is searched for the module.++findImportedModule+ :: FinderCache+ -> FinderOpts+ -> UnitState+ -> HomeUnit+ -> ModuleName+ -> Maybe FastString+ -> IO FindResult+findImportedModule fc fopts units home_unit mod_name mb_pkg =+ case mb_pkg of+ Nothing -> unqual_import+ Just pkg | pkg == fsLit "this" -> home_import -- "this" is special+ | otherwise -> pkg_import+ where+ home_import = findHomeModule fc fopts home_unit mod_name++ pkg_import = findExposedPackageModule fc fopts units mod_name mb_pkg++ unqual_import = home_import+ `orIfNotFound`+ findExposedPackageModule fc fopts units mod_name Nothing++-- | Locate a plugin module requested by the user, for a compiler+-- plugin. This consults the same set of exposed packages as+-- 'findImportedModule', unless @-hide-all-plugin-packages@ or+-- @-plugin-package@ are specified.+findPluginModule :: FinderCache -> FinderOpts -> UnitState -> HomeUnit -> ModuleName -> IO FindResult+findPluginModule fc fopts units home_unit mod_name =+ findHomeModule fc fopts home_unit mod_name+ `orIfNotFound`+ findExposedPluginPackageModule fc fopts units mod_name++-- | Locate a specific 'Module'. The purpose of this function is to+-- create a 'ModLocation' for a given 'Module', that is to find out+-- where the files associated with this module live. It is used when+-- reading the interface for a module mentioned by another interface,+-- for example (a "system import").++findExactModule :: FinderCache -> FinderOpts -> UnitState -> HomeUnit -> InstalledModule -> IO InstalledFindResult+findExactModule fc fopts unit_state home_unit mod = do+ if isHomeInstalledModule home_unit mod+ then findInstalledHomeModule fc fopts home_unit (moduleName mod)+ else findPackageModule fc unit_state fopts mod++-- -----------------------------------------------------------------------------+-- Helpers++-- | Given a monadic actions @this@ and @or_this@, first execute+-- @this@. If the returned 'FindResult' is successful, return+-- it; otherwise, execute @or_this@. If both failed, this function+-- also combines their failure messages in a reasonable way.+orIfNotFound :: Monad m => m FindResult -> m FindResult -> m FindResult+orIfNotFound this or_this = do+ res <- this+ case res of+ NotFound { fr_paths = paths1, fr_mods_hidden = mh1+ , fr_pkgs_hidden = ph1, fr_unusables = u1, fr_suggestions = s1 }+ -> do res2 <- or_this+ case res2 of+ NotFound { fr_paths = paths2, fr_pkg = mb_pkg2, fr_mods_hidden = mh2+ , fr_pkgs_hidden = ph2, fr_unusables = u2+ , fr_suggestions = s2 }+ -> return (NotFound { fr_paths = paths1 ++ paths2+ , fr_pkg = mb_pkg2 -- snd arg is the package search+ , fr_mods_hidden = mh1 ++ mh2+ , fr_pkgs_hidden = ph1 ++ ph2+ , fr_unusables = u1 ++ u2+ , fr_suggestions = s1 ++ s2 })+ _other -> return res2+ _other -> return res++-- | Helper function for 'findHomeModule': this function wraps an IO action+-- which would look up @mod_name@ in the file system (the home package),+-- and first consults the 'hsc_FC' cache to see if the lookup has already+-- been done. Otherwise, do the lookup (with the IO action) and save+-- the result in the finder cache and the module location cache (if it+-- was successful.)+homeSearchCache :: FinderCache -> HomeUnit -> ModuleName -> IO InstalledFindResult -> IO InstalledFindResult+homeSearchCache fc home_unit mod_name do_this = do+ let mod = mkHomeInstalledModule home_unit mod_name+ modLocationCache fc mod do_this++findExposedPackageModule :: FinderCache -> FinderOpts -> UnitState -> ModuleName -> Maybe FastString -> IO FindResult+findExposedPackageModule fc fopts units mod_name mb_pkg =+ findLookupResult fc fopts+ $ lookupModuleWithSuggestions units mod_name mb_pkg++findExposedPluginPackageModule :: FinderCache -> FinderOpts -> UnitState -> ModuleName -> IO FindResult+findExposedPluginPackageModule fc fopts units mod_name =+ findLookupResult fc fopts+ $ lookupPluginModuleWithSuggestions units mod_name Nothing++findLookupResult :: FinderCache -> FinderOpts -> LookupResult -> IO FindResult+findLookupResult fc fopts r = case r of+ LookupFound m pkg_conf -> do+ let im = fst (getModuleInstantiation m)+ r' <- findPackageModule_ fc fopts im (fst pkg_conf)+ case r' of+ -- TODO: ghc -M is unlikely to do the right thing+ -- with just the location of the thing that was+ -- instantiated; you probably also need all of the+ -- implicit locations from the instances+ InstalledFound loc _ -> return (Found loc m)+ InstalledNoPackage _ -> return (NoPackage (moduleUnit m))+ InstalledNotFound fp _ -> return (NotFound{ fr_paths = fp, fr_pkg = Just (moduleUnit m)+ , fr_pkgs_hidden = []+ , fr_mods_hidden = []+ , fr_unusables = []+ , fr_suggestions = []})+ LookupMultiple rs ->+ return (FoundMultiple rs)+ LookupHidden pkg_hiddens mod_hiddens ->+ return (NotFound{ fr_paths = [], fr_pkg = Nothing+ , fr_pkgs_hidden = map (moduleUnit.fst) pkg_hiddens+ , fr_mods_hidden = map (moduleUnit.fst) mod_hiddens+ , fr_unusables = []+ , fr_suggestions = [] })+ LookupUnusable unusable ->+ let unusables' = map get_unusable unusable+ get_unusable (m, ModUnusable r) = (moduleUnit m, r)+ get_unusable (_, r) =+ pprPanic "findLookupResult: unexpected origin" (ppr r)+ in return (NotFound{ fr_paths = [], fr_pkg = Nothing+ , fr_pkgs_hidden = []+ , fr_mods_hidden = []+ , fr_unusables = unusables'+ , fr_suggestions = [] })+ LookupNotFound suggest -> do+ let suggest'+ | finder_enableSuggestions fopts = suggest+ | otherwise = []+ return (NotFound{ fr_paths = [], fr_pkg = Nothing+ , fr_pkgs_hidden = []+ , fr_mods_hidden = []+ , fr_unusables = []+ , fr_suggestions = suggest' })++modLocationCache :: FinderCache -> InstalledModule -> IO InstalledFindResult -> IO InstalledFindResult+modLocationCache fc mod do_this = do+ m <- lookupFinderCache fc mod+ case m of+ Just result -> return result+ Nothing -> do+ result <- do_this+ addToFinderCache fc mod result+ return result++-- This returns a module because it's more convenient for users+addHomeModuleToFinder :: FinderCache -> HomeUnit -> ModuleName -> ModLocation -> IO Module+addHomeModuleToFinder fc home_unit mod_name loc = do+ let mod = mkHomeInstalledModule home_unit mod_name+ addToFinderCache fc mod (InstalledFound loc mod)+ return (mkHomeModule home_unit mod_name)++uncacheModule :: FinderCache -> HomeUnit -> ModuleName -> IO ()+uncacheModule fc home_unit mod_name = do+ let mod = mkHomeInstalledModule home_unit mod_name+ removeFromFinderCache fc mod++-- -----------------------------------------------------------------------------+-- The internal workers++findHomeModule :: FinderCache -> FinderOpts -> HomeUnit -> ModuleName -> IO FindResult+findHomeModule fc fopts home_unit mod_name = do+ let uid = homeUnitAsUnit home_unit+ r <- findInstalledHomeModule fc fopts home_unit mod_name+ return $ case r of+ InstalledFound loc _ -> Found loc (mkHomeModule home_unit mod_name)+ InstalledNoPackage _ -> NoPackage uid -- impossible+ InstalledNotFound fps _ -> NotFound {+ fr_paths = fps,+ fr_pkg = Just uid,+ fr_mods_hidden = [],+ fr_pkgs_hidden = [],+ fr_unusables = [],+ fr_suggestions = []+ }++-- | Implements the search for a module name in the home package only. Calling+-- this function directly is usually *not* what you want; currently, it's used+-- as a building block for the following operations:+--+-- 1. When you do a normal package lookup, we first check if the module+-- is available in the home module, before looking it up in the package+-- database.+--+-- 2. When you have a package qualified import with package name "this",+-- we shortcut to the home module.+--+-- 3. When we look up an exact 'Module', if the unit id associated with+-- the module is the current home module do a look up in the home module.+--+-- 4. Some special-case code in GHCi (ToDo: Figure out why that needs to+-- call this.)+findInstalledHomeModule :: FinderCache -> FinderOpts -> HomeUnit -> ModuleName -> IO InstalledFindResult+findInstalledHomeModule fc fopts home_unit mod_name = do+ homeSearchCache fc home_unit mod_name $+ let+ home_path = finder_importPaths fopts+ hisuf = finder_hiSuf fopts+ mod = mkHomeInstalledModule home_unit mod_name++ source_exts =+ [ ("hs", mkHomeModLocationSearched fopts mod_name "hs")+ , ("lhs", mkHomeModLocationSearched fopts mod_name "lhs")+ , ("hsig", mkHomeModLocationSearched fopts mod_name "hsig")+ , ("lhsig", mkHomeModLocationSearched fopts mod_name "lhsig")+ ]++ -- we use mkHomeModHiOnlyLocation instead of mkHiOnlyModLocation so that+ -- when hiDir field is set in dflags, we know to look there (see #16500)+ hi_exts = [ (hisuf, mkHomeModHiOnlyLocation fopts mod_name)+ , (addBootSuffix hisuf, mkHomeModHiOnlyLocation fopts mod_name)+ ]++ -- In compilation manager modes, we look for source files in the home+ -- package because we can compile these automatically. In one-shot+ -- compilation mode we look for .hi and .hi-boot files only.+ exts | finder_lookupHomeInterfaces fopts = hi_exts+ | otherwise = source_exts+ in++ -- special case for GHC.Prim; we won't find it in the filesystem.+ -- This is important only when compiling the base package (where GHC.Prim+ -- is a home module).+ if mod `installedModuleEq` gHC_PRIM+ then return (InstalledFound (error "GHC.Prim ModLocation") mod)+ else searchPathExts home_path mod exts+++-- | Search for a module in external packages only.+findPackageModule :: FinderCache -> UnitState -> FinderOpts -> InstalledModule -> IO InstalledFindResult+findPackageModule fc unit_state fopts mod = do+ let pkg_id = moduleUnit mod+ case lookupUnitId unit_state pkg_id of+ Nothing -> return (InstalledNoPackage pkg_id)+ Just u -> findPackageModule_ fc fopts mod u++-- | Look up the interface file associated with module @mod@. This function+-- requires a few invariants to be upheld: (1) the 'Module' in question must+-- be the module identifier of the *original* implementation of a module,+-- not a reexport (this invariant is upheld by "GHC.Unit.State") and (2)+-- the 'UnitInfo' must be consistent with the unit id in the 'Module'.+-- The redundancy is to avoid an extra lookup in the package state+-- for the appropriate config.+findPackageModule_ :: FinderCache -> FinderOpts -> InstalledModule -> UnitInfo -> IO InstalledFindResult+findPackageModule_ fc fopts mod pkg_conf = do+ massertPpr (moduleUnit mod == unitId pkg_conf)+ (ppr (moduleUnit mod) <+> ppr (unitId pkg_conf))+ modLocationCache fc mod $++ -- special case for GHC.Prim; we won't find it in the filesystem.+ if mod `installedModuleEq` gHC_PRIM+ then return (InstalledFound (error "GHC.Prim ModLocation") mod)+ else++ let+ tag = waysBuildTag (finder_ways fopts)++ -- hi-suffix for packages depends on the build tag.+ package_hisuf | null tag = "hi"+ | otherwise = tag ++ "_hi"++ mk_hi_loc = mkHiOnlyModLocation fopts package_hisuf++ import_dirs = map ST.unpack $ unitImportDirs pkg_conf+ -- we never look for a .hi-boot file in an external package;+ -- .hi-boot files only make sense for the home package.+ in+ case import_dirs of+ [one] | finder_bypassHiFileCheck fopts -> do+ -- there's only one place that this .hi file can be, so+ -- don't bother looking for it.+ let basename = moduleNameSlashes (moduleName mod)+ loc <- mk_hi_loc one basename+ return (InstalledFound loc mod)+ _otherwise ->+ searchPathExts import_dirs mod [(package_hisuf, mk_hi_loc)]++-- -----------------------------------------------------------------------------+-- General path searching++searchPathExts :: [FilePath] -- paths to search+ -> InstalledModule -- module name+ -> [ (+ FileExt, -- suffix+ FilePath -> BaseName -> IO ModLocation -- action+ )+ ]+ -> IO InstalledFindResult++searchPathExts paths mod exts = search to_search+ where+ basename = moduleNameSlashes (moduleName mod)++ to_search :: [(FilePath, IO ModLocation)]+ to_search = [ (file, fn path basename)+ | path <- paths,+ (ext,fn) <- exts,+ let base | path == "." = basename+ | otherwise = path </> basename+ file = base <.> ext+ ]++ search [] = return (InstalledNotFound (map fst to_search) (Just (moduleUnit mod)))++ search ((file, mk_result) : rest) = do+ b <- doesFileExist file+ if b+ then do { loc <- mk_result; return (InstalledFound loc mod) }+ else search rest++mkHomeModLocationSearched :: FinderOpts -> ModuleName -> FileExt+ -> FilePath -> BaseName -> IO ModLocation+mkHomeModLocationSearched fopts mod suff path basename =+ mkHomeModLocation2 fopts mod (path </> basename) suff++-- -----------------------------------------------------------------------------+-- Constructing a home module location++-- This is where we construct the ModLocation for a module in the home+-- package, for which we have a source file. It is called from three+-- places:+--+-- (a) Here in the finder, when we are searching for a module to import,+-- using the search path (-i option).+--+-- (b) The compilation manager, when constructing the ModLocation for+-- a "root" module (a source file named explicitly on the command line+-- or in a :load command in GHCi).+--+-- (c) The driver in one-shot mode, when we need to construct a+-- ModLocation for a source file named on the command-line.+--+-- Parameters are:+--+-- mod+-- The name of the module+--+-- path+-- (a): The search path component where the source file was found.+-- (b) and (c): "."+--+-- src_basename+-- (a): (moduleNameSlashes mod)+-- (b) and (c): The filename of the source file, minus its extension+--+-- ext+-- The filename extension of the source file (usually "hs" or "lhs").++mkHomeModLocation :: FinderOpts -> ModuleName -> FilePath -> IO ModLocation+mkHomeModLocation dflags mod src_filename = do+ let (basename,extension) = splitExtension src_filename+ mkHomeModLocation2 dflags mod basename extension++mkHomeModLocation2 :: FinderOpts+ -> ModuleName+ -> FilePath -- Of source module, without suffix+ -> String -- Suffix+ -> IO ModLocation+mkHomeModLocation2 fopts mod src_basename ext = do+ let mod_basename = moduleNameSlashes mod++ obj_fn = mkObjPath fopts src_basename mod_basename+ hi_fn = mkHiPath fopts src_basename mod_basename+ hie_fn = mkHiePath fopts src_basename mod_basename++ return (ModLocation{ ml_hs_file = Just (src_basename <.> ext),+ ml_hi_file = hi_fn,+ ml_obj_file = obj_fn,+ ml_hie_file = hie_fn })++mkHomeModHiOnlyLocation :: FinderOpts+ -> ModuleName+ -> FilePath+ -> BaseName+ -> IO ModLocation+mkHomeModHiOnlyLocation fopts mod path basename = do+ loc <- mkHomeModLocation2 fopts mod (path </> basename) ""+ return loc { ml_hs_file = Nothing }++mkHiOnlyModLocation :: FinderOpts -> Suffix -> FilePath -> String+ -> IO ModLocation+mkHiOnlyModLocation fopts hisuf path basename+ = do let full_basename = path </> basename+ obj_fn = mkObjPath fopts full_basename basename+ hie_fn = mkHiePath fopts full_basename basename+ return ModLocation{ ml_hs_file = Nothing,+ ml_hi_file = full_basename <.> hisuf,+ -- Remove the .hi-boot suffix from+ -- hi_file, if it had one. We always+ -- want the name of the real .hi file+ -- in the ml_hi_file field.+ ml_obj_file = obj_fn,+ ml_hie_file = hie_fn+ }++-- | Constructs the filename of a .o file for a given source file.+-- Does /not/ check whether the .o file exists+mkObjPath+ :: FinderOpts+ -> FilePath -- the filename of the source file, minus the extension+ -> String -- the module name with dots replaced by slashes+ -> FilePath+mkObjPath fopts basename mod_basename = obj_basename <.> osuf+ where+ odir = finder_objectDir fopts+ osuf = finder_objectSuf fopts++ obj_basename | Just dir <- odir = dir </> mod_basename+ | otherwise = basename+++-- | Constructs the filename of a .hi file for a given source file.+-- Does /not/ check whether the .hi file exists+mkHiPath+ :: FinderOpts+ -> FilePath -- the filename of the source file, minus the extension+ -> String -- the module name with dots replaced by slashes+ -> FilePath+mkHiPath fopts basename mod_basename = hi_basename <.> hisuf+ where+ hidir = finder_hiDir fopts+ hisuf = finder_hiSuf fopts++ hi_basename | Just dir <- hidir = dir </> mod_basename+ | otherwise = basename++-- | Constructs the filename of a .hie file for a given source file.+-- Does /not/ check whether the .hie file exists+mkHiePath+ :: FinderOpts+ -> FilePath -- the filename of the source file, minus the extension+ -> String -- the module name with dots replaced by slashes+ -> FilePath+mkHiePath fopts basename mod_basename = hie_basename <.> hiesuf+ where+ hiedir = finder_hieDir fopts+ hiesuf = finder_hieSuf fopts++ hie_basename | Just dir <- hiedir = dir </> mod_basename+ | otherwise = basename++++-- -----------------------------------------------------------------------------+-- Filenames of the stub files++-- We don't have to store these in ModLocations, because they can be derived+-- from other available information, and they're only rarely needed.++mkStubPaths+ :: FinderOpts+ -> ModuleName+ -> ModLocation+ -> FilePath++mkStubPaths fopts mod location+ = let+ stubdir = finder_stubDir fopts++ mod_basename = moduleNameSlashes mod+ src_basename = dropExtension $ expectJust "mkStubPaths"+ (ml_hs_file location)++ stub_basename0+ | Just dir <- stubdir = dir </> mod_basename+ | otherwise = src_basename++ stub_basename = stub_basename0 ++ "_stub"+ in+ stub_basename <.> "h"++-- -----------------------------------------------------------------------------+-- findLinkable isn't related to the other stuff in here,+-- but there's no other obvious place for it++findObjectLinkableMaybe :: Module -> ModLocation -> IO (Maybe Linkable)+findObjectLinkableMaybe mod locn+ = do let obj_fn = ml_obj_file locn+ maybe_obj_time <- modificationTimeIfExists obj_fn+ case maybe_obj_time of+ Nothing -> return Nothing+ Just obj_time -> liftM Just (findObjectLinkable mod obj_fn obj_time)++-- Make an object linkable when we know the object file exists, and we know+-- its modification time.+findObjectLinkable :: Module -> FilePath -> UTCTime -> IO Linkable+findObjectLinkable mod obj_fn obj_time = return (LM obj_time mod [DotO obj_fn])+ -- We used to look for _stub.o files here, but that was a bug (#706)+ -- Now GHC merges the stub.o into the main .o (#3687)+
compiler/GHC/Unit/Info.hs view
@@ -50,7 +50,6 @@ import Data.Version import Data.Bifunctor import Data.List (isPrefixOf, stripPrefix)-import qualified Data.Set as Set -- | Information about an installed unit@@ -205,19 +204,19 @@ -- | Either the 'unitLibraryDirs' or 'unitLibraryDynDirs' as appropriate for the way. libraryDirsForWay :: Ways -> UnitInfo -> [String] libraryDirsForWay ws- | WayDyn `elem` ws = map ST.unpack . unitLibraryDynDirs+ | hasWay ws WayDyn = map ST.unpack . unitLibraryDynDirs | otherwise = map ST.unpack . unitLibraryDirs unitHsLibs :: GhcNameVersion -> Ways -> UnitInfo -> [String] unitHsLibs namever ways0 p = map (mkDynName . addSuffix . ST.unpack) (unitLibraries p) where- ways1 = Set.filter (/= WayDyn) ways0+ ways1 = removeWay WayDyn ways0 -- the name of a shared library is libHSfoo-ghc<version>.so -- we leave out the _dyn, because it is superfluous -- debug and profiled RTSs include support for -eventlog- ways2 | WayDebug `Set.member` ways1 || WayProf `Set.member` ways1- = Set.filter (/= WayTracing) ways1+ ways2 | ways1 `hasWay` WayDebug || ways1 `hasWay` WayProf+ = removeWay WayTracing ways1 | otherwise = ways1 @@ -247,7 +246,7 @@ -- and handling specifically for the `rts` package for -- example in ghc-cabal. addSuffix rts@"HSrts" = rts ++ (expandTag rts_tag)- addSuffix rts@"HSrts-1.0.1" = rts ++ (expandTag rts_tag)+ addSuffix rts@"HSrts-1.0.2" = rts ++ (expandTag rts_tag) addSuffix other_lib = other_lib ++ (expandTag tag) expandTag t | null t = ""
compiler/GHC/Unit/Module/ModSummary.hs view
@@ -90,6 +90,8 @@ -- ^ Source imports of the module ms_textual_imps :: [(Maybe FastString, Located ModuleName)], -- ^ Non-source imports of the module from the module *text*+ ms_ghc_prim_import :: Bool,+ -- ^ Whether the special module GHC.Prim was imported explicitliy ms_parsed_mod :: Maybe HsParsedModule, -- ^ The parsed, nonrenamed source, if we have it. This is also -- used to support "inline module syntax" in Backpack files.@@ -111,6 +113,7 @@ ms_mod_name :: ModSummary -> ModuleName ms_mod_name = moduleName . ms_mod +-- | Textual imports, plus plugin imports but not SOURCE imports. ms_imps :: ModSummary -> [(Maybe FastString, Located ModuleName)] ms_imps ms = ms_textual_imps ms ++
compiler/GHC/Unit/State.hs view
@@ -2,6 +2,7 @@ {-# LANGUAGE ScopedTypeVariables, BangPatterns, FlexibleContexts #-} {-# LANGUAGE LambdaCase #-}+{-# LANGUAGE NamedFieldPuns #-} -- | Unit manipulation module GHC.Unit.State (@@ -34,6 +35,7 @@ listVisibleModuleNames, lookupModuleInAllUnits, lookupModuleWithSuggestions,+ lookupModulePackage, lookupPluginModuleWithSuggestions, requirementMerges, LookupResult(..),@@ -1790,7 +1792,7 @@ -> [(Module, UnitInfo)] lookupModuleInAllUnits pkgs m = case lookupModuleWithSuggestions pkgs m Nothing of- LookupFound a b -> [(a,b)]+ LookupFound a b -> [(a,fst b)] LookupMultiple rs -> map f rs where f (m,_) = (m, expectJust "lookupModule" (lookupUnit pkgs (moduleUnit m)))@@ -1799,7 +1801,7 @@ -- | The result of performing a lookup data LookupResult = -- | Found the module uniquely, nothing else to do- LookupFound Module UnitInfo+ LookupFound Module (UnitInfo, ModuleOrigin) -- | Multiple modules with the same name in scope | LookupMultiple [(Module, ModuleOrigin)] -- | No modules found, but there were some hidden ones with@@ -1822,6 +1824,26 @@ lookupModuleWithSuggestions pkgs = lookupModuleWithSuggestions' pkgs (moduleNameProvidersMap pkgs) +-- | The package which the module **appears** to come from, this could be+-- the one which reexports the module from it's original package. This function+-- is currently only used for -Wunused-packages+lookupModulePackage :: UnitState -> ModuleName -> Maybe FastString -> Maybe [UnitInfo]+lookupModulePackage pkgs mn mfs =+ case lookupModuleWithSuggestions' pkgs (moduleNameProvidersMap pkgs) mn mfs of+ LookupFound _ (orig_unit, origin) ->+ case origin of+ ModOrigin {fromOrigUnit, fromExposedReexport} ->+ case fromOrigUnit of+ -- Just True means, the import is available from its original location+ Just True ->+ pure [orig_unit]+ -- Otherwise, it must be available from a reexport+ _ -> pure fromExposedReexport++ _ -> Nothing++ _ -> Nothing+ lookupPluginModuleWithSuggestions :: UnitState -> ModuleName -> Maybe FastString@@ -1840,7 +1862,7 @@ Just xs -> case foldl' classify ([],[],[], []) (Map.toList xs) of ([], [], [], []) -> LookupNotFound suggestions- (_, _, _, [(m, _)]) -> LookupFound m (mod_unit m)+ (_, _, _, [(m, o)]) -> LookupFound m (mod_unit m, o) (_, _, _, exposed@(_:_)) -> LookupMultiple exposed ([], [], unusable@(_:_), []) -> LookupUnusable unusable (hidden_pkg, hidden_mod, _, []) ->
compiler/GHC/Utils/Logger.hs view
@@ -577,10 +577,19 @@ -> SDoc -> IO () putDumpFileMaybe' logger printer flag hdr fmt doc- = when (logHasDumpFlag logger flag) $ do- let sty = mkDumpStyle printer- logDumpFile logger sty flag hdr fmt doc+ = when (logHasDumpFlag logger flag) $+ logDumpFile' logger printer flag hdr fmt doc {-# INLINE putDumpFileMaybe' #-} -- see Note [INLINE conditional tracing utilities]+++logDumpFile' :: Logger -> PrintUnqualified -> DumpFlag+ -> String -> DumpFormat -> SDoc -> IO ()+{-# NOINLINE logDumpFile' #-}+-- NOINLINE: Now we are past the conditional, into the "cold" path,+-- don't inline, to reduce code size at the call site+-- See Note [INLINE conditional tracing utilities]+logDumpFile' logger printer flag hdr fmt doc+ = logDumpFile logger (mkDumpStyle printer) flag hdr fmt doc -- | Ensure that a dump file is created even if it stays empty touchDumpFile :: Logger -> DumpFlag -> IO ()
compiler/GHC/Utils/Monad.hs view
@@ -355,6 +355,25 @@ where FCode m = FCode' $ oneShot (\cgInfoDown -> oneShot (\state ->m cgInfoDown state)) +INLINE pragmas and (>>)+~~~~~~~~~~~~~~~~~~~~~~~+A nasty gotcha is described in #20008. In brief, be careful if you get (>>) via+its default method:++ instance Applicative M where+ pure a = MkM (\s -> (s, a))+ (<*>) = ap++ instance Monad UM where+ {-# INLINE (>>=) #-}+ m >>= k = MkM (\s -> blah)++Here we define (>>), via its default method, in terms of (>>=). If you do this,+be sure to put an INLINE pragma on (>>=), as above. That tells it to inline+(>>=) in the RHS of (>>), even when it is applied to only two arguments, which+in turn conveys the one-shot info from (>>=) to (>>). Lacking the INLINE, GHC+may eta-expand (>>), and with a non-one-shot lambda. #20008 has more discussion.+ Derived instances ~~~~~~~~~~~~~~~~~ One caveat of both approaches is that derived instances don't use the smart
compiler/GHC/Utils/Outputable.hs view
@@ -44,7 +44,7 @@ fsep, fcat, hang, hangNotEmpty, punctuate, ppWhen, ppUnless, ppWhenOption, ppUnlessOption,- speakNth, speakN, speakNOf, plural, isOrAre, doOrDoes, itsOrTheir,+ speakNth, speakN, speakNOf, plural, singular, isOrAre, doOrDoes, itsOrTheir, thisOrThese, unicodeSyntax, coloured, keyword,@@ -1425,6 +1425,15 @@ plural [_] = empty -- a bit frightening, but there you are plural _ = char 's' +-- | Determines the singular verb suffix appropriate for the length of a list:+--+-- > singular [] = empty+-- > singular["Hello"] = char 's'+-- > singular ["Hello", "World"] = empty+singular :: [a] -> SDoc+singular [_] = char 's'+singular _ = empty+ -- | Determines the form of to be appropriate for the length of a list: -- -- > isOrAre [] = text "are"@@ -1451,3 +1460,13 @@ itsOrTheir :: [a] -> SDoc itsOrTheir [_] = text "its" itsOrTheir _ = text "their"+++-- | Determines the form of subject appropriate for the length of a list:+--+-- > thisOrThese [x] = text "This"+-- > thisOrThese [x,y] = text "These"+-- > thisOrThese [] = text "These" -- probably avoid this+thisOrThese :: [a] -> SDoc+thisOrThese [_] = text "This"+thisOrThese _ = text "These"
compiler/GHC/Utils/Panic.hs view
@@ -19,7 +19,6 @@ , throwGhcExceptionIO , handleGhcException - , GHC.Utils.Panic.Plain.progName , pgmError , panic , pprPanic@@ -124,9 +123,7 @@ | otherwise = Nothing instance Show GhcException where- showsPrec _ e@(ProgramError _) = showGhcExceptionUnsafe e- showsPrec _ e@(CmdLineError _) = showString "<command line>: " . showGhcExceptionUnsafe e- showsPrec _ e = showString progName . showString ": " . showGhcExceptionUnsafe e+ showsPrec _ e = showGhcExceptionUnsafe e -- | Show an exception as a string. showException :: Exception e => e -> String
compiler/GHC/Utils/Panic/Plain.hs view
@@ -22,8 +22,6 @@ , cmdLineError, cmdLineErrorIO , assertPanic , assert, assertM, massert-- , progName ) where import GHC.Settings.Config@@ -31,7 +29,6 @@ import GHC.Utils.Exception as Exception import GHC.Stack import GHC.Prelude-import System.Environment import System.IO.Unsafe -- | This type is very similar to 'GHC.Utils.Panic.GhcException', but it omits@@ -69,14 +66,7 @@ instance Exception PlainGhcException instance Show PlainGhcException where- showsPrec _ e@(PlainProgramError _) = showPlainGhcException e- showsPrec _ e@(PlainCmdLineError _) = showString "<command line>: " . showPlainGhcException e- showsPrec _ e = showString progName . showString ": " . showPlainGhcException e---- | The name of this GHC.-progName :: String-progName = unsafePerformIO (getProgName)-{-# NOINLINE progName #-}+ showsPrec _ e = showPlainGhcException e -- | Short usage information to display when we are given the wrong cmd line arguments. short_usage :: String
compiler/GHC/Utils/TmpFs.hs view
@@ -9,6 +9,7 @@ , FilesToClean(..) , emptyFilesToClean , TempFileLifetime(..)+ , TempDir (..) , cleanTempDirs , cleanTempFiles , cleanCurrentModuleTempFiles@@ -24,7 +25,6 @@ import GHC.Prelude -import GHC.Driver.Session import GHC.Utils.Error import GHC.Utils.Outputable import GHC.Utils.Logger@@ -32,7 +32,6 @@ import GHC.Utils.Exception as Exception import GHC.Driver.Phases -import Control.Monad import Data.List (partition) import qualified Data.Set as Set import Data.Set (Set)@@ -92,6 +91,7 @@ -- runGhc(T) deriving (Show) +newtype TempDir = TempDir FilePath -- | An empty FilesToClean emptyFilesToClean :: FilesToClean@@ -135,19 +135,17 @@ src_files <- atomicModifyIORef' (tmp_files_to_clean src) (\s -> (emptyFilesToClean, s)) atomicModifyIORef' (tmp_files_to_clean dst) (\s -> (mergeFilesToClean src_files s, ())) -cleanTempDirs :: Logger -> TmpFs -> DynFlags -> IO ()-cleanTempDirs logger tmpfs dflags- = unless (gopt Opt_KeepTmpFiles dflags)- $ mask_+cleanTempDirs :: Logger -> TmpFs -> IO ()+cleanTempDirs logger tmpfs+ = mask_ $ do let ref = tmp_dirs_to_clean tmpfs ds <- atomicModifyIORef' ref $ \ds -> (Map.empty, ds) removeTmpDirs logger (Map.elems ds) -- | Delete all files in @tmp_files_to_clean@.-cleanTempFiles :: Logger -> TmpFs -> DynFlags -> IO ()-cleanTempFiles logger tmpfs dflags- = unless (gopt Opt_KeepTmpFiles dflags)- $ mask_+cleanTempFiles :: Logger -> TmpFs -> IO ()+cleanTempFiles logger tmpfs+ = mask_ $ do let ref = tmp_files_to_clean tmpfs to_delete <- atomicModifyIORef' ref $ \FilesToClean@@ -161,10 +159,9 @@ -- TFL_CurrentModule. -- If a file must be cleaned eventually, but must survive a -- cleanCurrentModuleTempFiles, ensure it has lifetime TFL_GhcSession.-cleanCurrentModuleTempFiles :: Logger -> TmpFs -> DynFlags -> IO ()-cleanCurrentModuleTempFiles logger tmpfs dflags- = unless (gopt Opt_KeepTmpFiles dflags)- $ mask_+cleanCurrentModuleTempFiles :: Logger -> TmpFs -> IO ()+cleanCurrentModuleTempFiles logger tmpfs+ = mask_ $ do let ref = tmp_files_to_clean tmpfs to_delete <- atomicModifyIORef' ref $ \ftc@FilesToClean{ftcCurrentModule = cm_files} ->@@ -212,9 +209,9 @@ atomicModifyIORef' (tmp_next_suffix tmpfs) $ \n -> (n+1,n) -- Find a temporary name that doesn't already exist.-newTempName :: Logger -> TmpFs -> DynFlags -> TempFileLifetime -> Suffix -> IO FilePath-newTempName logger tmpfs dflags lifetime extn- = do d <- getTempDir logger tmpfs dflags+newTempName :: Logger -> TmpFs -> TempDir -> TempFileLifetime -> Suffix -> IO FilePath+newTempName logger tmpfs tmp_dir lifetime extn+ = do d <- getTempDir logger tmpfs tmp_dir findTempName (d </> "ghc_") -- See Note [Deterministic base name] where findTempName :: FilePath -> IO FilePath@@ -227,9 +224,9 @@ addFilesToClean tmpfs lifetime [filename] return filename -newTempDir :: Logger -> TmpFs -> DynFlags -> IO FilePath-newTempDir logger tmpfs dflags- = do d <- getTempDir logger tmpfs dflags+newTempDir :: Logger -> TmpFs -> TempDir -> IO FilePath+newTempDir logger tmpfs tmp_dir+ = do d <- getTempDir logger tmpfs tmp_dir findTempDir (d </> "ghc_") where findTempDir :: FilePath -> IO FilePath@@ -242,10 +239,10 @@ -- see mkTempDir below; this is wrong: -> consIORef (tmp_dirs_to_clean tmpfs) filename return filename -newTempLibName :: Logger -> TmpFs -> DynFlags -> TempFileLifetime -> Suffix+newTempLibName :: Logger -> TmpFs -> TempDir -> TempFileLifetime -> Suffix -> IO (FilePath, FilePath, String)-newTempLibName logger tmpfs dflags lifetime extn- = do d <- getTempDir logger tmpfs dflags+newTempLibName logger tmpfs tmp_dir lifetime extn+ = do d <- getTempDir logger tmpfs tmp_dir findTempName d ("ghc_") where findTempName :: FilePath -> String -> IO (FilePath, FilePath, String)@@ -262,8 +259,8 @@ -- Return our temporary directory within tmp_dir, creating one if we -- don't have one yet.-getTempDir :: Logger -> TmpFs -> DynFlags -> IO FilePath-getTempDir logger tmpfs dflags = do+getTempDir :: Logger -> TmpFs -> TempDir -> IO FilePath+getTempDir logger tmpfs (TempDir tmp_dir) = do mapping <- readIORef dir_ref case Map.lookup tmp_dir mapping of Nothing -> do@@ -272,7 +269,6 @@ mask_ $ mkTempDir prefix Just dir -> return dir where- tmp_dir = tmpDir dflags dir_ref = tmp_dirs_to_clean tmpfs mkTempDir :: FilePath -> IO FilePath
compiler/GHC/Utils/Trace.hs view
@@ -7,6 +7,7 @@ , pprSTrace , pprTraceException , warnPprTrace+ , pprTraceUserWarning , trace ) where@@ -68,6 +69,15 @@ warnPprTrace False _msg x = x warnPprTrace True msg x = pprDebugAndThen defaultSDocContext trace (text "WARNING:")+ (msg $$ withFrozenCallStack traceCallStackDoc )+ x++-- | For when we want to show the user a non-fatal WARNING so that they can+-- report a GHC bug, but don't want to panic.+pprTraceUserWarning :: HasCallStack => SDoc -> a -> a+pprTraceUserWarning msg x+ | unsafeHasNoDebugOutput = x+ | otherwise = pprDebugAndThen defaultSDocContext trace (text "WARNING:") (msg $$ withFrozenCallStack traceCallStackDoc ) x
compiler/cbits/genSym.c view
@@ -16,9 +16,7 @@ HsInt ghc_lib_parser_genSym(void) { HsInt u = atomic_inc((StgWord *)&ghc_unique_counter, ghc_unique_inc) & UNIQUE_MASK;-#if DEBUG // Uh oh! We will overflow next time a unique is requested.- assert(u != UNIQUE_MASK);-#endif+ ASSERT(u != UNIQUE_MASK); return u; }
ghc-lib-parser.cabal view
@@ -1,7 +1,7 @@ cabal-version: >=1.22 build-type: Simple name: ghc-lib-parser-version: 0.20210701+version: 0.20210801 license: BSD3 license-file: LICENSE category: Development@@ -79,7 +79,6 @@ time >= 1.4 && < 1.10, transformers == 0.5.*, process >= 1 && < 1.7,- hpc == 0.6.*, exceptions == 0.10.*, parsec build-tools: alex >= 3.1, happy >= 1.19.4@@ -228,6 +227,7 @@ GHC.Driver.CmdLine GHC.Driver.Config GHC.Driver.Config.Diagnostic+ GHC.Driver.Config.Finder GHC.Driver.Config.Logger GHC.Driver.Config.Parser GHC.Driver.Env@@ -240,6 +240,7 @@ GHC.Driver.Monad GHC.Driver.Phases GHC.Driver.Pipeline.Monad+ GHC.Driver.Pipeline.Phases GHC.Driver.Plugins GHC.Driver.Ppr GHC.Driver.Session@@ -289,6 +290,7 @@ GHC.Parser GHC.Parser.Annotation GHC.Parser.CharClass+ GHC.Parser.Errors.Basic GHC.Parser.Errors.Ppr GHC.Parser.Errors.Types GHC.Parser.Header@@ -393,6 +395,7 @@ GHC.Unit.Database GHC.Unit.Env GHC.Unit.External+ GHC.Unit.Finder GHC.Unit.Finder.Types GHC.Unit.Home GHC.Unit.Home.ModInfo
ghc-lib/stage0/compiler/build/GHC/Parser/Lexer.hs view
@@ -23,7 +23,7 @@ MonadP(..), getRealSrcLoc, getPState, failMsgP, failLocMsgP, srcParseFail,- getErrorMessages, getMessages,+ getPsErrorMessages, getPsMessages, popContext, pushModuleContext, setLastToken, setSrcLoc, activeContext, nextIsEOF, getLexState, popLexState, pushLexState,@@ -70,7 +70,7 @@ import GHC.Utils.Panic import GHC.Data.StringBuffer import GHC.Data.FastString-import GHC.Types.Error hiding ( getErrorMessages, getMessages )+import GHC.Types.Error import GHC.Types.Unique.FM import GHC.Data.Maybe import GHC.Data.OrdList@@ -85,6 +85,7 @@ import GHC.Parser.Annotation import GHC.Driver.Flags+import GHC.Parser.Errors.Basic import GHC.Parser.Errors.Types import GHC.Parser.Errors.Ppr () @@ -608,7 +609,7 @@ , (0,alex_action_117) ] -{-# LINE 698 "compiler/GHC/Parser/Lexer.x" #-}+{-# LINE 699 "compiler/GHC/Parser/Lexer.x" #-} -- -----------------------------------------------------------------------------@@ -2210,7 +2211,7 @@ newtype ParseResult a = PR (# (# PState, a #) | PState #) -- | The parser has consumed a (possibly empty) prefix of the input and produced--- a result. Use 'getMessages' to check for accumulated warnings and non-fatal+-- a result. Use 'getPsMessages' to check for accumulated warnings and non-fatal -- errors. -- -- The carried parsing state can be used to resume parsing.@@ -2220,8 +2221,8 @@ -- | The parser has consumed a (possibly empty) prefix of the input and failed. -- -- The carried parsing state can be used to resume parsing. It is the state--- right before failure, including the fatal parse error. 'getMessages' and--- 'getErrorMessages' must return a non-empty bag of errors.+-- right before failure, including the fatal parse error. 'getPsMessages' and+-- 'getPsErrorMessages' must return a non-empty bag of errors. pattern PFailed :: PState -> ParseResult a pattern PFailed s = PR (# | s #) @@ -2836,7 +2837,7 @@ addError :: MsgEnvelope PsMessage -> m () -- | Add a warning to the accumulator.- -- Use 'getMessages' to get the accumulated warnings.+ -- Use 'getPsMessages' to get the accumulated warnings. addWarning :: MsgEnvelope PsMessage -> m () -- | Add a fatal error. This will be the last error reported by the parser, and@@ -2922,13 +2923,13 @@ -- | Get a bag of the errors that have been accumulated so far. -- Does not take -Werror into account.-getErrorMessages :: PState -> Messages PsMessage-getErrorMessages p = errors p+getPsErrorMessages :: PState -> Messages PsMessage+getPsErrorMessages p = errors p -- | Get the warnings and errors accumulated so far. -- Does not take -Werror into account.-getMessages :: PState -> (Messages PsMessage, Messages PsMessage)-getMessages p =+getPsMessages :: PState -> (Messages PsMessage, Messages PsMessage)+getPsMessages p = let ws = warnings p diag_opts = pDiagOpts (options p) -- we add the tabulation warning on the fly because
ghc-lib/stage0/compiler/build/primop-data-decl.hs-incl view
@@ -288,7 +288,6 @@ | FloatToDoubleOp | FloatDecode_IntOp | NewArrayOp- | SameMutableArrayOp | ReadArrayOp | WriteArrayOp | SizeofArrayOp@@ -304,7 +303,6 @@ | ThawArrayOp | CasArrayOp | NewSmallArrayOp- | SameSmallMutableArrayOp | ShrinkSmallMutableArrayOp_Char | ReadSmallArrayOp | WriteSmallArrayOp@@ -328,7 +326,6 @@ | ByteArrayIsPinnedOp | ByteArrayContents_Char | MutableByteArrayContents_Char- | SameMutableByteArrayOp | ShrinkMutableByteArrayOp_Char | ResizeMutableByteArrayOp_Char | UnsafeFreezeByteArrayOp@@ -442,7 +439,6 @@ | FetchOrByteArrayOp_Int | FetchXorByteArrayOp_Int | NewArrayArrayOp- | SameMutableArrayArrayOp | UnsafeFreezeArrayArrayOp | SizeofArrayArrayOp | SizeofMutableArrayArrayOp@@ -532,7 +528,6 @@ | NewMutVarOp | ReadMutVarOp | WriteMutVarOp- | SameMutVarOp | AtomicModifyMutVar2Op | AtomicModifyMutVar_Op | CasMutVarOp@@ -551,7 +546,6 @@ | ReadTVarOp | ReadTVarIOOp | WriteTVarOp- | SameTVarOp | NewMVarOp | TakeMVarOp | TryTakeMVarOp@@ -559,12 +553,10 @@ | TryPutMVarOp | ReadMVarOp | TryReadMVarOp- | SameMVarOp | IsEmptyMVarOp | NewIOPortrOp | ReadIOPortOp | WriteIOPortOp- | SameIOPortOp | DelayOp | WaitReadOp | WaitWriteOp@@ -587,7 +579,6 @@ | DeRefStablePtrOp | EqStablePtrOp | MakeStableNameOp- | EqStableNameOp | StableNameToIntOp | CompactNewOp | CompactResizeOp
ghc-lib/stage0/compiler/build/primop-list.hs-incl view
@@ -287,7 +287,6 @@ , FloatToDoubleOp , FloatDecode_IntOp , NewArrayOp- , SameMutableArrayOp , ReadArrayOp , WriteArrayOp , SizeofArrayOp@@ -303,7 +302,6 @@ , ThawArrayOp , CasArrayOp , NewSmallArrayOp- , SameSmallMutableArrayOp , ShrinkSmallMutableArrayOp_Char , ReadSmallArrayOp , WriteSmallArrayOp@@ -327,7 +325,6 @@ , ByteArrayIsPinnedOp , ByteArrayContents_Char , MutableByteArrayContents_Char- , SameMutableByteArrayOp , ShrinkMutableByteArrayOp_Char , ResizeMutableByteArrayOp_Char , UnsafeFreezeByteArrayOp@@ -441,7 +438,6 @@ , FetchOrByteArrayOp_Int , FetchXorByteArrayOp_Int , NewArrayArrayOp- , SameMutableArrayArrayOp , UnsafeFreezeArrayArrayOp , SizeofArrayArrayOp , SizeofMutableArrayArrayOp@@ -531,7 +527,6 @@ , NewMutVarOp , ReadMutVarOp , WriteMutVarOp- , SameMutVarOp , AtomicModifyMutVar2Op , AtomicModifyMutVar_Op , CasMutVarOp@@ -550,7 +545,6 @@ , ReadTVarOp , ReadTVarIOOp , WriteTVarOp- , SameTVarOp , NewMVarOp , TakeMVarOp , TryTakeMVarOp@@ -558,12 +552,10 @@ , TryPutMVarOp , ReadMVarOp , TryReadMVarOp- , SameMVarOp , IsEmptyMVarOp , NewIOPortrOp , ReadIOPortOp , WriteIOPortOp- , SameIOPortOp , DelayOp , WaitReadOp , WaitWriteOp@@ -586,7 +578,6 @@ , DeRefStablePtrOp , EqStablePtrOp , MakeStableNameOp- , EqStableNameOp , StableNameToIntOp , CompactNewOp , CompactResizeOp
ghc-lib/stage0/compiler/build/primop-primop-info.hs-incl view
@@ -287,7 +287,6 @@ primOpInfo FloatToDoubleOp = mkGenPrimOp (fsLit "float2Double#") [] [floatPrimTy] (doublePrimTy) primOpInfo FloatDecode_IntOp = mkGenPrimOp (fsLit "decodeFloat_Int#") [] [floatPrimTy] ((mkTupleTy Unboxed [intPrimTy, intPrimTy])) primOpInfo NewArrayOp = mkGenPrimOp (fsLit "newArray#") [alphaTyVarSpec, deltaTyVarSpec] [intPrimTy, alphaTy, mkStatePrimTy deltaTy] ((mkTupleTy Unboxed [mkStatePrimTy deltaTy, mkMutableArrayPrimTy deltaTy alphaTy]))-primOpInfo SameMutableArrayOp = mkGenPrimOp (fsLit "sameMutableArray#") [deltaTyVarSpec, alphaTyVarSpec] [mkMutableArrayPrimTy deltaTy alphaTy, mkMutableArrayPrimTy deltaTy alphaTy] (intPrimTy) primOpInfo ReadArrayOp = mkGenPrimOp (fsLit "readArray#") [deltaTyVarSpec, alphaTyVarSpec] [mkMutableArrayPrimTy deltaTy alphaTy, intPrimTy, mkStatePrimTy deltaTy] ((mkTupleTy Unboxed [mkStatePrimTy deltaTy, alphaTy])) primOpInfo WriteArrayOp = mkGenPrimOp (fsLit "writeArray#") [deltaTyVarSpec, alphaTyVarSpec] [mkMutableArrayPrimTy deltaTy alphaTy, intPrimTy, alphaTy, mkStatePrimTy deltaTy] (mkStatePrimTy deltaTy) primOpInfo SizeofArrayOp = mkGenPrimOp (fsLit "sizeofArray#") [alphaTyVarSpec] [mkArrayPrimTy alphaTy] (intPrimTy)@@ -303,7 +302,6 @@ primOpInfo ThawArrayOp = mkGenPrimOp (fsLit "thawArray#") [alphaTyVarSpec, deltaTyVarSpec] [mkArrayPrimTy alphaTy, intPrimTy, intPrimTy, mkStatePrimTy deltaTy] ((mkTupleTy Unboxed [mkStatePrimTy deltaTy, mkMutableArrayPrimTy deltaTy alphaTy])) primOpInfo CasArrayOp = mkGenPrimOp (fsLit "casArray#") [deltaTyVarSpec, alphaTyVarSpec] [mkMutableArrayPrimTy deltaTy alphaTy, intPrimTy, alphaTy, alphaTy, mkStatePrimTy deltaTy] ((mkTupleTy Unboxed [mkStatePrimTy deltaTy, intPrimTy, alphaTy])) primOpInfo NewSmallArrayOp = mkGenPrimOp (fsLit "newSmallArray#") [alphaTyVarSpec, deltaTyVarSpec] [intPrimTy, alphaTy, mkStatePrimTy deltaTy] ((mkTupleTy Unboxed [mkStatePrimTy deltaTy, mkSmallMutableArrayPrimTy deltaTy alphaTy]))-primOpInfo SameSmallMutableArrayOp = mkGenPrimOp (fsLit "sameSmallMutableArray#") [deltaTyVarSpec, alphaTyVarSpec] [mkSmallMutableArrayPrimTy deltaTy alphaTy, mkSmallMutableArrayPrimTy deltaTy alphaTy] (intPrimTy) primOpInfo ShrinkSmallMutableArrayOp_Char = mkGenPrimOp (fsLit "shrinkSmallMutableArray#") [deltaTyVarSpec, alphaTyVarSpec] [mkSmallMutableArrayPrimTy deltaTy alphaTy, intPrimTy, mkStatePrimTy deltaTy] (mkStatePrimTy deltaTy) primOpInfo ReadSmallArrayOp = mkGenPrimOp (fsLit "readSmallArray#") [deltaTyVarSpec, alphaTyVarSpec] [mkSmallMutableArrayPrimTy deltaTy alphaTy, intPrimTy, mkStatePrimTy deltaTy] ((mkTupleTy Unboxed [mkStatePrimTy deltaTy, alphaTy])) primOpInfo WriteSmallArrayOp = mkGenPrimOp (fsLit "writeSmallArray#") [deltaTyVarSpec, alphaTyVarSpec] [mkSmallMutableArrayPrimTy deltaTy alphaTy, intPrimTy, alphaTy, mkStatePrimTy deltaTy] (mkStatePrimTy deltaTy)@@ -327,7 +325,6 @@ primOpInfo ByteArrayIsPinnedOp = mkGenPrimOp (fsLit "isByteArrayPinned#") [] [byteArrayPrimTy] (intPrimTy) primOpInfo ByteArrayContents_Char = mkGenPrimOp (fsLit "byteArrayContents#") [] [byteArrayPrimTy] (addrPrimTy) primOpInfo MutableByteArrayContents_Char = mkGenPrimOp (fsLit "mutableByteArrayContents#") [deltaTyVarSpec] [mkMutableByteArrayPrimTy deltaTy] (addrPrimTy)-primOpInfo SameMutableByteArrayOp = mkGenPrimOp (fsLit "sameMutableByteArray#") [deltaTyVarSpec] [mkMutableByteArrayPrimTy deltaTy, mkMutableByteArrayPrimTy deltaTy] (intPrimTy) primOpInfo ShrinkMutableByteArrayOp_Char = mkGenPrimOp (fsLit "shrinkMutableByteArray#") [deltaTyVarSpec] [mkMutableByteArrayPrimTy deltaTy, intPrimTy, mkStatePrimTy deltaTy] (mkStatePrimTy deltaTy) primOpInfo ResizeMutableByteArrayOp_Char = mkGenPrimOp (fsLit "resizeMutableByteArray#") [deltaTyVarSpec] [mkMutableByteArrayPrimTy deltaTy, intPrimTy, mkStatePrimTy deltaTy] ((mkTupleTy Unboxed [mkStatePrimTy deltaTy, mkMutableByteArrayPrimTy deltaTy])) primOpInfo UnsafeFreezeByteArrayOp = mkGenPrimOp (fsLit "unsafeFreezeByteArray#") [deltaTyVarSpec] [mkMutableByteArrayPrimTy deltaTy, mkStatePrimTy deltaTy] ((mkTupleTy Unboxed [mkStatePrimTy deltaTy, byteArrayPrimTy]))@@ -441,7 +438,6 @@ primOpInfo FetchOrByteArrayOp_Int = mkGenPrimOp (fsLit "fetchOrIntArray#") [deltaTyVarSpec] [mkMutableByteArrayPrimTy deltaTy, intPrimTy, intPrimTy, mkStatePrimTy deltaTy] ((mkTupleTy Unboxed [mkStatePrimTy deltaTy, intPrimTy])) primOpInfo FetchXorByteArrayOp_Int = mkGenPrimOp (fsLit "fetchXorIntArray#") [deltaTyVarSpec] [mkMutableByteArrayPrimTy deltaTy, intPrimTy, intPrimTy, mkStatePrimTy deltaTy] ((mkTupleTy Unboxed [mkStatePrimTy deltaTy, intPrimTy])) primOpInfo NewArrayArrayOp = mkGenPrimOp (fsLit "newArrayArray#") [deltaTyVarSpec] [intPrimTy, mkStatePrimTy deltaTy] ((mkTupleTy Unboxed [mkStatePrimTy deltaTy, mkMutableArrayArrayPrimTy deltaTy]))-primOpInfo SameMutableArrayArrayOp = mkGenPrimOp (fsLit "sameMutableArrayArray#") [deltaTyVarSpec] [mkMutableArrayArrayPrimTy deltaTy, mkMutableArrayArrayPrimTy deltaTy] (intPrimTy) primOpInfo UnsafeFreezeArrayArrayOp = mkGenPrimOp (fsLit "unsafeFreezeArrayArray#") [deltaTyVarSpec] [mkMutableArrayArrayPrimTy deltaTy, mkStatePrimTy deltaTy] ((mkTupleTy Unboxed [mkStatePrimTy deltaTy, mkArrayArrayPrimTy])) primOpInfo SizeofArrayArrayOp = mkGenPrimOp (fsLit "sizeofArrayArray#") [] [mkArrayArrayPrimTy] (intPrimTy) primOpInfo SizeofMutableArrayArrayOp = mkGenPrimOp (fsLit "sizeofMutableArrayArray#") [deltaTyVarSpec] [mkMutableArrayArrayPrimTy deltaTy] (intPrimTy)@@ -531,7 +527,6 @@ primOpInfo NewMutVarOp = mkGenPrimOp (fsLit "newMutVar#") [alphaTyVarSpec, deltaTyVarSpec] [alphaTy, mkStatePrimTy deltaTy] ((mkTupleTy Unboxed [mkStatePrimTy deltaTy, mkMutVarPrimTy deltaTy alphaTy])) primOpInfo ReadMutVarOp = mkGenPrimOp (fsLit "readMutVar#") [deltaTyVarSpec, alphaTyVarSpec] [mkMutVarPrimTy deltaTy alphaTy, mkStatePrimTy deltaTy] ((mkTupleTy Unboxed [mkStatePrimTy deltaTy, alphaTy])) primOpInfo WriteMutVarOp = mkGenPrimOp (fsLit "writeMutVar#") [deltaTyVarSpec, alphaTyVarSpec] [mkMutVarPrimTy deltaTy alphaTy, alphaTy, mkStatePrimTy deltaTy] (mkStatePrimTy deltaTy)-primOpInfo SameMutVarOp = mkGenPrimOp (fsLit "sameMutVar#") [deltaTyVarSpec, alphaTyVarSpec] [mkMutVarPrimTy deltaTy alphaTy, mkMutVarPrimTy deltaTy alphaTy] (intPrimTy) primOpInfo AtomicModifyMutVar2Op = mkGenPrimOp (fsLit "atomicModifyMutVar2#") [deltaTyVarSpec, alphaTyVarSpec, gammaTyVarSpec] [mkMutVarPrimTy deltaTy alphaTy, (mkVisFunTyMany (alphaTy) (gammaTy)), mkStatePrimTy deltaTy] ((mkTupleTy Unboxed [mkStatePrimTy deltaTy, alphaTy, gammaTy])) primOpInfo AtomicModifyMutVar_Op = mkGenPrimOp (fsLit "atomicModifyMutVar_#") [deltaTyVarSpec, alphaTyVarSpec] [mkMutVarPrimTy deltaTy alphaTy, (mkVisFunTyMany (alphaTy) (alphaTy)), mkStatePrimTy deltaTy] ((mkTupleTy Unboxed [mkStatePrimTy deltaTy, alphaTy, alphaTy])) primOpInfo CasMutVarOp = mkGenPrimOp (fsLit "casMutVar#") [deltaTyVarSpec, alphaTyVarSpec] [mkMutVarPrimTy deltaTy alphaTy, alphaTy, alphaTy, mkStatePrimTy deltaTy] ((mkTupleTy Unboxed [mkStatePrimTy deltaTy, intPrimTy, alphaTy]))@@ -550,7 +545,6 @@ primOpInfo ReadTVarOp = mkGenPrimOp (fsLit "readTVar#") [deltaTyVarSpec, alphaTyVarSpec] [mkTVarPrimTy deltaTy alphaTy, mkStatePrimTy deltaTy] ((mkTupleTy Unboxed [mkStatePrimTy deltaTy, alphaTy])) primOpInfo ReadTVarIOOp = mkGenPrimOp (fsLit "readTVarIO#") [deltaTyVarSpec, alphaTyVarSpec] [mkTVarPrimTy deltaTy alphaTy, mkStatePrimTy deltaTy] ((mkTupleTy Unboxed [mkStatePrimTy deltaTy, alphaTy])) primOpInfo WriteTVarOp = mkGenPrimOp (fsLit "writeTVar#") [deltaTyVarSpec, alphaTyVarSpec] [mkTVarPrimTy deltaTy alphaTy, alphaTy, mkStatePrimTy deltaTy] (mkStatePrimTy deltaTy)-primOpInfo SameTVarOp = mkGenPrimOp (fsLit "sameTVar#") [deltaTyVarSpec, alphaTyVarSpec] [mkTVarPrimTy deltaTy alphaTy, mkTVarPrimTy deltaTy alphaTy] (intPrimTy) primOpInfo NewMVarOp = mkGenPrimOp (fsLit "newMVar#") [deltaTyVarSpec, alphaTyVarSpec] [mkStatePrimTy deltaTy] ((mkTupleTy Unboxed [mkStatePrimTy deltaTy, mkMVarPrimTy deltaTy alphaTy])) primOpInfo TakeMVarOp = mkGenPrimOp (fsLit "takeMVar#") [deltaTyVarSpec, alphaTyVarSpec] [mkMVarPrimTy deltaTy alphaTy, mkStatePrimTy deltaTy] ((mkTupleTy Unboxed [mkStatePrimTy deltaTy, alphaTy])) primOpInfo TryTakeMVarOp = mkGenPrimOp (fsLit "tryTakeMVar#") [deltaTyVarSpec, alphaTyVarSpec] [mkMVarPrimTy deltaTy alphaTy, mkStatePrimTy deltaTy] ((mkTupleTy Unboxed [mkStatePrimTy deltaTy, intPrimTy, alphaTy]))@@ -558,12 +552,10 @@ primOpInfo TryPutMVarOp = mkGenPrimOp (fsLit "tryPutMVar#") [deltaTyVarSpec, alphaTyVarSpec] [mkMVarPrimTy deltaTy alphaTy, alphaTy, mkStatePrimTy deltaTy] ((mkTupleTy Unboxed [mkStatePrimTy deltaTy, intPrimTy])) primOpInfo ReadMVarOp = mkGenPrimOp (fsLit "readMVar#") [deltaTyVarSpec, alphaTyVarSpec] [mkMVarPrimTy deltaTy alphaTy, mkStatePrimTy deltaTy] ((mkTupleTy Unboxed [mkStatePrimTy deltaTy, alphaTy])) primOpInfo TryReadMVarOp = mkGenPrimOp (fsLit "tryReadMVar#") [deltaTyVarSpec, alphaTyVarSpec] [mkMVarPrimTy deltaTy alphaTy, mkStatePrimTy deltaTy] ((mkTupleTy Unboxed [mkStatePrimTy deltaTy, intPrimTy, alphaTy]))-primOpInfo SameMVarOp = mkGenPrimOp (fsLit "sameMVar#") [deltaTyVarSpec, alphaTyVarSpec] [mkMVarPrimTy deltaTy alphaTy, mkMVarPrimTy deltaTy alphaTy] (intPrimTy) primOpInfo IsEmptyMVarOp = mkGenPrimOp (fsLit "isEmptyMVar#") [deltaTyVarSpec, alphaTyVarSpec] [mkMVarPrimTy deltaTy alphaTy, mkStatePrimTy deltaTy] ((mkTupleTy Unboxed [mkStatePrimTy deltaTy, intPrimTy])) primOpInfo NewIOPortrOp = mkGenPrimOp (fsLit "newIOPort#") [deltaTyVarSpec, alphaTyVarSpec] [mkStatePrimTy deltaTy] ((mkTupleTy Unboxed [mkStatePrimTy deltaTy, mkIOPortPrimTy deltaTy alphaTy])) primOpInfo ReadIOPortOp = mkGenPrimOp (fsLit "readIOPort#") [deltaTyVarSpec, alphaTyVarSpec] [mkIOPortPrimTy deltaTy alphaTy, mkStatePrimTy deltaTy] ((mkTupleTy Unboxed [mkStatePrimTy deltaTy, alphaTy])) primOpInfo WriteIOPortOp = mkGenPrimOp (fsLit "writeIOPort#") [deltaTyVarSpec, alphaTyVarSpec] [mkIOPortPrimTy deltaTy alphaTy, alphaTy, mkStatePrimTy deltaTy] ((mkTupleTy Unboxed [mkStatePrimTy deltaTy, intPrimTy]))-primOpInfo SameIOPortOp = mkGenPrimOp (fsLit "sameIOPort#") [deltaTyVarSpec, alphaTyVarSpec] [mkIOPortPrimTy deltaTy alphaTy, mkIOPortPrimTy deltaTy alphaTy] (intPrimTy) primOpInfo DelayOp = mkGenPrimOp (fsLit "delay#") [deltaTyVarSpec] [intPrimTy, mkStatePrimTy deltaTy] (mkStatePrimTy deltaTy) primOpInfo WaitReadOp = mkGenPrimOp (fsLit "waitRead#") [deltaTyVarSpec] [intPrimTy, mkStatePrimTy deltaTy] (mkStatePrimTy deltaTy) primOpInfo WaitWriteOp = mkGenPrimOp (fsLit "waitWrite#") [deltaTyVarSpec] [intPrimTy, mkStatePrimTy deltaTy] (mkStatePrimTy deltaTy)@@ -576,17 +568,16 @@ primOpInfo IsCurrentThreadBoundOp = mkGenPrimOp (fsLit "isCurrentThreadBound#") [] [mkStatePrimTy realWorldTy] ((mkTupleTy Unboxed [mkStatePrimTy realWorldTy, intPrimTy])) primOpInfo NoDuplicateOp = mkGenPrimOp (fsLit "noDuplicate#") [deltaTyVarSpec] [mkStatePrimTy deltaTy] (mkStatePrimTy deltaTy) primOpInfo ThreadStatusOp = mkGenPrimOp (fsLit "threadStatus#") [] [threadIdPrimTy, mkStatePrimTy realWorldTy] ((mkTupleTy Unboxed [mkStatePrimTy realWorldTy, intPrimTy, intPrimTy, intPrimTy]))-primOpInfo MkWeakOp = mkGenPrimOp (fsLit "mkWeak#") [levity1TyVarInf, levPolyTyVar1Spec, betaTyVarSpec, gammaTyVarSpec] [levPolyTy1, betaTy, (mkVisFunTyMany (mkStatePrimTy realWorldTy) ((mkTupleTy Unboxed [mkStatePrimTy realWorldTy, gammaTy]))), mkStatePrimTy realWorldTy] ((mkTupleTy Unboxed [mkStatePrimTy realWorldTy, mkWeakPrimTy betaTy]))-primOpInfo MkWeakNoFinalizerOp = mkGenPrimOp (fsLit "mkWeakNoFinalizer#") [levity1TyVarInf, levPolyTyVar1Spec, betaTyVarSpec] [levPolyTy1, betaTy, mkStatePrimTy realWorldTy] ((mkTupleTy Unboxed [mkStatePrimTy realWorldTy, mkWeakPrimTy betaTy]))+primOpInfo MkWeakOp = mkGenPrimOp (fsLit "mkWeak#") [levity1TyVarInf, levPolyAlphaTyVarSpec, betaTyVarSpec, gammaTyVarSpec] [levPolyAlphaTy, betaTy, (mkVisFunTyMany (mkStatePrimTy realWorldTy) ((mkTupleTy Unboxed [mkStatePrimTy realWorldTy, gammaTy]))), mkStatePrimTy realWorldTy] ((mkTupleTy Unboxed [mkStatePrimTy realWorldTy, mkWeakPrimTy betaTy]))+primOpInfo MkWeakNoFinalizerOp = mkGenPrimOp (fsLit "mkWeakNoFinalizer#") [levity1TyVarInf, levPolyAlphaTyVarSpec, betaTyVarSpec] [levPolyAlphaTy, betaTy, mkStatePrimTy realWorldTy] ((mkTupleTy Unboxed [mkStatePrimTy realWorldTy, mkWeakPrimTy betaTy])) primOpInfo AddCFinalizerToWeakOp = mkGenPrimOp (fsLit "addCFinalizerToWeak#") [betaTyVarSpec] [addrPrimTy, addrPrimTy, intPrimTy, addrPrimTy, mkWeakPrimTy betaTy, mkStatePrimTy realWorldTy] ((mkTupleTy Unboxed [mkStatePrimTy realWorldTy, intPrimTy])) primOpInfo DeRefWeakOp = mkGenPrimOp (fsLit "deRefWeak#") [alphaTyVarSpec] [mkWeakPrimTy alphaTy, mkStatePrimTy realWorldTy] ((mkTupleTy Unboxed [mkStatePrimTy realWorldTy, intPrimTy, alphaTy])) primOpInfo FinalizeWeakOp = mkGenPrimOp (fsLit "finalizeWeak#") [alphaTyVarSpec, betaTyVarSpec] [mkWeakPrimTy alphaTy, mkStatePrimTy realWorldTy] ((mkTupleTy Unboxed [mkStatePrimTy realWorldTy, intPrimTy, (mkVisFunTyMany (mkStatePrimTy realWorldTy) ((mkTupleTy Unboxed [mkStatePrimTy realWorldTy, betaTy])))]))-primOpInfo TouchOp = mkGenPrimOp (fsLit "touch#") [levity1TyVarInf, levPolyTyVar1Spec] [levPolyTy1, mkStatePrimTy realWorldTy] (mkStatePrimTy realWorldTy)+primOpInfo TouchOp = mkGenPrimOp (fsLit "touch#") [levity1TyVarInf, levPolyAlphaTyVarSpec] [levPolyAlphaTy, mkStatePrimTy realWorldTy] (mkStatePrimTy realWorldTy) primOpInfo MakeStablePtrOp = mkGenPrimOp (fsLit "makeStablePtr#") [alphaTyVarSpec] [alphaTy, mkStatePrimTy realWorldTy] ((mkTupleTy Unboxed [mkStatePrimTy realWorldTy, mkStablePtrPrimTy alphaTy])) primOpInfo DeRefStablePtrOp = mkGenPrimOp (fsLit "deRefStablePtr#") [alphaTyVarSpec] [mkStablePtrPrimTy alphaTy, mkStatePrimTy realWorldTy] ((mkTupleTy Unboxed [mkStatePrimTy realWorldTy, alphaTy])) primOpInfo EqStablePtrOp = mkGenPrimOp (fsLit "eqStablePtr#") [alphaTyVarSpec] [mkStablePtrPrimTy alphaTy, mkStablePtrPrimTy alphaTy] (intPrimTy) primOpInfo MakeStableNameOp = mkGenPrimOp (fsLit "makeStableName#") [alphaTyVarSpec] [alphaTy, mkStatePrimTy realWorldTy] ((mkTupleTy Unboxed [mkStatePrimTy realWorldTy, mkStableNamePrimTy alphaTy]))-primOpInfo EqStableNameOp = mkGenPrimOp (fsLit "eqStableName#") [alphaTyVarSpec, betaTyVarSpec] [mkStableNamePrimTy alphaTy, mkStableNamePrimTy betaTy] (intPrimTy) primOpInfo StableNameToIntOp = mkGenPrimOp (fsLit "stableNameToInt#") [alphaTyVarSpec] [mkStableNamePrimTy alphaTy] (intPrimTy) primOpInfo CompactNewOp = mkGenPrimOp (fsLit "compactNew#") [] [wordPrimTy, mkStatePrimTy realWorldTy] ((mkTupleTy Unboxed [mkStatePrimTy realWorldTy, compactPrimTy])) primOpInfo CompactResizeOp = mkGenPrimOp (fsLit "compactResize#") [] [compactPrimTy, wordPrimTy, mkStatePrimTy realWorldTy] (mkStatePrimTy realWorldTy)@@ -599,13 +590,13 @@ primOpInfo CompactAdd = mkGenPrimOp (fsLit "compactAdd#") [alphaTyVarSpec] [compactPrimTy, alphaTy, mkStatePrimTy realWorldTy] ((mkTupleTy Unboxed [mkStatePrimTy realWorldTy, alphaTy])) primOpInfo CompactAddWithSharing = mkGenPrimOp (fsLit "compactAddWithSharing#") [alphaTyVarSpec] [compactPrimTy, alphaTy, mkStatePrimTy realWorldTy] ((mkTupleTy Unboxed [mkStatePrimTy realWorldTy, alphaTy])) primOpInfo CompactSize = mkGenPrimOp (fsLit "compactSize#") [] [compactPrimTy, mkStatePrimTy realWorldTy] ((mkTupleTy Unboxed [mkStatePrimTy realWorldTy, wordPrimTy]))-primOpInfo ReallyUnsafePtrEqualityOp = mkGenPrimOp (fsLit "reallyUnsafePtrEquality#") [alphaTyVarSpec] [alphaTy, alphaTy] (intPrimTy)+primOpInfo ReallyUnsafePtrEqualityOp = mkGenPrimOp (fsLit "reallyUnsafePtrEquality#") [levity1TyVarInf, levPolyAlphaTyVarSpec, levity2TyVarInf, levPolyBetaTyVarSpec] [levPolyAlphaTy, levPolyBetaTy] (intPrimTy) primOpInfo ParOp = mkGenPrimOp (fsLit "par#") [alphaTyVarSpec] [alphaTy] (intPrimTy) primOpInfo SparkOp = mkGenPrimOp (fsLit "spark#") [alphaTyVarSpec, deltaTyVarSpec] [alphaTy, mkStatePrimTy deltaTy] ((mkTupleTy Unboxed [mkStatePrimTy deltaTy, alphaTy])) primOpInfo SeqOp = mkGenPrimOp (fsLit "seq#") [alphaTyVarSpec, deltaTyVarSpec] [alphaTy, mkStatePrimTy deltaTy] ((mkTupleTy Unboxed [mkStatePrimTy deltaTy, alphaTy])) primOpInfo GetSparkOp = mkGenPrimOp (fsLit "getSpark#") [deltaTyVarSpec, alphaTyVarSpec] [mkStatePrimTy deltaTy] ((mkTupleTy Unboxed [mkStatePrimTy deltaTy, intPrimTy, alphaTy])) primOpInfo NumSparks = mkGenPrimOp (fsLit "numSparks#") [deltaTyVarSpec] [mkStatePrimTy deltaTy] ((mkTupleTy Unboxed [mkStatePrimTy deltaTy, intPrimTy]))-primOpInfo KeepAliveOp = mkGenPrimOp (fsLit "keepAlive#") [levity1TyVarInf, levPolyTyVar1Spec, runtimeRep2TyVarInf, openBetaTyVarSpec] [levPolyTy1, mkStatePrimTy realWorldTy, (mkVisFunTyMany (mkStatePrimTy realWorldTy) (openBetaTy))] (openBetaTy)+primOpInfo KeepAliveOp = mkGenPrimOp (fsLit "keepAlive#") [levity1TyVarInf, levPolyAlphaTyVarSpec, runtimeRep2TyVarInf, openBetaTyVarSpec] [levPolyAlphaTy, mkStatePrimTy realWorldTy, (mkVisFunTyMany (mkStatePrimTy realWorldTy) (openBetaTy))] (openBetaTy) primOpInfo DataToTagOp = mkGenPrimOp (fsLit "dataToTag#") [alphaTyVarSpec] [alphaTy] (intPrimTy) primOpInfo TagToEnumOp = mkGenPrimOp (fsLit "tagToEnum#") [alphaTyVarSpec] [intPrimTy] (alphaTy) primOpInfo AddrToAnyOp = mkGenPrimOp (fsLit "addrToAny#") [alphaTyVarSpec] [addrPrimTy] ((mkTupleTy Unboxed [alphaTy]))
ghc-lib/stage0/compiler/build/primop-tag.hs-incl view
@@ -1,1286 +1,1277 @@ maxPrimOpTag :: Int-maxPrimOpTag = 1283-primOpTag :: PrimOp -> Int-primOpTag CharGtOp = 1-primOpTag CharGeOp = 2-primOpTag CharEqOp = 3-primOpTag CharNeOp = 4-primOpTag CharLtOp = 5-primOpTag CharLeOp = 6-primOpTag OrdOp = 7-primOpTag Int8ToIntOp = 8-primOpTag IntToInt8Op = 9-primOpTag Int8NegOp = 10-primOpTag Int8AddOp = 11-primOpTag Int8SubOp = 12-primOpTag Int8MulOp = 13-primOpTag Int8QuotOp = 14-primOpTag Int8RemOp = 15-primOpTag Int8QuotRemOp = 16-primOpTag Int8SllOp = 17-primOpTag Int8SraOp = 18-primOpTag Int8SrlOp = 19-primOpTag Int8ToWord8Op = 20-primOpTag Int8EqOp = 21-primOpTag Int8GeOp = 22-primOpTag Int8GtOp = 23-primOpTag Int8LeOp = 24-primOpTag Int8LtOp = 25-primOpTag Int8NeOp = 26-primOpTag Word8ToWordOp = 27-primOpTag WordToWord8Op = 28-primOpTag Word8AddOp = 29-primOpTag Word8SubOp = 30-primOpTag Word8MulOp = 31-primOpTag Word8QuotOp = 32-primOpTag Word8RemOp = 33-primOpTag Word8QuotRemOp = 34-primOpTag Word8AndOp = 35-primOpTag Word8OrOp = 36-primOpTag Word8XorOp = 37-primOpTag Word8NotOp = 38-primOpTag Word8SllOp = 39-primOpTag Word8SrlOp = 40-primOpTag Word8ToInt8Op = 41-primOpTag Word8EqOp = 42-primOpTag Word8GeOp = 43-primOpTag Word8GtOp = 44-primOpTag Word8LeOp = 45-primOpTag Word8LtOp = 46-primOpTag Word8NeOp = 47-primOpTag Int16ToIntOp = 48-primOpTag IntToInt16Op = 49-primOpTag Int16NegOp = 50-primOpTag Int16AddOp = 51-primOpTag Int16SubOp = 52-primOpTag Int16MulOp = 53-primOpTag Int16QuotOp = 54-primOpTag Int16RemOp = 55-primOpTag Int16QuotRemOp = 56-primOpTag Int16SllOp = 57-primOpTag Int16SraOp = 58-primOpTag Int16SrlOp = 59-primOpTag Int16ToWord16Op = 60-primOpTag Int16EqOp = 61-primOpTag Int16GeOp = 62-primOpTag Int16GtOp = 63-primOpTag Int16LeOp = 64-primOpTag Int16LtOp = 65-primOpTag Int16NeOp = 66-primOpTag Word16ToWordOp = 67-primOpTag WordToWord16Op = 68-primOpTag Word16AddOp = 69-primOpTag Word16SubOp = 70-primOpTag Word16MulOp = 71-primOpTag Word16QuotOp = 72-primOpTag Word16RemOp = 73-primOpTag Word16QuotRemOp = 74-primOpTag Word16AndOp = 75-primOpTag Word16OrOp = 76-primOpTag Word16XorOp = 77-primOpTag Word16NotOp = 78-primOpTag Word16SllOp = 79-primOpTag Word16SrlOp = 80-primOpTag Word16ToInt16Op = 81-primOpTag Word16EqOp = 82-primOpTag Word16GeOp = 83-primOpTag Word16GtOp = 84-primOpTag Word16LeOp = 85-primOpTag Word16LtOp = 86-primOpTag Word16NeOp = 87-primOpTag Int32ToIntOp = 88-primOpTag IntToInt32Op = 89-primOpTag Int32NegOp = 90-primOpTag Int32AddOp = 91-primOpTag Int32SubOp = 92-primOpTag Int32MulOp = 93-primOpTag Int32QuotOp = 94-primOpTag Int32RemOp = 95-primOpTag Int32QuotRemOp = 96-primOpTag Int32SllOp = 97-primOpTag Int32SraOp = 98-primOpTag Int32SrlOp = 99-primOpTag Int32ToWord32Op = 100-primOpTag Int32EqOp = 101-primOpTag Int32GeOp = 102-primOpTag Int32GtOp = 103-primOpTag Int32LeOp = 104-primOpTag Int32LtOp = 105-primOpTag Int32NeOp = 106-primOpTag Word32ToWordOp = 107-primOpTag WordToWord32Op = 108-primOpTag Word32AddOp = 109-primOpTag Word32SubOp = 110-primOpTag Word32MulOp = 111-primOpTag Word32QuotOp = 112-primOpTag Word32RemOp = 113-primOpTag Word32QuotRemOp = 114-primOpTag Word32AndOp = 115-primOpTag Word32OrOp = 116-primOpTag Word32XorOp = 117-primOpTag Word32NotOp = 118-primOpTag Word32SllOp = 119-primOpTag Word32SrlOp = 120-primOpTag Word32ToInt32Op = 121-primOpTag Word32EqOp = 122-primOpTag Word32GeOp = 123-primOpTag Word32GtOp = 124-primOpTag Word32LeOp = 125-primOpTag Word32LtOp = 126-primOpTag Word32NeOp = 127-primOpTag IntAddOp = 128-primOpTag IntSubOp = 129-primOpTag IntMulOp = 130-primOpTag IntMul2Op = 131-primOpTag IntMulMayOfloOp = 132-primOpTag IntQuotOp = 133-primOpTag IntRemOp = 134-primOpTag IntQuotRemOp = 135-primOpTag IntAndOp = 136-primOpTag IntOrOp = 137-primOpTag IntXorOp = 138-primOpTag IntNotOp = 139-primOpTag IntNegOp = 140-primOpTag IntAddCOp = 141-primOpTag IntSubCOp = 142-primOpTag IntGtOp = 143-primOpTag IntGeOp = 144-primOpTag IntEqOp = 145-primOpTag IntNeOp = 146-primOpTag IntLtOp = 147-primOpTag IntLeOp = 148-primOpTag ChrOp = 149-primOpTag IntToWordOp = 150-primOpTag IntToFloatOp = 151-primOpTag IntToDoubleOp = 152-primOpTag WordToFloatOp = 153-primOpTag WordToDoubleOp = 154-primOpTag IntSllOp = 155-primOpTag IntSraOp = 156-primOpTag IntSrlOp = 157-primOpTag WordAddOp = 158-primOpTag WordAddCOp = 159-primOpTag WordSubCOp = 160-primOpTag WordAdd2Op = 161-primOpTag WordSubOp = 162-primOpTag WordMulOp = 163-primOpTag WordMul2Op = 164-primOpTag WordQuotOp = 165-primOpTag WordRemOp = 166-primOpTag WordQuotRemOp = 167-primOpTag WordQuotRem2Op = 168-primOpTag WordAndOp = 169-primOpTag WordOrOp = 170-primOpTag WordXorOp = 171-primOpTag WordNotOp = 172-primOpTag WordSllOp = 173-primOpTag WordSrlOp = 174-primOpTag WordToIntOp = 175-primOpTag WordGtOp = 176-primOpTag WordGeOp = 177-primOpTag WordEqOp = 178-primOpTag WordNeOp = 179-primOpTag WordLtOp = 180-primOpTag WordLeOp = 181-primOpTag PopCnt8Op = 182-primOpTag PopCnt16Op = 183-primOpTag PopCnt32Op = 184-primOpTag PopCnt64Op = 185-primOpTag PopCntOp = 186-primOpTag Pdep8Op = 187-primOpTag Pdep16Op = 188-primOpTag Pdep32Op = 189-primOpTag Pdep64Op = 190-primOpTag PdepOp = 191-primOpTag Pext8Op = 192-primOpTag Pext16Op = 193-primOpTag Pext32Op = 194-primOpTag Pext64Op = 195-primOpTag PextOp = 196-primOpTag Clz8Op = 197-primOpTag Clz16Op = 198-primOpTag Clz32Op = 199-primOpTag Clz64Op = 200-primOpTag ClzOp = 201-primOpTag Ctz8Op = 202-primOpTag Ctz16Op = 203-primOpTag Ctz32Op = 204-primOpTag Ctz64Op = 205-primOpTag CtzOp = 206-primOpTag BSwap16Op = 207-primOpTag BSwap32Op = 208-primOpTag BSwap64Op = 209-primOpTag BSwapOp = 210-primOpTag BRev8Op = 211-primOpTag BRev16Op = 212-primOpTag BRev32Op = 213-primOpTag BRev64Op = 214-primOpTag BRevOp = 215-primOpTag Narrow8IntOp = 216-primOpTag Narrow16IntOp = 217-primOpTag Narrow32IntOp = 218-primOpTag Narrow8WordOp = 219-primOpTag Narrow16WordOp = 220-primOpTag Narrow32WordOp = 221-primOpTag DoubleGtOp = 222-primOpTag DoubleGeOp = 223-primOpTag DoubleEqOp = 224-primOpTag DoubleNeOp = 225-primOpTag DoubleLtOp = 226-primOpTag DoubleLeOp = 227-primOpTag DoubleAddOp = 228-primOpTag DoubleSubOp = 229-primOpTag DoubleMulOp = 230-primOpTag DoubleDivOp = 231-primOpTag DoubleNegOp = 232-primOpTag DoubleFabsOp = 233-primOpTag DoubleToIntOp = 234-primOpTag DoubleToFloatOp = 235-primOpTag DoubleExpOp = 236-primOpTag DoubleExpM1Op = 237-primOpTag DoubleLogOp = 238-primOpTag DoubleLog1POp = 239-primOpTag DoubleSqrtOp = 240-primOpTag DoubleSinOp = 241-primOpTag DoubleCosOp = 242-primOpTag DoubleTanOp = 243-primOpTag DoubleAsinOp = 244-primOpTag DoubleAcosOp = 245-primOpTag DoubleAtanOp = 246-primOpTag DoubleSinhOp = 247-primOpTag DoubleCoshOp = 248-primOpTag DoubleTanhOp = 249-primOpTag DoubleAsinhOp = 250-primOpTag DoubleAcoshOp = 251-primOpTag DoubleAtanhOp = 252-primOpTag DoublePowerOp = 253-primOpTag DoubleDecode_2IntOp = 254-primOpTag DoubleDecode_Int64Op = 255-primOpTag FloatGtOp = 256-primOpTag FloatGeOp = 257-primOpTag FloatEqOp = 258-primOpTag FloatNeOp = 259-primOpTag FloatLtOp = 260-primOpTag FloatLeOp = 261-primOpTag FloatAddOp = 262-primOpTag FloatSubOp = 263-primOpTag FloatMulOp = 264-primOpTag FloatDivOp = 265-primOpTag FloatNegOp = 266-primOpTag FloatFabsOp = 267-primOpTag FloatToIntOp = 268-primOpTag FloatExpOp = 269-primOpTag FloatExpM1Op = 270-primOpTag FloatLogOp = 271-primOpTag FloatLog1POp = 272-primOpTag FloatSqrtOp = 273-primOpTag FloatSinOp = 274-primOpTag FloatCosOp = 275-primOpTag FloatTanOp = 276-primOpTag FloatAsinOp = 277-primOpTag FloatAcosOp = 278-primOpTag FloatAtanOp = 279-primOpTag FloatSinhOp = 280-primOpTag FloatCoshOp = 281-primOpTag FloatTanhOp = 282-primOpTag FloatAsinhOp = 283-primOpTag FloatAcoshOp = 284-primOpTag FloatAtanhOp = 285-primOpTag FloatPowerOp = 286-primOpTag FloatToDoubleOp = 287-primOpTag FloatDecode_IntOp = 288-primOpTag NewArrayOp = 289-primOpTag SameMutableArrayOp = 290-primOpTag ReadArrayOp = 291-primOpTag WriteArrayOp = 292-primOpTag SizeofArrayOp = 293-primOpTag SizeofMutableArrayOp = 294-primOpTag IndexArrayOp = 295-primOpTag UnsafeFreezeArrayOp = 296-primOpTag UnsafeThawArrayOp = 297-primOpTag CopyArrayOp = 298-primOpTag CopyMutableArrayOp = 299-primOpTag CloneArrayOp = 300-primOpTag CloneMutableArrayOp = 301-primOpTag FreezeArrayOp = 302-primOpTag ThawArrayOp = 303-primOpTag CasArrayOp = 304-primOpTag NewSmallArrayOp = 305-primOpTag SameSmallMutableArrayOp = 306-primOpTag ShrinkSmallMutableArrayOp_Char = 307-primOpTag ReadSmallArrayOp = 308-primOpTag WriteSmallArrayOp = 309-primOpTag SizeofSmallArrayOp = 310-primOpTag SizeofSmallMutableArrayOp = 311-primOpTag GetSizeofSmallMutableArrayOp = 312-primOpTag IndexSmallArrayOp = 313-primOpTag UnsafeFreezeSmallArrayOp = 314-primOpTag UnsafeThawSmallArrayOp = 315-primOpTag CopySmallArrayOp = 316-primOpTag CopySmallMutableArrayOp = 317-primOpTag CloneSmallArrayOp = 318-primOpTag CloneSmallMutableArrayOp = 319-primOpTag FreezeSmallArrayOp = 320-primOpTag ThawSmallArrayOp = 321-primOpTag CasSmallArrayOp = 322-primOpTag NewByteArrayOp_Char = 323-primOpTag NewPinnedByteArrayOp_Char = 324-primOpTag NewAlignedPinnedByteArrayOp_Char = 325-primOpTag MutableByteArrayIsPinnedOp = 326-primOpTag ByteArrayIsPinnedOp = 327-primOpTag ByteArrayContents_Char = 328-primOpTag MutableByteArrayContents_Char = 329-primOpTag SameMutableByteArrayOp = 330-primOpTag ShrinkMutableByteArrayOp_Char = 331-primOpTag ResizeMutableByteArrayOp_Char = 332-primOpTag UnsafeFreezeByteArrayOp = 333-primOpTag SizeofByteArrayOp = 334-primOpTag SizeofMutableByteArrayOp = 335-primOpTag GetSizeofMutableByteArrayOp = 336-primOpTag IndexByteArrayOp_Char = 337-primOpTag IndexByteArrayOp_WideChar = 338-primOpTag IndexByteArrayOp_Int = 339-primOpTag IndexByteArrayOp_Word = 340-primOpTag IndexByteArrayOp_Addr = 341-primOpTag IndexByteArrayOp_Float = 342-primOpTag IndexByteArrayOp_Double = 343-primOpTag IndexByteArrayOp_StablePtr = 344-primOpTag IndexByteArrayOp_Int8 = 345-primOpTag IndexByteArrayOp_Int16 = 346-primOpTag IndexByteArrayOp_Int32 = 347-primOpTag IndexByteArrayOp_Int64 = 348-primOpTag IndexByteArrayOp_Word8 = 349-primOpTag IndexByteArrayOp_Word16 = 350-primOpTag IndexByteArrayOp_Word32 = 351-primOpTag IndexByteArrayOp_Word64 = 352-primOpTag IndexByteArrayOp_Word8AsChar = 353-primOpTag IndexByteArrayOp_Word8AsWideChar = 354-primOpTag IndexByteArrayOp_Word8AsInt = 355-primOpTag IndexByteArrayOp_Word8AsWord = 356-primOpTag IndexByteArrayOp_Word8AsAddr = 357-primOpTag IndexByteArrayOp_Word8AsFloat = 358-primOpTag IndexByteArrayOp_Word8AsDouble = 359-primOpTag IndexByteArrayOp_Word8AsStablePtr = 360-primOpTag IndexByteArrayOp_Word8AsInt16 = 361-primOpTag IndexByteArrayOp_Word8AsInt32 = 362-primOpTag IndexByteArrayOp_Word8AsInt64 = 363-primOpTag IndexByteArrayOp_Word8AsWord16 = 364-primOpTag IndexByteArrayOp_Word8AsWord32 = 365-primOpTag IndexByteArrayOp_Word8AsWord64 = 366-primOpTag ReadByteArrayOp_Char = 367-primOpTag ReadByteArrayOp_WideChar = 368-primOpTag ReadByteArrayOp_Int = 369-primOpTag ReadByteArrayOp_Word = 370-primOpTag ReadByteArrayOp_Addr = 371-primOpTag ReadByteArrayOp_Float = 372-primOpTag ReadByteArrayOp_Double = 373-primOpTag ReadByteArrayOp_StablePtr = 374-primOpTag ReadByteArrayOp_Int8 = 375-primOpTag ReadByteArrayOp_Int16 = 376-primOpTag ReadByteArrayOp_Int32 = 377-primOpTag ReadByteArrayOp_Int64 = 378-primOpTag ReadByteArrayOp_Word8 = 379-primOpTag ReadByteArrayOp_Word16 = 380-primOpTag ReadByteArrayOp_Word32 = 381-primOpTag ReadByteArrayOp_Word64 = 382-primOpTag ReadByteArrayOp_Word8AsChar = 383-primOpTag ReadByteArrayOp_Word8AsWideChar = 384-primOpTag ReadByteArrayOp_Word8AsInt = 385-primOpTag ReadByteArrayOp_Word8AsWord = 386-primOpTag ReadByteArrayOp_Word8AsAddr = 387-primOpTag ReadByteArrayOp_Word8AsFloat = 388-primOpTag ReadByteArrayOp_Word8AsDouble = 389-primOpTag ReadByteArrayOp_Word8AsStablePtr = 390-primOpTag ReadByteArrayOp_Word8AsInt16 = 391-primOpTag ReadByteArrayOp_Word8AsInt32 = 392-primOpTag ReadByteArrayOp_Word8AsInt64 = 393-primOpTag ReadByteArrayOp_Word8AsWord16 = 394-primOpTag ReadByteArrayOp_Word8AsWord32 = 395-primOpTag ReadByteArrayOp_Word8AsWord64 = 396-primOpTag WriteByteArrayOp_Char = 397-primOpTag WriteByteArrayOp_WideChar = 398-primOpTag WriteByteArrayOp_Int = 399-primOpTag WriteByteArrayOp_Word = 400-primOpTag WriteByteArrayOp_Addr = 401-primOpTag WriteByteArrayOp_Float = 402-primOpTag WriteByteArrayOp_Double = 403-primOpTag WriteByteArrayOp_StablePtr = 404-primOpTag WriteByteArrayOp_Int8 = 405-primOpTag WriteByteArrayOp_Int16 = 406-primOpTag WriteByteArrayOp_Int32 = 407-primOpTag WriteByteArrayOp_Int64 = 408-primOpTag WriteByteArrayOp_Word8 = 409-primOpTag WriteByteArrayOp_Word16 = 410-primOpTag WriteByteArrayOp_Word32 = 411-primOpTag WriteByteArrayOp_Word64 = 412-primOpTag WriteByteArrayOp_Word8AsChar = 413-primOpTag WriteByteArrayOp_Word8AsWideChar = 414-primOpTag WriteByteArrayOp_Word8AsInt = 415-primOpTag WriteByteArrayOp_Word8AsWord = 416-primOpTag WriteByteArrayOp_Word8AsAddr = 417-primOpTag WriteByteArrayOp_Word8AsFloat = 418-primOpTag WriteByteArrayOp_Word8AsDouble = 419-primOpTag WriteByteArrayOp_Word8AsStablePtr = 420-primOpTag WriteByteArrayOp_Word8AsInt16 = 421-primOpTag WriteByteArrayOp_Word8AsInt32 = 422-primOpTag WriteByteArrayOp_Word8AsInt64 = 423-primOpTag WriteByteArrayOp_Word8AsWord16 = 424-primOpTag WriteByteArrayOp_Word8AsWord32 = 425-primOpTag WriteByteArrayOp_Word8AsWord64 = 426-primOpTag CompareByteArraysOp = 427-primOpTag CopyByteArrayOp = 428-primOpTag CopyMutableByteArrayOp = 429-primOpTag CopyByteArrayToAddrOp = 430-primOpTag CopyMutableByteArrayToAddrOp = 431-primOpTag CopyAddrToByteArrayOp = 432-primOpTag SetByteArrayOp = 433-primOpTag AtomicReadByteArrayOp_Int = 434-primOpTag AtomicWriteByteArrayOp_Int = 435-primOpTag CasByteArrayOp_Int = 436-primOpTag FetchAddByteArrayOp_Int = 437-primOpTag FetchSubByteArrayOp_Int = 438-primOpTag FetchAndByteArrayOp_Int = 439-primOpTag FetchNandByteArrayOp_Int = 440-primOpTag FetchOrByteArrayOp_Int = 441-primOpTag FetchXorByteArrayOp_Int = 442-primOpTag NewArrayArrayOp = 443-primOpTag SameMutableArrayArrayOp = 444-primOpTag UnsafeFreezeArrayArrayOp = 445-primOpTag SizeofArrayArrayOp = 446-primOpTag SizeofMutableArrayArrayOp = 447-primOpTag IndexArrayArrayOp_ByteArray = 448-primOpTag IndexArrayArrayOp_ArrayArray = 449-primOpTag ReadArrayArrayOp_ByteArray = 450-primOpTag ReadArrayArrayOp_MutableByteArray = 451-primOpTag ReadArrayArrayOp_ArrayArray = 452-primOpTag ReadArrayArrayOp_MutableArrayArray = 453-primOpTag WriteArrayArrayOp_ByteArray = 454-primOpTag WriteArrayArrayOp_MutableByteArray = 455-primOpTag WriteArrayArrayOp_ArrayArray = 456-primOpTag WriteArrayArrayOp_MutableArrayArray = 457-primOpTag CopyArrayArrayOp = 458-primOpTag CopyMutableArrayArrayOp = 459-primOpTag AddrAddOp = 460-primOpTag AddrSubOp = 461-primOpTag AddrRemOp = 462-primOpTag AddrToIntOp = 463-primOpTag IntToAddrOp = 464-primOpTag AddrGtOp = 465-primOpTag AddrGeOp = 466-primOpTag AddrEqOp = 467-primOpTag AddrNeOp = 468-primOpTag AddrLtOp = 469-primOpTag AddrLeOp = 470-primOpTag IndexOffAddrOp_Char = 471-primOpTag IndexOffAddrOp_WideChar = 472-primOpTag IndexOffAddrOp_Int = 473-primOpTag IndexOffAddrOp_Word = 474-primOpTag IndexOffAddrOp_Addr = 475-primOpTag IndexOffAddrOp_Float = 476-primOpTag IndexOffAddrOp_Double = 477-primOpTag IndexOffAddrOp_StablePtr = 478-primOpTag IndexOffAddrOp_Int8 = 479-primOpTag IndexOffAddrOp_Int16 = 480-primOpTag IndexOffAddrOp_Int32 = 481-primOpTag IndexOffAddrOp_Int64 = 482-primOpTag IndexOffAddrOp_Word8 = 483-primOpTag IndexOffAddrOp_Word16 = 484-primOpTag IndexOffAddrOp_Word32 = 485-primOpTag IndexOffAddrOp_Word64 = 486-primOpTag ReadOffAddrOp_Char = 487-primOpTag ReadOffAddrOp_WideChar = 488-primOpTag ReadOffAddrOp_Int = 489-primOpTag ReadOffAddrOp_Word = 490-primOpTag ReadOffAddrOp_Addr = 491-primOpTag ReadOffAddrOp_Float = 492-primOpTag ReadOffAddrOp_Double = 493-primOpTag ReadOffAddrOp_StablePtr = 494-primOpTag ReadOffAddrOp_Int8 = 495-primOpTag ReadOffAddrOp_Int16 = 496-primOpTag ReadOffAddrOp_Int32 = 497-primOpTag ReadOffAddrOp_Int64 = 498-primOpTag ReadOffAddrOp_Word8 = 499-primOpTag ReadOffAddrOp_Word16 = 500-primOpTag ReadOffAddrOp_Word32 = 501-primOpTag ReadOffAddrOp_Word64 = 502-primOpTag WriteOffAddrOp_Char = 503-primOpTag WriteOffAddrOp_WideChar = 504-primOpTag WriteOffAddrOp_Int = 505-primOpTag WriteOffAddrOp_Word = 506-primOpTag WriteOffAddrOp_Addr = 507-primOpTag WriteOffAddrOp_Float = 508-primOpTag WriteOffAddrOp_Double = 509-primOpTag WriteOffAddrOp_StablePtr = 510-primOpTag WriteOffAddrOp_Int8 = 511-primOpTag WriteOffAddrOp_Int16 = 512-primOpTag WriteOffAddrOp_Int32 = 513-primOpTag WriteOffAddrOp_Int64 = 514-primOpTag WriteOffAddrOp_Word8 = 515-primOpTag WriteOffAddrOp_Word16 = 516-primOpTag WriteOffAddrOp_Word32 = 517-primOpTag WriteOffAddrOp_Word64 = 518-primOpTag InterlockedExchange_Addr = 519-primOpTag InterlockedExchange_Word = 520-primOpTag CasAddrOp_Addr = 521-primOpTag CasAddrOp_Word = 522-primOpTag FetchAddAddrOp_Word = 523-primOpTag FetchSubAddrOp_Word = 524-primOpTag FetchAndAddrOp_Word = 525-primOpTag FetchNandAddrOp_Word = 526-primOpTag FetchOrAddrOp_Word = 527-primOpTag FetchXorAddrOp_Word = 528-primOpTag AtomicReadAddrOp_Word = 529-primOpTag AtomicWriteAddrOp_Word = 530-primOpTag NewMutVarOp = 531-primOpTag ReadMutVarOp = 532-primOpTag WriteMutVarOp = 533-primOpTag SameMutVarOp = 534-primOpTag AtomicModifyMutVar2Op = 535-primOpTag AtomicModifyMutVar_Op = 536-primOpTag CasMutVarOp = 537-primOpTag CatchOp = 538-primOpTag RaiseOp = 539-primOpTag RaiseIOOp = 540-primOpTag MaskAsyncExceptionsOp = 541-primOpTag MaskUninterruptibleOp = 542-primOpTag UnmaskAsyncExceptionsOp = 543-primOpTag MaskStatus = 544-primOpTag AtomicallyOp = 545-primOpTag RetryOp = 546-primOpTag CatchRetryOp = 547-primOpTag CatchSTMOp = 548-primOpTag NewTVarOp = 549-primOpTag ReadTVarOp = 550-primOpTag ReadTVarIOOp = 551-primOpTag WriteTVarOp = 552-primOpTag SameTVarOp = 553-primOpTag NewMVarOp = 554-primOpTag TakeMVarOp = 555-primOpTag TryTakeMVarOp = 556-primOpTag PutMVarOp = 557-primOpTag TryPutMVarOp = 558-primOpTag ReadMVarOp = 559-primOpTag TryReadMVarOp = 560-primOpTag SameMVarOp = 561-primOpTag IsEmptyMVarOp = 562-primOpTag NewIOPortrOp = 563-primOpTag ReadIOPortOp = 564-primOpTag WriteIOPortOp = 565-primOpTag SameIOPortOp = 566-primOpTag DelayOp = 567-primOpTag WaitReadOp = 568-primOpTag WaitWriteOp = 569-primOpTag ForkOp = 570-primOpTag ForkOnOp = 571-primOpTag KillThreadOp = 572-primOpTag YieldOp = 573-primOpTag MyThreadIdOp = 574-primOpTag LabelThreadOp = 575-primOpTag IsCurrentThreadBoundOp = 576-primOpTag NoDuplicateOp = 577-primOpTag ThreadStatusOp = 578-primOpTag MkWeakOp = 579-primOpTag MkWeakNoFinalizerOp = 580-primOpTag AddCFinalizerToWeakOp = 581-primOpTag DeRefWeakOp = 582-primOpTag FinalizeWeakOp = 583-primOpTag TouchOp = 584-primOpTag MakeStablePtrOp = 585-primOpTag DeRefStablePtrOp = 586-primOpTag EqStablePtrOp = 587-primOpTag MakeStableNameOp = 588-primOpTag EqStableNameOp = 589-primOpTag StableNameToIntOp = 590-primOpTag CompactNewOp = 591-primOpTag CompactResizeOp = 592-primOpTag CompactContainsOp = 593-primOpTag CompactContainsAnyOp = 594-primOpTag CompactGetFirstBlockOp = 595-primOpTag CompactGetNextBlockOp = 596-primOpTag CompactAllocateBlockOp = 597-primOpTag CompactFixupPointersOp = 598-primOpTag CompactAdd = 599-primOpTag CompactAddWithSharing = 600-primOpTag CompactSize = 601-primOpTag ReallyUnsafePtrEqualityOp = 602-primOpTag ParOp = 603-primOpTag SparkOp = 604-primOpTag SeqOp = 605-primOpTag GetSparkOp = 606-primOpTag NumSparks = 607-primOpTag KeepAliveOp = 608-primOpTag DataToTagOp = 609-primOpTag TagToEnumOp = 610-primOpTag AddrToAnyOp = 611-primOpTag AnyToAddrOp = 612-primOpTag MkApUpd0_Op = 613-primOpTag NewBCOOp = 614-primOpTag UnpackClosureOp = 615-primOpTag ClosureSizeOp = 616-primOpTag GetApStackValOp = 617-primOpTag GetCCSOfOp = 618-primOpTag GetCurrentCCSOp = 619-primOpTag ClearCCSOp = 620-primOpTag WhereFromOp = 621-primOpTag TraceEventOp = 622-primOpTag TraceEventBinaryOp = 623-primOpTag TraceMarkerOp = 624-primOpTag SetThreadAllocationCounter = 625-primOpTag (VecBroadcastOp IntVec 16 W8) = 626-primOpTag (VecBroadcastOp IntVec 8 W16) = 627-primOpTag (VecBroadcastOp IntVec 4 W32) = 628-primOpTag (VecBroadcastOp IntVec 2 W64) = 629-primOpTag (VecBroadcastOp IntVec 32 W8) = 630-primOpTag (VecBroadcastOp IntVec 16 W16) = 631-primOpTag (VecBroadcastOp IntVec 8 W32) = 632-primOpTag (VecBroadcastOp IntVec 4 W64) = 633-primOpTag (VecBroadcastOp IntVec 64 W8) = 634-primOpTag (VecBroadcastOp IntVec 32 W16) = 635-primOpTag (VecBroadcastOp IntVec 16 W32) = 636-primOpTag (VecBroadcastOp IntVec 8 W64) = 637-primOpTag (VecBroadcastOp WordVec 16 W8) = 638-primOpTag (VecBroadcastOp WordVec 8 W16) = 639-primOpTag (VecBroadcastOp WordVec 4 W32) = 640-primOpTag (VecBroadcastOp WordVec 2 W64) = 641-primOpTag (VecBroadcastOp WordVec 32 W8) = 642-primOpTag (VecBroadcastOp WordVec 16 W16) = 643-primOpTag (VecBroadcastOp WordVec 8 W32) = 644-primOpTag (VecBroadcastOp WordVec 4 W64) = 645-primOpTag (VecBroadcastOp WordVec 64 W8) = 646-primOpTag (VecBroadcastOp WordVec 32 W16) = 647-primOpTag (VecBroadcastOp WordVec 16 W32) = 648-primOpTag (VecBroadcastOp WordVec 8 W64) = 649-primOpTag (VecBroadcastOp FloatVec 4 W32) = 650-primOpTag (VecBroadcastOp FloatVec 2 W64) = 651-primOpTag (VecBroadcastOp FloatVec 8 W32) = 652-primOpTag (VecBroadcastOp FloatVec 4 W64) = 653-primOpTag (VecBroadcastOp FloatVec 16 W32) = 654-primOpTag (VecBroadcastOp FloatVec 8 W64) = 655-primOpTag (VecPackOp IntVec 16 W8) = 656-primOpTag (VecPackOp IntVec 8 W16) = 657-primOpTag (VecPackOp IntVec 4 W32) = 658-primOpTag (VecPackOp IntVec 2 W64) = 659-primOpTag (VecPackOp IntVec 32 W8) = 660-primOpTag (VecPackOp IntVec 16 W16) = 661-primOpTag (VecPackOp IntVec 8 W32) = 662-primOpTag (VecPackOp IntVec 4 W64) = 663-primOpTag (VecPackOp IntVec 64 W8) = 664-primOpTag (VecPackOp IntVec 32 W16) = 665-primOpTag (VecPackOp IntVec 16 W32) = 666-primOpTag (VecPackOp IntVec 8 W64) = 667-primOpTag (VecPackOp WordVec 16 W8) = 668-primOpTag (VecPackOp WordVec 8 W16) = 669-primOpTag (VecPackOp WordVec 4 W32) = 670-primOpTag (VecPackOp WordVec 2 W64) = 671-primOpTag (VecPackOp WordVec 32 W8) = 672-primOpTag (VecPackOp WordVec 16 W16) = 673-primOpTag (VecPackOp WordVec 8 W32) = 674-primOpTag (VecPackOp WordVec 4 W64) = 675-primOpTag (VecPackOp WordVec 64 W8) = 676-primOpTag (VecPackOp WordVec 32 W16) = 677-primOpTag (VecPackOp WordVec 16 W32) = 678-primOpTag (VecPackOp WordVec 8 W64) = 679-primOpTag (VecPackOp FloatVec 4 W32) = 680-primOpTag (VecPackOp FloatVec 2 W64) = 681-primOpTag (VecPackOp FloatVec 8 W32) = 682-primOpTag (VecPackOp FloatVec 4 W64) = 683-primOpTag (VecPackOp FloatVec 16 W32) = 684-primOpTag (VecPackOp FloatVec 8 W64) = 685-primOpTag (VecUnpackOp IntVec 16 W8) = 686-primOpTag (VecUnpackOp IntVec 8 W16) = 687-primOpTag (VecUnpackOp IntVec 4 W32) = 688-primOpTag (VecUnpackOp IntVec 2 W64) = 689-primOpTag (VecUnpackOp IntVec 32 W8) = 690-primOpTag (VecUnpackOp IntVec 16 W16) = 691-primOpTag (VecUnpackOp IntVec 8 W32) = 692-primOpTag (VecUnpackOp IntVec 4 W64) = 693-primOpTag (VecUnpackOp IntVec 64 W8) = 694-primOpTag (VecUnpackOp IntVec 32 W16) = 695-primOpTag (VecUnpackOp IntVec 16 W32) = 696-primOpTag (VecUnpackOp IntVec 8 W64) = 697-primOpTag (VecUnpackOp WordVec 16 W8) = 698-primOpTag (VecUnpackOp WordVec 8 W16) = 699-primOpTag (VecUnpackOp WordVec 4 W32) = 700-primOpTag (VecUnpackOp WordVec 2 W64) = 701-primOpTag (VecUnpackOp WordVec 32 W8) = 702-primOpTag (VecUnpackOp WordVec 16 W16) = 703-primOpTag (VecUnpackOp WordVec 8 W32) = 704-primOpTag (VecUnpackOp WordVec 4 W64) = 705-primOpTag (VecUnpackOp WordVec 64 W8) = 706-primOpTag (VecUnpackOp WordVec 32 W16) = 707-primOpTag (VecUnpackOp WordVec 16 W32) = 708-primOpTag (VecUnpackOp WordVec 8 W64) = 709-primOpTag (VecUnpackOp FloatVec 4 W32) = 710-primOpTag (VecUnpackOp FloatVec 2 W64) = 711-primOpTag (VecUnpackOp FloatVec 8 W32) = 712-primOpTag (VecUnpackOp FloatVec 4 W64) = 713-primOpTag (VecUnpackOp FloatVec 16 W32) = 714-primOpTag (VecUnpackOp FloatVec 8 W64) = 715-primOpTag (VecInsertOp IntVec 16 W8) = 716-primOpTag (VecInsertOp IntVec 8 W16) = 717-primOpTag (VecInsertOp IntVec 4 W32) = 718-primOpTag (VecInsertOp IntVec 2 W64) = 719-primOpTag (VecInsertOp IntVec 32 W8) = 720-primOpTag (VecInsertOp IntVec 16 W16) = 721-primOpTag (VecInsertOp IntVec 8 W32) = 722-primOpTag (VecInsertOp IntVec 4 W64) = 723-primOpTag (VecInsertOp IntVec 64 W8) = 724-primOpTag (VecInsertOp IntVec 32 W16) = 725-primOpTag (VecInsertOp IntVec 16 W32) = 726-primOpTag (VecInsertOp IntVec 8 W64) = 727-primOpTag (VecInsertOp WordVec 16 W8) = 728-primOpTag (VecInsertOp WordVec 8 W16) = 729-primOpTag (VecInsertOp WordVec 4 W32) = 730-primOpTag (VecInsertOp WordVec 2 W64) = 731-primOpTag (VecInsertOp WordVec 32 W8) = 732-primOpTag (VecInsertOp WordVec 16 W16) = 733-primOpTag (VecInsertOp WordVec 8 W32) = 734-primOpTag (VecInsertOp WordVec 4 W64) = 735-primOpTag (VecInsertOp WordVec 64 W8) = 736-primOpTag (VecInsertOp WordVec 32 W16) = 737-primOpTag (VecInsertOp WordVec 16 W32) = 738-primOpTag (VecInsertOp WordVec 8 W64) = 739-primOpTag (VecInsertOp FloatVec 4 W32) = 740-primOpTag (VecInsertOp FloatVec 2 W64) = 741-primOpTag (VecInsertOp FloatVec 8 W32) = 742-primOpTag (VecInsertOp FloatVec 4 W64) = 743-primOpTag (VecInsertOp FloatVec 16 W32) = 744-primOpTag (VecInsertOp FloatVec 8 W64) = 745-primOpTag (VecAddOp IntVec 16 W8) = 746-primOpTag (VecAddOp IntVec 8 W16) = 747-primOpTag (VecAddOp IntVec 4 W32) = 748-primOpTag (VecAddOp IntVec 2 W64) = 749-primOpTag (VecAddOp IntVec 32 W8) = 750-primOpTag (VecAddOp IntVec 16 W16) = 751-primOpTag (VecAddOp IntVec 8 W32) = 752-primOpTag (VecAddOp IntVec 4 W64) = 753-primOpTag (VecAddOp IntVec 64 W8) = 754-primOpTag (VecAddOp IntVec 32 W16) = 755-primOpTag (VecAddOp IntVec 16 W32) = 756-primOpTag (VecAddOp IntVec 8 W64) = 757-primOpTag (VecAddOp WordVec 16 W8) = 758-primOpTag (VecAddOp WordVec 8 W16) = 759-primOpTag (VecAddOp WordVec 4 W32) = 760-primOpTag (VecAddOp WordVec 2 W64) = 761-primOpTag (VecAddOp WordVec 32 W8) = 762-primOpTag (VecAddOp WordVec 16 W16) = 763-primOpTag (VecAddOp WordVec 8 W32) = 764-primOpTag (VecAddOp WordVec 4 W64) = 765-primOpTag (VecAddOp WordVec 64 W8) = 766-primOpTag (VecAddOp WordVec 32 W16) = 767-primOpTag (VecAddOp WordVec 16 W32) = 768-primOpTag (VecAddOp WordVec 8 W64) = 769-primOpTag (VecAddOp FloatVec 4 W32) = 770-primOpTag (VecAddOp FloatVec 2 W64) = 771-primOpTag (VecAddOp FloatVec 8 W32) = 772-primOpTag (VecAddOp FloatVec 4 W64) = 773-primOpTag (VecAddOp FloatVec 16 W32) = 774-primOpTag (VecAddOp FloatVec 8 W64) = 775-primOpTag (VecSubOp IntVec 16 W8) = 776-primOpTag (VecSubOp IntVec 8 W16) = 777-primOpTag (VecSubOp IntVec 4 W32) = 778-primOpTag (VecSubOp IntVec 2 W64) = 779-primOpTag (VecSubOp IntVec 32 W8) = 780-primOpTag (VecSubOp IntVec 16 W16) = 781-primOpTag (VecSubOp IntVec 8 W32) = 782-primOpTag (VecSubOp IntVec 4 W64) = 783-primOpTag (VecSubOp IntVec 64 W8) = 784-primOpTag (VecSubOp IntVec 32 W16) = 785-primOpTag (VecSubOp IntVec 16 W32) = 786-primOpTag (VecSubOp IntVec 8 W64) = 787-primOpTag (VecSubOp WordVec 16 W8) = 788-primOpTag (VecSubOp WordVec 8 W16) = 789-primOpTag (VecSubOp WordVec 4 W32) = 790-primOpTag (VecSubOp WordVec 2 W64) = 791-primOpTag (VecSubOp WordVec 32 W8) = 792-primOpTag (VecSubOp WordVec 16 W16) = 793-primOpTag (VecSubOp WordVec 8 W32) = 794-primOpTag (VecSubOp WordVec 4 W64) = 795-primOpTag (VecSubOp WordVec 64 W8) = 796-primOpTag (VecSubOp WordVec 32 W16) = 797-primOpTag (VecSubOp WordVec 16 W32) = 798-primOpTag (VecSubOp WordVec 8 W64) = 799-primOpTag (VecSubOp FloatVec 4 W32) = 800-primOpTag (VecSubOp FloatVec 2 W64) = 801-primOpTag (VecSubOp FloatVec 8 W32) = 802-primOpTag (VecSubOp FloatVec 4 W64) = 803-primOpTag (VecSubOp FloatVec 16 W32) = 804-primOpTag (VecSubOp FloatVec 8 W64) = 805-primOpTag (VecMulOp IntVec 16 W8) = 806-primOpTag (VecMulOp IntVec 8 W16) = 807-primOpTag (VecMulOp IntVec 4 W32) = 808-primOpTag (VecMulOp IntVec 2 W64) = 809-primOpTag (VecMulOp IntVec 32 W8) = 810-primOpTag (VecMulOp IntVec 16 W16) = 811-primOpTag (VecMulOp IntVec 8 W32) = 812-primOpTag (VecMulOp IntVec 4 W64) = 813-primOpTag (VecMulOp IntVec 64 W8) = 814-primOpTag (VecMulOp IntVec 32 W16) = 815-primOpTag (VecMulOp IntVec 16 W32) = 816-primOpTag (VecMulOp IntVec 8 W64) = 817-primOpTag (VecMulOp WordVec 16 W8) = 818-primOpTag (VecMulOp WordVec 8 W16) = 819-primOpTag (VecMulOp WordVec 4 W32) = 820-primOpTag (VecMulOp WordVec 2 W64) = 821-primOpTag (VecMulOp WordVec 32 W8) = 822-primOpTag (VecMulOp WordVec 16 W16) = 823-primOpTag (VecMulOp WordVec 8 W32) = 824-primOpTag (VecMulOp WordVec 4 W64) = 825-primOpTag (VecMulOp WordVec 64 W8) = 826-primOpTag (VecMulOp WordVec 32 W16) = 827-primOpTag (VecMulOp WordVec 16 W32) = 828-primOpTag (VecMulOp WordVec 8 W64) = 829-primOpTag (VecMulOp FloatVec 4 W32) = 830-primOpTag (VecMulOp FloatVec 2 W64) = 831-primOpTag (VecMulOp FloatVec 8 W32) = 832-primOpTag (VecMulOp FloatVec 4 W64) = 833-primOpTag (VecMulOp FloatVec 16 W32) = 834-primOpTag (VecMulOp FloatVec 8 W64) = 835-primOpTag (VecDivOp FloatVec 4 W32) = 836-primOpTag (VecDivOp FloatVec 2 W64) = 837-primOpTag (VecDivOp FloatVec 8 W32) = 838-primOpTag (VecDivOp FloatVec 4 W64) = 839-primOpTag (VecDivOp FloatVec 16 W32) = 840-primOpTag (VecDivOp FloatVec 8 W64) = 841-primOpTag (VecQuotOp IntVec 16 W8) = 842-primOpTag (VecQuotOp IntVec 8 W16) = 843-primOpTag (VecQuotOp IntVec 4 W32) = 844-primOpTag (VecQuotOp IntVec 2 W64) = 845-primOpTag (VecQuotOp IntVec 32 W8) = 846-primOpTag (VecQuotOp IntVec 16 W16) = 847-primOpTag (VecQuotOp IntVec 8 W32) = 848-primOpTag (VecQuotOp IntVec 4 W64) = 849-primOpTag (VecQuotOp IntVec 64 W8) = 850-primOpTag (VecQuotOp IntVec 32 W16) = 851-primOpTag (VecQuotOp IntVec 16 W32) = 852-primOpTag (VecQuotOp IntVec 8 W64) = 853-primOpTag (VecQuotOp WordVec 16 W8) = 854-primOpTag (VecQuotOp WordVec 8 W16) = 855-primOpTag (VecQuotOp WordVec 4 W32) = 856-primOpTag (VecQuotOp WordVec 2 W64) = 857-primOpTag (VecQuotOp WordVec 32 W8) = 858-primOpTag (VecQuotOp WordVec 16 W16) = 859-primOpTag (VecQuotOp WordVec 8 W32) = 860-primOpTag (VecQuotOp WordVec 4 W64) = 861-primOpTag (VecQuotOp WordVec 64 W8) = 862-primOpTag (VecQuotOp WordVec 32 W16) = 863-primOpTag (VecQuotOp WordVec 16 W32) = 864-primOpTag (VecQuotOp WordVec 8 W64) = 865-primOpTag (VecRemOp IntVec 16 W8) = 866-primOpTag (VecRemOp IntVec 8 W16) = 867-primOpTag (VecRemOp IntVec 4 W32) = 868-primOpTag (VecRemOp IntVec 2 W64) = 869-primOpTag (VecRemOp IntVec 32 W8) = 870-primOpTag (VecRemOp IntVec 16 W16) = 871-primOpTag (VecRemOp IntVec 8 W32) = 872-primOpTag (VecRemOp IntVec 4 W64) = 873-primOpTag (VecRemOp IntVec 64 W8) = 874-primOpTag (VecRemOp IntVec 32 W16) = 875-primOpTag (VecRemOp IntVec 16 W32) = 876-primOpTag (VecRemOp IntVec 8 W64) = 877-primOpTag (VecRemOp WordVec 16 W8) = 878-primOpTag (VecRemOp WordVec 8 W16) = 879-primOpTag (VecRemOp WordVec 4 W32) = 880-primOpTag (VecRemOp WordVec 2 W64) = 881-primOpTag (VecRemOp WordVec 32 W8) = 882-primOpTag (VecRemOp WordVec 16 W16) = 883-primOpTag (VecRemOp WordVec 8 W32) = 884-primOpTag (VecRemOp WordVec 4 W64) = 885-primOpTag (VecRemOp WordVec 64 W8) = 886-primOpTag (VecRemOp WordVec 32 W16) = 887-primOpTag (VecRemOp WordVec 16 W32) = 888-primOpTag (VecRemOp WordVec 8 W64) = 889-primOpTag (VecNegOp IntVec 16 W8) = 890-primOpTag (VecNegOp IntVec 8 W16) = 891-primOpTag (VecNegOp IntVec 4 W32) = 892-primOpTag (VecNegOp IntVec 2 W64) = 893-primOpTag (VecNegOp IntVec 32 W8) = 894-primOpTag (VecNegOp IntVec 16 W16) = 895-primOpTag (VecNegOp IntVec 8 W32) = 896-primOpTag (VecNegOp IntVec 4 W64) = 897-primOpTag (VecNegOp IntVec 64 W8) = 898-primOpTag (VecNegOp IntVec 32 W16) = 899-primOpTag (VecNegOp IntVec 16 W32) = 900-primOpTag (VecNegOp IntVec 8 W64) = 901-primOpTag (VecNegOp FloatVec 4 W32) = 902-primOpTag (VecNegOp FloatVec 2 W64) = 903-primOpTag (VecNegOp FloatVec 8 W32) = 904-primOpTag (VecNegOp FloatVec 4 W64) = 905-primOpTag (VecNegOp FloatVec 16 W32) = 906-primOpTag (VecNegOp FloatVec 8 W64) = 907-primOpTag (VecIndexByteArrayOp IntVec 16 W8) = 908-primOpTag (VecIndexByteArrayOp IntVec 8 W16) = 909-primOpTag (VecIndexByteArrayOp IntVec 4 W32) = 910-primOpTag (VecIndexByteArrayOp IntVec 2 W64) = 911-primOpTag (VecIndexByteArrayOp IntVec 32 W8) = 912-primOpTag (VecIndexByteArrayOp IntVec 16 W16) = 913-primOpTag (VecIndexByteArrayOp IntVec 8 W32) = 914-primOpTag (VecIndexByteArrayOp IntVec 4 W64) = 915-primOpTag (VecIndexByteArrayOp IntVec 64 W8) = 916-primOpTag (VecIndexByteArrayOp IntVec 32 W16) = 917-primOpTag (VecIndexByteArrayOp IntVec 16 W32) = 918-primOpTag (VecIndexByteArrayOp IntVec 8 W64) = 919-primOpTag (VecIndexByteArrayOp WordVec 16 W8) = 920-primOpTag (VecIndexByteArrayOp WordVec 8 W16) = 921-primOpTag (VecIndexByteArrayOp WordVec 4 W32) = 922-primOpTag (VecIndexByteArrayOp WordVec 2 W64) = 923-primOpTag (VecIndexByteArrayOp WordVec 32 W8) = 924-primOpTag (VecIndexByteArrayOp WordVec 16 W16) = 925-primOpTag (VecIndexByteArrayOp WordVec 8 W32) = 926-primOpTag (VecIndexByteArrayOp WordVec 4 W64) = 927-primOpTag (VecIndexByteArrayOp WordVec 64 W8) = 928-primOpTag (VecIndexByteArrayOp WordVec 32 W16) = 929-primOpTag (VecIndexByteArrayOp WordVec 16 W32) = 930-primOpTag (VecIndexByteArrayOp WordVec 8 W64) = 931-primOpTag (VecIndexByteArrayOp FloatVec 4 W32) = 932-primOpTag (VecIndexByteArrayOp FloatVec 2 W64) = 933-primOpTag (VecIndexByteArrayOp FloatVec 8 W32) = 934-primOpTag (VecIndexByteArrayOp FloatVec 4 W64) = 935-primOpTag (VecIndexByteArrayOp FloatVec 16 W32) = 936-primOpTag (VecIndexByteArrayOp FloatVec 8 W64) = 937-primOpTag (VecReadByteArrayOp IntVec 16 W8) = 938-primOpTag (VecReadByteArrayOp IntVec 8 W16) = 939-primOpTag (VecReadByteArrayOp IntVec 4 W32) = 940-primOpTag (VecReadByteArrayOp IntVec 2 W64) = 941-primOpTag (VecReadByteArrayOp IntVec 32 W8) = 942-primOpTag (VecReadByteArrayOp IntVec 16 W16) = 943-primOpTag (VecReadByteArrayOp IntVec 8 W32) = 944-primOpTag (VecReadByteArrayOp IntVec 4 W64) = 945-primOpTag (VecReadByteArrayOp IntVec 64 W8) = 946-primOpTag (VecReadByteArrayOp IntVec 32 W16) = 947-primOpTag (VecReadByteArrayOp IntVec 16 W32) = 948-primOpTag (VecReadByteArrayOp IntVec 8 W64) = 949-primOpTag (VecReadByteArrayOp WordVec 16 W8) = 950-primOpTag (VecReadByteArrayOp WordVec 8 W16) = 951-primOpTag (VecReadByteArrayOp WordVec 4 W32) = 952-primOpTag (VecReadByteArrayOp WordVec 2 W64) = 953-primOpTag (VecReadByteArrayOp WordVec 32 W8) = 954-primOpTag (VecReadByteArrayOp WordVec 16 W16) = 955-primOpTag (VecReadByteArrayOp WordVec 8 W32) = 956-primOpTag (VecReadByteArrayOp WordVec 4 W64) = 957-primOpTag (VecReadByteArrayOp WordVec 64 W8) = 958-primOpTag (VecReadByteArrayOp WordVec 32 W16) = 959-primOpTag (VecReadByteArrayOp WordVec 16 W32) = 960-primOpTag (VecReadByteArrayOp WordVec 8 W64) = 961-primOpTag (VecReadByteArrayOp FloatVec 4 W32) = 962-primOpTag (VecReadByteArrayOp FloatVec 2 W64) = 963-primOpTag (VecReadByteArrayOp FloatVec 8 W32) = 964-primOpTag (VecReadByteArrayOp FloatVec 4 W64) = 965-primOpTag (VecReadByteArrayOp FloatVec 16 W32) = 966-primOpTag (VecReadByteArrayOp FloatVec 8 W64) = 967-primOpTag (VecWriteByteArrayOp IntVec 16 W8) = 968-primOpTag (VecWriteByteArrayOp IntVec 8 W16) = 969-primOpTag (VecWriteByteArrayOp IntVec 4 W32) = 970-primOpTag (VecWriteByteArrayOp IntVec 2 W64) = 971-primOpTag (VecWriteByteArrayOp IntVec 32 W8) = 972-primOpTag (VecWriteByteArrayOp IntVec 16 W16) = 973-primOpTag (VecWriteByteArrayOp IntVec 8 W32) = 974-primOpTag (VecWriteByteArrayOp IntVec 4 W64) = 975-primOpTag (VecWriteByteArrayOp IntVec 64 W8) = 976-primOpTag (VecWriteByteArrayOp IntVec 32 W16) = 977-primOpTag (VecWriteByteArrayOp IntVec 16 W32) = 978-primOpTag (VecWriteByteArrayOp IntVec 8 W64) = 979-primOpTag (VecWriteByteArrayOp WordVec 16 W8) = 980-primOpTag (VecWriteByteArrayOp WordVec 8 W16) = 981-primOpTag (VecWriteByteArrayOp WordVec 4 W32) = 982-primOpTag (VecWriteByteArrayOp WordVec 2 W64) = 983-primOpTag (VecWriteByteArrayOp WordVec 32 W8) = 984-primOpTag (VecWriteByteArrayOp WordVec 16 W16) = 985-primOpTag (VecWriteByteArrayOp WordVec 8 W32) = 986-primOpTag (VecWriteByteArrayOp WordVec 4 W64) = 987-primOpTag (VecWriteByteArrayOp WordVec 64 W8) = 988-primOpTag (VecWriteByteArrayOp WordVec 32 W16) = 989-primOpTag (VecWriteByteArrayOp WordVec 16 W32) = 990-primOpTag (VecWriteByteArrayOp WordVec 8 W64) = 991-primOpTag (VecWriteByteArrayOp FloatVec 4 W32) = 992-primOpTag (VecWriteByteArrayOp FloatVec 2 W64) = 993-primOpTag (VecWriteByteArrayOp FloatVec 8 W32) = 994-primOpTag (VecWriteByteArrayOp FloatVec 4 W64) = 995-primOpTag (VecWriteByteArrayOp FloatVec 16 W32) = 996-primOpTag (VecWriteByteArrayOp FloatVec 8 W64) = 997-primOpTag (VecIndexOffAddrOp IntVec 16 W8) = 998-primOpTag (VecIndexOffAddrOp IntVec 8 W16) = 999-primOpTag (VecIndexOffAddrOp IntVec 4 W32) = 1000-primOpTag (VecIndexOffAddrOp IntVec 2 W64) = 1001-primOpTag (VecIndexOffAddrOp IntVec 32 W8) = 1002-primOpTag (VecIndexOffAddrOp IntVec 16 W16) = 1003-primOpTag (VecIndexOffAddrOp IntVec 8 W32) = 1004-primOpTag (VecIndexOffAddrOp IntVec 4 W64) = 1005-primOpTag (VecIndexOffAddrOp IntVec 64 W8) = 1006-primOpTag (VecIndexOffAddrOp IntVec 32 W16) = 1007-primOpTag (VecIndexOffAddrOp IntVec 16 W32) = 1008-primOpTag (VecIndexOffAddrOp IntVec 8 W64) = 1009-primOpTag (VecIndexOffAddrOp WordVec 16 W8) = 1010-primOpTag (VecIndexOffAddrOp WordVec 8 W16) = 1011-primOpTag (VecIndexOffAddrOp WordVec 4 W32) = 1012-primOpTag (VecIndexOffAddrOp WordVec 2 W64) = 1013-primOpTag (VecIndexOffAddrOp WordVec 32 W8) = 1014-primOpTag (VecIndexOffAddrOp WordVec 16 W16) = 1015-primOpTag (VecIndexOffAddrOp WordVec 8 W32) = 1016-primOpTag (VecIndexOffAddrOp WordVec 4 W64) = 1017-primOpTag (VecIndexOffAddrOp WordVec 64 W8) = 1018-primOpTag (VecIndexOffAddrOp WordVec 32 W16) = 1019-primOpTag (VecIndexOffAddrOp WordVec 16 W32) = 1020-primOpTag (VecIndexOffAddrOp WordVec 8 W64) = 1021-primOpTag (VecIndexOffAddrOp FloatVec 4 W32) = 1022-primOpTag (VecIndexOffAddrOp FloatVec 2 W64) = 1023-primOpTag (VecIndexOffAddrOp FloatVec 8 W32) = 1024-primOpTag (VecIndexOffAddrOp FloatVec 4 W64) = 1025-primOpTag (VecIndexOffAddrOp FloatVec 16 W32) = 1026-primOpTag (VecIndexOffAddrOp FloatVec 8 W64) = 1027-primOpTag (VecReadOffAddrOp IntVec 16 W8) = 1028-primOpTag (VecReadOffAddrOp IntVec 8 W16) = 1029-primOpTag (VecReadOffAddrOp IntVec 4 W32) = 1030-primOpTag (VecReadOffAddrOp IntVec 2 W64) = 1031-primOpTag (VecReadOffAddrOp IntVec 32 W8) = 1032-primOpTag (VecReadOffAddrOp IntVec 16 W16) = 1033-primOpTag (VecReadOffAddrOp IntVec 8 W32) = 1034-primOpTag (VecReadOffAddrOp IntVec 4 W64) = 1035-primOpTag (VecReadOffAddrOp IntVec 64 W8) = 1036-primOpTag (VecReadOffAddrOp IntVec 32 W16) = 1037-primOpTag (VecReadOffAddrOp IntVec 16 W32) = 1038-primOpTag (VecReadOffAddrOp IntVec 8 W64) = 1039-primOpTag (VecReadOffAddrOp WordVec 16 W8) = 1040-primOpTag (VecReadOffAddrOp WordVec 8 W16) = 1041-primOpTag (VecReadOffAddrOp WordVec 4 W32) = 1042-primOpTag (VecReadOffAddrOp WordVec 2 W64) = 1043-primOpTag (VecReadOffAddrOp WordVec 32 W8) = 1044-primOpTag (VecReadOffAddrOp WordVec 16 W16) = 1045-primOpTag (VecReadOffAddrOp WordVec 8 W32) = 1046-primOpTag (VecReadOffAddrOp WordVec 4 W64) = 1047-primOpTag (VecReadOffAddrOp WordVec 64 W8) = 1048-primOpTag (VecReadOffAddrOp WordVec 32 W16) = 1049-primOpTag (VecReadOffAddrOp WordVec 16 W32) = 1050-primOpTag (VecReadOffAddrOp WordVec 8 W64) = 1051-primOpTag (VecReadOffAddrOp FloatVec 4 W32) = 1052-primOpTag (VecReadOffAddrOp FloatVec 2 W64) = 1053-primOpTag (VecReadOffAddrOp FloatVec 8 W32) = 1054-primOpTag (VecReadOffAddrOp FloatVec 4 W64) = 1055-primOpTag (VecReadOffAddrOp FloatVec 16 W32) = 1056-primOpTag (VecReadOffAddrOp FloatVec 8 W64) = 1057-primOpTag (VecWriteOffAddrOp IntVec 16 W8) = 1058-primOpTag (VecWriteOffAddrOp IntVec 8 W16) = 1059-primOpTag (VecWriteOffAddrOp IntVec 4 W32) = 1060-primOpTag (VecWriteOffAddrOp IntVec 2 W64) = 1061-primOpTag (VecWriteOffAddrOp IntVec 32 W8) = 1062-primOpTag (VecWriteOffAddrOp IntVec 16 W16) = 1063-primOpTag (VecWriteOffAddrOp IntVec 8 W32) = 1064-primOpTag (VecWriteOffAddrOp IntVec 4 W64) = 1065-primOpTag (VecWriteOffAddrOp IntVec 64 W8) = 1066-primOpTag (VecWriteOffAddrOp IntVec 32 W16) = 1067-primOpTag (VecWriteOffAddrOp IntVec 16 W32) = 1068-primOpTag (VecWriteOffAddrOp IntVec 8 W64) = 1069-primOpTag (VecWriteOffAddrOp WordVec 16 W8) = 1070-primOpTag (VecWriteOffAddrOp WordVec 8 W16) = 1071-primOpTag (VecWriteOffAddrOp WordVec 4 W32) = 1072-primOpTag (VecWriteOffAddrOp WordVec 2 W64) = 1073-primOpTag (VecWriteOffAddrOp WordVec 32 W8) = 1074-primOpTag (VecWriteOffAddrOp WordVec 16 W16) = 1075-primOpTag (VecWriteOffAddrOp WordVec 8 W32) = 1076-primOpTag (VecWriteOffAddrOp WordVec 4 W64) = 1077-primOpTag (VecWriteOffAddrOp WordVec 64 W8) = 1078-primOpTag (VecWriteOffAddrOp WordVec 32 W16) = 1079-primOpTag (VecWriteOffAddrOp WordVec 16 W32) = 1080-primOpTag (VecWriteOffAddrOp WordVec 8 W64) = 1081-primOpTag (VecWriteOffAddrOp FloatVec 4 W32) = 1082-primOpTag (VecWriteOffAddrOp FloatVec 2 W64) = 1083-primOpTag (VecWriteOffAddrOp FloatVec 8 W32) = 1084-primOpTag (VecWriteOffAddrOp FloatVec 4 W64) = 1085-primOpTag (VecWriteOffAddrOp FloatVec 16 W32) = 1086-primOpTag (VecWriteOffAddrOp FloatVec 8 W64) = 1087-primOpTag (VecIndexScalarByteArrayOp IntVec 16 W8) = 1088-primOpTag (VecIndexScalarByteArrayOp IntVec 8 W16) = 1089-primOpTag (VecIndexScalarByteArrayOp IntVec 4 W32) = 1090-primOpTag (VecIndexScalarByteArrayOp IntVec 2 W64) = 1091-primOpTag (VecIndexScalarByteArrayOp IntVec 32 W8) = 1092-primOpTag (VecIndexScalarByteArrayOp IntVec 16 W16) = 1093-primOpTag (VecIndexScalarByteArrayOp IntVec 8 W32) = 1094-primOpTag (VecIndexScalarByteArrayOp IntVec 4 W64) = 1095-primOpTag (VecIndexScalarByteArrayOp IntVec 64 W8) = 1096-primOpTag (VecIndexScalarByteArrayOp IntVec 32 W16) = 1097-primOpTag (VecIndexScalarByteArrayOp IntVec 16 W32) = 1098-primOpTag (VecIndexScalarByteArrayOp IntVec 8 W64) = 1099-primOpTag (VecIndexScalarByteArrayOp WordVec 16 W8) = 1100-primOpTag (VecIndexScalarByteArrayOp WordVec 8 W16) = 1101-primOpTag (VecIndexScalarByteArrayOp WordVec 4 W32) = 1102-primOpTag (VecIndexScalarByteArrayOp WordVec 2 W64) = 1103-primOpTag (VecIndexScalarByteArrayOp WordVec 32 W8) = 1104-primOpTag (VecIndexScalarByteArrayOp WordVec 16 W16) = 1105-primOpTag (VecIndexScalarByteArrayOp WordVec 8 W32) = 1106-primOpTag (VecIndexScalarByteArrayOp WordVec 4 W64) = 1107-primOpTag (VecIndexScalarByteArrayOp WordVec 64 W8) = 1108-primOpTag (VecIndexScalarByteArrayOp WordVec 32 W16) = 1109-primOpTag (VecIndexScalarByteArrayOp WordVec 16 W32) = 1110-primOpTag (VecIndexScalarByteArrayOp WordVec 8 W64) = 1111-primOpTag (VecIndexScalarByteArrayOp FloatVec 4 W32) = 1112-primOpTag (VecIndexScalarByteArrayOp FloatVec 2 W64) = 1113-primOpTag (VecIndexScalarByteArrayOp FloatVec 8 W32) = 1114-primOpTag (VecIndexScalarByteArrayOp FloatVec 4 W64) = 1115-primOpTag (VecIndexScalarByteArrayOp FloatVec 16 W32) = 1116-primOpTag (VecIndexScalarByteArrayOp FloatVec 8 W64) = 1117-primOpTag (VecReadScalarByteArrayOp IntVec 16 W8) = 1118-primOpTag (VecReadScalarByteArrayOp IntVec 8 W16) = 1119-primOpTag (VecReadScalarByteArrayOp IntVec 4 W32) = 1120-primOpTag (VecReadScalarByteArrayOp IntVec 2 W64) = 1121-primOpTag (VecReadScalarByteArrayOp IntVec 32 W8) = 1122-primOpTag (VecReadScalarByteArrayOp IntVec 16 W16) = 1123-primOpTag (VecReadScalarByteArrayOp IntVec 8 W32) = 1124-primOpTag (VecReadScalarByteArrayOp IntVec 4 W64) = 1125-primOpTag (VecReadScalarByteArrayOp IntVec 64 W8) = 1126-primOpTag (VecReadScalarByteArrayOp IntVec 32 W16) = 1127-primOpTag (VecReadScalarByteArrayOp IntVec 16 W32) = 1128-primOpTag (VecReadScalarByteArrayOp IntVec 8 W64) = 1129-primOpTag (VecReadScalarByteArrayOp WordVec 16 W8) = 1130-primOpTag (VecReadScalarByteArrayOp WordVec 8 W16) = 1131-primOpTag (VecReadScalarByteArrayOp WordVec 4 W32) = 1132-primOpTag (VecReadScalarByteArrayOp WordVec 2 W64) = 1133-primOpTag (VecReadScalarByteArrayOp WordVec 32 W8) = 1134-primOpTag (VecReadScalarByteArrayOp WordVec 16 W16) = 1135-primOpTag (VecReadScalarByteArrayOp WordVec 8 W32) = 1136-primOpTag (VecReadScalarByteArrayOp WordVec 4 W64) = 1137-primOpTag (VecReadScalarByteArrayOp WordVec 64 W8) = 1138-primOpTag (VecReadScalarByteArrayOp WordVec 32 W16) = 1139-primOpTag (VecReadScalarByteArrayOp WordVec 16 W32) = 1140-primOpTag (VecReadScalarByteArrayOp WordVec 8 W64) = 1141-primOpTag (VecReadScalarByteArrayOp FloatVec 4 W32) = 1142-primOpTag (VecReadScalarByteArrayOp FloatVec 2 W64) = 1143-primOpTag (VecReadScalarByteArrayOp FloatVec 8 W32) = 1144-primOpTag (VecReadScalarByteArrayOp FloatVec 4 W64) = 1145-primOpTag (VecReadScalarByteArrayOp FloatVec 16 W32) = 1146-primOpTag (VecReadScalarByteArrayOp FloatVec 8 W64) = 1147-primOpTag (VecWriteScalarByteArrayOp IntVec 16 W8) = 1148-primOpTag (VecWriteScalarByteArrayOp IntVec 8 W16) = 1149-primOpTag (VecWriteScalarByteArrayOp IntVec 4 W32) = 1150-primOpTag (VecWriteScalarByteArrayOp IntVec 2 W64) = 1151-primOpTag (VecWriteScalarByteArrayOp IntVec 32 W8) = 1152-primOpTag (VecWriteScalarByteArrayOp IntVec 16 W16) = 1153-primOpTag (VecWriteScalarByteArrayOp IntVec 8 W32) = 1154-primOpTag (VecWriteScalarByteArrayOp IntVec 4 W64) = 1155-primOpTag (VecWriteScalarByteArrayOp IntVec 64 W8) = 1156-primOpTag (VecWriteScalarByteArrayOp IntVec 32 W16) = 1157-primOpTag (VecWriteScalarByteArrayOp IntVec 16 W32) = 1158-primOpTag (VecWriteScalarByteArrayOp IntVec 8 W64) = 1159-primOpTag (VecWriteScalarByteArrayOp WordVec 16 W8) = 1160-primOpTag (VecWriteScalarByteArrayOp WordVec 8 W16) = 1161-primOpTag (VecWriteScalarByteArrayOp WordVec 4 W32) = 1162-primOpTag (VecWriteScalarByteArrayOp WordVec 2 W64) = 1163-primOpTag (VecWriteScalarByteArrayOp WordVec 32 W8) = 1164-primOpTag (VecWriteScalarByteArrayOp WordVec 16 W16) = 1165-primOpTag (VecWriteScalarByteArrayOp WordVec 8 W32) = 1166-primOpTag (VecWriteScalarByteArrayOp WordVec 4 W64) = 1167-primOpTag (VecWriteScalarByteArrayOp WordVec 64 W8) = 1168-primOpTag (VecWriteScalarByteArrayOp WordVec 32 W16) = 1169-primOpTag (VecWriteScalarByteArrayOp WordVec 16 W32) = 1170-primOpTag (VecWriteScalarByteArrayOp WordVec 8 W64) = 1171-primOpTag (VecWriteScalarByteArrayOp FloatVec 4 W32) = 1172-primOpTag (VecWriteScalarByteArrayOp FloatVec 2 W64) = 1173-primOpTag (VecWriteScalarByteArrayOp FloatVec 8 W32) = 1174-primOpTag (VecWriteScalarByteArrayOp FloatVec 4 W64) = 1175-primOpTag (VecWriteScalarByteArrayOp FloatVec 16 W32) = 1176-primOpTag (VecWriteScalarByteArrayOp FloatVec 8 W64) = 1177-primOpTag (VecIndexScalarOffAddrOp IntVec 16 W8) = 1178-primOpTag (VecIndexScalarOffAddrOp IntVec 8 W16) = 1179-primOpTag (VecIndexScalarOffAddrOp IntVec 4 W32) = 1180-primOpTag (VecIndexScalarOffAddrOp IntVec 2 W64) = 1181-primOpTag (VecIndexScalarOffAddrOp IntVec 32 W8) = 1182-primOpTag (VecIndexScalarOffAddrOp IntVec 16 W16) = 1183-primOpTag (VecIndexScalarOffAddrOp IntVec 8 W32) = 1184-primOpTag (VecIndexScalarOffAddrOp IntVec 4 W64) = 1185-primOpTag (VecIndexScalarOffAddrOp IntVec 64 W8) = 1186-primOpTag (VecIndexScalarOffAddrOp IntVec 32 W16) = 1187-primOpTag (VecIndexScalarOffAddrOp IntVec 16 W32) = 1188-primOpTag (VecIndexScalarOffAddrOp IntVec 8 W64) = 1189-primOpTag (VecIndexScalarOffAddrOp WordVec 16 W8) = 1190-primOpTag (VecIndexScalarOffAddrOp WordVec 8 W16) = 1191-primOpTag (VecIndexScalarOffAddrOp WordVec 4 W32) = 1192-primOpTag (VecIndexScalarOffAddrOp WordVec 2 W64) = 1193-primOpTag (VecIndexScalarOffAddrOp WordVec 32 W8) = 1194-primOpTag (VecIndexScalarOffAddrOp WordVec 16 W16) = 1195-primOpTag (VecIndexScalarOffAddrOp WordVec 8 W32) = 1196-primOpTag (VecIndexScalarOffAddrOp WordVec 4 W64) = 1197-primOpTag (VecIndexScalarOffAddrOp WordVec 64 W8) = 1198-primOpTag (VecIndexScalarOffAddrOp WordVec 32 W16) = 1199-primOpTag (VecIndexScalarOffAddrOp WordVec 16 W32) = 1200-primOpTag (VecIndexScalarOffAddrOp WordVec 8 W64) = 1201-primOpTag (VecIndexScalarOffAddrOp FloatVec 4 W32) = 1202-primOpTag (VecIndexScalarOffAddrOp FloatVec 2 W64) = 1203-primOpTag (VecIndexScalarOffAddrOp FloatVec 8 W32) = 1204-primOpTag (VecIndexScalarOffAddrOp FloatVec 4 W64) = 1205-primOpTag (VecIndexScalarOffAddrOp FloatVec 16 W32) = 1206-primOpTag (VecIndexScalarOffAddrOp FloatVec 8 W64) = 1207-primOpTag (VecReadScalarOffAddrOp IntVec 16 W8) = 1208-primOpTag (VecReadScalarOffAddrOp IntVec 8 W16) = 1209-primOpTag (VecReadScalarOffAddrOp IntVec 4 W32) = 1210-primOpTag (VecReadScalarOffAddrOp IntVec 2 W64) = 1211-primOpTag (VecReadScalarOffAddrOp IntVec 32 W8) = 1212-primOpTag (VecReadScalarOffAddrOp IntVec 16 W16) = 1213-primOpTag (VecReadScalarOffAddrOp IntVec 8 W32) = 1214-primOpTag (VecReadScalarOffAddrOp IntVec 4 W64) = 1215-primOpTag (VecReadScalarOffAddrOp IntVec 64 W8) = 1216-primOpTag (VecReadScalarOffAddrOp IntVec 32 W16) = 1217-primOpTag (VecReadScalarOffAddrOp IntVec 16 W32) = 1218-primOpTag (VecReadScalarOffAddrOp IntVec 8 W64) = 1219-primOpTag (VecReadScalarOffAddrOp WordVec 16 W8) = 1220-primOpTag (VecReadScalarOffAddrOp WordVec 8 W16) = 1221-primOpTag (VecReadScalarOffAddrOp WordVec 4 W32) = 1222-primOpTag (VecReadScalarOffAddrOp WordVec 2 W64) = 1223-primOpTag (VecReadScalarOffAddrOp WordVec 32 W8) = 1224-primOpTag (VecReadScalarOffAddrOp WordVec 16 W16) = 1225-primOpTag (VecReadScalarOffAddrOp WordVec 8 W32) = 1226-primOpTag (VecReadScalarOffAddrOp WordVec 4 W64) = 1227-primOpTag (VecReadScalarOffAddrOp WordVec 64 W8) = 1228-primOpTag (VecReadScalarOffAddrOp WordVec 32 W16) = 1229-primOpTag (VecReadScalarOffAddrOp WordVec 16 W32) = 1230-primOpTag (VecReadScalarOffAddrOp WordVec 8 W64) = 1231-primOpTag (VecReadScalarOffAddrOp FloatVec 4 W32) = 1232-primOpTag (VecReadScalarOffAddrOp FloatVec 2 W64) = 1233-primOpTag (VecReadScalarOffAddrOp FloatVec 8 W32) = 1234-primOpTag (VecReadScalarOffAddrOp FloatVec 4 W64) = 1235-primOpTag (VecReadScalarOffAddrOp FloatVec 16 W32) = 1236-primOpTag (VecReadScalarOffAddrOp FloatVec 8 W64) = 1237-primOpTag (VecWriteScalarOffAddrOp IntVec 16 W8) = 1238-primOpTag (VecWriteScalarOffAddrOp IntVec 8 W16) = 1239-primOpTag (VecWriteScalarOffAddrOp IntVec 4 W32) = 1240-primOpTag (VecWriteScalarOffAddrOp IntVec 2 W64) = 1241-primOpTag (VecWriteScalarOffAddrOp IntVec 32 W8) = 1242-primOpTag (VecWriteScalarOffAddrOp IntVec 16 W16) = 1243-primOpTag (VecWriteScalarOffAddrOp IntVec 8 W32) = 1244-primOpTag (VecWriteScalarOffAddrOp IntVec 4 W64) = 1245-primOpTag (VecWriteScalarOffAddrOp IntVec 64 W8) = 1246-primOpTag (VecWriteScalarOffAddrOp IntVec 32 W16) = 1247-primOpTag (VecWriteScalarOffAddrOp IntVec 16 W32) = 1248-primOpTag (VecWriteScalarOffAddrOp IntVec 8 W64) = 1249-primOpTag (VecWriteScalarOffAddrOp WordVec 16 W8) = 1250-primOpTag (VecWriteScalarOffAddrOp WordVec 8 W16) = 1251-primOpTag (VecWriteScalarOffAddrOp WordVec 4 W32) = 1252-primOpTag (VecWriteScalarOffAddrOp WordVec 2 W64) = 1253-primOpTag (VecWriteScalarOffAddrOp WordVec 32 W8) = 1254-primOpTag (VecWriteScalarOffAddrOp WordVec 16 W16) = 1255-primOpTag (VecWriteScalarOffAddrOp WordVec 8 W32) = 1256-primOpTag (VecWriteScalarOffAddrOp WordVec 4 W64) = 1257-primOpTag (VecWriteScalarOffAddrOp WordVec 64 W8) = 1258-primOpTag (VecWriteScalarOffAddrOp WordVec 32 W16) = 1259-primOpTag (VecWriteScalarOffAddrOp WordVec 16 W32) = 1260-primOpTag (VecWriteScalarOffAddrOp WordVec 8 W64) = 1261-primOpTag (VecWriteScalarOffAddrOp FloatVec 4 W32) = 1262-primOpTag (VecWriteScalarOffAddrOp FloatVec 2 W64) = 1263-primOpTag (VecWriteScalarOffAddrOp FloatVec 8 W32) = 1264-primOpTag (VecWriteScalarOffAddrOp FloatVec 4 W64) = 1265-primOpTag (VecWriteScalarOffAddrOp FloatVec 16 W32) = 1266-primOpTag (VecWriteScalarOffAddrOp FloatVec 8 W64) = 1267-primOpTag PrefetchByteArrayOp3 = 1268-primOpTag PrefetchMutableByteArrayOp3 = 1269-primOpTag PrefetchAddrOp3 = 1270-primOpTag PrefetchValueOp3 = 1271-primOpTag PrefetchByteArrayOp2 = 1272-primOpTag PrefetchMutableByteArrayOp2 = 1273-primOpTag PrefetchAddrOp2 = 1274-primOpTag PrefetchValueOp2 = 1275-primOpTag PrefetchByteArrayOp1 = 1276-primOpTag PrefetchMutableByteArrayOp1 = 1277-primOpTag PrefetchAddrOp1 = 1278-primOpTag PrefetchValueOp1 = 1279-primOpTag PrefetchByteArrayOp0 = 1280-primOpTag PrefetchMutableByteArrayOp0 = 1281-primOpTag PrefetchAddrOp0 = 1282-primOpTag PrefetchValueOp0 = 1283+maxPrimOpTag = 1274+primOpTag :: PrimOp -> Int+primOpTag CharGtOp = 1+primOpTag CharGeOp = 2+primOpTag CharEqOp = 3+primOpTag CharNeOp = 4+primOpTag CharLtOp = 5+primOpTag CharLeOp = 6+primOpTag OrdOp = 7+primOpTag Int8ToIntOp = 8+primOpTag IntToInt8Op = 9+primOpTag Int8NegOp = 10+primOpTag Int8AddOp = 11+primOpTag Int8SubOp = 12+primOpTag Int8MulOp = 13+primOpTag Int8QuotOp = 14+primOpTag Int8RemOp = 15+primOpTag Int8QuotRemOp = 16+primOpTag Int8SllOp = 17+primOpTag Int8SraOp = 18+primOpTag Int8SrlOp = 19+primOpTag Int8ToWord8Op = 20+primOpTag Int8EqOp = 21+primOpTag Int8GeOp = 22+primOpTag Int8GtOp = 23+primOpTag Int8LeOp = 24+primOpTag Int8LtOp = 25+primOpTag Int8NeOp = 26+primOpTag Word8ToWordOp = 27+primOpTag WordToWord8Op = 28+primOpTag Word8AddOp = 29+primOpTag Word8SubOp = 30+primOpTag Word8MulOp = 31+primOpTag Word8QuotOp = 32+primOpTag Word8RemOp = 33+primOpTag Word8QuotRemOp = 34+primOpTag Word8AndOp = 35+primOpTag Word8OrOp = 36+primOpTag Word8XorOp = 37+primOpTag Word8NotOp = 38+primOpTag Word8SllOp = 39+primOpTag Word8SrlOp = 40+primOpTag Word8ToInt8Op = 41+primOpTag Word8EqOp = 42+primOpTag Word8GeOp = 43+primOpTag Word8GtOp = 44+primOpTag Word8LeOp = 45+primOpTag Word8LtOp = 46+primOpTag Word8NeOp = 47+primOpTag Int16ToIntOp = 48+primOpTag IntToInt16Op = 49+primOpTag Int16NegOp = 50+primOpTag Int16AddOp = 51+primOpTag Int16SubOp = 52+primOpTag Int16MulOp = 53+primOpTag Int16QuotOp = 54+primOpTag Int16RemOp = 55+primOpTag Int16QuotRemOp = 56+primOpTag Int16SllOp = 57+primOpTag Int16SraOp = 58+primOpTag Int16SrlOp = 59+primOpTag Int16ToWord16Op = 60+primOpTag Int16EqOp = 61+primOpTag Int16GeOp = 62+primOpTag Int16GtOp = 63+primOpTag Int16LeOp = 64+primOpTag Int16LtOp = 65+primOpTag Int16NeOp = 66+primOpTag Word16ToWordOp = 67+primOpTag WordToWord16Op = 68+primOpTag Word16AddOp = 69+primOpTag Word16SubOp = 70+primOpTag Word16MulOp = 71+primOpTag Word16QuotOp = 72+primOpTag Word16RemOp = 73+primOpTag Word16QuotRemOp = 74+primOpTag Word16AndOp = 75+primOpTag Word16OrOp = 76+primOpTag Word16XorOp = 77+primOpTag Word16NotOp = 78+primOpTag Word16SllOp = 79+primOpTag Word16SrlOp = 80+primOpTag Word16ToInt16Op = 81+primOpTag Word16EqOp = 82+primOpTag Word16GeOp = 83+primOpTag Word16GtOp = 84+primOpTag Word16LeOp = 85+primOpTag Word16LtOp = 86+primOpTag Word16NeOp = 87+primOpTag Int32ToIntOp = 88+primOpTag IntToInt32Op = 89+primOpTag Int32NegOp = 90+primOpTag Int32AddOp = 91+primOpTag Int32SubOp = 92+primOpTag Int32MulOp = 93+primOpTag Int32QuotOp = 94+primOpTag Int32RemOp = 95+primOpTag Int32QuotRemOp = 96+primOpTag Int32SllOp = 97+primOpTag Int32SraOp = 98+primOpTag Int32SrlOp = 99+primOpTag Int32ToWord32Op = 100+primOpTag Int32EqOp = 101+primOpTag Int32GeOp = 102+primOpTag Int32GtOp = 103+primOpTag Int32LeOp = 104+primOpTag Int32LtOp = 105+primOpTag Int32NeOp = 106+primOpTag Word32ToWordOp = 107+primOpTag WordToWord32Op = 108+primOpTag Word32AddOp = 109+primOpTag Word32SubOp = 110+primOpTag Word32MulOp = 111+primOpTag Word32QuotOp = 112+primOpTag Word32RemOp = 113+primOpTag Word32QuotRemOp = 114+primOpTag Word32AndOp = 115+primOpTag Word32OrOp = 116+primOpTag Word32XorOp = 117+primOpTag Word32NotOp = 118+primOpTag Word32SllOp = 119+primOpTag Word32SrlOp = 120+primOpTag Word32ToInt32Op = 121+primOpTag Word32EqOp = 122+primOpTag Word32GeOp = 123+primOpTag Word32GtOp = 124+primOpTag Word32LeOp = 125+primOpTag Word32LtOp = 126+primOpTag Word32NeOp = 127+primOpTag IntAddOp = 128+primOpTag IntSubOp = 129+primOpTag IntMulOp = 130+primOpTag IntMul2Op = 131+primOpTag IntMulMayOfloOp = 132+primOpTag IntQuotOp = 133+primOpTag IntRemOp = 134+primOpTag IntQuotRemOp = 135+primOpTag IntAndOp = 136+primOpTag IntOrOp = 137+primOpTag IntXorOp = 138+primOpTag IntNotOp = 139+primOpTag IntNegOp = 140+primOpTag IntAddCOp = 141+primOpTag IntSubCOp = 142+primOpTag IntGtOp = 143+primOpTag IntGeOp = 144+primOpTag IntEqOp = 145+primOpTag IntNeOp = 146+primOpTag IntLtOp = 147+primOpTag IntLeOp = 148+primOpTag ChrOp = 149+primOpTag IntToWordOp = 150+primOpTag IntToFloatOp = 151+primOpTag IntToDoubleOp = 152+primOpTag WordToFloatOp = 153+primOpTag WordToDoubleOp = 154+primOpTag IntSllOp = 155+primOpTag IntSraOp = 156+primOpTag IntSrlOp = 157+primOpTag WordAddOp = 158+primOpTag WordAddCOp = 159+primOpTag WordSubCOp = 160+primOpTag WordAdd2Op = 161+primOpTag WordSubOp = 162+primOpTag WordMulOp = 163+primOpTag WordMul2Op = 164+primOpTag WordQuotOp = 165+primOpTag WordRemOp = 166+primOpTag WordQuotRemOp = 167+primOpTag WordQuotRem2Op = 168+primOpTag WordAndOp = 169+primOpTag WordOrOp = 170+primOpTag WordXorOp = 171+primOpTag WordNotOp = 172+primOpTag WordSllOp = 173+primOpTag WordSrlOp = 174+primOpTag WordToIntOp = 175+primOpTag WordGtOp = 176+primOpTag WordGeOp = 177+primOpTag WordEqOp = 178+primOpTag WordNeOp = 179+primOpTag WordLtOp = 180+primOpTag WordLeOp = 181+primOpTag PopCnt8Op = 182+primOpTag PopCnt16Op = 183+primOpTag PopCnt32Op = 184+primOpTag PopCnt64Op = 185+primOpTag PopCntOp = 186+primOpTag Pdep8Op = 187+primOpTag Pdep16Op = 188+primOpTag Pdep32Op = 189+primOpTag Pdep64Op = 190+primOpTag PdepOp = 191+primOpTag Pext8Op = 192+primOpTag Pext16Op = 193+primOpTag Pext32Op = 194+primOpTag Pext64Op = 195+primOpTag PextOp = 196+primOpTag Clz8Op = 197+primOpTag Clz16Op = 198+primOpTag Clz32Op = 199+primOpTag Clz64Op = 200+primOpTag ClzOp = 201+primOpTag Ctz8Op = 202+primOpTag Ctz16Op = 203+primOpTag Ctz32Op = 204+primOpTag Ctz64Op = 205+primOpTag CtzOp = 206+primOpTag BSwap16Op = 207+primOpTag BSwap32Op = 208+primOpTag BSwap64Op = 209+primOpTag BSwapOp = 210+primOpTag BRev8Op = 211+primOpTag BRev16Op = 212+primOpTag BRev32Op = 213+primOpTag BRev64Op = 214+primOpTag BRevOp = 215+primOpTag Narrow8IntOp = 216+primOpTag Narrow16IntOp = 217+primOpTag Narrow32IntOp = 218+primOpTag Narrow8WordOp = 219+primOpTag Narrow16WordOp = 220+primOpTag Narrow32WordOp = 221+primOpTag DoubleGtOp = 222+primOpTag DoubleGeOp = 223+primOpTag DoubleEqOp = 224+primOpTag DoubleNeOp = 225+primOpTag DoubleLtOp = 226+primOpTag DoubleLeOp = 227+primOpTag DoubleAddOp = 228+primOpTag DoubleSubOp = 229+primOpTag DoubleMulOp = 230+primOpTag DoubleDivOp = 231+primOpTag DoubleNegOp = 232+primOpTag DoubleFabsOp = 233+primOpTag DoubleToIntOp = 234+primOpTag DoubleToFloatOp = 235+primOpTag DoubleExpOp = 236+primOpTag DoubleExpM1Op = 237+primOpTag DoubleLogOp = 238+primOpTag DoubleLog1POp = 239+primOpTag DoubleSqrtOp = 240+primOpTag DoubleSinOp = 241+primOpTag DoubleCosOp = 242+primOpTag DoubleTanOp = 243+primOpTag DoubleAsinOp = 244+primOpTag DoubleAcosOp = 245+primOpTag DoubleAtanOp = 246+primOpTag DoubleSinhOp = 247+primOpTag DoubleCoshOp = 248+primOpTag DoubleTanhOp = 249+primOpTag DoubleAsinhOp = 250+primOpTag DoubleAcoshOp = 251+primOpTag DoubleAtanhOp = 252+primOpTag DoublePowerOp = 253+primOpTag DoubleDecode_2IntOp = 254+primOpTag DoubleDecode_Int64Op = 255+primOpTag FloatGtOp = 256+primOpTag FloatGeOp = 257+primOpTag FloatEqOp = 258+primOpTag FloatNeOp = 259+primOpTag FloatLtOp = 260+primOpTag FloatLeOp = 261+primOpTag FloatAddOp = 262+primOpTag FloatSubOp = 263+primOpTag FloatMulOp = 264+primOpTag FloatDivOp = 265+primOpTag FloatNegOp = 266+primOpTag FloatFabsOp = 267+primOpTag FloatToIntOp = 268+primOpTag FloatExpOp = 269+primOpTag FloatExpM1Op = 270+primOpTag FloatLogOp = 271+primOpTag FloatLog1POp = 272+primOpTag FloatSqrtOp = 273+primOpTag FloatSinOp = 274+primOpTag FloatCosOp = 275+primOpTag FloatTanOp = 276+primOpTag FloatAsinOp = 277+primOpTag FloatAcosOp = 278+primOpTag FloatAtanOp = 279+primOpTag FloatSinhOp = 280+primOpTag FloatCoshOp = 281+primOpTag FloatTanhOp = 282+primOpTag FloatAsinhOp = 283+primOpTag FloatAcoshOp = 284+primOpTag FloatAtanhOp = 285+primOpTag FloatPowerOp = 286+primOpTag FloatToDoubleOp = 287+primOpTag FloatDecode_IntOp = 288+primOpTag NewArrayOp = 289+primOpTag ReadArrayOp = 290+primOpTag WriteArrayOp = 291+primOpTag SizeofArrayOp = 292+primOpTag SizeofMutableArrayOp = 293+primOpTag IndexArrayOp = 294+primOpTag UnsafeFreezeArrayOp = 295+primOpTag UnsafeThawArrayOp = 296+primOpTag CopyArrayOp = 297+primOpTag CopyMutableArrayOp = 298+primOpTag CloneArrayOp = 299+primOpTag CloneMutableArrayOp = 300+primOpTag FreezeArrayOp = 301+primOpTag ThawArrayOp = 302+primOpTag CasArrayOp = 303+primOpTag NewSmallArrayOp = 304+primOpTag ShrinkSmallMutableArrayOp_Char = 305+primOpTag ReadSmallArrayOp = 306+primOpTag WriteSmallArrayOp = 307+primOpTag SizeofSmallArrayOp = 308+primOpTag SizeofSmallMutableArrayOp = 309+primOpTag GetSizeofSmallMutableArrayOp = 310+primOpTag IndexSmallArrayOp = 311+primOpTag UnsafeFreezeSmallArrayOp = 312+primOpTag UnsafeThawSmallArrayOp = 313+primOpTag CopySmallArrayOp = 314+primOpTag CopySmallMutableArrayOp = 315+primOpTag CloneSmallArrayOp = 316+primOpTag CloneSmallMutableArrayOp = 317+primOpTag FreezeSmallArrayOp = 318+primOpTag ThawSmallArrayOp = 319+primOpTag CasSmallArrayOp = 320+primOpTag NewByteArrayOp_Char = 321+primOpTag NewPinnedByteArrayOp_Char = 322+primOpTag NewAlignedPinnedByteArrayOp_Char = 323+primOpTag MutableByteArrayIsPinnedOp = 324+primOpTag ByteArrayIsPinnedOp = 325+primOpTag ByteArrayContents_Char = 326+primOpTag MutableByteArrayContents_Char = 327+primOpTag ShrinkMutableByteArrayOp_Char = 328+primOpTag ResizeMutableByteArrayOp_Char = 329+primOpTag UnsafeFreezeByteArrayOp = 330+primOpTag SizeofByteArrayOp = 331+primOpTag SizeofMutableByteArrayOp = 332+primOpTag GetSizeofMutableByteArrayOp = 333+primOpTag IndexByteArrayOp_Char = 334+primOpTag IndexByteArrayOp_WideChar = 335+primOpTag IndexByteArrayOp_Int = 336+primOpTag IndexByteArrayOp_Word = 337+primOpTag IndexByteArrayOp_Addr = 338+primOpTag IndexByteArrayOp_Float = 339+primOpTag IndexByteArrayOp_Double = 340+primOpTag IndexByteArrayOp_StablePtr = 341+primOpTag IndexByteArrayOp_Int8 = 342+primOpTag IndexByteArrayOp_Int16 = 343+primOpTag IndexByteArrayOp_Int32 = 344+primOpTag IndexByteArrayOp_Int64 = 345+primOpTag IndexByteArrayOp_Word8 = 346+primOpTag IndexByteArrayOp_Word16 = 347+primOpTag IndexByteArrayOp_Word32 = 348+primOpTag IndexByteArrayOp_Word64 = 349+primOpTag IndexByteArrayOp_Word8AsChar = 350+primOpTag IndexByteArrayOp_Word8AsWideChar = 351+primOpTag IndexByteArrayOp_Word8AsInt = 352+primOpTag IndexByteArrayOp_Word8AsWord = 353+primOpTag IndexByteArrayOp_Word8AsAddr = 354+primOpTag IndexByteArrayOp_Word8AsFloat = 355+primOpTag IndexByteArrayOp_Word8AsDouble = 356+primOpTag IndexByteArrayOp_Word8AsStablePtr = 357+primOpTag IndexByteArrayOp_Word8AsInt16 = 358+primOpTag IndexByteArrayOp_Word8AsInt32 = 359+primOpTag IndexByteArrayOp_Word8AsInt64 = 360+primOpTag IndexByteArrayOp_Word8AsWord16 = 361+primOpTag IndexByteArrayOp_Word8AsWord32 = 362+primOpTag IndexByteArrayOp_Word8AsWord64 = 363+primOpTag ReadByteArrayOp_Char = 364+primOpTag ReadByteArrayOp_WideChar = 365+primOpTag ReadByteArrayOp_Int = 366+primOpTag ReadByteArrayOp_Word = 367+primOpTag ReadByteArrayOp_Addr = 368+primOpTag ReadByteArrayOp_Float = 369+primOpTag ReadByteArrayOp_Double = 370+primOpTag ReadByteArrayOp_StablePtr = 371+primOpTag ReadByteArrayOp_Int8 = 372+primOpTag ReadByteArrayOp_Int16 = 373+primOpTag ReadByteArrayOp_Int32 = 374+primOpTag ReadByteArrayOp_Int64 = 375+primOpTag ReadByteArrayOp_Word8 = 376+primOpTag ReadByteArrayOp_Word16 = 377+primOpTag ReadByteArrayOp_Word32 = 378+primOpTag ReadByteArrayOp_Word64 = 379+primOpTag ReadByteArrayOp_Word8AsChar = 380+primOpTag ReadByteArrayOp_Word8AsWideChar = 381+primOpTag ReadByteArrayOp_Word8AsInt = 382+primOpTag ReadByteArrayOp_Word8AsWord = 383+primOpTag ReadByteArrayOp_Word8AsAddr = 384+primOpTag ReadByteArrayOp_Word8AsFloat = 385+primOpTag ReadByteArrayOp_Word8AsDouble = 386+primOpTag ReadByteArrayOp_Word8AsStablePtr = 387+primOpTag ReadByteArrayOp_Word8AsInt16 = 388+primOpTag ReadByteArrayOp_Word8AsInt32 = 389+primOpTag ReadByteArrayOp_Word8AsInt64 = 390+primOpTag ReadByteArrayOp_Word8AsWord16 = 391+primOpTag ReadByteArrayOp_Word8AsWord32 = 392+primOpTag ReadByteArrayOp_Word8AsWord64 = 393+primOpTag WriteByteArrayOp_Char = 394+primOpTag WriteByteArrayOp_WideChar = 395+primOpTag WriteByteArrayOp_Int = 396+primOpTag WriteByteArrayOp_Word = 397+primOpTag WriteByteArrayOp_Addr = 398+primOpTag WriteByteArrayOp_Float = 399+primOpTag WriteByteArrayOp_Double = 400+primOpTag WriteByteArrayOp_StablePtr = 401+primOpTag WriteByteArrayOp_Int8 = 402+primOpTag WriteByteArrayOp_Int16 = 403+primOpTag WriteByteArrayOp_Int32 = 404+primOpTag WriteByteArrayOp_Int64 = 405+primOpTag WriteByteArrayOp_Word8 = 406+primOpTag WriteByteArrayOp_Word16 = 407+primOpTag WriteByteArrayOp_Word32 = 408+primOpTag WriteByteArrayOp_Word64 = 409+primOpTag WriteByteArrayOp_Word8AsChar = 410+primOpTag WriteByteArrayOp_Word8AsWideChar = 411+primOpTag WriteByteArrayOp_Word8AsInt = 412+primOpTag WriteByteArrayOp_Word8AsWord = 413+primOpTag WriteByteArrayOp_Word8AsAddr = 414+primOpTag WriteByteArrayOp_Word8AsFloat = 415+primOpTag WriteByteArrayOp_Word8AsDouble = 416+primOpTag WriteByteArrayOp_Word8AsStablePtr = 417+primOpTag WriteByteArrayOp_Word8AsInt16 = 418+primOpTag WriteByteArrayOp_Word8AsInt32 = 419+primOpTag WriteByteArrayOp_Word8AsInt64 = 420+primOpTag WriteByteArrayOp_Word8AsWord16 = 421+primOpTag WriteByteArrayOp_Word8AsWord32 = 422+primOpTag WriteByteArrayOp_Word8AsWord64 = 423+primOpTag CompareByteArraysOp = 424+primOpTag CopyByteArrayOp = 425+primOpTag CopyMutableByteArrayOp = 426+primOpTag CopyByteArrayToAddrOp = 427+primOpTag CopyMutableByteArrayToAddrOp = 428+primOpTag CopyAddrToByteArrayOp = 429+primOpTag SetByteArrayOp = 430+primOpTag AtomicReadByteArrayOp_Int = 431+primOpTag AtomicWriteByteArrayOp_Int = 432+primOpTag CasByteArrayOp_Int = 433+primOpTag FetchAddByteArrayOp_Int = 434+primOpTag FetchSubByteArrayOp_Int = 435+primOpTag FetchAndByteArrayOp_Int = 436+primOpTag FetchNandByteArrayOp_Int = 437+primOpTag FetchOrByteArrayOp_Int = 438+primOpTag FetchXorByteArrayOp_Int = 439+primOpTag NewArrayArrayOp = 440+primOpTag UnsafeFreezeArrayArrayOp = 441+primOpTag SizeofArrayArrayOp = 442+primOpTag SizeofMutableArrayArrayOp = 443+primOpTag IndexArrayArrayOp_ByteArray = 444+primOpTag IndexArrayArrayOp_ArrayArray = 445+primOpTag ReadArrayArrayOp_ByteArray = 446+primOpTag ReadArrayArrayOp_MutableByteArray = 447+primOpTag ReadArrayArrayOp_ArrayArray = 448+primOpTag ReadArrayArrayOp_MutableArrayArray = 449+primOpTag WriteArrayArrayOp_ByteArray = 450+primOpTag WriteArrayArrayOp_MutableByteArray = 451+primOpTag WriteArrayArrayOp_ArrayArray = 452+primOpTag WriteArrayArrayOp_MutableArrayArray = 453+primOpTag CopyArrayArrayOp = 454+primOpTag CopyMutableArrayArrayOp = 455+primOpTag AddrAddOp = 456+primOpTag AddrSubOp = 457+primOpTag AddrRemOp = 458+primOpTag AddrToIntOp = 459+primOpTag IntToAddrOp = 460+primOpTag AddrGtOp = 461+primOpTag AddrGeOp = 462+primOpTag AddrEqOp = 463+primOpTag AddrNeOp = 464+primOpTag AddrLtOp = 465+primOpTag AddrLeOp = 466+primOpTag IndexOffAddrOp_Char = 467+primOpTag IndexOffAddrOp_WideChar = 468+primOpTag IndexOffAddrOp_Int = 469+primOpTag IndexOffAddrOp_Word = 470+primOpTag IndexOffAddrOp_Addr = 471+primOpTag IndexOffAddrOp_Float = 472+primOpTag IndexOffAddrOp_Double = 473+primOpTag IndexOffAddrOp_StablePtr = 474+primOpTag IndexOffAddrOp_Int8 = 475+primOpTag IndexOffAddrOp_Int16 = 476+primOpTag IndexOffAddrOp_Int32 = 477+primOpTag IndexOffAddrOp_Int64 = 478+primOpTag IndexOffAddrOp_Word8 = 479+primOpTag IndexOffAddrOp_Word16 = 480+primOpTag IndexOffAddrOp_Word32 = 481+primOpTag IndexOffAddrOp_Word64 = 482+primOpTag ReadOffAddrOp_Char = 483+primOpTag ReadOffAddrOp_WideChar = 484+primOpTag ReadOffAddrOp_Int = 485+primOpTag ReadOffAddrOp_Word = 486+primOpTag ReadOffAddrOp_Addr = 487+primOpTag ReadOffAddrOp_Float = 488+primOpTag ReadOffAddrOp_Double = 489+primOpTag ReadOffAddrOp_StablePtr = 490+primOpTag ReadOffAddrOp_Int8 = 491+primOpTag ReadOffAddrOp_Int16 = 492+primOpTag ReadOffAddrOp_Int32 = 493+primOpTag ReadOffAddrOp_Int64 = 494+primOpTag ReadOffAddrOp_Word8 = 495+primOpTag ReadOffAddrOp_Word16 = 496+primOpTag ReadOffAddrOp_Word32 = 497+primOpTag ReadOffAddrOp_Word64 = 498+primOpTag WriteOffAddrOp_Char = 499+primOpTag WriteOffAddrOp_WideChar = 500+primOpTag WriteOffAddrOp_Int = 501+primOpTag WriteOffAddrOp_Word = 502+primOpTag WriteOffAddrOp_Addr = 503+primOpTag WriteOffAddrOp_Float = 504+primOpTag WriteOffAddrOp_Double = 505+primOpTag WriteOffAddrOp_StablePtr = 506+primOpTag WriteOffAddrOp_Int8 = 507+primOpTag WriteOffAddrOp_Int16 = 508+primOpTag WriteOffAddrOp_Int32 = 509+primOpTag WriteOffAddrOp_Int64 = 510+primOpTag WriteOffAddrOp_Word8 = 511+primOpTag WriteOffAddrOp_Word16 = 512+primOpTag WriteOffAddrOp_Word32 = 513+primOpTag WriteOffAddrOp_Word64 = 514+primOpTag InterlockedExchange_Addr = 515+primOpTag InterlockedExchange_Word = 516+primOpTag CasAddrOp_Addr = 517+primOpTag CasAddrOp_Word = 518+primOpTag FetchAddAddrOp_Word = 519+primOpTag FetchSubAddrOp_Word = 520+primOpTag FetchAndAddrOp_Word = 521+primOpTag FetchNandAddrOp_Word = 522+primOpTag FetchOrAddrOp_Word = 523+primOpTag FetchXorAddrOp_Word = 524+primOpTag AtomicReadAddrOp_Word = 525+primOpTag AtomicWriteAddrOp_Word = 526+primOpTag NewMutVarOp = 527+primOpTag ReadMutVarOp = 528+primOpTag WriteMutVarOp = 529+primOpTag AtomicModifyMutVar2Op = 530+primOpTag AtomicModifyMutVar_Op = 531+primOpTag CasMutVarOp = 532+primOpTag CatchOp = 533+primOpTag RaiseOp = 534+primOpTag RaiseIOOp = 535+primOpTag MaskAsyncExceptionsOp = 536+primOpTag MaskUninterruptibleOp = 537+primOpTag UnmaskAsyncExceptionsOp = 538+primOpTag MaskStatus = 539+primOpTag AtomicallyOp = 540+primOpTag RetryOp = 541+primOpTag CatchRetryOp = 542+primOpTag CatchSTMOp = 543+primOpTag NewTVarOp = 544+primOpTag ReadTVarOp = 545+primOpTag ReadTVarIOOp = 546+primOpTag WriteTVarOp = 547+primOpTag NewMVarOp = 548+primOpTag TakeMVarOp = 549+primOpTag TryTakeMVarOp = 550+primOpTag PutMVarOp = 551+primOpTag TryPutMVarOp = 552+primOpTag ReadMVarOp = 553+primOpTag TryReadMVarOp = 554+primOpTag IsEmptyMVarOp = 555+primOpTag NewIOPortrOp = 556+primOpTag ReadIOPortOp = 557+primOpTag WriteIOPortOp = 558+primOpTag DelayOp = 559+primOpTag WaitReadOp = 560+primOpTag WaitWriteOp = 561+primOpTag ForkOp = 562+primOpTag ForkOnOp = 563+primOpTag KillThreadOp = 564+primOpTag YieldOp = 565+primOpTag MyThreadIdOp = 566+primOpTag LabelThreadOp = 567+primOpTag IsCurrentThreadBoundOp = 568+primOpTag NoDuplicateOp = 569+primOpTag ThreadStatusOp = 570+primOpTag MkWeakOp = 571+primOpTag MkWeakNoFinalizerOp = 572+primOpTag AddCFinalizerToWeakOp = 573+primOpTag DeRefWeakOp = 574+primOpTag FinalizeWeakOp = 575+primOpTag TouchOp = 576+primOpTag MakeStablePtrOp = 577+primOpTag DeRefStablePtrOp = 578+primOpTag EqStablePtrOp = 579+primOpTag MakeStableNameOp = 580+primOpTag StableNameToIntOp = 581+primOpTag CompactNewOp = 582+primOpTag CompactResizeOp = 583+primOpTag CompactContainsOp = 584+primOpTag CompactContainsAnyOp = 585+primOpTag CompactGetFirstBlockOp = 586+primOpTag CompactGetNextBlockOp = 587+primOpTag CompactAllocateBlockOp = 588+primOpTag CompactFixupPointersOp = 589+primOpTag CompactAdd = 590+primOpTag CompactAddWithSharing = 591+primOpTag CompactSize = 592+primOpTag ReallyUnsafePtrEqualityOp = 593+primOpTag ParOp = 594+primOpTag SparkOp = 595+primOpTag SeqOp = 596+primOpTag GetSparkOp = 597+primOpTag NumSparks = 598+primOpTag KeepAliveOp = 599+primOpTag DataToTagOp = 600+primOpTag TagToEnumOp = 601+primOpTag AddrToAnyOp = 602+primOpTag AnyToAddrOp = 603+primOpTag MkApUpd0_Op = 604+primOpTag NewBCOOp = 605+primOpTag UnpackClosureOp = 606+primOpTag ClosureSizeOp = 607+primOpTag GetApStackValOp = 608+primOpTag GetCCSOfOp = 609+primOpTag GetCurrentCCSOp = 610+primOpTag ClearCCSOp = 611+primOpTag WhereFromOp = 612+primOpTag TraceEventOp = 613+primOpTag TraceEventBinaryOp = 614+primOpTag TraceMarkerOp = 615+primOpTag SetThreadAllocationCounter = 616+primOpTag (VecBroadcastOp IntVec 16 W8) = 617+primOpTag (VecBroadcastOp IntVec 8 W16) = 618+primOpTag (VecBroadcastOp IntVec 4 W32) = 619+primOpTag (VecBroadcastOp IntVec 2 W64) = 620+primOpTag (VecBroadcastOp IntVec 32 W8) = 621+primOpTag (VecBroadcastOp IntVec 16 W16) = 622+primOpTag (VecBroadcastOp IntVec 8 W32) = 623+primOpTag (VecBroadcastOp IntVec 4 W64) = 624+primOpTag (VecBroadcastOp IntVec 64 W8) = 625+primOpTag (VecBroadcastOp IntVec 32 W16) = 626+primOpTag (VecBroadcastOp IntVec 16 W32) = 627+primOpTag (VecBroadcastOp IntVec 8 W64) = 628+primOpTag (VecBroadcastOp WordVec 16 W8) = 629+primOpTag (VecBroadcastOp WordVec 8 W16) = 630+primOpTag (VecBroadcastOp WordVec 4 W32) = 631+primOpTag (VecBroadcastOp WordVec 2 W64) = 632+primOpTag (VecBroadcastOp WordVec 32 W8) = 633+primOpTag (VecBroadcastOp WordVec 16 W16) = 634+primOpTag (VecBroadcastOp WordVec 8 W32) = 635+primOpTag (VecBroadcastOp WordVec 4 W64) = 636+primOpTag (VecBroadcastOp WordVec 64 W8) = 637+primOpTag (VecBroadcastOp WordVec 32 W16) = 638+primOpTag (VecBroadcastOp WordVec 16 W32) = 639+primOpTag (VecBroadcastOp WordVec 8 W64) = 640+primOpTag (VecBroadcastOp FloatVec 4 W32) = 641+primOpTag (VecBroadcastOp FloatVec 2 W64) = 642+primOpTag (VecBroadcastOp FloatVec 8 W32) = 643+primOpTag (VecBroadcastOp FloatVec 4 W64) = 644+primOpTag (VecBroadcastOp FloatVec 16 W32) = 645+primOpTag (VecBroadcastOp FloatVec 8 W64) = 646+primOpTag (VecPackOp IntVec 16 W8) = 647+primOpTag (VecPackOp IntVec 8 W16) = 648+primOpTag (VecPackOp IntVec 4 W32) = 649+primOpTag (VecPackOp IntVec 2 W64) = 650+primOpTag (VecPackOp IntVec 32 W8) = 651+primOpTag (VecPackOp IntVec 16 W16) = 652+primOpTag (VecPackOp IntVec 8 W32) = 653+primOpTag (VecPackOp IntVec 4 W64) = 654+primOpTag (VecPackOp IntVec 64 W8) = 655+primOpTag (VecPackOp IntVec 32 W16) = 656+primOpTag (VecPackOp IntVec 16 W32) = 657+primOpTag (VecPackOp IntVec 8 W64) = 658+primOpTag (VecPackOp WordVec 16 W8) = 659+primOpTag (VecPackOp WordVec 8 W16) = 660+primOpTag (VecPackOp WordVec 4 W32) = 661+primOpTag (VecPackOp WordVec 2 W64) = 662+primOpTag (VecPackOp WordVec 32 W8) = 663+primOpTag (VecPackOp WordVec 16 W16) = 664+primOpTag (VecPackOp WordVec 8 W32) = 665+primOpTag (VecPackOp WordVec 4 W64) = 666+primOpTag (VecPackOp WordVec 64 W8) = 667+primOpTag (VecPackOp WordVec 32 W16) = 668+primOpTag (VecPackOp WordVec 16 W32) = 669+primOpTag (VecPackOp WordVec 8 W64) = 670+primOpTag (VecPackOp FloatVec 4 W32) = 671+primOpTag (VecPackOp FloatVec 2 W64) = 672+primOpTag (VecPackOp FloatVec 8 W32) = 673+primOpTag (VecPackOp FloatVec 4 W64) = 674+primOpTag (VecPackOp FloatVec 16 W32) = 675+primOpTag (VecPackOp FloatVec 8 W64) = 676+primOpTag (VecUnpackOp IntVec 16 W8) = 677+primOpTag (VecUnpackOp IntVec 8 W16) = 678+primOpTag (VecUnpackOp IntVec 4 W32) = 679+primOpTag (VecUnpackOp IntVec 2 W64) = 680+primOpTag (VecUnpackOp IntVec 32 W8) = 681+primOpTag (VecUnpackOp IntVec 16 W16) = 682+primOpTag (VecUnpackOp IntVec 8 W32) = 683+primOpTag (VecUnpackOp IntVec 4 W64) = 684+primOpTag (VecUnpackOp IntVec 64 W8) = 685+primOpTag (VecUnpackOp IntVec 32 W16) = 686+primOpTag (VecUnpackOp IntVec 16 W32) = 687+primOpTag (VecUnpackOp IntVec 8 W64) = 688+primOpTag (VecUnpackOp WordVec 16 W8) = 689+primOpTag (VecUnpackOp WordVec 8 W16) = 690+primOpTag (VecUnpackOp WordVec 4 W32) = 691+primOpTag (VecUnpackOp WordVec 2 W64) = 692+primOpTag (VecUnpackOp WordVec 32 W8) = 693+primOpTag (VecUnpackOp WordVec 16 W16) = 694+primOpTag (VecUnpackOp WordVec 8 W32) = 695+primOpTag (VecUnpackOp WordVec 4 W64) = 696+primOpTag (VecUnpackOp WordVec 64 W8) = 697+primOpTag (VecUnpackOp WordVec 32 W16) = 698+primOpTag (VecUnpackOp WordVec 16 W32) = 699+primOpTag (VecUnpackOp WordVec 8 W64) = 700+primOpTag (VecUnpackOp FloatVec 4 W32) = 701+primOpTag (VecUnpackOp FloatVec 2 W64) = 702+primOpTag (VecUnpackOp FloatVec 8 W32) = 703+primOpTag (VecUnpackOp FloatVec 4 W64) = 704+primOpTag (VecUnpackOp FloatVec 16 W32) = 705+primOpTag (VecUnpackOp FloatVec 8 W64) = 706+primOpTag (VecInsertOp IntVec 16 W8) = 707+primOpTag (VecInsertOp IntVec 8 W16) = 708+primOpTag (VecInsertOp IntVec 4 W32) = 709+primOpTag (VecInsertOp IntVec 2 W64) = 710+primOpTag (VecInsertOp IntVec 32 W8) = 711+primOpTag (VecInsertOp IntVec 16 W16) = 712+primOpTag (VecInsertOp IntVec 8 W32) = 713+primOpTag (VecInsertOp IntVec 4 W64) = 714+primOpTag (VecInsertOp IntVec 64 W8) = 715+primOpTag (VecInsertOp IntVec 32 W16) = 716+primOpTag (VecInsertOp IntVec 16 W32) = 717+primOpTag (VecInsertOp IntVec 8 W64) = 718+primOpTag (VecInsertOp WordVec 16 W8) = 719+primOpTag (VecInsertOp WordVec 8 W16) = 720+primOpTag (VecInsertOp WordVec 4 W32) = 721+primOpTag (VecInsertOp WordVec 2 W64) = 722+primOpTag (VecInsertOp WordVec 32 W8) = 723+primOpTag (VecInsertOp WordVec 16 W16) = 724+primOpTag (VecInsertOp WordVec 8 W32) = 725+primOpTag (VecInsertOp WordVec 4 W64) = 726+primOpTag (VecInsertOp WordVec 64 W8) = 727+primOpTag (VecInsertOp WordVec 32 W16) = 728+primOpTag (VecInsertOp WordVec 16 W32) = 729+primOpTag (VecInsertOp WordVec 8 W64) = 730+primOpTag (VecInsertOp FloatVec 4 W32) = 731+primOpTag (VecInsertOp FloatVec 2 W64) = 732+primOpTag (VecInsertOp FloatVec 8 W32) = 733+primOpTag (VecInsertOp FloatVec 4 W64) = 734+primOpTag (VecInsertOp FloatVec 16 W32) = 735+primOpTag (VecInsertOp FloatVec 8 W64) = 736+primOpTag (VecAddOp IntVec 16 W8) = 737+primOpTag (VecAddOp IntVec 8 W16) = 738+primOpTag (VecAddOp IntVec 4 W32) = 739+primOpTag (VecAddOp IntVec 2 W64) = 740+primOpTag (VecAddOp IntVec 32 W8) = 741+primOpTag (VecAddOp IntVec 16 W16) = 742+primOpTag (VecAddOp IntVec 8 W32) = 743+primOpTag (VecAddOp IntVec 4 W64) = 744+primOpTag (VecAddOp IntVec 64 W8) = 745+primOpTag (VecAddOp IntVec 32 W16) = 746+primOpTag (VecAddOp IntVec 16 W32) = 747+primOpTag (VecAddOp IntVec 8 W64) = 748+primOpTag (VecAddOp WordVec 16 W8) = 749+primOpTag (VecAddOp WordVec 8 W16) = 750+primOpTag (VecAddOp WordVec 4 W32) = 751+primOpTag (VecAddOp WordVec 2 W64) = 752+primOpTag (VecAddOp WordVec 32 W8) = 753+primOpTag (VecAddOp WordVec 16 W16) = 754+primOpTag (VecAddOp WordVec 8 W32) = 755+primOpTag (VecAddOp WordVec 4 W64) = 756+primOpTag (VecAddOp WordVec 64 W8) = 757+primOpTag (VecAddOp WordVec 32 W16) = 758+primOpTag (VecAddOp WordVec 16 W32) = 759+primOpTag (VecAddOp WordVec 8 W64) = 760+primOpTag (VecAddOp FloatVec 4 W32) = 761+primOpTag (VecAddOp FloatVec 2 W64) = 762+primOpTag (VecAddOp FloatVec 8 W32) = 763+primOpTag (VecAddOp FloatVec 4 W64) = 764+primOpTag (VecAddOp FloatVec 16 W32) = 765+primOpTag (VecAddOp FloatVec 8 W64) = 766+primOpTag (VecSubOp IntVec 16 W8) = 767+primOpTag (VecSubOp IntVec 8 W16) = 768+primOpTag (VecSubOp IntVec 4 W32) = 769+primOpTag (VecSubOp IntVec 2 W64) = 770+primOpTag (VecSubOp IntVec 32 W8) = 771+primOpTag (VecSubOp IntVec 16 W16) = 772+primOpTag (VecSubOp IntVec 8 W32) = 773+primOpTag (VecSubOp IntVec 4 W64) = 774+primOpTag (VecSubOp IntVec 64 W8) = 775+primOpTag (VecSubOp IntVec 32 W16) = 776+primOpTag (VecSubOp IntVec 16 W32) = 777+primOpTag (VecSubOp IntVec 8 W64) = 778+primOpTag (VecSubOp WordVec 16 W8) = 779+primOpTag (VecSubOp WordVec 8 W16) = 780+primOpTag (VecSubOp WordVec 4 W32) = 781+primOpTag (VecSubOp WordVec 2 W64) = 782+primOpTag (VecSubOp WordVec 32 W8) = 783+primOpTag (VecSubOp WordVec 16 W16) = 784+primOpTag (VecSubOp WordVec 8 W32) = 785+primOpTag (VecSubOp WordVec 4 W64) = 786+primOpTag (VecSubOp WordVec 64 W8) = 787+primOpTag (VecSubOp WordVec 32 W16) = 788+primOpTag (VecSubOp WordVec 16 W32) = 789+primOpTag (VecSubOp WordVec 8 W64) = 790+primOpTag (VecSubOp FloatVec 4 W32) = 791+primOpTag (VecSubOp FloatVec 2 W64) = 792+primOpTag (VecSubOp FloatVec 8 W32) = 793+primOpTag (VecSubOp FloatVec 4 W64) = 794+primOpTag (VecSubOp FloatVec 16 W32) = 795+primOpTag (VecSubOp FloatVec 8 W64) = 796+primOpTag (VecMulOp IntVec 16 W8) = 797+primOpTag (VecMulOp IntVec 8 W16) = 798+primOpTag (VecMulOp IntVec 4 W32) = 799+primOpTag (VecMulOp IntVec 2 W64) = 800+primOpTag (VecMulOp IntVec 32 W8) = 801+primOpTag (VecMulOp IntVec 16 W16) = 802+primOpTag (VecMulOp IntVec 8 W32) = 803+primOpTag (VecMulOp IntVec 4 W64) = 804+primOpTag (VecMulOp IntVec 64 W8) = 805+primOpTag (VecMulOp IntVec 32 W16) = 806+primOpTag (VecMulOp IntVec 16 W32) = 807+primOpTag (VecMulOp IntVec 8 W64) = 808+primOpTag (VecMulOp WordVec 16 W8) = 809+primOpTag (VecMulOp WordVec 8 W16) = 810+primOpTag (VecMulOp WordVec 4 W32) = 811+primOpTag (VecMulOp WordVec 2 W64) = 812+primOpTag (VecMulOp WordVec 32 W8) = 813+primOpTag (VecMulOp WordVec 16 W16) = 814+primOpTag (VecMulOp WordVec 8 W32) = 815+primOpTag (VecMulOp WordVec 4 W64) = 816+primOpTag (VecMulOp WordVec 64 W8) = 817+primOpTag (VecMulOp WordVec 32 W16) = 818+primOpTag (VecMulOp WordVec 16 W32) = 819+primOpTag (VecMulOp WordVec 8 W64) = 820+primOpTag (VecMulOp FloatVec 4 W32) = 821+primOpTag (VecMulOp FloatVec 2 W64) = 822+primOpTag (VecMulOp FloatVec 8 W32) = 823+primOpTag (VecMulOp FloatVec 4 W64) = 824+primOpTag (VecMulOp FloatVec 16 W32) = 825+primOpTag (VecMulOp FloatVec 8 W64) = 826+primOpTag (VecDivOp FloatVec 4 W32) = 827+primOpTag (VecDivOp FloatVec 2 W64) = 828+primOpTag (VecDivOp FloatVec 8 W32) = 829+primOpTag (VecDivOp FloatVec 4 W64) = 830+primOpTag (VecDivOp FloatVec 16 W32) = 831+primOpTag (VecDivOp FloatVec 8 W64) = 832+primOpTag (VecQuotOp IntVec 16 W8) = 833+primOpTag (VecQuotOp IntVec 8 W16) = 834+primOpTag (VecQuotOp IntVec 4 W32) = 835+primOpTag (VecQuotOp IntVec 2 W64) = 836+primOpTag (VecQuotOp IntVec 32 W8) = 837+primOpTag (VecQuotOp IntVec 16 W16) = 838+primOpTag (VecQuotOp IntVec 8 W32) = 839+primOpTag (VecQuotOp IntVec 4 W64) = 840+primOpTag (VecQuotOp IntVec 64 W8) = 841+primOpTag (VecQuotOp IntVec 32 W16) = 842+primOpTag (VecQuotOp IntVec 16 W32) = 843+primOpTag (VecQuotOp IntVec 8 W64) = 844+primOpTag (VecQuotOp WordVec 16 W8) = 845+primOpTag (VecQuotOp WordVec 8 W16) = 846+primOpTag (VecQuotOp WordVec 4 W32) = 847+primOpTag (VecQuotOp WordVec 2 W64) = 848+primOpTag (VecQuotOp WordVec 32 W8) = 849+primOpTag (VecQuotOp WordVec 16 W16) = 850+primOpTag (VecQuotOp WordVec 8 W32) = 851+primOpTag (VecQuotOp WordVec 4 W64) = 852+primOpTag (VecQuotOp WordVec 64 W8) = 853+primOpTag (VecQuotOp WordVec 32 W16) = 854+primOpTag (VecQuotOp WordVec 16 W32) = 855+primOpTag (VecQuotOp WordVec 8 W64) = 856+primOpTag (VecRemOp IntVec 16 W8) = 857+primOpTag (VecRemOp IntVec 8 W16) = 858+primOpTag (VecRemOp IntVec 4 W32) = 859+primOpTag (VecRemOp IntVec 2 W64) = 860+primOpTag (VecRemOp IntVec 32 W8) = 861+primOpTag (VecRemOp IntVec 16 W16) = 862+primOpTag (VecRemOp IntVec 8 W32) = 863+primOpTag (VecRemOp IntVec 4 W64) = 864+primOpTag (VecRemOp IntVec 64 W8) = 865+primOpTag (VecRemOp IntVec 32 W16) = 866+primOpTag (VecRemOp IntVec 16 W32) = 867+primOpTag (VecRemOp IntVec 8 W64) = 868+primOpTag (VecRemOp WordVec 16 W8) = 869+primOpTag (VecRemOp WordVec 8 W16) = 870+primOpTag (VecRemOp WordVec 4 W32) = 871+primOpTag (VecRemOp WordVec 2 W64) = 872+primOpTag (VecRemOp WordVec 32 W8) = 873+primOpTag (VecRemOp WordVec 16 W16) = 874+primOpTag (VecRemOp WordVec 8 W32) = 875+primOpTag (VecRemOp WordVec 4 W64) = 876+primOpTag (VecRemOp WordVec 64 W8) = 877+primOpTag (VecRemOp WordVec 32 W16) = 878+primOpTag (VecRemOp WordVec 16 W32) = 879+primOpTag (VecRemOp WordVec 8 W64) = 880+primOpTag (VecNegOp IntVec 16 W8) = 881+primOpTag (VecNegOp IntVec 8 W16) = 882+primOpTag (VecNegOp IntVec 4 W32) = 883+primOpTag (VecNegOp IntVec 2 W64) = 884+primOpTag (VecNegOp IntVec 32 W8) = 885+primOpTag (VecNegOp IntVec 16 W16) = 886+primOpTag (VecNegOp IntVec 8 W32) = 887+primOpTag (VecNegOp IntVec 4 W64) = 888+primOpTag (VecNegOp IntVec 64 W8) = 889+primOpTag (VecNegOp IntVec 32 W16) = 890+primOpTag (VecNegOp IntVec 16 W32) = 891+primOpTag (VecNegOp IntVec 8 W64) = 892+primOpTag (VecNegOp FloatVec 4 W32) = 893+primOpTag (VecNegOp FloatVec 2 W64) = 894+primOpTag (VecNegOp FloatVec 8 W32) = 895+primOpTag (VecNegOp FloatVec 4 W64) = 896+primOpTag (VecNegOp FloatVec 16 W32) = 897+primOpTag (VecNegOp FloatVec 8 W64) = 898+primOpTag (VecIndexByteArrayOp IntVec 16 W8) = 899+primOpTag (VecIndexByteArrayOp IntVec 8 W16) = 900+primOpTag (VecIndexByteArrayOp IntVec 4 W32) = 901+primOpTag (VecIndexByteArrayOp IntVec 2 W64) = 902+primOpTag (VecIndexByteArrayOp IntVec 32 W8) = 903+primOpTag (VecIndexByteArrayOp IntVec 16 W16) = 904+primOpTag (VecIndexByteArrayOp IntVec 8 W32) = 905+primOpTag (VecIndexByteArrayOp IntVec 4 W64) = 906+primOpTag (VecIndexByteArrayOp IntVec 64 W8) = 907+primOpTag (VecIndexByteArrayOp IntVec 32 W16) = 908+primOpTag (VecIndexByteArrayOp IntVec 16 W32) = 909+primOpTag (VecIndexByteArrayOp IntVec 8 W64) = 910+primOpTag (VecIndexByteArrayOp WordVec 16 W8) = 911+primOpTag (VecIndexByteArrayOp WordVec 8 W16) = 912+primOpTag (VecIndexByteArrayOp WordVec 4 W32) = 913+primOpTag (VecIndexByteArrayOp WordVec 2 W64) = 914+primOpTag (VecIndexByteArrayOp WordVec 32 W8) = 915+primOpTag (VecIndexByteArrayOp WordVec 16 W16) = 916+primOpTag (VecIndexByteArrayOp WordVec 8 W32) = 917+primOpTag (VecIndexByteArrayOp WordVec 4 W64) = 918+primOpTag (VecIndexByteArrayOp WordVec 64 W8) = 919+primOpTag (VecIndexByteArrayOp WordVec 32 W16) = 920+primOpTag (VecIndexByteArrayOp WordVec 16 W32) = 921+primOpTag (VecIndexByteArrayOp WordVec 8 W64) = 922+primOpTag (VecIndexByteArrayOp FloatVec 4 W32) = 923+primOpTag (VecIndexByteArrayOp FloatVec 2 W64) = 924+primOpTag (VecIndexByteArrayOp FloatVec 8 W32) = 925+primOpTag (VecIndexByteArrayOp FloatVec 4 W64) = 926+primOpTag (VecIndexByteArrayOp FloatVec 16 W32) = 927+primOpTag (VecIndexByteArrayOp FloatVec 8 W64) = 928+primOpTag (VecReadByteArrayOp IntVec 16 W8) = 929+primOpTag (VecReadByteArrayOp IntVec 8 W16) = 930+primOpTag (VecReadByteArrayOp IntVec 4 W32) = 931+primOpTag (VecReadByteArrayOp IntVec 2 W64) = 932+primOpTag (VecReadByteArrayOp IntVec 32 W8) = 933+primOpTag (VecReadByteArrayOp IntVec 16 W16) = 934+primOpTag (VecReadByteArrayOp IntVec 8 W32) = 935+primOpTag (VecReadByteArrayOp IntVec 4 W64) = 936+primOpTag (VecReadByteArrayOp IntVec 64 W8) = 937+primOpTag (VecReadByteArrayOp IntVec 32 W16) = 938+primOpTag (VecReadByteArrayOp IntVec 16 W32) = 939+primOpTag (VecReadByteArrayOp IntVec 8 W64) = 940+primOpTag (VecReadByteArrayOp WordVec 16 W8) = 941+primOpTag (VecReadByteArrayOp WordVec 8 W16) = 942+primOpTag (VecReadByteArrayOp WordVec 4 W32) = 943+primOpTag (VecReadByteArrayOp WordVec 2 W64) = 944+primOpTag (VecReadByteArrayOp WordVec 32 W8) = 945+primOpTag (VecReadByteArrayOp WordVec 16 W16) = 946+primOpTag (VecReadByteArrayOp WordVec 8 W32) = 947+primOpTag (VecReadByteArrayOp WordVec 4 W64) = 948+primOpTag (VecReadByteArrayOp WordVec 64 W8) = 949+primOpTag (VecReadByteArrayOp WordVec 32 W16) = 950+primOpTag (VecReadByteArrayOp WordVec 16 W32) = 951+primOpTag (VecReadByteArrayOp WordVec 8 W64) = 952+primOpTag (VecReadByteArrayOp FloatVec 4 W32) = 953+primOpTag (VecReadByteArrayOp FloatVec 2 W64) = 954+primOpTag (VecReadByteArrayOp FloatVec 8 W32) = 955+primOpTag (VecReadByteArrayOp FloatVec 4 W64) = 956+primOpTag (VecReadByteArrayOp FloatVec 16 W32) = 957+primOpTag (VecReadByteArrayOp FloatVec 8 W64) = 958+primOpTag (VecWriteByteArrayOp IntVec 16 W8) = 959+primOpTag (VecWriteByteArrayOp IntVec 8 W16) = 960+primOpTag (VecWriteByteArrayOp IntVec 4 W32) = 961+primOpTag (VecWriteByteArrayOp IntVec 2 W64) = 962+primOpTag (VecWriteByteArrayOp IntVec 32 W8) = 963+primOpTag (VecWriteByteArrayOp IntVec 16 W16) = 964+primOpTag (VecWriteByteArrayOp IntVec 8 W32) = 965+primOpTag (VecWriteByteArrayOp IntVec 4 W64) = 966+primOpTag (VecWriteByteArrayOp IntVec 64 W8) = 967+primOpTag (VecWriteByteArrayOp IntVec 32 W16) = 968+primOpTag (VecWriteByteArrayOp IntVec 16 W32) = 969+primOpTag (VecWriteByteArrayOp IntVec 8 W64) = 970+primOpTag (VecWriteByteArrayOp WordVec 16 W8) = 971+primOpTag (VecWriteByteArrayOp WordVec 8 W16) = 972+primOpTag (VecWriteByteArrayOp WordVec 4 W32) = 973+primOpTag (VecWriteByteArrayOp WordVec 2 W64) = 974+primOpTag (VecWriteByteArrayOp WordVec 32 W8) = 975+primOpTag (VecWriteByteArrayOp WordVec 16 W16) = 976+primOpTag (VecWriteByteArrayOp WordVec 8 W32) = 977+primOpTag (VecWriteByteArrayOp WordVec 4 W64) = 978+primOpTag (VecWriteByteArrayOp WordVec 64 W8) = 979+primOpTag (VecWriteByteArrayOp WordVec 32 W16) = 980+primOpTag (VecWriteByteArrayOp WordVec 16 W32) = 981+primOpTag (VecWriteByteArrayOp WordVec 8 W64) = 982+primOpTag (VecWriteByteArrayOp FloatVec 4 W32) = 983+primOpTag (VecWriteByteArrayOp FloatVec 2 W64) = 984+primOpTag (VecWriteByteArrayOp FloatVec 8 W32) = 985+primOpTag (VecWriteByteArrayOp FloatVec 4 W64) = 986+primOpTag (VecWriteByteArrayOp FloatVec 16 W32) = 987+primOpTag (VecWriteByteArrayOp FloatVec 8 W64) = 988+primOpTag (VecIndexOffAddrOp IntVec 16 W8) = 989+primOpTag (VecIndexOffAddrOp IntVec 8 W16) = 990+primOpTag (VecIndexOffAddrOp IntVec 4 W32) = 991+primOpTag (VecIndexOffAddrOp IntVec 2 W64) = 992+primOpTag (VecIndexOffAddrOp IntVec 32 W8) = 993+primOpTag (VecIndexOffAddrOp IntVec 16 W16) = 994+primOpTag (VecIndexOffAddrOp IntVec 8 W32) = 995+primOpTag (VecIndexOffAddrOp IntVec 4 W64) = 996+primOpTag (VecIndexOffAddrOp IntVec 64 W8) = 997+primOpTag (VecIndexOffAddrOp IntVec 32 W16) = 998+primOpTag (VecIndexOffAddrOp IntVec 16 W32) = 999+primOpTag (VecIndexOffAddrOp IntVec 8 W64) = 1000+primOpTag (VecIndexOffAddrOp WordVec 16 W8) = 1001+primOpTag (VecIndexOffAddrOp WordVec 8 W16) = 1002+primOpTag (VecIndexOffAddrOp WordVec 4 W32) = 1003+primOpTag (VecIndexOffAddrOp WordVec 2 W64) = 1004+primOpTag (VecIndexOffAddrOp WordVec 32 W8) = 1005+primOpTag (VecIndexOffAddrOp WordVec 16 W16) = 1006+primOpTag (VecIndexOffAddrOp WordVec 8 W32) = 1007+primOpTag (VecIndexOffAddrOp WordVec 4 W64) = 1008+primOpTag (VecIndexOffAddrOp WordVec 64 W8) = 1009+primOpTag (VecIndexOffAddrOp WordVec 32 W16) = 1010+primOpTag (VecIndexOffAddrOp WordVec 16 W32) = 1011+primOpTag (VecIndexOffAddrOp WordVec 8 W64) = 1012+primOpTag (VecIndexOffAddrOp FloatVec 4 W32) = 1013+primOpTag (VecIndexOffAddrOp FloatVec 2 W64) = 1014+primOpTag (VecIndexOffAddrOp FloatVec 8 W32) = 1015+primOpTag (VecIndexOffAddrOp FloatVec 4 W64) = 1016+primOpTag (VecIndexOffAddrOp FloatVec 16 W32) = 1017+primOpTag (VecIndexOffAddrOp FloatVec 8 W64) = 1018+primOpTag (VecReadOffAddrOp IntVec 16 W8) = 1019+primOpTag (VecReadOffAddrOp IntVec 8 W16) = 1020+primOpTag (VecReadOffAddrOp IntVec 4 W32) = 1021+primOpTag (VecReadOffAddrOp IntVec 2 W64) = 1022+primOpTag (VecReadOffAddrOp IntVec 32 W8) = 1023+primOpTag (VecReadOffAddrOp IntVec 16 W16) = 1024+primOpTag (VecReadOffAddrOp IntVec 8 W32) = 1025+primOpTag (VecReadOffAddrOp IntVec 4 W64) = 1026+primOpTag (VecReadOffAddrOp IntVec 64 W8) = 1027+primOpTag (VecReadOffAddrOp IntVec 32 W16) = 1028+primOpTag (VecReadOffAddrOp IntVec 16 W32) = 1029+primOpTag (VecReadOffAddrOp IntVec 8 W64) = 1030+primOpTag (VecReadOffAddrOp WordVec 16 W8) = 1031+primOpTag (VecReadOffAddrOp WordVec 8 W16) = 1032+primOpTag (VecReadOffAddrOp WordVec 4 W32) = 1033+primOpTag (VecReadOffAddrOp WordVec 2 W64) = 1034+primOpTag (VecReadOffAddrOp WordVec 32 W8) = 1035+primOpTag (VecReadOffAddrOp WordVec 16 W16) = 1036+primOpTag (VecReadOffAddrOp WordVec 8 W32) = 1037+primOpTag (VecReadOffAddrOp WordVec 4 W64) = 1038+primOpTag (VecReadOffAddrOp WordVec 64 W8) = 1039+primOpTag (VecReadOffAddrOp WordVec 32 W16) = 1040+primOpTag (VecReadOffAddrOp WordVec 16 W32) = 1041+primOpTag (VecReadOffAddrOp WordVec 8 W64) = 1042+primOpTag (VecReadOffAddrOp FloatVec 4 W32) = 1043+primOpTag (VecReadOffAddrOp FloatVec 2 W64) = 1044+primOpTag (VecReadOffAddrOp FloatVec 8 W32) = 1045+primOpTag (VecReadOffAddrOp FloatVec 4 W64) = 1046+primOpTag (VecReadOffAddrOp FloatVec 16 W32) = 1047+primOpTag (VecReadOffAddrOp FloatVec 8 W64) = 1048+primOpTag (VecWriteOffAddrOp IntVec 16 W8) = 1049+primOpTag (VecWriteOffAddrOp IntVec 8 W16) = 1050+primOpTag (VecWriteOffAddrOp IntVec 4 W32) = 1051+primOpTag (VecWriteOffAddrOp IntVec 2 W64) = 1052+primOpTag (VecWriteOffAddrOp IntVec 32 W8) = 1053+primOpTag (VecWriteOffAddrOp IntVec 16 W16) = 1054+primOpTag (VecWriteOffAddrOp IntVec 8 W32) = 1055+primOpTag (VecWriteOffAddrOp IntVec 4 W64) = 1056+primOpTag (VecWriteOffAddrOp IntVec 64 W8) = 1057+primOpTag (VecWriteOffAddrOp IntVec 32 W16) = 1058+primOpTag (VecWriteOffAddrOp IntVec 16 W32) = 1059+primOpTag (VecWriteOffAddrOp IntVec 8 W64) = 1060+primOpTag (VecWriteOffAddrOp WordVec 16 W8) = 1061+primOpTag (VecWriteOffAddrOp WordVec 8 W16) = 1062+primOpTag (VecWriteOffAddrOp WordVec 4 W32) = 1063+primOpTag (VecWriteOffAddrOp WordVec 2 W64) = 1064+primOpTag (VecWriteOffAddrOp WordVec 32 W8) = 1065+primOpTag (VecWriteOffAddrOp WordVec 16 W16) = 1066+primOpTag (VecWriteOffAddrOp WordVec 8 W32) = 1067+primOpTag (VecWriteOffAddrOp WordVec 4 W64) = 1068+primOpTag (VecWriteOffAddrOp WordVec 64 W8) = 1069+primOpTag (VecWriteOffAddrOp WordVec 32 W16) = 1070+primOpTag (VecWriteOffAddrOp WordVec 16 W32) = 1071+primOpTag (VecWriteOffAddrOp WordVec 8 W64) = 1072+primOpTag (VecWriteOffAddrOp FloatVec 4 W32) = 1073+primOpTag (VecWriteOffAddrOp FloatVec 2 W64) = 1074+primOpTag (VecWriteOffAddrOp FloatVec 8 W32) = 1075+primOpTag (VecWriteOffAddrOp FloatVec 4 W64) = 1076+primOpTag (VecWriteOffAddrOp FloatVec 16 W32) = 1077+primOpTag (VecWriteOffAddrOp FloatVec 8 W64) = 1078+primOpTag (VecIndexScalarByteArrayOp IntVec 16 W8) = 1079+primOpTag (VecIndexScalarByteArrayOp IntVec 8 W16) = 1080+primOpTag (VecIndexScalarByteArrayOp IntVec 4 W32) = 1081+primOpTag (VecIndexScalarByteArrayOp IntVec 2 W64) = 1082+primOpTag (VecIndexScalarByteArrayOp IntVec 32 W8) = 1083+primOpTag (VecIndexScalarByteArrayOp IntVec 16 W16) = 1084+primOpTag (VecIndexScalarByteArrayOp IntVec 8 W32) = 1085+primOpTag (VecIndexScalarByteArrayOp IntVec 4 W64) = 1086+primOpTag (VecIndexScalarByteArrayOp IntVec 64 W8) = 1087+primOpTag (VecIndexScalarByteArrayOp IntVec 32 W16) = 1088+primOpTag (VecIndexScalarByteArrayOp IntVec 16 W32) = 1089+primOpTag (VecIndexScalarByteArrayOp IntVec 8 W64) = 1090+primOpTag (VecIndexScalarByteArrayOp WordVec 16 W8) = 1091+primOpTag (VecIndexScalarByteArrayOp WordVec 8 W16) = 1092+primOpTag (VecIndexScalarByteArrayOp WordVec 4 W32) = 1093+primOpTag (VecIndexScalarByteArrayOp WordVec 2 W64) = 1094+primOpTag (VecIndexScalarByteArrayOp WordVec 32 W8) = 1095+primOpTag (VecIndexScalarByteArrayOp WordVec 16 W16) = 1096+primOpTag (VecIndexScalarByteArrayOp WordVec 8 W32) = 1097+primOpTag (VecIndexScalarByteArrayOp WordVec 4 W64) = 1098+primOpTag (VecIndexScalarByteArrayOp WordVec 64 W8) = 1099+primOpTag (VecIndexScalarByteArrayOp WordVec 32 W16) = 1100+primOpTag (VecIndexScalarByteArrayOp WordVec 16 W32) = 1101+primOpTag (VecIndexScalarByteArrayOp WordVec 8 W64) = 1102+primOpTag (VecIndexScalarByteArrayOp FloatVec 4 W32) = 1103+primOpTag (VecIndexScalarByteArrayOp FloatVec 2 W64) = 1104+primOpTag (VecIndexScalarByteArrayOp FloatVec 8 W32) = 1105+primOpTag (VecIndexScalarByteArrayOp FloatVec 4 W64) = 1106+primOpTag (VecIndexScalarByteArrayOp FloatVec 16 W32) = 1107+primOpTag (VecIndexScalarByteArrayOp FloatVec 8 W64) = 1108+primOpTag (VecReadScalarByteArrayOp IntVec 16 W8) = 1109+primOpTag (VecReadScalarByteArrayOp IntVec 8 W16) = 1110+primOpTag (VecReadScalarByteArrayOp IntVec 4 W32) = 1111+primOpTag (VecReadScalarByteArrayOp IntVec 2 W64) = 1112+primOpTag (VecReadScalarByteArrayOp IntVec 32 W8) = 1113+primOpTag (VecReadScalarByteArrayOp IntVec 16 W16) = 1114+primOpTag (VecReadScalarByteArrayOp IntVec 8 W32) = 1115+primOpTag (VecReadScalarByteArrayOp IntVec 4 W64) = 1116+primOpTag (VecReadScalarByteArrayOp IntVec 64 W8) = 1117+primOpTag (VecReadScalarByteArrayOp IntVec 32 W16) = 1118+primOpTag (VecReadScalarByteArrayOp IntVec 16 W32) = 1119+primOpTag (VecReadScalarByteArrayOp IntVec 8 W64) = 1120+primOpTag (VecReadScalarByteArrayOp WordVec 16 W8) = 1121+primOpTag (VecReadScalarByteArrayOp WordVec 8 W16) = 1122+primOpTag (VecReadScalarByteArrayOp WordVec 4 W32) = 1123+primOpTag (VecReadScalarByteArrayOp WordVec 2 W64) = 1124+primOpTag (VecReadScalarByteArrayOp WordVec 32 W8) = 1125+primOpTag (VecReadScalarByteArrayOp WordVec 16 W16) = 1126+primOpTag (VecReadScalarByteArrayOp WordVec 8 W32) = 1127+primOpTag (VecReadScalarByteArrayOp WordVec 4 W64) = 1128+primOpTag (VecReadScalarByteArrayOp WordVec 64 W8) = 1129+primOpTag (VecReadScalarByteArrayOp WordVec 32 W16) = 1130+primOpTag (VecReadScalarByteArrayOp WordVec 16 W32) = 1131+primOpTag (VecReadScalarByteArrayOp WordVec 8 W64) = 1132+primOpTag (VecReadScalarByteArrayOp FloatVec 4 W32) = 1133+primOpTag (VecReadScalarByteArrayOp FloatVec 2 W64) = 1134+primOpTag (VecReadScalarByteArrayOp FloatVec 8 W32) = 1135+primOpTag (VecReadScalarByteArrayOp FloatVec 4 W64) = 1136+primOpTag (VecReadScalarByteArrayOp FloatVec 16 W32) = 1137+primOpTag (VecReadScalarByteArrayOp FloatVec 8 W64) = 1138+primOpTag (VecWriteScalarByteArrayOp IntVec 16 W8) = 1139+primOpTag (VecWriteScalarByteArrayOp IntVec 8 W16) = 1140+primOpTag (VecWriteScalarByteArrayOp IntVec 4 W32) = 1141+primOpTag (VecWriteScalarByteArrayOp IntVec 2 W64) = 1142+primOpTag (VecWriteScalarByteArrayOp IntVec 32 W8) = 1143+primOpTag (VecWriteScalarByteArrayOp IntVec 16 W16) = 1144+primOpTag (VecWriteScalarByteArrayOp IntVec 8 W32) = 1145+primOpTag (VecWriteScalarByteArrayOp IntVec 4 W64) = 1146+primOpTag (VecWriteScalarByteArrayOp IntVec 64 W8) = 1147+primOpTag (VecWriteScalarByteArrayOp IntVec 32 W16) = 1148+primOpTag (VecWriteScalarByteArrayOp IntVec 16 W32) = 1149+primOpTag (VecWriteScalarByteArrayOp IntVec 8 W64) = 1150+primOpTag (VecWriteScalarByteArrayOp WordVec 16 W8) = 1151+primOpTag (VecWriteScalarByteArrayOp WordVec 8 W16) = 1152+primOpTag (VecWriteScalarByteArrayOp WordVec 4 W32) = 1153+primOpTag (VecWriteScalarByteArrayOp WordVec 2 W64) = 1154+primOpTag (VecWriteScalarByteArrayOp WordVec 32 W8) = 1155+primOpTag (VecWriteScalarByteArrayOp WordVec 16 W16) = 1156+primOpTag (VecWriteScalarByteArrayOp WordVec 8 W32) = 1157+primOpTag (VecWriteScalarByteArrayOp WordVec 4 W64) = 1158+primOpTag (VecWriteScalarByteArrayOp WordVec 64 W8) = 1159+primOpTag (VecWriteScalarByteArrayOp WordVec 32 W16) = 1160+primOpTag (VecWriteScalarByteArrayOp WordVec 16 W32) = 1161+primOpTag (VecWriteScalarByteArrayOp WordVec 8 W64) = 1162+primOpTag (VecWriteScalarByteArrayOp FloatVec 4 W32) = 1163+primOpTag (VecWriteScalarByteArrayOp FloatVec 2 W64) = 1164+primOpTag (VecWriteScalarByteArrayOp FloatVec 8 W32) = 1165+primOpTag (VecWriteScalarByteArrayOp FloatVec 4 W64) = 1166+primOpTag (VecWriteScalarByteArrayOp FloatVec 16 W32) = 1167+primOpTag (VecWriteScalarByteArrayOp FloatVec 8 W64) = 1168+primOpTag (VecIndexScalarOffAddrOp IntVec 16 W8) = 1169+primOpTag (VecIndexScalarOffAddrOp IntVec 8 W16) = 1170+primOpTag (VecIndexScalarOffAddrOp IntVec 4 W32) = 1171+primOpTag (VecIndexScalarOffAddrOp IntVec 2 W64) = 1172+primOpTag (VecIndexScalarOffAddrOp IntVec 32 W8) = 1173+primOpTag (VecIndexScalarOffAddrOp IntVec 16 W16) = 1174+primOpTag (VecIndexScalarOffAddrOp IntVec 8 W32) = 1175+primOpTag (VecIndexScalarOffAddrOp IntVec 4 W64) = 1176+primOpTag (VecIndexScalarOffAddrOp IntVec 64 W8) = 1177+primOpTag (VecIndexScalarOffAddrOp IntVec 32 W16) = 1178+primOpTag (VecIndexScalarOffAddrOp IntVec 16 W32) = 1179+primOpTag (VecIndexScalarOffAddrOp IntVec 8 W64) = 1180+primOpTag (VecIndexScalarOffAddrOp WordVec 16 W8) = 1181+primOpTag (VecIndexScalarOffAddrOp WordVec 8 W16) = 1182+primOpTag (VecIndexScalarOffAddrOp WordVec 4 W32) = 1183+primOpTag (VecIndexScalarOffAddrOp WordVec 2 W64) = 1184+primOpTag (VecIndexScalarOffAddrOp WordVec 32 W8) = 1185+primOpTag (VecIndexScalarOffAddrOp WordVec 16 W16) = 1186+primOpTag (VecIndexScalarOffAddrOp WordVec 8 W32) = 1187+primOpTag (VecIndexScalarOffAddrOp WordVec 4 W64) = 1188+primOpTag (VecIndexScalarOffAddrOp WordVec 64 W8) = 1189+primOpTag (VecIndexScalarOffAddrOp WordVec 32 W16) = 1190+primOpTag (VecIndexScalarOffAddrOp WordVec 16 W32) = 1191+primOpTag (VecIndexScalarOffAddrOp WordVec 8 W64) = 1192+primOpTag (VecIndexScalarOffAddrOp FloatVec 4 W32) = 1193+primOpTag (VecIndexScalarOffAddrOp FloatVec 2 W64) = 1194+primOpTag (VecIndexScalarOffAddrOp FloatVec 8 W32) = 1195+primOpTag (VecIndexScalarOffAddrOp FloatVec 4 W64) = 1196+primOpTag (VecIndexScalarOffAddrOp FloatVec 16 W32) = 1197+primOpTag (VecIndexScalarOffAddrOp FloatVec 8 W64) = 1198+primOpTag (VecReadScalarOffAddrOp IntVec 16 W8) = 1199+primOpTag (VecReadScalarOffAddrOp IntVec 8 W16) = 1200+primOpTag (VecReadScalarOffAddrOp IntVec 4 W32) = 1201+primOpTag (VecReadScalarOffAddrOp IntVec 2 W64) = 1202+primOpTag (VecReadScalarOffAddrOp IntVec 32 W8) = 1203+primOpTag (VecReadScalarOffAddrOp IntVec 16 W16) = 1204+primOpTag (VecReadScalarOffAddrOp IntVec 8 W32) = 1205+primOpTag (VecReadScalarOffAddrOp IntVec 4 W64) = 1206+primOpTag (VecReadScalarOffAddrOp IntVec 64 W8) = 1207+primOpTag (VecReadScalarOffAddrOp IntVec 32 W16) = 1208+primOpTag (VecReadScalarOffAddrOp IntVec 16 W32) = 1209+primOpTag (VecReadScalarOffAddrOp IntVec 8 W64) = 1210+primOpTag (VecReadScalarOffAddrOp WordVec 16 W8) = 1211+primOpTag (VecReadScalarOffAddrOp WordVec 8 W16) = 1212+primOpTag (VecReadScalarOffAddrOp WordVec 4 W32) = 1213+primOpTag (VecReadScalarOffAddrOp WordVec 2 W64) = 1214+primOpTag (VecReadScalarOffAddrOp WordVec 32 W8) = 1215+primOpTag (VecReadScalarOffAddrOp WordVec 16 W16) = 1216+primOpTag (VecReadScalarOffAddrOp WordVec 8 W32) = 1217+primOpTag (VecReadScalarOffAddrOp WordVec 4 W64) = 1218+primOpTag (VecReadScalarOffAddrOp WordVec 64 W8) = 1219+primOpTag (VecReadScalarOffAddrOp WordVec 32 W16) = 1220+primOpTag (VecReadScalarOffAddrOp WordVec 16 W32) = 1221+primOpTag (VecReadScalarOffAddrOp WordVec 8 W64) = 1222+primOpTag (VecReadScalarOffAddrOp FloatVec 4 W32) = 1223+primOpTag (VecReadScalarOffAddrOp FloatVec 2 W64) = 1224+primOpTag (VecReadScalarOffAddrOp FloatVec 8 W32) = 1225+primOpTag (VecReadScalarOffAddrOp FloatVec 4 W64) = 1226+primOpTag (VecReadScalarOffAddrOp FloatVec 16 W32) = 1227+primOpTag (VecReadScalarOffAddrOp FloatVec 8 W64) = 1228+primOpTag (VecWriteScalarOffAddrOp IntVec 16 W8) = 1229+primOpTag (VecWriteScalarOffAddrOp IntVec 8 W16) = 1230+primOpTag (VecWriteScalarOffAddrOp IntVec 4 W32) = 1231+primOpTag (VecWriteScalarOffAddrOp IntVec 2 W64) = 1232+primOpTag (VecWriteScalarOffAddrOp IntVec 32 W8) = 1233+primOpTag (VecWriteScalarOffAddrOp IntVec 16 W16) = 1234+primOpTag (VecWriteScalarOffAddrOp IntVec 8 W32) = 1235+primOpTag (VecWriteScalarOffAddrOp IntVec 4 W64) = 1236+primOpTag (VecWriteScalarOffAddrOp IntVec 64 W8) = 1237+primOpTag (VecWriteScalarOffAddrOp IntVec 32 W16) = 1238+primOpTag (VecWriteScalarOffAddrOp IntVec 16 W32) = 1239+primOpTag (VecWriteScalarOffAddrOp IntVec 8 W64) = 1240+primOpTag (VecWriteScalarOffAddrOp WordVec 16 W8) = 1241+primOpTag (VecWriteScalarOffAddrOp WordVec 8 W16) = 1242+primOpTag (VecWriteScalarOffAddrOp WordVec 4 W32) = 1243+primOpTag (VecWriteScalarOffAddrOp WordVec 2 W64) = 1244+primOpTag (VecWriteScalarOffAddrOp WordVec 32 W8) = 1245+primOpTag (VecWriteScalarOffAddrOp WordVec 16 W16) = 1246+primOpTag (VecWriteScalarOffAddrOp WordVec 8 W32) = 1247+primOpTag (VecWriteScalarOffAddrOp WordVec 4 W64) = 1248+primOpTag (VecWriteScalarOffAddrOp WordVec 64 W8) = 1249+primOpTag (VecWriteScalarOffAddrOp WordVec 32 W16) = 1250+primOpTag (VecWriteScalarOffAddrOp WordVec 16 W32) = 1251+primOpTag (VecWriteScalarOffAddrOp WordVec 8 W64) = 1252+primOpTag (VecWriteScalarOffAddrOp FloatVec 4 W32) = 1253+primOpTag (VecWriteScalarOffAddrOp FloatVec 2 W64) = 1254+primOpTag (VecWriteScalarOffAddrOp FloatVec 8 W32) = 1255+primOpTag (VecWriteScalarOffAddrOp FloatVec 4 W64) = 1256+primOpTag (VecWriteScalarOffAddrOp FloatVec 16 W32) = 1257+primOpTag (VecWriteScalarOffAddrOp FloatVec 8 W64) = 1258+primOpTag PrefetchByteArrayOp3 = 1259+primOpTag PrefetchMutableByteArrayOp3 = 1260+primOpTag PrefetchAddrOp3 = 1261+primOpTag PrefetchValueOp3 = 1262+primOpTag PrefetchByteArrayOp2 = 1263+primOpTag PrefetchMutableByteArrayOp2 = 1264+primOpTag PrefetchAddrOp2 = 1265+primOpTag PrefetchValueOp2 = 1266+primOpTag PrefetchByteArrayOp1 = 1267+primOpTag PrefetchMutableByteArrayOp1 = 1268+primOpTag PrefetchAddrOp1 = 1269+primOpTag PrefetchValueOp1 = 1270+primOpTag PrefetchByteArrayOp0 = 1271+primOpTag PrefetchMutableByteArrayOp0 = 1272+primOpTag PrefetchAddrOp0 = 1273+primOpTag PrefetchValueOp0 = 1274
ghc-lib/stage0/lib/ghcautoconf.h view
@@ -482,6 +482,9 @@ macro is obsolete. */ #define TIME_WITH_SYS_TIME 1 +/* Compile-in ASSERTs in all ways. */+/* #undef USE_ASSERTS_ALL_WAYS */+ /* Enable single heap address space support */ #define USE_LARGE_ADDRESS_SPACE 1
ghc-lib/stage0/libraries/ghc-boot/build/GHC/Version.hs view
@@ -3,19 +3,19 @@ import Prelude -- See Note [Why do we import Prelude here?] cProjectGitCommitId :: String-cProjectGitCommitId = "66bd59319a6506125758a1c876eba874bf4f1c86"+cProjectGitCommitId = "54d6b20192fe6fc244248c7766533a768c591bae" cProjectVersion :: String-cProjectVersion = "9.3.20210701"+cProjectVersion = "9.3.20210729" cProjectVersionInt :: String cProjectVersionInt = "903" cProjectPatchLevel :: String-cProjectPatchLevel = "20210701"+cProjectPatchLevel = "20210729" cProjectPatchLevel1 :: String-cProjectPatchLevel1 = "20210701"+cProjectPatchLevel1 = "20210729" cProjectPatchLevel2 :: String cProjectPatchLevel2 = ""
libraries/ghc-boot-th/GHC/LanguageExtensions/Type.hs view
@@ -61,7 +61,7 @@ | NumDecimals | DisambiguateRecordFields | RecordWildCards- | RecordPuns+ | NamedFieldPuns | ViewPatterns | GADTs | GADTSyntax
libraries/ghci/GHCi/Message.hs view
@@ -462,7 +462,7 @@ #define MIN_VERSION_ghc_heap(major1,major2,minor) (\ (major1) < 9 || \ (major1) == 9 && (major2) < 3 || \- (major1) == 9 && (major2) == 3 && (minor) <= 20210701)+ (major1) == 9 && (major2) == 3 && (minor) <= 20210729) #endif /* MIN_VERSION_ghc_heap */ #if MIN_VERSION_ghc_heap(8,11,0) instance Binary Heap.StgTSOProfInfo
libraries/template-haskell/Language/Haskell/TH/Lib.hs view
@@ -103,6 +103,9 @@ -- **** Fixity infixLD, infixRD, infixND, + -- **** Default declaration+ defaultD,+ -- **** Foreign Function Interface (FFI) cCall, stdCall, cApi, prim, javaScript, unsafe, safe, interruptible, forImpD,
libraries/template-haskell/Language/Haskell/TH/Lib/Internal.hs view
@@ -468,6 +468,9 @@ infixND :: Quote m => Int -> Name -> m Dec infixND prec nm = pure (InfixD (Fixity prec InfixN) nm) +defaultD :: Quote m => [m Type] -> m Dec+defaultD tys = DefaultD <$> sequenceA tys+ pragInlD :: Quote m => Name -> Inline -> RuleMatch -> Phases -> m Dec pragInlD name inline rm phases = pure $ PragmaD $ InlineP name inline rm phases@@ -1030,6 +1033,7 @@ doc_loc (StandaloneDerivD _ _ _) = Nothing doc_loc (DefaultSigD _ _) = Nothing doc_loc (ImplicitParamBindD _ _) = Nothing+ doc_loc (DefaultD _) = Nothing -- | Variant of 'withDecDoc' that applies the same documentation to -- multiple declarations. Useful for documenting quoted declarations.
libraries/template-haskell/Language/Haskell/TH/Ppr.hs view
@@ -361,6 +361,8 @@ ppr_dec _ (KiSigD f k) = text "type" <+> pprPrefixOcc f <+> dcolon <+> ppr k ppr_dec _ (ForeignD f) = ppr f ppr_dec _ (InfixD fx n) = pprFixity n fx+ppr_dec _ (DefaultD tys) =+ text "default" <+> parens (sep $ punctuate comma $ map ppr tys) ppr_dec _ (PragmaD p) = ppr p ppr_dec isTop (DataFamilyD tc tvs kind) = text "data" <+> maybeFamily <+> ppr tc <+> hsep (map ppr tvs) <+> maybeKind
libraries/template-haskell/Language/Haskell/TH/Syntax.hs view
@@ -2289,6 +2289,7 @@ --{ foreign export ... }@ | InfixD Fixity Name -- ^ @{ infix 3 foo }@+ | DefaultD [Type] -- ^ @{ default (Integer, Double) }@ -- | pragmas | PragmaD Pragma -- ^ @{ {\-\# INLINE [1] foo \#-\} }@