Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
401 changes: 296 additions & 105 deletions src/Compiler/Optimize/LowerComputedCollections.fs

Large diffs are not rendered by default.

22 changes: 21 additions & 1 deletion src/Compiler/TypedTree/TcGlobals.fs
Original file line number Diff line number Diff line change
Expand Up @@ -809,6 +809,16 @@ type TcGlobals(
let v_range_op_info = makeIntrinsicValRef(fslib_MFOperators_nleref, "op_Range" , None , None , [vara], ([[varaTy];[varaTy]], mkSeqTy varaTy))
let v_range_step_op_info = makeIntrinsicValRef(fslib_MFOperators_nleref, "op_RangeStep" , None , None , [vara;varb], ([[varaTy];[varbTy];[varaTy]], mkSeqTy varaTy))
let v_range_int32_op_info = makeIntrinsicValRef(fslib_MFOperatorIntrinsics_nleref, "RangeInt32" , None , None , [], ([[v_int_ty];[v_int_ty];[v_int_ty]], mkSeqTy v_int_ty))
let v_range_int64_op_info = makeIntrinsicValRef(fslib_MFOperatorIntrinsics_nleref, "RangeInt64" , None , None , [], ([[v_int64_ty];[v_int64_ty];[v_int64_ty]], mkSeqTy v_int64_ty))
let v_range_uint64_op_info = makeIntrinsicValRef(fslib_MFOperatorIntrinsics_nleref, "RangeUInt64" , None , None , [], ([[v_uint64_ty];[v_uint64_ty];[v_uint64_ty]], mkSeqTy v_uint64_ty))
let v_range_uint32_op_info = makeIntrinsicValRef(fslib_MFOperatorIntrinsics_nleref, "RangeUInt32" , None , None , [], ([[v_uint32_ty];[v_uint32_ty];[v_uint32_ty]], mkSeqTy v_uint32_ty))
let v_range_nativeint_op_info = makeIntrinsicValRef(fslib_MFOperatorIntrinsics_nleref, "RangeIntPtr" , None , None , [], ([[v_nativeint_ty];[v_nativeint_ty];[v_nativeint_ty]], mkSeqTy v_nativeint_ty))
let v_range_unativeint_op_info = makeIntrinsicValRef(fslib_MFOperatorIntrinsics_nleref, "RangeUIntPtr" , None , None , [], ([[v_unativeint_ty];[v_unativeint_ty];[v_unativeint_ty]], mkSeqTy v_unativeint_ty))
let v_range_int16_op_info = makeIntrinsicValRef(fslib_MFOperatorIntrinsics_nleref, "RangeInt16" , None , None , [], ([[v_int16_ty];[v_int16_ty];[v_int16_ty]], mkSeqTy v_int16_ty))
let v_range_uint16_op_info = makeIntrinsicValRef(fslib_MFOperatorIntrinsics_nleref, "RangeUInt16" , None , None , [], ([[v_uint16_ty];[v_uint16_ty];[v_uint16_ty]], mkSeqTy v_uint16_ty))
let v_range_sbyte_op_info = makeIntrinsicValRef(fslib_MFOperatorIntrinsics_nleref, "RangeSByte" , None , None , [], ([[v_sbyte_ty];[v_sbyte_ty];[v_sbyte_ty]], mkSeqTy v_sbyte_ty))
let v_range_byte_op_info = makeIntrinsicValRef(fslib_MFOperatorIntrinsics_nleref, "RangeByte" , None , None , [], ([[v_byte_ty];[v_byte_ty];[v_byte_ty]], mkSeqTy v_byte_ty))
let v_range_char_op_info = makeIntrinsicValRef(fslib_MFOperatorIntrinsics_nleref, "RangeChar" , None , None , [], ([[v_char_ty];[v_char_ty];[v_char_ty]], mkSeqTy v_char_ty))

let v_array_length_info = makeIntrinsicValRef(fslib_MFArrayModule_nleref, "length" , None , Some "Length" , [vara], ([[mkArrayType 1 varaTy]], v_int_ty))
let v_array_init_info = makeIntrinsicValRef(fslib_MFArrayModule_nleref, "init" , None , Some "Initialize", [vara], ([[v_int32_ty]; [v_int32_ty --> varaTy]], mkArrayType 1 varaTy))
Expand All @@ -821,7 +831,7 @@ type TcGlobals(
let v_array3D_set_info = makeIntrinsicValRef(fslib_MFIntrinsicFunctions_nleref, "SetArray3D" , None , None , [vara], ([[mkArrayType 3 varaTy];[v_int_ty]; [v_int_ty]; [v_int_ty]; [varaTy]], v_unit_ty))
let v_array4D_set_info = makeIntrinsicValRef(fslib_MFIntrinsicFunctions_nleref, "SetArray4D" , None , None , [vara], ([[mkArrayType 4 varaTy];[v_int_ty]; [v_int_ty]; [v_int_ty]; [v_int_ty]; [varaTy]], v_unit_ty))

let v_list_init_info = makeIntrinsicValRef(fslib_MFListModule_nleref, "init" , None , Some "Initialize", [vara], ([[v_int32_ty]; [v_int32_ty --> varaTy]], mkListTy varaTy))
let v_list_init_info = makeIntrinsicValRef(fslib_MFListModule_nleref, "init" , None , Some "Initialize", [vara], ([[v_int32_ty]; [v_int32_ty --> varaTy]], mkListTy varaTy))

let v_option_toNullable_info = makeIntrinsicValRef(fslib_MFOptionModule_nleref, "toNullable" , None , Some "ToNullable" , [vara], ([[mkOptionTy varaTy]], mkNullableTy varaTy))
let v_option_defaultValue_info = makeIntrinsicValRef(fslib_MFOptionModule_nleref, "defaultValue" , None , Some "DefaultValue" , [vara], ([[varaTy]; [mkOptionTy varaTy]], varaTy))
Expand Down Expand Up @@ -1690,6 +1700,16 @@ type TcGlobals(
member val range_op_vref = ValRefForIntrinsic v_range_op_info
member val range_step_op_vref = ValRefForIntrinsic v_range_step_op_info
member val range_int32_op_vref = ValRefForIntrinsic v_range_int32_op_info
member val range_int64_op_vref = ValRefForIntrinsic v_range_int64_op_info
member val range_uint64_op_vref = ValRefForIntrinsic v_range_uint64_op_info
member val range_uint32_op_vref = ValRefForIntrinsic v_range_uint32_op_info
member val range_nativeint_op_vref = ValRefForIntrinsic v_range_nativeint_op_info
member val range_unativeint_op_vref = ValRefForIntrinsic v_range_unativeint_op_info
member val range_int16_op_vref = ValRefForIntrinsic v_range_int16_op_info
member val range_uint16_op_vref = ValRefForIntrinsic v_range_uint16_op_info
member val range_sbyte_op_vref = ValRefForIntrinsic v_range_sbyte_op_info
member val range_byte_op_vref = ValRefForIntrinsic v_range_byte_op_info
member val range_char_op_vref = ValRefForIntrinsic v_range_char_op_info
member val array_get_vref = ValRefForIntrinsic v_array_get_info
member val array2D_get_vref = ValRefForIntrinsic v_array2D_get_info
member val array3D_get_vref = ValRefForIntrinsic v_array3D_get_info
Expand Down
2 changes: 2 additions & 0 deletions src/Compiler/TypedTree/TypedTreeOps.fs
Original file line number Diff line number Diff line change
Expand Up @@ -7757,6 +7757,8 @@ let mkCallArray4DSet (g: TcGlobals) m ty e1 idx1 idx2 idx3 idx4 v = mkApps g (ty

let mkCallListInit (g: TcGlobals) m ty e1 e2 = mkApps g (typedExprForIntrinsic g m g.list_init_info, [[ty]], [e1; e2], m)

let mkCallInvalidArg (g: TcGlobals) m ty e1 e2 = mkApps g (typedExprForIntrinsic g m g.invalid_arg_info, [[ty]], [e1; e2], m)

let mkCallHash (g: TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.hash_info, [[ty]], [ e1 ], m)

let mkCallBox (g: TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.box_info, [[ty]], [ e1 ], m)
Expand Down
2 changes: 2 additions & 0 deletions src/Compiler/TypedTree/TypedTreeOps.fsi
Original file line number Diff line number Diff line change
Expand Up @@ -2035,6 +2035,8 @@ val mkCallArray4DSet: TcGlobals -> range -> TType -> Expr -> Expr -> Expr -> Exp

val mkCallListInit: TcGlobals -> range -> TType -> Expr -> Expr -> Expr

val mkCallInvalidArg: TcGlobals -> range -> TType -> Expr -> Expr -> Expr

val mkCallHash: TcGlobals -> range -> TType -> Expr -> Expr

val mkCallBox: TcGlobals -> range -> TType -> Expr -> Expr
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,53 +47,123 @@
extends [runtime]System.Object
{
.custom instance void [FSharp.Core]Microsoft.FSharp.Core.CompilationMappingAttribute::.ctor(valuetype [FSharp.Core]Microsoft.FSharp.Core.SourceConstructFlags) = ( 01 00 07 00 00 00 00 00 )
.class auto ansi serializable sealed nested assembly beforefieldinit t1@1
extends class [FSharp.Core]Microsoft.FSharp.Core.FSharpFunc`2<int32,uint8>
{
.field static assembly initonly class assembly/CompareMicroPerfAndCodeGenerationTests/t1@1 @_instance
.method assembly specialname rtspecialname
instance void .ctor() cil managed
{
.custom instance void [runtime]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )
.custom instance void [runtime]System.Diagnostics.DebuggerNonUserCodeAttribute::.ctor() = ( 01 00 00 00 )

.maxstack 8
IL_0000: ldarg.0
IL_0001: call instance void class [FSharp.Core]Microsoft.FSharp.Core.FSharpFunc`2<int32,uint8>::.ctor()
IL_0006: ret
}

.method public strict virtual instance uint8
Invoke(int32 i) cil managed
{

.maxstack 8
IL_0000: ldc.i4.0
IL_0001: ldarg.1
IL_0002: add
IL_0003: ret
}

.method private specialname rtspecialname static
void .cctor() cil managed
{

.maxstack 10
IL_0000: newobj instance void assembly/CompareMicroPerfAndCodeGenerationTests/t1@1::.ctor()
IL_0005: stsfld class assembly/CompareMicroPerfAndCodeGenerationTests/t1@1 assembly/CompareMicroPerfAndCodeGenerationTests/t1@1::@_instance
IL_000a: ret
}

}

.class auto ansi serializable sealed nested assembly beforefieldinit t2@1
extends class [FSharp.Core]Microsoft.FSharp.Core.FSharpFunc`2<int32,uint8>
{
.field static assembly initonly class assembly/CompareMicroPerfAndCodeGenerationTests/t2@1 @_instance
.method assembly specialname rtspecialname
instance void .ctor() cil managed
{
.custom instance void [runtime]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )
.custom instance void [runtime]System.Diagnostics.DebuggerNonUserCodeAttribute::.ctor() = ( 01 00 00 00 )

.maxstack 8
IL_0000: ldarg.0
IL_0001: call instance void class [FSharp.Core]Microsoft.FSharp.Core.FSharpFunc`2<int32,uint8>::.ctor()
IL_0006: ret
}

.method public strict virtual instance uint8
Invoke(int32 i) cil managed
{

.maxstack 8
IL_0000: ldc.i4.0
IL_0001: ldarg.1
IL_0002: add
IL_0003: ret
}

.method private specialname rtspecialname static
void .cctor() cil managed
{

.maxstack 10
IL_0000: newobj instance void assembly/CompareMicroPerfAndCodeGenerationTests/t2@1::.ctor()
IL_0005: stsfld class assembly/CompareMicroPerfAndCodeGenerationTests/t2@1 assembly/CompareMicroPerfAndCodeGenerationTests/t2@1::@_instance
IL_000a: ret
}

}

.method public static int32 f7() cil managed
{

.maxstack 5
.maxstack 4
.locals init (int32 V_0,
uint8[] V_1,
uint8[] V_2,
int32 V_3)
IL_0000: ldc.i4.1
IL_0001: stloc.0
IL_0002: ldc.i4.0
IL_0003: ldc.i4.1
IL_0004: ldc.i4.s 100
IL_0006: call class [runtime]System.Collections.Generic.IEnumerable`1<uint8> [FSharp.Core]Microsoft.FSharp.Core.Operators/OperatorIntrinsics::RangeByte(uint8,
uint8,
uint8)
IL_000b: call class [runtime]System.Collections.Generic.IEnumerable`1<!!0> [FSharp.Core]Microsoft.FSharp.Core.Operators::CreateSequence<uint8>(class [runtime]System.Collections.Generic.IEnumerable`1<!!0>)
IL_0010: call !!0[] [FSharp.Core]Microsoft.FSharp.Collections.SeqModule::ToArray<uint8>(class [runtime]System.Collections.Generic.IEnumerable`1<!!0>)
IL_0015: stloc.1
IL_0016: ldc.i4.0
IL_0017: ldc.i4.1
IL_0018: ldc.i4.s 100
IL_001a: call class [runtime]System.Collections.Generic.IEnumerable`1<uint8> [FSharp.Core]Microsoft.FSharp.Core.Operators/OperatorIntrinsics::RangeByte(uint8,
uint8,
uint8)
IL_001f: call class [runtime]System.Collections.Generic.IEnumerable`1<!!0> [FSharp.Core]Microsoft.FSharp.Core.Operators::CreateSequence<uint8>(class [runtime]System.Collections.Generic.IEnumerable`1<!!0>)
IL_0024: call !!0[] [FSharp.Core]Microsoft.FSharp.Collections.SeqModule::ToArray<uint8>(class [runtime]System.Collections.Generic.IEnumerable`1<!!0>)
IL_0029: stloc.2
IL_002a: ldc.i4.0
IL_0002: ldc.i4.s 101
IL_0004: ldsfld class assembly/CompareMicroPerfAndCodeGenerationTests/t1@1 assembly/CompareMicroPerfAndCodeGenerationTests/t1@1::@_instance
IL_0009: call !!0[] [FSharp.Core]Microsoft.FSharp.Collections.ArrayModule::Initialize<uint8>(int32,
class [FSharp.Core]Microsoft.FSharp.Core.FSharpFunc`2<int32,!!0>)
IL_000e: stloc.1
IL_000f: ldc.i4.s 101
IL_0011: ldsfld class assembly/CompareMicroPerfAndCodeGenerationTests/t2@1 assembly/CompareMicroPerfAndCodeGenerationTests/t2@1::@_instance
IL_0016: call !!0[] [FSharp.Core]Microsoft.FSharp.Collections.ArrayModule::Initialize<uint8>(int32,
class [FSharp.Core]Microsoft.FSharp.Core.FSharpFunc`2<int32,!!0>)
IL_001b: stloc.2
IL_001c: ldc.i4.0
IL_001d: stloc.3
IL_001e: br.s IL_002c

IL_0020: ldloc.1
IL_0021: ldloc.2
IL_0022: call int32 [FSharp.Core]Microsoft.FSharp.Core.LanguagePrimitives/HashCompare::GenericComparisonIntrinsic<uint8[]>(!!0,
!!0)
IL_0027: stloc.0
IL_0028: ldloc.3
IL_0029: ldc.i4.1
IL_002a: add
IL_002b: stloc.3
IL_002c: br.s IL_003a
IL_002c: ldloc.3
IL_002d: ldc.i4 0x989681
IL_0032: blt.s IL_0020

IL_002e: ldloc.1
IL_002f: ldloc.2
IL_0030: call int32 [FSharp.Core]Microsoft.FSharp.Core.LanguagePrimitives/HashCompare::GenericComparisonIntrinsic<uint8[]>(!!0,
!!0)
IL_0035: stloc.0
IL_0036: ldloc.3
IL_0037: ldc.i4.1
IL_0038: add
IL_0039: stloc.3
IL_003a: ldloc.3
IL_003b: ldc.i4 0x989681
IL_0040: blt.s IL_002e

IL_0042: ldloc.0
IL_0043: ret
IL_0034: ldloc.0
IL_0035: ret
}

}
Expand Down
Loading