diff options
author | Ian Lynagh <igloo@earth.li> | 2011-07-23 21:46:37 +0100 |
---|---|---|
committer | Ian Lynagh <igloo@earth.li> | 2011-07-23 21:46:37 +0100 |
commit | 2b42de78c59d81300aa62b17cf2b5d984fa55e84 (patch) | |
tree | 03d92316f695bd584ff9dcbf433712a6978ab2cd /compiler/prelude | |
parent | 12f0c84ad20bf65ded353f9c6e300f34b9436ee4 (diff) | |
download | haskell-2b42de78c59d81300aa62b17cf2b5d984fa55e84.tar.gz |
Add rules for Integer constant folding
Diffstat (limited to 'compiler/prelude')
-rw-r--r-- | compiler/prelude/PrelNames.lhs | 316 | ||||
-rw-r--r-- | compiler/prelude/PrelRules.lhs | 137 | ||||
-rw-r--r-- | compiler/prelude/TysWiredIn.lhs | 19 |
3 files changed, 352 insertions, 120 deletions
diff --git a/compiler/prelude/PrelNames.lhs b/compiler/prelude/PrelNames.lhs index 995ab1df6c..c5f123d61c 100644 --- a/compiler/prelude/PrelNames.lhs +++ b/compiler/prelude/PrelNames.lhs @@ -113,12 +113,10 @@ basicKnownKeyNames ++ [ -- Type constructors (synonyms especially) ioTyConName, ioDataConName, runMainIOName, - orderingTyConName, rationalTyConName, stringTyConName, ratioDataConName, ratioTyConName, - integerTyConName, smallIntegerName, -- Classes. *Must* include: -- classes that are grabbed by key (e.g., eqClassKey) @@ -201,12 +199,22 @@ basicKnownKeyNames -- Others otherwiseIdName, inlineIdName, - plusIntegerName, timesIntegerName, eqStringName, assertName, breakpointName, breakpointCondName, breakpointAutoName, opaqueTyConName, assertErrorName, runSTRepName, printName, fstName, sndName, + -- Integer + integerTyConName, plusIntegerName, timesIntegerName, smallIntegerName, + integerToWordName, integerToIntName, minusIntegerName, + negateIntegerName, eqIntegerName, neqIntegerName, + absIntegerName, signumIntegerName, + leIntegerName, gtIntegerName, ltIntegerName, geIntegerName, + compareIntegerName, + gcdIntegerName, lcmIntegerName, + andIntegerName, orIntegerName, xorIntegerName, complementIntegerName, + shiftLIntegerName, shiftRIntegerName, + -- MonadFix monadFixClassName, mfixName, @@ -216,6 +224,9 @@ basicKnownKeyNames -- Annotation type checking toAnnotationWrapperName + -- The Ordering type + , orderingTyConName, ltDataConName, eqDataConName, gtDataConName + -- The Either type , eitherTyConName, leftDataConName, rightDataConName @@ -638,8 +649,11 @@ wildCardName = mkSystemVarName wildCardKey (fsLit "wild") runMainIOName :: Name runMainIOName = varQual gHC_TOP_HANDLER (fsLit "runMainIO") runMainKey -orderingTyConName :: Name +orderingTyConName, ltDataConName, eqDataConName, gtDataConName :: Name orderingTyConName = tcQual gHC_ORDERING (fsLit "Ordering") orderingTyConKey +ltDataConName = conName gHC_ORDERING (fsLit "LT") ltDataConKey +eqDataConName = conName gHC_ORDERING (fsLit "EQ") eqDataConKey +gtDataConName = conName gHC_ORDERING (fsLit "GT") gtDataConKey eitherTyConName, leftDataConName, rightDataConName :: Name eitherTyConName = tcQual dATA_EITHER (fsLit "Either") eitherTyConKey @@ -769,17 +783,46 @@ fstName = varQual dATA_TUPLE (fsLit "fst") fstIdKey sndName = varQual dATA_TUPLE (fsLit "snd") sndIdKey -- Module GHC.Num -numClassName, fromIntegerName, minusName, negateName, plusIntegerName, - timesIntegerName, - integerTyConName, smallIntegerName :: Name +numClassName, fromIntegerName, minusName, negateName :: Name numClassName = clsQual gHC_NUM (fsLit "Num") numClassKey fromIntegerName = methName gHC_NUM (fsLit "fromInteger") fromIntegerClassOpKey minusName = methName gHC_NUM (fsLit "-") minusClassOpKey negateName = methName gHC_NUM (fsLit "negate") negateClassOpKey -plusIntegerName = varQual gHC_INTEGER (fsLit "plusInteger") plusIntegerIdKey -timesIntegerName = varQual gHC_INTEGER (fsLit "timesInteger") timesIntegerIdKey -integerTyConName = tcQual gHC_INTEGER_TYPE (fsLit "Integer") integerTyConKey -smallIntegerName = varQual gHC_INTEGER (fsLit "smallInteger") smallIntegerIdKey + +integerTyConName, plusIntegerName, timesIntegerName, smallIntegerName, + integerToWordName, integerToIntName, minusIntegerName, + negateIntegerName, eqIntegerName, neqIntegerName, + absIntegerName, signumIntegerName, + leIntegerName, gtIntegerName, ltIntegerName, geIntegerName, + compareIntegerName, + gcdIntegerName, lcmIntegerName, + andIntegerName, orIntegerName, xorIntegerName, complementIntegerName, + shiftLIntegerName, shiftRIntegerName :: Name +integerTyConName = tcQual gHC_INTEGER_TYPE (fsLit "Integer") integerTyConKey +plusIntegerName = varQual gHC_INTEGER (fsLit "plusInteger") plusIntegerIdKey +timesIntegerName = varQual gHC_INTEGER (fsLit "timesInteger") timesIntegerIdKey +smallIntegerName = varQual gHC_INTEGER (fsLit "smallInteger") smallIntegerIdKey +integerToWordName = varQual gHC_INTEGER (fsLit "integerToWord") integerToWordIdKey +integerToIntName = varQual gHC_INTEGER (fsLit "integerToInt") integerToIntIdKey +minusIntegerName = varQual gHC_INTEGER (fsLit "minusInteger") minusIntegerIdKey +negateIntegerName = varQual gHC_INTEGER (fsLit "negateInteger") negateIntegerIdKey +eqIntegerName = varQual gHC_INTEGER (fsLit "eqInteger") eqIntegerIdKey +neqIntegerName = varQual gHC_INTEGER (fsLit "neqInteger") neqIntegerIdKey +absIntegerName = varQual gHC_INTEGER (fsLit "absInteger") absIntegerIdKey +signumIntegerName = varQual gHC_INTEGER (fsLit "signumInteger") signumIntegerIdKey +leIntegerName = varQual gHC_INTEGER (fsLit "leInteger") leIntegerIdKey +gtIntegerName = varQual gHC_INTEGER (fsLit "gtInteger") gtIntegerIdKey +ltIntegerName = varQual gHC_INTEGER (fsLit "ltInteger") ltIntegerIdKey +geIntegerName = varQual gHC_INTEGER (fsLit "geInteger") geIntegerIdKey +compareIntegerName = varQual gHC_INTEGER (fsLit "compareInteger") compareIntegerIdKey +gcdIntegerName = varQual gHC_INTEGER (fsLit "gcdInteger") gcdIntegerIdKey +lcmIntegerName = varQual gHC_INTEGER (fsLit "lcmInteger") lcmIntegerIdKey +andIntegerName = varQual gHC_INTEGER (fsLit "andInteger") andIntegerIdKey +orIntegerName = varQual gHC_INTEGER (fsLit "orInteger") orIntegerIdKey +xorIntegerName = varQual gHC_INTEGER (fsLit "xorInteger") xorIntegerIdKey +complementIntegerName = varQual gHC_INTEGER (fsLit "complementInteger") complementIntegerIdKey +shiftLIntegerName = varQual gHC_INTEGER (fsLit "shiftLInteger") shiftLIntegerIdKey +shiftRIntegerName = varQual gHC_INTEGER (fsLit "shiftRInteger") shiftRIntegerIdKey -- GHC.Real types and classes rationalTyConName, ratioTyConName, ratioDataConName, realClassName, @@ -1301,6 +1344,11 @@ parrDataConKey = mkPreludeDataConUnique 24 leftDataConKey, rightDataConKey :: Unique leftDataConKey = mkPreludeDataConUnique 25 rightDataConKey = mkPreludeDataConUnique 26 + +ltDataConKey, eqDataConKey, gtDataConKey :: Unique +ltDataConKey = mkPreludeDataConUnique 27 +eqDataConKey = mkPreludeDataConUnique 28 +gtDataConKey = mkPreludeDataConUnique 29 \end{code} %************************************************************************ @@ -1320,111 +1368,141 @@ wildCardKey, absentErrorIdKey, augmentIdKey, appendIdKey, unpackCStringFoldrIdKey, unpackCStringIdKey :: Unique wildCardKey = mkPreludeMiscIdUnique 0 -- See Note [WildCard] absentErrorIdKey = mkPreludeMiscIdUnique 1 -augmentIdKey = mkPreludeMiscIdUnique 3 -appendIdKey = mkPreludeMiscIdUnique 4 -buildIdKey = mkPreludeMiscIdUnique 5 -errorIdKey = mkPreludeMiscIdUnique 6 -foldrIdKey = mkPreludeMiscIdUnique 8 -recSelErrorIdKey = mkPreludeMiscIdUnique 9 -seqIdKey = mkPreludeMiscIdUnique 15 -irrefutPatErrorIdKey = mkPreludeMiscIdUnique 16 -eqStringIdKey = mkPreludeMiscIdUnique 17 -noMethodBindingErrorIdKey = mkPreludeMiscIdUnique 18 -nonExhaustiveGuardsErrorIdKey = mkPreludeMiscIdUnique 19 -runtimeErrorIdKey = mkPreludeMiscIdUnique 20 -patErrorIdKey = mkPreludeMiscIdUnique 23 -realWorldPrimIdKey = mkPreludeMiscIdUnique 24 -recConErrorIdKey = mkPreludeMiscIdUnique 25 -unpackCStringUtf8IdKey = mkPreludeMiscIdUnique 28 -unpackCStringAppendIdKey = mkPreludeMiscIdUnique 29 -unpackCStringFoldrIdKey = mkPreludeMiscIdUnique 30 -unpackCStringIdKey = mkPreludeMiscIdUnique 31 +augmentIdKey = mkPreludeMiscIdUnique 2 +appendIdKey = mkPreludeMiscIdUnique 3 +buildIdKey = mkPreludeMiscIdUnique 4 +errorIdKey = mkPreludeMiscIdUnique 5 +foldrIdKey = mkPreludeMiscIdUnique 6 +recSelErrorIdKey = mkPreludeMiscIdUnique 7 +seqIdKey = mkPreludeMiscIdUnique 8 +irrefutPatErrorIdKey = mkPreludeMiscIdUnique 9 +eqStringIdKey = mkPreludeMiscIdUnique 10 +noMethodBindingErrorIdKey = mkPreludeMiscIdUnique 11 +nonExhaustiveGuardsErrorIdKey = mkPreludeMiscIdUnique 12 +runtimeErrorIdKey = mkPreludeMiscIdUnique 13 +patErrorIdKey = mkPreludeMiscIdUnique 14 +realWorldPrimIdKey = mkPreludeMiscIdUnique 15 +recConErrorIdKey = mkPreludeMiscIdUnique 16 +unpackCStringUtf8IdKey = mkPreludeMiscIdUnique 17 +unpackCStringAppendIdKey = mkPreludeMiscIdUnique 18 +unpackCStringFoldrIdKey = mkPreludeMiscIdUnique 19 +unpackCStringIdKey = mkPreludeMiscIdUnique 20 unsafeCoerceIdKey, concatIdKey, filterIdKey, zipIdKey, bindIOIdKey, returnIOIdKey, newStablePtrIdKey, - smallIntegerIdKey, plusIntegerIdKey, timesIntegerIdKey, printIdKey, failIOIdKey, nullAddrIdKey, voidArgIdKey, fstIdKey, sndIdKey, otherwiseIdKey, assertIdKey, runSTRepIdKey :: Unique -unsafeCoerceIdKey = mkPreludeMiscIdUnique 32 -concatIdKey = mkPreludeMiscIdUnique 33 -filterIdKey = mkPreludeMiscIdUnique 34 -zipIdKey = mkPreludeMiscIdUnique 35 -bindIOIdKey = mkPreludeMiscIdUnique 36 -returnIOIdKey = mkPreludeMiscIdUnique 37 -newStablePtrIdKey = mkPreludeMiscIdUnique 39 -smallIntegerIdKey = mkPreludeMiscIdUnique 40 -plusIntegerIdKey = mkPreludeMiscIdUnique 41 -timesIntegerIdKey = mkPreludeMiscIdUnique 42 -printIdKey = mkPreludeMiscIdUnique 43 -failIOIdKey = mkPreludeMiscIdUnique 44 -nullAddrIdKey = mkPreludeMiscIdUnique 46 -voidArgIdKey = mkPreludeMiscIdUnique 47 -fstIdKey = mkPreludeMiscIdUnique 49 -sndIdKey = mkPreludeMiscIdUnique 50 -otherwiseIdKey = mkPreludeMiscIdUnique 51 -assertIdKey = mkPreludeMiscIdUnique 53 -runSTRepIdKey = mkPreludeMiscIdUnique 54 +unsafeCoerceIdKey = mkPreludeMiscIdUnique 30 +concatIdKey = mkPreludeMiscIdUnique 31 +filterIdKey = mkPreludeMiscIdUnique 32 +zipIdKey = mkPreludeMiscIdUnique 33 +bindIOIdKey = mkPreludeMiscIdUnique 34 +returnIOIdKey = mkPreludeMiscIdUnique 35 +newStablePtrIdKey = mkPreludeMiscIdUnique 36 +printIdKey = mkPreludeMiscIdUnique 37 +failIOIdKey = mkPreludeMiscIdUnique 38 +nullAddrIdKey = mkPreludeMiscIdUnique 39 +voidArgIdKey = mkPreludeMiscIdUnique 40 +fstIdKey = mkPreludeMiscIdUnique 41 +sndIdKey = mkPreludeMiscIdUnique 42 +otherwiseIdKey = mkPreludeMiscIdUnique 43 +assertIdKey = mkPreludeMiscIdUnique 44 +runSTRepIdKey = mkPreludeMiscIdUnique 45 + +smallIntegerIdKey, integerToWordIdKey, integerToIntIdKey, + plusIntegerIdKey, timesIntegerIdKey, minusIntegerIdKey, + negateIntegerIdKey, + eqIntegerIdKey, neqIntegerIdKey, absIntegerIdKey, signumIntegerIdKey, + leIntegerIdKey, gtIntegerIdKey, ltIntegerIdKey, geIntegerIdKey, + compareIntegerIdKey, + gcdIntegerIdKey, lcmIntegerIdKey, + andIntegerIdKey, orIntegerIdKey, xorIntegerIdKey, complementIntegerIdKey, + shiftLIntegerIdKey, shiftRIntegerIdKey :: Unique +smallIntegerIdKey = mkPreludeMiscIdUnique 60 +integerToWordIdKey = mkPreludeMiscIdUnique 61 +integerToIntIdKey = mkPreludeMiscIdUnique 62 +plusIntegerIdKey = mkPreludeMiscIdUnique 63 +timesIntegerIdKey = mkPreludeMiscIdUnique 64 +minusIntegerIdKey = mkPreludeMiscIdUnique 65 +negateIntegerIdKey = mkPreludeMiscIdUnique 66 +eqIntegerIdKey = mkPreludeMiscIdUnique 67 +neqIntegerIdKey = mkPreludeMiscIdUnique 68 +absIntegerIdKey = mkPreludeMiscIdUnique 69 +signumIntegerIdKey = mkPreludeMiscIdUnique 70 +leIntegerIdKey = mkPreludeMiscIdUnique 71 +gtIntegerIdKey = mkPreludeMiscIdUnique 72 +ltIntegerIdKey = mkPreludeMiscIdUnique 73 +geIntegerIdKey = mkPreludeMiscIdUnique 74 +compareIntegerIdKey = mkPreludeMiscIdUnique 75 +gcdIntegerIdKey = mkPreludeMiscIdUnique 85 +lcmIntegerIdKey = mkPreludeMiscIdUnique 86 +andIntegerIdKey = mkPreludeMiscIdUnique 87 +orIntegerIdKey = mkPreludeMiscIdUnique 88 +xorIntegerIdKey = mkPreludeMiscIdUnique 89 +complementIntegerIdKey = mkPreludeMiscIdUnique 90 +shiftLIntegerIdKey = mkPreludeMiscIdUnique 91 +shiftRIntegerIdKey = mkPreludeMiscIdUnique 92 rootMainKey, runMainKey :: Unique -rootMainKey = mkPreludeMiscIdUnique 55 -runMainKey = mkPreludeMiscIdUnique 56 +rootMainKey = mkPreludeMiscIdUnique 100 +runMainKey = mkPreludeMiscIdUnique 101 thenIOIdKey, lazyIdKey, assertErrorIdKey :: Unique -thenIOIdKey = mkPreludeMiscIdUnique 59 -lazyIdKey = mkPreludeMiscIdUnique 60 -assertErrorIdKey = mkPreludeMiscIdUnique 61 +thenIOIdKey = mkPreludeMiscIdUnique 102 +lazyIdKey = mkPreludeMiscIdUnique 103 +assertErrorIdKey = mkPreludeMiscIdUnique 104 breakpointIdKey, breakpointCondIdKey, breakpointAutoIdKey, breakpointJumpIdKey, breakpointCondJumpIdKey, breakpointAutoJumpIdKey :: Unique -breakpointIdKey = mkPreludeMiscIdUnique 62 -breakpointCondIdKey = mkPreludeMiscIdUnique 63 -breakpointAutoIdKey = mkPreludeMiscIdUnique 64 -breakpointJumpIdKey = mkPreludeMiscIdUnique 65 -breakpointCondJumpIdKey = mkPreludeMiscIdUnique 66 -breakpointAutoJumpIdKey = mkPreludeMiscIdUnique 67 +breakpointIdKey = mkPreludeMiscIdUnique 110 +breakpointCondIdKey = mkPreludeMiscIdUnique 111 +breakpointAutoIdKey = mkPreludeMiscIdUnique 112 +breakpointJumpIdKey = mkPreludeMiscIdUnique 113 +breakpointCondJumpIdKey = mkPreludeMiscIdUnique 114 +breakpointAutoJumpIdKey = mkPreludeMiscIdUnique 115 inlineIdKey :: Unique -inlineIdKey = mkPreludeMiscIdUnique 68 +inlineIdKey = mkPreludeMiscIdUnique 120 mapIdKey, groupWithIdKey, dollarIdKey :: Unique -mapIdKey = mkPreludeMiscIdUnique 69 -groupWithIdKey = mkPreludeMiscIdUnique 70 -dollarIdKey = mkPreludeMiscIdUnique 71 +mapIdKey = mkPreludeMiscIdUnique 121 +groupWithIdKey = mkPreludeMiscIdUnique 122 +dollarIdKey = mkPreludeMiscIdUnique 123 coercionTokenIdKey :: Unique -coercionTokenIdKey = mkPreludeMiscIdUnique 72 +coercionTokenIdKey = mkPreludeMiscIdUnique 124 -- Parallel array functions singletonPIdKey, nullPIdKey, lengthPIdKey, replicatePIdKey, mapPIdKey, filterPIdKey, zipPIdKey, crossMapPIdKey, indexPIdKey, toPIdKey, enumFromToPIdKey, enumFromThenToPIdKey, emptyPIdKey, appPIdKey :: Unique -singletonPIdKey = mkPreludeMiscIdUnique 79 -nullPIdKey = mkPreludeMiscIdUnique 80 -lengthPIdKey = mkPreludeMiscIdUnique 81 -replicatePIdKey = mkPreludeMiscIdUnique 82 -mapPIdKey = mkPreludeMiscIdUnique 83 -filterPIdKey = mkPreludeMiscIdUnique 84 -zipPIdKey = mkPreludeMiscIdUnique 85 -crossMapPIdKey = mkPreludeMiscIdUnique 86 -indexPIdKey = mkPreludeMiscIdUnique 87 -toPIdKey = mkPreludeMiscIdUnique 88 -enumFromToPIdKey = mkPreludeMiscIdUnique 89 -enumFromThenToPIdKey = mkPreludeMiscIdUnique 90 -emptyPIdKey = mkPreludeMiscIdUnique 91 -appPIdKey = mkPreludeMiscIdUnique 92 +singletonPIdKey = mkPreludeMiscIdUnique 130 +nullPIdKey = mkPreludeMiscIdUnique 131 +lengthPIdKey = mkPreludeMiscIdUnique 132 +replicatePIdKey = mkPreludeMiscIdUnique 133 +mapPIdKey = mkPreludeMiscIdUnique 134 +filterPIdKey = mkPreludeMiscIdUnique 135 +zipPIdKey = mkPreludeMiscIdUnique 136 +crossMapPIdKey = mkPreludeMiscIdUnique 137 +indexPIdKey = mkPreludeMiscIdUnique 138 +toPIdKey = mkPreludeMiscIdUnique 139 +enumFromToPIdKey = mkPreludeMiscIdUnique 140 +enumFromThenToPIdKey = mkPreludeMiscIdUnique 141 +emptyPIdKey = mkPreludeMiscIdUnique 142 +appPIdKey = mkPreludeMiscIdUnique 143 -- dotnet interop unmarshalObjectIdKey, marshalObjectIdKey, marshalStringIdKey, unmarshalStringIdKey, checkDotnetResNameIdKey :: Unique -unmarshalObjectIdKey = mkPreludeMiscIdUnique 94 -marshalObjectIdKey = mkPreludeMiscIdUnique 95 -marshalStringIdKey = mkPreludeMiscIdUnique 96 -unmarshalStringIdKey = mkPreludeMiscIdUnique 97 -checkDotnetResNameIdKey = mkPreludeMiscIdUnique 98 +unmarshalObjectIdKey = mkPreludeMiscIdUnique 150 +marshalObjectIdKey = mkPreludeMiscIdUnique 151 +marshalStringIdKey = mkPreludeMiscIdUnique 152 +unmarshalStringIdKey = mkPreludeMiscIdUnique 153 +checkDotnetResNameIdKey = mkPreludeMiscIdUnique 154 undefinedKey :: Unique -undefinedKey = mkPreludeMiscIdUnique 99 +undefinedKey = mkPreludeMiscIdUnique 155 \end{code} @@ -1435,7 +1513,7 @@ during type checking. \begin{code} -- Just a place holder for unbound variables produced by the renamer: unboundKey :: Unique -unboundKey = mkPreludeMiscIdUnique 101 +unboundKey = mkPreludeMiscIdUnique 160 fromIntegerClassOpKey, minusClassOpKey, fromRationalClassOpKey, enumFromClassOpKey, enumFromThenClassOpKey, enumFromToClassOpKey, @@ -1443,56 +1521,56 @@ fromIntegerClassOpKey, minusClassOpKey, fromRationalClassOpKey, failMClassOpKey, bindMClassOpKey, thenMClassOpKey, returnMClassOpKey, fmapClassOpKey :: Unique -fromIntegerClassOpKey = mkPreludeMiscIdUnique 102 -minusClassOpKey = mkPreludeMiscIdUnique 103 -fromRationalClassOpKey = mkPreludeMiscIdUnique 104 -enumFromClassOpKey = mkPreludeMiscIdUnique 105 -enumFromThenClassOpKey = mkPreludeMiscIdUnique 106 -enumFromToClassOpKey = mkPreludeMiscIdUnique 107 -enumFromThenToClassOpKey = mkPreludeMiscIdUnique 108 -eqClassOpKey = mkPreludeMiscIdUnique 109 -geClassOpKey = mkPreludeMiscIdUnique 110 -negateClassOpKey = mkPreludeMiscIdUnique 111 -failMClassOpKey = mkPreludeMiscIdUnique 112 -bindMClassOpKey = mkPreludeMiscIdUnique 113 -- (>>=) -thenMClassOpKey = mkPreludeMiscIdUnique 114 -- (>>) -fmapClassOpKey = mkPreludeMiscIdUnique 115 -returnMClassOpKey = mkPreludeMiscIdUnique 117 +fromIntegerClassOpKey = mkPreludeMiscIdUnique 160 +minusClassOpKey = mkPreludeMiscIdUnique 161 +fromRationalClassOpKey = mkPreludeMiscIdUnique 162 +enumFromClassOpKey = mkPreludeMiscIdUnique 163 +enumFromThenClassOpKey = mkPreludeMiscIdUnique 164 +enumFromToClassOpKey = mkPreludeMiscIdUnique 165 +enumFromThenToClassOpKey = mkPreludeMiscIdUnique 166 +eqClassOpKey = mkPreludeMiscIdUnique 167 +geClassOpKey = mkPreludeMiscIdUnique 168 +negateClassOpKey = mkPreludeMiscIdUnique 169 +failMClassOpKey = mkPreludeMiscIdUnique 170 +bindMClassOpKey = mkPreludeMiscIdUnique 171 -- (>>=) +thenMClassOpKey = mkPreludeMiscIdUnique 172 -- (>>) +fmapClassOpKey = mkPreludeMiscIdUnique 173 +returnMClassOpKey = mkPreludeMiscIdUnique 174 -- Recursive do notation mfixIdKey :: Unique -mfixIdKey = mkPreludeMiscIdUnique 118 +mfixIdKey = mkPreludeMiscIdUnique 175 -- Arrow notation arrAIdKey, composeAIdKey, firstAIdKey, appAIdKey, choiceAIdKey, loopAIdKey :: Unique -arrAIdKey = mkPreludeMiscIdUnique 119 -composeAIdKey = mkPreludeMiscIdUnique 120 -- >>> -firstAIdKey = mkPreludeMiscIdUnique 121 -appAIdKey = mkPreludeMiscIdUnique 122 -choiceAIdKey = mkPreludeMiscIdUnique 123 -- ||| -loopAIdKey = mkPreludeMiscIdUnique 124 +arrAIdKey = mkPreludeMiscIdUnique 180 +composeAIdKey = mkPreludeMiscIdUnique 181 -- >>> +firstAIdKey = mkPreludeMiscIdUnique 182 +appAIdKey = mkPreludeMiscIdUnique 183 +choiceAIdKey = mkPreludeMiscIdUnique 184 -- ||| +loopAIdKey = mkPreludeMiscIdUnique 185 fromStringClassOpKey :: Unique -fromStringClassOpKey = mkPreludeMiscIdUnique 125 +fromStringClassOpKey = mkPreludeMiscIdUnique 186 -- Annotation type checking toAnnotationWrapperIdKey :: Unique -toAnnotationWrapperIdKey = mkPreludeMiscIdUnique 126 +toAnnotationWrapperIdKey = mkPreludeMiscIdUnique 187 -- Conversion functions fromIntegralIdKey, realToFracIdKey, toIntegerClassOpKey, toRationalClassOpKey :: Unique -fromIntegralIdKey = mkPreludeMiscIdUnique 127 -realToFracIdKey = mkPreludeMiscIdUnique 128 -toIntegerClassOpKey = mkPreludeMiscIdUnique 129 -toRationalClassOpKey = mkPreludeMiscIdUnique 130 +fromIntegralIdKey = mkPreludeMiscIdUnique 190 +realToFracIdKey = mkPreludeMiscIdUnique 191 +toIntegerClassOpKey = mkPreludeMiscIdUnique 192 +toRationalClassOpKey = mkPreludeMiscIdUnique 193 -- Monad comprehensions guardMIdKey, liftMIdKey, groupMIdKey, mzipIdKey :: Unique -guardMIdKey = mkPreludeMiscIdUnique 131 -liftMIdKey = mkPreludeMiscIdUnique 132 -groupMIdKey = mkPreludeMiscIdUnique 133 -mzipIdKey = mkPreludeMiscIdUnique 134 +guardMIdKey = mkPreludeMiscIdUnique 194 +liftMIdKey = mkPreludeMiscIdUnique 195 +groupMIdKey = mkPreludeMiscIdUnique 196 +mzipIdKey = mkPreludeMiscIdUnique 197 ---------------- Template Haskell ------------------- diff --git a/compiler/prelude/PrelRules.lhs b/compiler/prelude/PrelRules.lhs index e9401d4c9e..f86e6a4a29 100644 --- a/compiler/prelude/PrelRules.lhs +++ b/compiler/prelude/PrelRules.lhs @@ -461,6 +461,12 @@ convFloating l = l trueVal, falseVal :: Expr CoreBndr trueVal = Var trueDataConId falseVal = Var falseDataConId + +ltVal, eqVal, gtVal :: Expr CoreBndr +ltVal = Var ltDataConId +eqVal = Var eqDataConId +gtVal = Var gtDataConId + mkIntVal :: Integer -> Expr CoreBndr mkIntVal i = Lit (mkMachInt i) mkWordVal :: Integer -> Expr CoreBndr @@ -604,8 +610,56 @@ builtinRules BuiltinRule { ru_name = fsLit "EqString", ru_fn = eqStringName, ru_nargs = 2, ru_try = match_eq_string }, BuiltinRule { ru_name = fsLit "Inline", ru_fn = inlineIdName, - ru_nargs = 2, ru_try = match_inline } + ru_nargs = 2, ru_try = match_inline }, + -- TODO: All the below rules need to handle target platform + -- having a different wordsize than the host platform + rule_Integer_convert "integerToWord" integerToWordName mkWordLitWord, + rule_Integer_convert "integerToInt" integerToIntName mkIntLitInt, + rule_Integer_binop "plusInteger" plusIntegerName (+), + rule_Integer_binop "timesInteger" timesIntegerName (*), + rule_Integer_binop "minusInteger" minusIntegerName (-), + rule_Integer_unop "negateInteger" negateIntegerName negate, + rule_Integer_binop_Bool "eqInteger" eqIntegerName (==), + rule_Integer_binop_Bool "neqInteger" neqIntegerName (/=), + rule_Integer_unop "absInteger" absIntegerName abs, + rule_Integer_unop "signumInteger" signumIntegerName signum, + rule_Integer_binop_Bool "leInteger" leIntegerName (<=), + rule_Integer_binop_Bool "gtInteger" gtIntegerName (>), + rule_Integer_binop_Bool "ltInteger" ltIntegerName (<), + rule_Integer_binop_Bool "geInteger" geIntegerName (>=), + rule_Integer_binop_Ordering "compareInteger" compareIntegerName compare, + -- TODO: divMod/quoteRem/quot/rem rules. Due to the 0 check we + -- need rules for the generic functions, rather than the + -- Integer-specific functions + rule_Integer_binop "gcdInteger" gcdIntegerName gcd, + rule_Integer_binop "lcmInteger" lcmIntegerName lcm, + rule_Integer_binop "andInteger" andIntegerName (.&.), + rule_Integer_binop "orInteger" orIntegerName (.|.), + rule_Integer_binop "xorInteger" xorIntegerName xor, + rule_Integer_unop "complementInteger" complementIntegerName complement, + -- TODO: Likewise, these rules currently don't do anything, due to + -- the sign test in shift's definition + rule_Integer_Int_binop "shiftLInteger" shiftLIntegerName shiftL, + rule_Integer_Int_binop "shiftRInteger" shiftRIntegerName shiftR ] + where rule_Integer_convert str name convert + = BuiltinRule { ru_name = fsLit str, ru_fn = name, ru_nargs = 1, + ru_try = match_Integer_convert convert } + rule_Integer_unop str name op + = BuiltinRule { ru_name = fsLit str, ru_fn = name, ru_nargs = 1, + ru_try = match_Integer_unop op } + rule_Integer_binop str name op + = BuiltinRule { ru_name = fsLit str, ru_fn = name, ru_nargs = 2, + ru_try = match_Integer_binop op } + rule_Integer_Int_binop str name op + = BuiltinRule { ru_name = fsLit str, ru_fn = name, ru_nargs = 2, + ru_try = match_Integer_Int_binop op } + rule_Integer_binop_Bool str name op + = BuiltinRule { ru_name = fsLit str, ru_fn = name, ru_nargs = 2, + ru_try = match_Integer_binop_Bool op } + rule_Integer_binop_Ordering str name op + = BuiltinRule { ru_name = fsLit str, ru_fn = name, ru_nargs = 2, + ru_try = match_Integer_binop_Ordering op } --------------------------------------------------- @@ -667,4 +721,85 @@ match_inline _ (Type _ : e : _) = Just (mkApps unf args1) match_inline _ _ = Nothing + +-- Integer rules + +match_Integer_convert :: Num a + => (a -> Expr CoreBndr) + -> IdUnfoldingFun + -> [Expr CoreBndr] + -> Maybe (Expr CoreBndr) +match_Integer_convert convert _ [x] + | (Var fx, [Lit (MachInt ix)]) <- collectArgs x, + idName fx == smallIntegerName + = Just (convert (fromIntegral ix)) +match_Integer_convert _ _ _ = Nothing + +match_Integer_unop :: (Integer -> Integer) + -> IdUnfoldingFun + -> [Expr CoreBndr] + -> Maybe (Expr CoreBndr) +match_Integer_unop unop _ [x] + | (Var fx, [Lit (MachInt ix)]) <- collectArgs x, + idName fx == smallIntegerName, + let iz = unop ix, + iz >= fromIntegral (minBound :: Int), + iz <= fromIntegral (maxBound :: Int) + = Just (Var fx `App` Lit (MachInt iz)) +match_Integer_unop _ _ _ = Nothing + +match_Integer_binop :: (Integer -> Integer -> Integer) + -> IdUnfoldingFun + -> [Expr CoreBndr] + -> Maybe (Expr CoreBndr) +match_Integer_binop binop _ [x, y] + | (Var fx, [Lit (MachInt ix)]) <- collectArgs x, + (Var fy, [Lit (MachInt iy)]) <- collectArgs y, + idName fx == smallIntegerName, + idName fy == smallIntegerName, + let iz = ix `binop` iy, + iz >= fromIntegral (minBound :: Int), + iz <= fromIntegral (maxBound :: Int) + = Just (Var fx `App` Lit (MachInt iz)) +match_Integer_binop _ _ _ = Nothing + +match_Integer_Int_binop :: (Integer -> Int -> Integer) + -> IdUnfoldingFun + -> [Expr CoreBndr] + -> Maybe (Expr CoreBndr) +match_Integer_Int_binop binop _ [x, Lit (MachInt iy)] + | (Var fx, [Lit (MachInt ix)]) <- collectArgs x, + idName fx == smallIntegerName, + let iz = ix `binop` fromIntegral iy, + iz >= fromIntegral (minBound :: Int), + iz <= fromIntegral (maxBound :: Int) + = Just (Var fx `App` Lit (MachInt iz)) +match_Integer_Int_binop _ _ _ = Nothing + +match_Integer_binop_Bool :: (Integer -> Integer -> Bool) + -> IdUnfoldingFun + -> [Expr CoreBndr] + -> Maybe (Expr CoreBndr) +match_Integer_binop_Bool binop _ [x, y] + | (Var fx, [Lit (MachInt ix)]) <- collectArgs x, + (Var fy, [Lit (MachInt iy)]) <- collectArgs y, + idName fx == smallIntegerName, + idName fy == smallIntegerName + = Just (if ix `binop` iy then trueVal else falseVal) +match_Integer_binop_Bool _ _ _ = Nothing + +match_Integer_binop_Ordering :: (Integer -> Integer -> Ordering) + -> IdUnfoldingFun + -> [Expr CoreBndr] + -> Maybe (Expr CoreBndr) +match_Integer_binop_Ordering binop _ [x, y] + | (Var fx, [Lit (MachInt ix)]) <- collectArgs x, + (Var fy, [Lit (MachInt iy)]) <- collectArgs y, + idName fx == smallIntegerName, + idName fy == smallIntegerName + = Just $ case ix `binop` iy of + LT -> ltVal + EQ -> eqVal + GT -> gtVal +match_Integer_binop_Ordering _ _ _ = Nothing \end{code} diff --git a/compiler/prelude/TysWiredIn.lhs b/compiler/prelude/TysWiredIn.lhs index 8759157f4e..65a0c334d5 100644 --- a/compiler/prelude/TysWiredIn.lhs +++ b/compiler/prelude/TysWiredIn.lhs @@ -15,6 +15,11 @@ module TysWiredIn ( trueDataCon, trueDataConId, true_RDR, falseDataCon, falseDataConId, false_RDR, + -- * Ordering + ltDataCon, ltDataConId, + eqDataCon, eqDataConId, + gtDataCon, gtDataConId, + -- * Char charTyCon, charDataCon, charTyCon_RDR, charTy, stringTy, charTyConName, @@ -424,6 +429,20 @@ trueDataCon = pcDataCon trueDataConName [] [] boolTyCon falseDataConId, trueDataConId :: Id falseDataConId = dataConWorkId falseDataCon trueDataConId = dataConWorkId trueDataCon + +orderingTyCon :: TyCon +orderingTyCon = pcTyCon True NonRecursive orderingTyConName + [] [ltDataCon, eqDataCon, gtDataCon] + +ltDataCon, eqDataCon, gtDataCon :: DataCon +ltDataCon = pcDataCon ltDataConName [] [] orderingTyCon +eqDataCon = pcDataCon eqDataConName [] [] orderingTyCon +gtDataCon = pcDataCon gtDataConName [] [] orderingTyCon + +ltDataConId, eqDataConId, gtDataConId :: Id +ltDataConId = dataConWorkId ltDataCon +eqDataConId = dataConWorkId eqDataCon +gtDataConId = dataConWorkId gtDataCon \end{code} %************************************************************************ |