Skip to content

Commit a4c0c9c

Browse files
dsymeKevinRansom
authored andcommitted
ad test cases for dotnet/fsharp#532
add missing files for test case fix 532 - accumulate hiding information fixes #532
1 parent 2d413fb commit a4c0c9c

File tree

10 files changed

+80
-23
lines changed

10 files changed

+80
-23
lines changed

src/fsharp/CompileOptions.fs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1133,17 +1133,17 @@ let ApplyAllOptimizations (tcConfig:TcConfig, tcGlobals, tcVal, outfile, importM
11331133
let optEnv0 = optEnv
11341134
let (TAssembly(implFiles)) = tassembly
11351135
ReportTime tcConfig ("Optimizations");
1136-
let results,(optEnvFirstLoop,_,_) =
1137-
((optEnv0,optEnv0,optEnv0),implFiles) ||> List.mapFold (fun (optEnvFirstLoop,optEnvExtraLoop,optEnvFinalSimplify) implFile ->
1136+
let results,(optEnvFirstLoop,_,_,_) =
1137+
((optEnv0,optEnv0,optEnv0,SignatureHidingInfo.Empty),implFiles) ||> List.mapFold (fun (optEnvFirstLoop,optEnvExtraLoop,optEnvFinalSimplify,hidden) implFile ->
11381138

11391139
// Only do abstract_big_targets on the first pass! Only do it when TLR is on!
11401140
let optSettings = tcConfig.optSettings
11411141
let optSettings = { optSettings with abstractBigTargets = tcConfig.doTLR }
11421142
let optSettings = { optSettings with reportingPhase = true }
11431143

11441144
//ReportTime tcConfig ("Initial simplify");
1145-
let optEnvFirstLoop,implFile,implFileOptData =
1146-
Optimizer.OptimizeImplFile(optSettings,ccu,tcGlobals,tcVal, importMap,optEnvFirstLoop,isIncrementalFragment,tcConfig.emitTailcalls,implFile)
1145+
let optEnvFirstLoop,implFile,implFileOptData,hidden =
1146+
Optimizer.OptimizeImplFile(optSettings,ccu,tcGlobals,tcVal, importMap,optEnvFirstLoop,isIncrementalFragment,tcConfig.emitTailcalls,hidden,implFile)
11471147

11481148
let implFile = AutoBox.TransformImplFile tcGlobals importMap implFile
11491149

@@ -1157,7 +1157,7 @@ let ApplyAllOptimizations (tcConfig:TcConfig, tcGlobals, tcVal, outfile, importM
11571157
let implFile,optEnvExtraLoop =
11581158
if tcConfig.extraOptimizationIterations > 0 then
11591159
//ReportTime tcConfig ("Extra simplification loop");
1160-
let optEnvExtraLoop,implFile, _ = Optimizer.OptimizeImplFile(optSettings,ccu,tcGlobals,tcVal, importMap,optEnvExtraLoop,isIncrementalFragment,tcConfig.emitTailcalls,implFile)
1160+
let optEnvExtraLoop,implFile, _, _ = Optimizer.OptimizeImplFile(optSettings,ccu,tcGlobals,tcVal, importMap,optEnvExtraLoop,isIncrementalFragment,tcConfig.emitTailcalls,hidden,implFile)
11611161
//PrintWholeAssemblyImplementation tcConfig outfile (sprintf "extra-loop-%d" n) implFile;
11621162
implFile,optEnvExtraLoop
11631163
else
@@ -1182,12 +1182,12 @@ let ApplyAllOptimizations (tcConfig:TcConfig, tcGlobals, tcVal, outfile, importM
11821182
let implFile,optEnvFinalSimplify =
11831183
if tcConfig.doFinalSimplify then
11841184
//ReportTime tcConfig ("Final simplify pass");
1185-
let optEnvFinalSimplify,implFile, _ = Optimizer.OptimizeImplFile(optSettings,ccu,tcGlobals,tcVal, importMap,optEnvFinalSimplify,isIncrementalFragment,tcConfig.emitTailcalls,implFile)
1185+
let optEnvFinalSimplify,implFile, _, _ = Optimizer.OptimizeImplFile(optSettings,ccu,tcGlobals,tcVal, importMap,optEnvFinalSimplify,isIncrementalFragment,tcConfig.emitTailcalls,hidden,implFile)
11861186
//PrintWholeAssemblyImplementation tcConfig outfile "post-rec-opt" implFile;
11871187
implFile,optEnvFinalSimplify
11881188
else
11891189
implFile,optEnvFinalSimplify
1190-
(implFile,implFileOptData),(optEnvFirstLoop,optEnvExtraLoop,optEnvFinalSimplify))
1190+
(implFile,implFileOptData),(optEnvFirstLoop,optEnvExtraLoop,optEnvFinalSimplify,hidden))
11911191

11921192
let implFiles,implFileOptDatas = List.unzip results
11931193
let assemblyOptData = Optimizer.UnionOptimizationInfos implFileOptDatas

src/fsharp/Optimizer.fs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3193,7 +3193,7 @@ and OptimizeModuleDefs cenv (env,bindInfosColl) defs =
31933193
let defs,minfos = List.unzip defs
31943194
(defs,UnionOptimizationInfos minfos),(env,bindInfosColl)
31953195

3196-
and OptimizeImplFileInternal cenv env isIncrementalFragment (TImplFile(qname, pragmas, (ModuleOrNamespaceExprWithSig(mty,_,_) as mexpr), hasExplicitEntryPoint,isScript)) =
3196+
and OptimizeImplFileInternal cenv env isIncrementalFragment hidden (TImplFile(qname, pragmas, (ModuleOrNamespaceExprWithSig(mty,_,_) as mexpr), hasExplicitEntryPoint,isScript)) =
31973197
let env,mexpr',minfo =
31983198
match mexpr with
31993199
// FSI: FSI compiles everything as if you're typing incrementally into one module
@@ -3209,16 +3209,16 @@ and OptimizeImplFileInternal cenv env isIncrementalFragment (TImplFile(qname, pr
32093209
let env = { env with localExternalVals=env.localExternalVals.MarkAsCollapsible() } // take the chance to flatten to a dictionary
32103210
env, mexpr', minfo
32113211

3212-
let hidden = ComputeHidingInfoAtAssemblyBoundary mty
3212+
let hidden = ComputeHidingInfoAtAssemblyBoundary mty hidden
32133213

32143214
let minfo = AbstractLazyModulInfoByHiding true hidden minfo
3215-
env, TImplFile(qname,pragmas,mexpr',hasExplicitEntryPoint,isScript), minfo
3215+
env, TImplFile(qname,pragmas,mexpr',hasExplicitEntryPoint,isScript), minfo, hidden
32163216

32173217
//-------------------------------------------------------------------------
32183218
// Entry point
32193219
//-------------------------------------------------------------------------
32203220

3221-
let OptimizeImplFile(settings,ccu,tcGlobals,tcVal, importMap,optEnv,isIncrementalFragment,emitTailcalls,mimpls) =
3221+
let OptimizeImplFile(settings,ccu,tcGlobals,tcVal, importMap,optEnv,isIncrementalFragment,emitTailcalls,hidden,mimpls) =
32223222
let cenv =
32233223
{ settings=settings;
32243224
scope=ccu;
@@ -3229,7 +3229,7 @@ let OptimizeImplFile(settings,ccu,tcGlobals,tcVal, importMap,optEnv,isIncrementa
32293229
localInternalVals=new System.Collections.Generic.Dictionary<Stamp,ValInfo>(10000);
32303230
emitTailcalls=emitTailcalls;
32313231
casApplied=new Dictionary<Stamp,bool>() }
3232-
OptimizeImplFileInternal cenv optEnv isIncrementalFragment mimpls
3232+
OptimizeImplFileInternal cenv optEnv isIncrementalFragment hidden mimpls
32333233

32343234

32353235
//-------------------------------------------------------------------------

src/fsharp/Optimizer.fsi

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ module internal Microsoft.FSharp.Compiler.Optimizer
55
open Internal.Utilities
66
open Microsoft.FSharp.Compiler
77
open Microsoft.FSharp.Compiler.Tast
8+
open Microsoft.FSharp.Compiler.Tastops
89
open Microsoft.FSharp.Compiler.TcGlobals
910
open Microsoft.FSharp.Compiler.AbstractIL
1011
open Microsoft.FSharp.Compiler.AbstractIL.Internal
@@ -43,7 +44,7 @@ type IncrementalOptimizationEnv =
4344
val internal BindCcu : CcuThunk -> CcuOptimizationInfo -> IncrementalOptimizationEnv -> TcGlobals -> IncrementalOptimizationEnv
4445

4546
/// Optimize one implementation file in the given environment
46-
val internal OptimizeImplFile : OptimizationSettings * CcuThunk * TcGlobals * ConstraintSolver.TcValF * Import.ImportMap * IncrementalOptimizationEnv * isIncrementalFragment: bool * emitTaicalls: bool * TypedImplFile -> IncrementalOptimizationEnv * TypedImplFile * ImplFileOptimizationInfo
47+
val internal OptimizeImplFile : OptimizationSettings * CcuThunk * TcGlobals * ConstraintSolver.TcValF * Import.ImportMap * IncrementalOptimizationEnv * isIncrementalFragment: bool * emitTaicalls: bool * SignatureHidingInfo * TypedImplFile -> IncrementalOptimizationEnv * TypedImplFile * ImplFileOptimizationInfo * SignatureHidingInfo
4748

4849
#if DEBUG
4950
/// Displaying optimization data

src/fsharp/TastOps.fs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3695,9 +3695,9 @@ let rec accModuleOrNamespaceHidingInfoAtAssemblyBoundary mty acc =
36953695
let acc = QueueList.foldBack accValHidingInfoAtAssemblyBoundary mty.AllValsAndMembers acc
36963696
acc
36973697

3698-
let ComputeHidingInfoAtAssemblyBoundary mty =
3698+
let ComputeHidingInfoAtAssemblyBoundary mty acc =
36993699
// dprintf "ComputeRemappingFromInferredSignatureToExplicitSignature,\nmty = %s\nmmsigty=%s\n" (showL(entityTypeL mty)) (showL(entityTypeL msigty));
3700-
accModuleOrNamespaceHidingInfoAtAssemblyBoundary mty SignatureHidingInfo.Empty
3700+
accModuleOrNamespaceHidingInfoAtAssemblyBoundary mty acc
37013701

37023702
//--------------------------------------------------------------------------
37033703
// Compute instances of the above for mexpr -> mty

src/fsharp/TastOps.fsi

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -745,10 +745,11 @@ type SignatureHidingInfo =
745745
mhiVals : Zset<Val>;
746746
mhiRecdFields : Zset<RecdFieldRef>;
747747
mhiUnionCases : Zset<UnionCaseRef> }
748+
static member Empty : SignatureHidingInfo
748749

749750
val ComputeRemappingFromInferredSignatureToExplicitSignature : TcGlobals -> ModuleOrNamespaceType -> ModuleOrNamespaceType -> SignatureRepackageInfo * SignatureHidingInfo
750751
val ComputeRemappingFromImplementationToSignature : TcGlobals -> ModuleOrNamespaceExpr -> ModuleOrNamespaceType -> SignatureRepackageInfo * SignatureHidingInfo
751-
val ComputeHidingInfoAtAssemblyBoundary : ModuleOrNamespaceType -> SignatureHidingInfo
752+
val ComputeHidingInfoAtAssemblyBoundary : ModuleOrNamespaceType -> SignatureHidingInfo -> SignatureHidingInfo
752753
val mkRepackageRemapping : SignatureRepackageInfo -> Remap
753754

754755
val wrapModuleOrNamespaceExprInNamespace : Ident -> CompilationPath -> ModuleOrNamespaceExpr -> ModuleOrNamespaceExpr

tests/fsharp/optimize/inline/build.bat

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,23 @@ if NOT "%FSC:NOTAVAIL=X%" == "%FSC%" (
99
goto Skip
1010
)
1111

12-
"%FSC%" %fsc_flags% -g --optimize- --target:library -o:lib.dll lib.fs
12+
"%FSC%" %fsc_flags% -g --optimize- --target:library -o:lib.dll lib.fs lib2.fs
1313
if ERRORLEVEL 1 goto Error
1414

15-
"%FSC%" %fsc_flags% --optimize --target:library -o:lib--optimize.dll -g lib.fs
15+
"%FSC%" %fsc_flags% -g --optimize- --target:library -o:lib3.dll -r:lib.dll lib3.fs
1616
if ERRORLEVEL 1 goto Error
1717

18-
"%FSC%" %fsc_flags% -g --optimize- -o:test.exe test.fs -r:lib.dll
18+
"%FSC%" %fsc_flags% -g --optimize- -o:test.exe test.fs -r:lib.dll -r:lib3.dll
1919
if ERRORLEVEL 1 goto Error
2020

21-
"%FSC%" %fsc_flags% --optimize -o:test--optimize.exe -g test.fs -r:lib--optimize.dll
21+
22+
"%FSC%" %fsc_flags% --optimize --target:library -o:lib--optimize.dll -g lib.fs lib2.fs
23+
if ERRORLEVEL 1 goto Error
24+
25+
"%FSC%" %fsc_flags% --optimize --target:library -o:lib3--optimize.dll -r lib-optimize.dll -g lib3.fs
26+
if ERRORLEVEL 1 goto Error
27+
28+
"%FSC%" %fsc_flags% --optimize -o:test--optimize.exe -g test.fs -r:lib--optimize.dll -r:lib3--optimize.dll
2229
if ERRORLEVEL 1 goto Error
2330

2431
:Ok

tests/fsharp/optimize/inline/lib.fs

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
module Test.Lib
1+
namespace ThisNamespaceHasToBeTheSame
22

33
#nowarn "9"
44

@@ -69,3 +69,20 @@ module Vector3GenericInt =
6969
module Vector3GenericObj =
7070
let inline test (v1: Vector3Generic<obj>) (v2: Vector3Generic<obj>) =
7171
v1.x
72+
73+
type HiddenRecord =
74+
private { x : int }
75+
member this.X = this.x
76+
77+
type HiddenUnion =
78+
private A of int | B of string
79+
member this.X = match this with A x -> x | B s -> s.Length
80+
81+
type internal Foo private () =
82+
static member FooMethod() = ()
83+
84+
[<System.Runtime.CompilerServices.InternalsVisibleToAttribute("lib3")>]
85+
do()
86+
87+
[<System.Runtime.CompilerServices.InternalsVisibleToAttribute("lib3--optimize")>]
88+
do()
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
namespace ThisNamespaceHasToBeTheSame
2+
module Factory =
3+
let NewRecord () = { x = 0 }
4+
let NewUnionA () = A 1
5+
let NewUnionB () = B "1"
6+
7+
type Bar () =
8+
member x.BarMethod() =
9+
Foo.FooMethod()
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
namespace ASecondLibrary
2+
3+
open ThisNamespaceHasToBeTheSame
4+
5+
type Bar () =
6+
member x.BarMethod() =
7+
Foo.FooMethod()

tests/fsharp/optimize/inline/test.fs

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
module Test.Test
22

3-
open Test.Lib
3+
open ThisNamespaceHasToBeTheSame
4+
open ASecondLibrary
45

56
let testVector3DotInline (v1: Vector3) =
67
Vector3.dot v1 v1
@@ -15,4 +16,18 @@ let testVector3GenericInline (v1: Vector3Generic<int>) =
1516
Vector3GenericInt.test v1 v1
1617

1718
let testVector3GenericInline2 (v1: Vector3Generic<obj>) =
18-
Vector3GenericObj.test v1 v1
19+
Vector3GenericObj.test v1 v1
20+
21+
// This was the failing case for the first bug reported in https://github.com/Microsoft/visualfsharp/issues/532
22+
//
23+
let testAccessingSomethingInlinableThatUsesAPrivateInlinedConstructFromAThirdModule =
24+
let boom1 = ThisNamespaceHasToBeTheSame.Factory.NewRecord ()
25+
let boom2 = ThisNamespaceHasToBeTheSame.Factory.NewUnionA ()
26+
let boom3 = ThisNamespaceHasToBeTheSame.Factory.NewUnionB ()
27+
boom1.X, boom2.X, boom3.X
28+
29+
// This is the failing case for the second bug reported in https://github.com/Microsoft/visualfsharp/issues/532
30+
//
31+
//let testAccessingSomethingInlinableThatUsesAInternalConstructFromAnInternalsVisibleToAssembly =
32+
// Bar().BarMethod()
33+

0 commit comments

Comments
 (0)