Skip to content

Commit d2906ad

Browse files
authored
Merge pull request #54 from ncave/optimize
review fixes
2 parents e1f3e16 + ddf74bd commit d2906ad

File tree

5 files changed

+79
-39
lines changed

5 files changed

+79
-39
lines changed

src/fsharp/TastOps.fs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6187,7 +6187,6 @@ let mkCallToSByteOperator (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrin
61876187
let mkCallToInt16Operator (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.int16_operator_info, [[ty]], [e1], m)
61886188
let mkCallToUInt16Operator (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.uint16_operator_info, [[ty]], [e1], m)
61896189
let mkCallToIntOperator (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.int_operator_info, [[ty]], [e1], m)
6190-
let mkCallToEnumOperator (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.enum_operator_info, [[ty]], [e1], m)
61916190
let mkCallToInt32Operator (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.int32_operator_info, [[ty]], [e1], m)
61926191
let mkCallToUInt32Operator (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.uint32_operator_info, [[ty]], [e1], m)
61936192
let mkCallToInt64Operator (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.int64_operator_info, [[ty]], [e1], m)
@@ -6197,6 +6196,9 @@ let mkCallToDoubleOperator (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrin
61976196
let mkCallToIntPtrOperator (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.nativeint_operator_info, [[ty]], [e1], m)
61986197
let mkCallToUIntPtrOperator (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.unativeint_operator_info, [[ty]], [e1], m)
61996198

6199+
let mkCallToCharOperator (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.char_operator_info, [[ty]], [e1], m)
6200+
let mkCallToEnumOperator (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.enum_operator_info, [[ty]], [e1], m)
6201+
62006202
let mkCallArrayLength (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.array_length_info, [[ty]], [e1], m)
62016203
let mkCallArrayGet (g:TcGlobals) m ty e1 idx1 = mkApps g (typedExprForIntrinsic g m g.array_get_info, [[ty]], [ e1 ; idx1 ], m)
62026204
let mkCallArray2DGet (g:TcGlobals) m ty e1 idx1 idx2 = mkApps g (typedExprForIntrinsic g m g.array2D_get_info, [[ty]], [ e1 ; idx1; idx2 ], m)

src/fsharp/TastOps.fsi

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1280,7 +1280,6 @@ val mkCallToSByteOperator : TcGlobals -> range -> TType -> Ex
12801280
val mkCallToInt16Operator : TcGlobals -> range -> TType -> Expr -> Expr
12811281
val mkCallToUInt16Operator : TcGlobals -> range -> TType -> Expr -> Expr
12821282
val mkCallToIntOperator : TcGlobals -> range -> TType -> Expr -> Expr
1283-
val mkCallToEnumOperator : TcGlobals -> range -> TType -> Expr -> Expr
12841283
val mkCallToInt32Operator : TcGlobals -> range -> TType -> Expr -> Expr
12851284
val mkCallToUInt32Operator : TcGlobals -> range -> TType -> Expr -> Expr
12861285
val mkCallToInt64Operator : TcGlobals -> range -> TType -> Expr -> Expr
@@ -1290,6 +1289,9 @@ val mkCallToDoubleOperator : TcGlobals -> range -> TType -> Ex
12901289
val mkCallToIntPtrOperator : TcGlobals -> range -> TType -> Expr -> Expr
12911290
val mkCallToUIntPtrOperator : TcGlobals -> range -> TType -> Expr -> Expr
12921291

1292+
val mkCallToCharOperator : TcGlobals -> range -> TType -> Expr -> Expr
1293+
val mkCallToEnumOperator : TcGlobals -> range -> TType -> Expr -> Expr
1294+
12931295
val mkCallDeserializeQuotationFSharp20Plus : TcGlobals -> range -> Expr -> Expr -> Expr -> Expr -> Expr
12941296
val mkCallDeserializeQuotationFSharp40Plus : TcGlobals -> range -> Expr -> Expr -> Expr -> Expr -> Expr -> Expr
12951297
val mkCallCastQuotation : TcGlobals -> range -> TType -> Expr -> Expr

src/fsharp/TcGlobals.fs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -295,7 +295,6 @@ type public TcGlobals(compilingFslib: bool, ilg:ILGlobals, fslibCcu: CcuThunk, d
295295
let v_int16_ty = mkNonGenericTy v_int16_tcr
296296
let v_uint16_ty = mkNonGenericTy v_uint16_tcr
297297
let v_int_ty = mkNonGenericTy v_int_tcr
298-
let v_enum_ty = mkNonGenericTy v_int_tcr
299298
let v_int32_ty = mkNonGenericTy v_int32_tcr
300299
let v_uint32_ty = mkNonGenericTy v_uint32_tcr
301300
let v_int64_ty = mkNonGenericTy v_int64_tcr
@@ -305,6 +304,7 @@ type public TcGlobals(compilingFslib: bool, ilg:ILGlobals, fslibCcu: CcuThunk, d
305304
let v_nativeint_ty = mkNonGenericTy v_nativeint_tcr
306305
let v_unativeint_ty = mkNonGenericTy v_unativeint_tcr
307306

307+
let v_enum_ty = mkNonGenericTy v_int_tcr
308308
let v_bool_ty = mkNonGenericTy v_bool_tcr
309309
let v_char_ty = mkNonGenericTy v_char_tcr
310310
let v_obj_ty = mkNonGenericTy v_obj_tcr
@@ -607,7 +607,6 @@ type public TcGlobals(compilingFslib: bool, ilg:ILGlobals, fslibCcu: CcuThunk, d
607607
let v_int16_operator_info = makeIntrinsicValRef(fslib_MFOperators_nleref, "int16" , None , Some "ToInt16", [vara], ([[varaTy]], v_int16_ty))
608608
let v_uint16_operator_info = makeIntrinsicValRef(fslib_MFOperators_nleref, "uint16" , None , Some "ToUInt16", [vara], ([[varaTy]], v_uint16_ty))
609609
let v_int_operator_info = makeIntrinsicValRef(fslib_MFOperators_nleref, "int" , None , Some "ToInt", [vara], ([[varaTy]], v_int_ty))
610-
let v_enum_operator_info = makeIntrinsicValRef(fslib_MFOperators_nleref, "enum" , None , Some "ToEnum", [vara], ([[varaTy]], v_enum_ty))
611610
let v_int32_operator_info = makeIntrinsicValRef(fslib_MFOperators_nleref, "int32" , None , Some "ToInt32", [vara], ([[varaTy]], v_int32_ty))
612611
let v_uint32_operator_info = makeIntrinsicValRef(fslib_MFOperators_nleref, "uint32" , None , Some "ToUInt32", [vara], ([[varaTy]], v_uint32_ty))
613612
let v_int64_operator_info = makeIntrinsicValRef(fslib_MFOperators_nleref, "int64" , None , Some "ToInt64", [vara], ([[varaTy]], v_int64_ty))
@@ -617,6 +616,9 @@ type public TcGlobals(compilingFslib: bool, ilg:ILGlobals, fslibCcu: CcuThunk, d
617616
let v_nativeint_operator_info = makeIntrinsicValRef(fslib_MFOperators_nleref, "nativeint" , None , Some "ToIntPtr", [vara], ([[varaTy]], v_nativeint_ty))
618617
let v_unativeint_operator_info = makeIntrinsicValRef(fslib_MFOperators_nleref, "unativeint" , None , Some "ToUIntPtr", [vara], ([[varaTy]], v_unativeint_ty))
619618

619+
let v_char_operator_info = makeIntrinsicValRef(fslib_MFOperators_nleref, "char" , None , Some "ToChar", [vara], ([[varaTy]], v_char_ty))
620+
let v_enum_operator_info = makeIntrinsicValRef(fslib_MFOperators_nleref, "enum" , None , Some "ToEnum", [vara], ([[varaTy]], v_enum_ty))
621+
620622
let v_hash_info = makeIntrinsicValRef(fslib_MFOperators_nleref, "hash" , None , Some "Hash" , [vara], ([[varaTy]], v_int_ty))
621623
let v_box_info = makeIntrinsicValRef(fslib_MFOperators_nleref, "box" , None , Some "Box" , [vara], ([[varaTy]], v_obj_ty))
622624
let v_isnull_info = makeIntrinsicValRef(fslib_MFOperators_nleref, "isNull" , None , Some "IsNull" , [vara], ([[varaTy]], v_bool_ty))
@@ -886,6 +888,8 @@ type public TcGlobals(compilingFslib: bool, ilg:ILGlobals, fslibCcu: CcuThunk, d
886888
member __.expr_tcr = v_expr_tcr
887889
member __.raw_expr_tcr = v_raw_expr_tcr
888890
member __.nativeint_tcr = v_nativeint_tcr
891+
member __.unativeint_tcr = v_unativeint_tcr
892+
member __.int_tcr = v_int_tcr
889893
member __.int32_tcr = v_int32_tcr
890894
member __.int16_tcr = v_int16_tcr
891895
member __.int64_tcr = v_int64_tcr
@@ -1227,7 +1231,6 @@ type public TcGlobals(compilingFslib: bool, ilg:ILGlobals, fslibCcu: CcuThunk, d
12271231
member __.int16_operator_info = v_int16_operator_info
12281232
member __.uint16_operator_info = v_uint16_operator_info
12291233
member __.int_operator_info = v_int_operator_info
1230-
member __.enum_operator_info = v_enum_operator_info
12311234
member __.int32_operator_info = v_int32_operator_info
12321235
member __.uint32_operator_info = v_uint32_operator_info
12331236
member __.int64_operator_info = v_int64_operator_info
@@ -1237,6 +1240,9 @@ type public TcGlobals(compilingFslib: bool, ilg:ILGlobals, fslibCcu: CcuThunk, d
12371240
member __.nativeint_operator_info = v_nativeint_operator_info
12381241
member __.unativeint_operator_info = v_unativeint_operator_info
12391242

1243+
member __.char_operator_info = v_char_operator_info
1244+
member __.enum_operator_info = v_enum_operator_info
1245+
12401246
member val compare_operator_vref = ValRefForIntrinsic v_compare_operator_info
12411247
member val equals_operator_vref = ValRefForIntrinsic v_equals_operator_info
12421248
member val equals_nullable_operator_vref = ValRefForIntrinsic v_equals_nullable_operator_info

src/fsharp/symbols/Exprs.fs

Lines changed: 34 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,27 @@ module FSharpExprConvert =
268268
| DT_REF -> None
269269
| _ -> None
270270

271+
let (|TTypeConvOp|_|) (cenv:Impl.cenv) ty =
272+
let g = cenv.g
273+
match ty with
274+
| TType_app (tcref,_) ->
275+
match tcref with
276+
| x when tyconRefEq g tcref g.sbyte_tcr -> Some mkCallToSByteOperator
277+
| x when tyconRefEq g tcref g.byte_tcr -> Some mkCallToByteOperator
278+
| x when tyconRefEq g tcref g.int16_tcr -> Some mkCallToInt16Operator
279+
| x when tyconRefEq g tcref g.uint16_tcr -> Some mkCallToUInt16Operator
280+
| x when tyconRefEq g tcref g.int_tcr -> Some mkCallToIntOperator
281+
| x when tyconRefEq g tcref g.int32_tcr -> Some mkCallToInt32Operator
282+
| x when tyconRefEq g tcref g.uint32_tcr -> Some mkCallToUInt32Operator
283+
| x when tyconRefEq g tcref g.int64_tcr -> Some mkCallToInt64Operator
284+
| x when tyconRefEq g tcref g.uint64_tcr -> Some mkCallToUInt64Operator
285+
| x when tyconRefEq g tcref g.float32_tcr -> Some mkCallToSingleOperator
286+
| x when tyconRefEq g tcref g.float_tcr -> Some mkCallToDoubleOperator
287+
| x when tyconRefEq g tcref g.nativeint_tcr -> Some mkCallToIntPtrOperator
288+
| x when tyconRefEq g tcref g.unativeint_tcr -> Some mkCallToUIntPtrOperator
289+
| _ -> None
290+
| _ -> None
291+
271292
let ConvType cenv typ = FSharpType(cenv, typ)
272293
let ConvTypes cenv typs = List.map (ConvType cenv) typs
273294
let ConvILTypeRefApp (cenv:Impl.cenv) m tref tyargs =
@@ -601,8 +622,14 @@ module FSharpExprConvert =
601622
let argR = ConvExpr cenv env arg
602623
E.ILFieldSet(None, typR, fspec.Name, argR)
603624

604-
| TOp.ILAsm([ ], _), _, [arg] ->
605-
ConvExprPrim cenv env arg
625+
| TOp.ILAsm([ ], [tty]), _, [arg] ->
626+
match tty with
627+
| TTypeConvOp cenv convOp ->
628+
let ty = tyOfExpr cenv.g arg
629+
let op = convOp cenv.g m ty arg
630+
ConvExprPrim cenv env op
631+
| _ ->
632+
ConvExprPrim cenv env arg
606633

607634
| TOp.ILAsm([ I_box _ ], _), [ty], [arg] ->
608635
let op = mkCallBox cenv.g m ty arg
@@ -671,9 +698,12 @@ module FSharpExprConvert =
671698
let op2 = convertOp2 cenv.g m ty2 op1
672699
ConvExprPrim cenv env op2
673700

674-
| TOp.ILAsm([ ILConvertOp convertOp ], _), _, [arg] ->
701+
| TOp.ILAsm([ ILConvertOp convertOp ], [TType_app (tcref,_)]), _, [arg] ->
675702
let ty = tyOfExpr cenv.g arg
676-
let op = convertOp cenv.g m ty arg
703+
let op =
704+
if tyconRefEq cenv.g tcref cenv.g.char_tcr
705+
then mkCallToCharOperator cenv.g m ty arg
706+
else convertOp cenv.g m ty arg
677707
ConvExprPrim cenv env op
678708

679709
| TOp.ILAsm([ I_throw ], _), _, [arg1] ->

0 commit comments

Comments
 (0)