@@ -1190,13 +1190,6 @@ module internal TupleCompilation =
11901190 else
11911191 mkAsmExpr ([ mkNormalCall ( mkILMethodSpecForTupleItem g ty n) ], [], [ expr ], [ retTy ], m)
11921192
1193- /// Match an Int32 constant expression
1194- [<return : Struct>]
1195- let (| Int32Expr | _ |) expr =
1196- match expr with
1197- | Expr.Const( Const.Int32 n, _, _) -> ValueSome n
1198- | _ -> ValueNone
1199-
12001193 /// Match a try-finally expression
12011194 [<return : Struct>]
12021195 let (| TryFinally | _ |) expr =
@@ -1231,7 +1224,9 @@ module internal TupleCompilation =
12311224 ValueSome( startExpr, 1 , finishExpr)
12321225
12331226 // detect (RangeInt32 startExpr N finishExpr), the inlined/compiled form of 'n .. m' and 'n .. N .. m'
1234- | Expr.App( Expr.Val( vf, _, _), _, [], [ startExpr; Int32Expr n; finishExpr ], _) when valRefEq g vf g.range_ int32_ op_ vref ->
1227+ | Expr.App( Expr.Val( vf, _, _), _, [], [ startExpr; Expr.Const( Const.Int32 n, _, _); finishExpr ], _) when
1228+ valRefEq g vf g.range_ int32_ op_ vref
1229+ ->
12351230 ValueSome( startExpr, n, finishExpr)
12361231
12371232 | _ -> ValueNone
@@ -1402,10 +1397,7 @@ module internal TupleCompilation =
14021397 | Const.SByte v -> Const.SByte( abs v)
14031398 | _ -> c
14041399
1405- /// start..finish
1406- /// start..step..finish
1407- [<return : Struct>]
1408- let (| IntegralRange | _ |) g expr =
1400+ let tryMatchIntegralRange g expr =
14091401 match expr with
14101402 | ValApp g g.range_ int32_ op_ vref ([], [ start; step; finish ], _) -> ValueSome( g.int32_ ty, ( start, step, finish))
14111403 | ValApp g g.range_ int64_ op_ vref ([], [ start; step; finish ], _) -> ValueSome( g.int64_ ty, ( start, step, finish))
@@ -2164,16 +2156,19 @@ module internal TupleCompilation =
21642156
21652157 mkFastForLoop g ( spFor, spIn, mWholeExpr, elemVar, startExpr, ( step = 1 ), finishExpr, bodyExpr)
21662158
2167- | OptimizeAllForExpressions,
2168- CompiledForEachExpr g (_ enumTy, rangeExpr & IntegralRange g ( rangeTy, ( start, step, finish)), elemVar, bodyExpr, ranges) when
2169- g.langVersion.SupportsFeature LanguageFeature.LowerIntegralRangesToFastLoops
2170- ->
2171- let mBody , _spFor , _spIn , mFor , mIn , spInWhile , _mWhole = ranges
2172-
2173- mkOptimizedRangeLoop g ( mBody, mFor, mIn, spInWhile) ( rangeTy, rangeExpr) ( start, step, finish) ( fun _count mkLoop ->
2174- mkLoop ( fun _idxVar loopVar -> mkInvisibleLet elemVar.Range elemVar loopVar bodyExpr))
2175-
21762159 | OptimizeAllForExpressions, CompiledForEachExpr g ( enumerableTy, enumerableExpr, elemVar, bodyExpr, ranges) ->
2160+ match
2161+ ( if g.langVersion.SupportsFeature LanguageFeature.LowerIntegralRangesToFastLoops then
2162+ tryMatchIntegralRange g enumerableExpr
2163+ else
2164+ ValueNone)
2165+ with
2166+ | ValueSome( rangeTy, ( start, step, finish)) ->
2167+ let mBody , _spFor , _spIn , mFor , mIn , spInWhile , _mWhole = ranges
2168+
2169+ mkOptimizedRangeLoop g ( mBody, mFor, mIn, spInWhile) ( rangeTy, enumerableExpr) ( start, step, finish) ( fun _count mkLoop ->
2170+ mkLoop ( fun _idxVar loopVar -> mkInvisibleLet elemVar.Range elemVar loopVar bodyExpr))
2171+ | ValueNone ->
21772172
21782173 let mBody , spFor , spIn , mFor , mIn , spInWhile , mWholeExpr = ranges
21792174
@@ -2725,6 +2720,18 @@ module internal ConstantEvaluation =
27252720 Expr.Op( TOp.Array, [ elemTy ], args, m)
27262721 | _ -> EvalAttribArgExpr SuppressLanguageFeatureCheck.No g x
27272722
2723+ /// Match an Int32 constant expression
2724+ [<return : Struct>]
2725+ let (| Int32Expr | _ |) expr =
2726+ match expr with
2727+ | Expr.Const( Const.Int32 n, _, _) -> ValueSome n
2728+ | _ -> ValueNone
2729+
2730+ /// start..finish
2731+ /// start..step..finish
2732+ [<return : Struct>]
2733+ let (| IntegralRange | _ |) g expr = tryMatchIntegralRange g expr
2734+
27282735[<AutoOpen>]
27292736module internal ResumableCodePatterns =
27302737
0 commit comments