Skip to content

Commit 413a507

Browse files
T-GroCopilot
andcommitted
Fix B-grade outliers: rename CollectionTypes, move dest/is from Makers, move patterns from TupleCompilation
- Rename CollectionTypes → TypedTreeCollections - Move destInt32/destThrow/isThrow/isIDelegateEventType/destIDelegateEventType Makers→ExprTransforms - Move (|Int32Expr|_|)/(|IntegralRange|_|) TupleCompilation→ConstantEvaluation Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent 0406b0b commit 413a507

File tree

6 files changed

+78
-71
lines changed

6 files changed

+78
-71
lines changed

src/Compiler/TypedTree/TypedTreeOps.ExprConstruction.fs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -518,7 +518,7 @@ module internal ExprConstruction =
518518
let (|InnerExprPat|) expr = stripExpr expr
519519

520520
[<AutoOpen>]
521-
module internal CollectionTypes =
521+
module internal TypedTreeCollections =
522522

523523
//--------------------------------------------------------------------------
524524
// Maps tracking extra information for values

src/Compiler/TypedTree/TypedTreeOps.ExprConstruction.fsi

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -335,7 +335,7 @@ module internal ExprConstruction =
335335
val (|InnerExprPat|): Expr -> Expr
336336

337337
[<AutoOpen>]
338-
module internal CollectionTypes =
338+
module internal TypedTreeCollections =
339339

340340
/// Mutable data structure mapping Val's to T based on stamp keys
341341
[<Sealed; NoEquality; NoComparison>]

src/Compiler/TypedTree/TypedTreeOps.ExprOps.fs

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -800,24 +800,6 @@ module internal Makers =
800800
else
801801
error (InternalError($"Unrecognized numeric type '{ty}'.", m))
802802

803-
let destInt32 =
804-
function
805-
| Expr.Const(Const.Int32 n, _, _) -> Some n
806-
| _ -> None
807-
808-
let isIDelegateEventType g ty =
809-
match tryTcrefOfAppTy g ty with
810-
| ValueSome tcref -> tyconRefEq g g.fslib_IDelegateEvent_tcr tcref
811-
| _ -> false
812-
813-
let destIDelegateEventType g ty =
814-
if isIDelegateEventType g ty then
815-
match argsOfAppTy g ty with
816-
| [ ty1 ] -> ty1
817-
| _ -> failwith "destIDelegateEventType: internal error"
818-
else
819-
failwith "destIDelegateEventType: not an IDelegateEvent type"
820-
821803
let mkRefCellContentsRef (g: TcGlobals) =
822804
mkRecdFieldRef g.refcell_tcr_canon "contents"
823805

@@ -1628,13 +1610,6 @@ module internal Makers =
16281610
let mkThrow m ty e =
16291611
mkAsmExpr ([ I_throw ], [], [ e ], [ ty ], m)
16301612

1631-
let destThrow =
1632-
function
1633-
| Expr.Op(TOp.ILAsm([ I_throw ], [ ty2 ]), [], [ e ], m) -> Some(m, ty2, e)
1634-
| _ -> None
1635-
1636-
let isThrow x = Option.isSome (destThrow x)
1637-
16381613
// reraise - parsed as library call - internally represented as op form.
16391614
let mkReraiseLibCall (g: TcGlobals) ty m =
16401615
let ve, vt = typedExprForIntrinsic g m g.reraise_info
@@ -2284,6 +2259,31 @@ module internal ExprTransforms =
22842259
tmp.SetDeclaringEntity parent
22852260
tmp.SetIsMemberOrModuleBinding()
22862261

2262+
let destInt32 =
2263+
function
2264+
| Expr.Const(Const.Int32 n, _, _) -> Some n
2265+
| _ -> None
2266+
2267+
let destThrow =
2268+
function
2269+
| Expr.Op(TOp.ILAsm([ I_throw ], [ ty2 ]), [], [ e ], m) -> Some(m, ty2, e)
2270+
| _ -> None
2271+
2272+
let isThrow x = Option.isSome (destThrow x)
2273+
2274+
let isIDelegateEventType g ty =
2275+
match tryTcrefOfAppTy g ty with
2276+
| ValueSome tcref -> tyconRefEq g g.fslib_IDelegateEvent_tcr tcref
2277+
| _ -> false
2278+
2279+
let destIDelegateEventType g ty =
2280+
if isIDelegateEventType g ty then
2281+
match argsOfAppTy g ty with
2282+
| [ ty1 ] -> ty1
2283+
| _ -> failwith "destIDelegateEventType: internal error"
2284+
else
2285+
failwith "destIDelegateEventType: not an IDelegateEvent type"
2286+
22872287
/// For match with only one non-failing target T0, the other targets, T1... failing (say, raise exception).
22882288
/// tree, T0(v0, .., vN) => rhs ; T1() => fail ; ...
22892289
/// Convert it to bind T0's variables, then continue with T0's rhs:

src/Compiler/TypedTree/TypedTreeOps.ExprOps.fsi

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -150,8 +150,6 @@ module internal Makers =
150150
/// Makes an expression holding a constant 1 value of the given numeric type.
151151
val mkTypedOne: g: TcGlobals -> m: range -> ty: TType -> Expr
152152

153-
val destInt32: Expr -> int32 option
154-
155153
val mkRefCellContentsRef: TcGlobals -> RecdFieldRef
156154

157155
val mkSequential: range -> Expr -> Expr -> Expr
@@ -464,18 +462,10 @@ module internal Makers =
464462

465463
val mkThrow: range -> TType -> Expr -> Expr
466464

467-
val destThrow: Expr -> (range * TType * Expr) option
468-
469-
val isThrow: Expr -> bool
470-
471465
val mkReraiseLibCall: TcGlobals -> TType -> range -> Expr
472466

473467
val mkReraise: range -> TType -> Expr
474468

475-
val isIDelegateEventType: TcGlobals -> TType -> bool
476-
477-
val destIDelegateEventType: TcGlobals -> TType -> TType
478-
479469
/// Add a label to use as the target for a goto
480470
val mkLabelled: range -> ILCodeLabel -> Expr -> Expr
481471

@@ -569,3 +559,13 @@ module internal ExprTransforms =
569559
/// Mutate a value to indicate it should be considered a local rather than a module-bound definition
570560
// REVIEW: this mutation should not be needed
571561
val ClearValReprInfo: Val -> Val
562+
563+
val destInt32: Expr -> int32 option
564+
565+
val destThrow: Expr -> (range * TType * Expr) option
566+
567+
val isThrow: Expr -> bool
568+
569+
val isIDelegateEventType: TcGlobals -> TType -> bool
570+
571+
val destIDelegateEventType: TcGlobals -> TType -> TType

src/Compiler/TypedTree/TypedTreeOps.Transforms.fs

Lines changed: 28 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -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>]
27292736
module internal ResumableCodePatterns =
27302737

src/Compiler/TypedTree/TypedTreeOps.Transforms.fsi

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -191,19 +191,6 @@ module internal TupleCompilation =
191191
/// Make a TAST expression representing getting an item from a tuple
192192
val mkGetTupleItemN: TcGlobals -> range -> int -> ILType -> bool -> Expr -> TType -> Expr
193193

194-
[<return: Struct>]
195-
val (|Int32Expr|_|): Expr -> int32 voption
196-
197-
/// Matches if the given expression is an application
198-
/// of the range or range-step operator on an integral type
199-
/// and returns the type, start, step, and finish if so.
200-
///
201-
/// start..finish
202-
///
203-
/// start..step..finish
204-
[<return: Struct>]
205-
val (|IntegralRange|_|): g: TcGlobals -> expr: Expr -> (TType * (Expr * Expr * Expr)) voption
206-
207194
[<RequireQualifiedAccess>]
208195
module IntegralConst =
209196
/// Constant 0.
@@ -275,6 +262,19 @@ module internal ConstantEvaluation =
275262

276263
val EvaledAttribExprEquality: TcGlobals -> Expr -> Expr -> bool
277264

265+
[<return: Struct>]
266+
val (|Int32Expr|_|): Expr -> int32 voption
267+
268+
/// Matches if the given expression is an application
269+
/// of the range or range-step operator on an integral type
270+
/// and returns the type, start, step, and finish if so.
271+
///
272+
/// start..finish
273+
///
274+
/// start..step..finish
275+
[<return: Struct>]
276+
val (|IntegralRange|_|): g: TcGlobals -> expr: Expr -> (TType * (Expr * Expr * Expr)) voption
277+
278278
[<AutoOpen>]
279279
module internal ResumableCodePatterns =
280280

0 commit comments

Comments
 (0)