platform/upstream/coreclr.git
8 years agoFix compiler warnings
Rahul Kumar [Mon, 8 Aug 2016 21:35:40 +0000 (14:35 -0700)]
Fix compiler warnings

8 years agoCheck PAL_VirtualUnwind failure during GC (#6598)
Jonghyun Park [Mon, 8 Aug 2016 01:35:54 +0000 (10:35 +0900)]
Check PAL_VirtualUnwind failure during GC (#6598)

As discussed in #6525, PAL_VirtualUnwind sometimes fails during GC.

This GC failure leads to very unpredicatble behavior (which is very hard to
analyze).

This commit tries to stop the execution at the point where error
happens.

8 years agoDon't overwrite crossgen log in build.cmd script (#6639)
James Ko [Sun, 7 Aug 2016 15:21:30 +0000 (11:21 -0400)]
Don't overwrite crossgen log in build.cmd script (#6639)

8 years agoFix compile error (#6641)
Guo Xiao [Sun, 7 Aug 2016 15:20:52 +0000 (10:20 -0500)]
Fix compile error (#6641)

error: cannot initialize return object of type 'void *' with an lvalue
of type 'void ()'

8 years agoMerge pull request #6619 from BruceForstall/Fix6517
Bruce Forstall [Sat, 6 Aug 2016 17:39:06 +0000 (10:39 -0700)]
Merge pull request #6619 from BruceForstall/Fix6517

Fix #6517

8 years agoMerge pull request #6630 from dotnet-bot/UpdateDependencies20160805073043
Gaurav Khanna [Sat, 6 Aug 2016 02:33:50 +0000 (19:33 -0700)]
Merge pull request #6630 from dotnet-bot/UpdateDependencies20160805073043

Updating External dependencies to beta-24405-00

8 years agoMerge pull request #6631 from erozenfeld/NullCheckFolding
Eugene Rozenfeld [Sat, 6 Aug 2016 02:09:04 +0000 (19:09 -0700)]
Merge pull request #6631 from erozenfeld/NullCheckFolding

Null check folding.

8 years agoDecrease writes to local variables in Buffer.MemoryCopy (#6627)
James Ko [Sat, 6 Aug 2016 02:06:59 +0000 (22:06 -0400)]
Decrease writes to local variables in Buffer.MemoryCopy (#6627)

In `Buffer.MemoryCopy` currently we are making 4 writes every time we copy some data; 1 to update `*dest`, 1 to update `dest`, 1 to update `src` and 1 to update `len`. I've decreased it to 2; one to update a new local variable `i`, which keeps track of how many bytes we are into the buffer. All writes are now made using

```cs
*(dest + i + x) = *(src + i + x)
```

which has no additional overhead since they're converted to using memory addressing operands by the jit.

Another change I made was to add a few extra cases for the switch-case at the beginning that does copying for small sizes without any branches. It now covers sizes 0-22. This is beneficial to the main codepath, since we can convert the unrolled loop to a `do..while` loop and save an extra branch at the beginning. (max 7 bytes for alignment, 16 for 1 iteration of the loop, so the min bytes we can copy without checking whether we should stop is 23.) This adds

This PR increases the performance of `MemoryCopy` by 10-20% for most buffer sizes on x86; you can see the performance test/results (and the generated assembly for each version) [here](https://gist.github.com/jamesqo/337852c8ce09205a8289ce1f1b9b5382). (Note that this codepath is also used by `wstrcpy` at the moment, so this directly affects many common String operations.)

8 years agoMerge pull request #6636 from AndyAyersMS/MoreObservations
Andy Ayers [Sat, 6 Aug 2016 02:03:53 +0000 (19:03 -0700)]
Merge pull request #6636 from AndyAyersMS/MoreObservations

Inliner: add a few more observations

8 years agoFix #6517
Bruce Forstall [Fri, 5 Aug 2016 06:52:25 +0000 (23:52 -0700)]
Fix #6517

My previous change #6342 to implement tailcall-via-helper for RyuJIT/x86
also changed non-x86 for Delegate Invoke calls, to avoid creating a
temp where we already had a local. However, this temp is needed if the
local is a field (with an offset). Even if it is not a field, I saw it
needed in a JitStressRegs case. So I'm returning it to the previous logic
for non-x86, non-tailcall cases. It is still required for tailcall cases
to preserve some delicate ordering constraints on the special tailcall
argument values.

8 years agoInliner: add a few more observations
Andy Ayers [Fri, 5 Aug 2016 21:49:02 +0000 (14:49 -0700)]
Inliner: add a few more observations

Now that we can trust `optMethodFlags`, note if the root caller has
newarr or newobj. We can't yet tell if these operations might feed
a particular call's arguments but their presence in the root method
alone might be enough to build correlations with performance changes.

Count number of returns in the callee. Note if callee has same this
as the (root) caller. Note when callee is a class constructor.

Add code to dump out the new observations. No policies act on these yet.

8 years agoMerge pull request #6522 from swaroop-sridhar/gcinfov2
Swaroop Sridhar [Fri, 5 Aug 2016 22:48:42 +0000 (15:48 -0700)]
Merge pull request #6522 from swaroop-sridhar/gcinfov2

Implement GcInfo v2

8 years agoNull check folding.
Eugene Rozenfeld [Fri, 5 Aug 2016 20:14:58 +0000 (13:14 -0700)]
Null check folding.

1. Added a null check folding optimization to early prop. The optimization tries to fold
GT_NULLCHECK(y) nodes  into GT_IND(x) nodes where x=y+const
in the same block (where const is sufficiently small). The algorithm uses SSA use-def info
to go from x to its def and then tries to match the pattern x = COMMA(NULLCHECK(y), ADD(y, const))).
If such a pattern is found, the algorithm checks the trees and statements that are between the use
and the def in execution order to see if they have unsafe side effects: calls, exception sources, and
assignments (all assignment if we are in a try and assignments to global memory if we are not).
If there are no nodes with unsafe side effects, the null check is removed.

2. Made several improvements to null check elimination in assertion propagation.
..* Added a new kind for op1: O1K_VALUE_NUMBER
..* Non-null assertions can now be made about arbitrary value numbers, not just locals
..* Fixed code that was trying to find a ref given a byref: the code now handles an arbitrary number of
    offsets and checks whether the total offsetof is small enough.
..* Added similar code that tries to find a ref VN given a byref VN

This addresses part of the suboptimal code generated for #1226: null check is no longer emitted.

Correctness: ran full desktop and CoreCLR testing.

Throughput: no measurable throughput impact (verified by running internal CQNgenTP several times).

Code size in CoreCLR:

Framework assemblies:

Total bytes of diff: -805 (-0.01 % of base)
    diff is an improvement.
Total byte diff includes 0 bytes from reconciling methods
        Base had    0 unique methods,        0 unique bytes
        Diff had    0 unique methods,        0 unique bytes
Top file improvements by size (bytes):
        -352 : System.Private.CoreLib.dasm (-0.01 % of base)
        -306 : Microsoft.CodeAnalysis.CSharp.dasm (-0.01 % of base)
         -58 : Microsoft.CodeAnalysis.dasm (-0.01 % of base)
         -48 : System.Numerics.Vectors.dasm (-0.08 % of base)
         -14 : System.Xml.XmlDocument.dasm (-0.01 % of base)
7 total files with size differences.
Top method improvements by size (bytes):
         -30 : System.Numerics.Vectors.dasm - System.Numerics.Matrix4x4:ToString():ref:this
         -30 : System.Private.CoreLib.dasm - System.DateTimeParse:ParseByFormat(byref,byref,byref,ref,byref):bool
         -24 : Microsoft.CodeAnalysis.CSharp.dasm - <GetMethodsToEmit>d__68:MoveNext():bool:this
         -18 : System.Private.CoreLib.dasm - System.DateTimeParse:Lex(int,byref,byref,byref,byref,byref,int):bool
         -18 : System.Private.CoreLib.dasm - System.DateTimeParse:ProcessDateTimeSuffix(byref,byref,byref):bool
243 total methods with size differences.

JIT Code quality benchmarks in CoreCLR:

Total bytes of diff: -29 (-0.01 % of base)
    diff is an improvement.
Total byte diff includes 0 bytes from reconciling methods
        Base had    0 unique methods,        0 unique bytes
        Diff had    0 unique methods,        0 unique bytes
Top file improvements by size (bytes):
         -25 : Bytemark\Bytemark\Bytemark.dasm (-0.03 % of base)
          -4 : BenchmarksGame\pidigits\pi-digits\pi-digits.dasm (-0.21 % of base)
2 total files with size differences.
Top method improvements by size (bytes):
          -9 : Bytemark\Bytemark\Bytemark.dasm - AssignJagged:second_assignments(ref,ref)
          -6 : Bytemark\Bytemark\Bytemark.dasm - EMFloat:MultiplyInternalFPF(byref,byref,byref)
          -4 : Bytemark\Bytemark\Bytemark.dasm - EMFloat:AddSubInternalFPF(ubyte,byref,byref,byref)
          -2 : Bytemark\Bytemark\Bytemark.dasm - EMFloat:denormalize(byref,int)
          -2 : Bytemark\Bytemark\Bytemark.dasm - EMFloat:DivideInternalFPF(byref,byref,byref)
8 total methods with size differences.

In internal SPMI:

3915 methods with diffs, almost everything -- code size improvements
13,715 bytes code size reduction overall 0.51% on affected methods

CQ_Perf: 85 methods with diffs, 84 code size improvements, no regressions
Benchmarks with code size diffs:
Roslyn 59
TrueTypeBench 19
mono-pi-digits 2
mono-chameneos-redux 2
ByteMark\assign_jagged 1
Json_Serialize 1
SharpChess 1
BenchI\mulmtx 1

Internal CQPerf didn't report any runtime wins for these benchmarks.

8 years agoImplement GcInfo v2
Swaroop Sridhar [Wed, 20 Jul 2016 23:50:22 +0000 (16:50 -0700)]
Implement GcInfo v2
Ref #4379

This change implements GcInfo version 2 for all platforms that use the
GcInfo library (all architectures other than X86).

Changes are:
1) Defines ReturnKind enumeration for all platforms
2) Change the GcInfo encoder library to encode the ReturnKind and ReversePInvokeFrame slot
3) Change the CM's GcInfo decoder to encode the ReturnKind and ReversePInvokeFrame slot for GCINFO_VERSION 2
4) Some corrections to GCINFO_MEASUREments
5) Changes to RYU Jit to provide the correct information to the encoder
6) Changes to the VM to use the ReturnKind information while hijacking a thread
   - If ReturnKind is available from GcInfo, new hijack routines are used
   - Otherwise, fall back to old method (for compatibility)
7) Rework and simplify the thread hijack routines by scanning HijackFrames directly for gcroots
8) Supporting code to implement the above features.

Returning Structs in multiple registers

Hijacking for StructInRegs is currently only implemented for
Unix SystemV ABI Multi-reg struct returns. However, the hijack-workers that use
ReturnKind are ready to handle other platforms (ex: ARM/ARM64 Windows)
once the corresponding HijackTripThread() assembly routines are defined.

The New feature flag: FEATURE_MULTIREG_RETURN is set for platforms where a struct value
can be returned in multiple registers [ex: Windows/Unix ARM/ARM64, Unix-AMD64]
FEATURE_UNIX_AMD64_STRUCT_PASSING is a specific kind of FEATURE_MULTIREG_RETURN
specified by SystemV ABI for AMD64

Compatibility with other JITs

- All new GCInfo generated by RYU Jit is in GcInfo version 2
- All Ngen images must be regenerated with the new GcInfo version.
- Ready-to-run images with old GcInfo will continue to work.
- Jit64/X64 uses the GcInfo library, so it generates GcInfo version 2.
  However, it doesn't (yet) provide the data to encode the correct ReturnKind
  Similar is the case for ARM32 code running on JIT32, and any other JITs
  that may be using GcInfo library but not yet modified to use the new API.
  So, compatibility is achived using RT_Unset flag.

When ReturnKind is RT_Unset, it means that the JIT did not set
the ReturnKind in the GCInfo, and therefore the VM cannot rely on it,
and must use other mechanisms (similar to GcInfo ver 1) to determine
the Return type's GC information.

Implement GC root scanning for Hijack-frames

This change implements GCScanRoots() method for Hijacke-frames
based on the ReturnKind information available from the GcInfo.
If the exact ReturnKind is not available in the GcInfo, the
thread-suspension logic will compute the ReturnKind based on
the method-signature.

As a result of this change, several hijack-helpers in the VM
are cleaned up. There's only one implementation of HijackWorker()
to handle all returnKinds.

This change also simplifies the thread-hijack logic by using a
single assembly helper OnHijackTripThread() in most cases.
The only other helper used is for X86 floating point return values
for save/restoring the top of the FP stack.

ARM64

Only GcIndfo v2 is reliably supported for ARM64 platform.
The changes to thread-hijack mechanism fixes #6494 for ARM64.

No measurable change in JIT throughput, performance or native-image
size from this change.

8 years agoMerge pull request #6629 from JosephTremoulet/DeadFlag
Joseph Tremoulet [Fri, 5 Aug 2016 20:06:09 +0000 (16:06 -0400)]
Merge pull request #6629 from JosephTremoulet/DeadFlag

Remove GTF_REDINDEX_CHECK

8 years agoUpdating External dependencies to beta-24405-00
dotnet-bot [Fri, 5 Aug 2016 19:30:43 +0000 (19:30 +0000)]
Updating External dependencies to beta-24405-00

8 years agoMerge pull request #6628 from vancem/WCF_ExplictChannels
Vance Morrison [Fri, 5 Aug 2016 18:53:13 +0000 (11:53 -0700)]
Merge pull request #6628 from vancem/WCF_ExplictChannels

Wcf explict channels

8 years agoMerge pull request #6495 from briansull/cleanup
Brian Sullivan [Fri, 5 Aug 2016 18:44:20 +0000 (11:44 -0700)]
Merge pull request #6495 from briansull/cleanup

Followup work from codereview feedback

8 years agoMerge pull request #6617 from adityamandaleeka/fix_sos
Aditya Mandaleeka [Fri, 5 Aug 2016 18:04:45 +0000 (11:04 -0700)]
Merge pull request #6617 from adityamandaleeka/fix_sos

Fix bug in SymbolReader initialization in SOS

8 years agoMerge pull request #6620 from hqueue/fix/typo_20160805
Aditya Mandaleeka [Fri, 5 Aug 2016 18:04:00 +0000 (11:04 -0700)]
Merge pull request #6620 from hqueue/fix/typo_20160805

Fix misleading comment in codegenlegacy.cpp

8 years agoRemove GTF_REDINDEX_CHECK
Joseph Tremoulet [Fri, 5 Aug 2016 17:41:30 +0000 (13:41 -0400)]
Remove GTF_REDINDEX_CHECK

This flag is unused.  Its description also sounds like it's redundant with
the GTF_ARR_BOUND_INBND flag, so the latter flag could be used if a new
need to convey this information arises in the future.

Preserving GTF_ARR_BOUND_INBND and removing GTF_REDINDEX_CHECK makes more
sense than the other way around since GTF_ARR_BOUND_INBND is specific to
the relevant opcode.

8 years agoMerge pull request #6577 from lukasztomczyk/threadpool-spinwaitconfig
Koundinya Veluri [Fri, 5 Aug 2016 17:37:02 +0000 (10:37 -0700)]
Merge pull request #6577 from lukasztomczyk/threadpool-spinwaitconfig

Expose ThreadPool_UnfairSemaphoreSpinLimit config

8 years agoMerge pull request #6609 from AndyAyersMS/InlineSummaryData
Andy Ayers [Fri, 5 Aug 2016 16:48:48 +0000 (09:48 -0700)]
Merge pull request #6609 from AndyAyersMS/InlineSummaryData

Inliner: gather summary stats and dump to Jit CSV log

8 years agoFix typo/comments
Vance Morrison [Fri, 5 Aug 2016 16:28:06 +0000 (09:28 -0700)]
Fix typo/comments

8 years agoMerge pull request #6618 from hseok-oh/struct8byte
Brian Sullivan [Fri, 5 Aug 2016 15:59:29 +0000 (08:59 -0700)]
Merge pull request #6618 from hseok-oh/struct8byte

disable pass/return struct(float, float) using register in 32bit arch

8 years agoFix invalid checks for CONTEXT_XSTATE (#6621)
Jan Vorlicek [Fri, 5 Aug 2016 10:48:03 +0000 (12:48 +0200)]
Fix invalid checks for CONTEXT_XSTATE (#6621)

Checks for context flags containing CONTEXT_XSTATE were incorrect at two places.
The issue was that CONTEXT_XSTATE is not a single bit flag, but contains two
bits set - it is CONTEXT_AMD64 | 0x40. So testing the flag using
(contextFlags & CONTEXT_XSTATE) != 0 was always true, since context flags
on AMD64 always contain CONTEXT_AMD64 and so the `&` result is always non-zero.

8 years agoFix Issue 6585: Add offset to struct field arg (#6616)
Carol Eidt [Fri, 5 Aug 2016 08:38:44 +0000 (01:38 -0700)]
Fix Issue 6585: Add offset to struct field arg (#6616)

When the child of a GT_OBJ is a lclFldAddr, genConsumePutStructArgStk()
was not adding the offset of the struct field to the base address of
the local.

8 years agoFix misleading comment in codegenlegacy.cpp
Hyung-Kyu Choi [Fri, 5 Aug 2016 07:30:08 +0000 (16:30 +0900)]
Fix misleading comment in codegenlegacy.cpp

Signed-off-by: Hyung-Kyu Choi <hk0110.choi@samsung.com>
8 years agodisable pass/return struct(float, float) using register in 32bit architecture
Hyeongseok Oh [Fri, 5 Aug 2016 03:42:52 +0000 (12:42 +0900)]
disable pass/return struct(float, float) using register in 32bit architecture

8 years agoClean up some SOS code.
Aditya Mandaleeka [Fri, 5 Aug 2016 02:31:07 +0000 (19:31 -0700)]
Clean up some SOS code.

8 years agoCache failure to initialize SymbolReader logic in SOS.
Aditya Mandaleeka [Fri, 5 Aug 2016 02:19:21 +0000 (19:19 -0700)]
Cache failure to initialize SymbolReader logic in SOS.

8 years agoMerge pull request #6103 from mikedn/nothrowinl
Andy Ayers [Fri, 5 Aug 2016 02:14:57 +0000 (19:14 -0700)]
Merge pull request #6103 from mikedn/nothrowinl

Do not inline methods that never return

8 years agoFollowup work from codereview feedback
Brian Sullivan [Thu, 28 Jul 2016 00:39:15 +0000 (17:39 -0700)]
Followup work from codereview feedback

For PR  #6467 - Enable multireg returns on Arm64

8 years agoMerge pull request #6597 from yizhang82/test-warnings
Yi Zhang (CLR) [Fri, 5 Aug 2016 00:41:47 +0000 (17:41 -0700)]
Merge pull request #6597 from yizhang82/test-warnings

Fix warnings in interop tests

8 years agoMerge pull request #6572 from JosephTremoulet/starg
Joseph Tremoulet [Fri, 5 Aug 2016 00:31:03 +0000 (20:31 -0400)]
Merge pull request #6572 from JosephTremoulet/starg

Allow inlining when inlinee has `starg`

8 years agoAllow inlining when inlinee has `starg`
Joseph Tremoulet [Fri, 29 Jul 2016 17:54:37 +0000 (13:54 -0400)]
Allow inlining when inlinee has `starg`

The inliner's restriction that methods that make use of the `starg` opcode
cannot be inlined is somewhat artificial.  The comments indicate that the
reason for this excluion is because the inliner forward-substitutes
argument expressions in place of parameter references, but the codepaths
required to force evaluating an argument expression at the callsite and
reference that result in place of parameter references is already in place
to handle `ldarga` and complex argument expressions.

This change
 - adds an `argHasStargOp` flag to the `inlArgInfo` type, similar
   to the existing `argHasLdargaOp` flag
 - removes the `CALLEE_STORES_TO_ARGUMENT` inline observation and instead
   sets the new flag for `starg` cases
 - updates `impInlineFetchArg` to force evaluation to a temp for arguments
   that are marked `argHasStargOp`
 - updates `starg` processing in the importer to store to the
   corresponding temp when importing for an inlinee

Resolves #6014.

8 years agoMerge pull request #6579 from CarolEidt/LessConservativeGtObj
Carol Eidt [Fri, 5 Aug 2016 00:04:15 +0000 (17:04 -0700)]
Merge pull request #6579 from CarolEidt/LessConservativeGtObj

Less Conservative GtObj

8 years agoMerge pull request #6608 from dotnet-bot/from-tfs
Aditya Mandaleeka [Thu, 4 Aug 2016 21:40:42 +0000 (14:40 -0700)]
Merge pull request #6608 from dotnet-bot/from-tfs

Merge changes from TFS

8 years agoFix newly introduced typo in Documentation/README
Aditya Mandaleeka [Thu, 4 Aug 2016 21:14:20 +0000 (14:14 -0700)]
Fix newly introduced typo in Documentation/README

8 years agoFix warnings in interop tests and disable IsComObject(null) scenario as it is failing...
Yi Zhang [Thu, 4 Aug 2016 05:03:53 +0000 (22:03 -0700)]
Fix warnings in interop tests and disable IsComObject(null) scenario as it is failing in non-Windows

8 years agoFix link to all BotR chapters in table of contents
Aditya Mandaleeka [Thu, 4 Aug 2016 21:05:50 +0000 (14:05 -0700)]
Fix link to all BotR chapters in table of contents

8 years agoMerge pull request #6612 from vancem/Doc_Add_BOTR_TOC
Vance Morrison [Thu, 4 Aug 2016 21:00:10 +0000 (14:00 -0700)]
Merge pull request #6612 from vancem/Doc_Add_BOTR_TOC

Add a table of contents to the book of the runtime

8 years agoPull Request feedback
Vance Morrison [Thu, 4 Aug 2016 20:59:33 +0000 (13:59 -0700)]
Pull Request feedback

8 years agoAdd a table of contents to the book of the runtime
Vance Morrison [Thu, 4 Aug 2016 20:13:19 +0000 (13:13 -0700)]
Add a table of contents to the book of the runtime

 (so you have one link to go to that represents the entire book)

8 years agoAdding support to the following generic dictionary entry slots for R2R: (#6291)
Fadi Hanna [Thu, 4 Aug 2016 19:51:18 +0000 (12:51 -0700)]
Adding support to the following generic dictionary entry slots for R2R: (#6291)

DeclaringTypeHandleSlot
ConstrainedMethodEntrySlot

8 years agoFix contract violation (violation caused by a copy/paste bug in PR 6200
Fadi Hanna [Thu, 4 Aug 2016 19:21:28 +0000 (12:21 -0700)]
Fix contract violation (violation caused by a copy/paste bug in PR 6200

[tfs-changeset: 1620960]

8 years agoMerge pull request #6558 from bryanar/dumpling_ci2
Bryan P. Arant [Thu, 4 Aug 2016 19:17:53 +0000 (12:17 -0700)]
Merge pull request #6558 from bryanar/dumpling_ci2

Collect core dump URLs from dumpling service to raise up to CI.

8 years agoon fail: create local_dumplings.txt with the url of the uploaded core dump file if...
Bryan Arant [Mon, 1 Aug 2016 20:25:57 +0000 (13:25 -0700)]
on fail: create local_dumplings.txt with the url of the uploaded core dump file if dumpling is enabled. After, concatenate all of the local_dumplings.txt in to $(PWD)/dumplings.txt

8 years agoInliner: gather summary stats and dump to Jit CSV log
Andy Ayers [Wed, 3 Aug 2016 22:37:32 +0000 (15:37 -0700)]
Inliner: gather summary stats and dump to Jit CSV log

Collect per-method summary stats about inlining: number of calls,
number of candidates, etc.

8 years agoUpdating External dependencies to beta-24404-00 (#6601)
dotnet bot [Thu, 4 Aug 2016 18:36:43 +0000 (11:36 -0700)]
Updating External dependencies to beta-24404-00 (#6601)

8 years agoAdded additional comments to AppendFormatHelper to explain the parsing. (#1261)
Adam Speight [Thu, 4 Aug 2016 17:38:05 +0000 (18:38 +0100)]
Added additional comments to AppendFormatHelper to explain the parsing. (#1261)

* Added additional comments to AppendFormatHelper to explain the parsing.
* Create private static readonly properties for Index Limit and Width Limit.

8 years agoAdd a throw/inline benchmark
Mike Danes [Tue, 5 Jul 2016 20:45:49 +0000 (23:45 +0300)]
Add a throw/inline benchmark

8 years agoDo not inline methods that never return
Mike Danes [Wed, 3 Aug 2016 19:51:36 +0000 (22:51 +0300)]
Do not inline methods that never return

Methods that do not contain return blocks can't ever exit normally, they either throw or loop indefinitely. Inlining is not beneficial in such cases as it increases the code size without providing any speed benefits. In the particular case of throws the inlined code can easily be 10 times larger than the call site.

The call to fgMoreThanOneReturnBlock has been replaced with code that does the same thing but also detects the existence of at least one return block. This avoids walking the basic block list twice.

Note that BBJ_RETURN blocks are also generated for CEE_JMP. Methods exiting via CEE_JMP instead of CEE_RET will continue to be inlined (assuming they were inlined before this change).

8 years agoMerge pull request #6596 from yizhang82/interop-api
Yi Zhang (CLR) [Thu, 4 Aug 2016 04:41:34 +0000 (21:41 -0700)]
Merge pull request #6596 from yizhang82/interop-api

Add more interop API into System.Runtime

8 years agoMerge pull request #6589 from briansull/issue-5954
Brian Sullivan [Thu, 4 Aug 2016 01:40:15 +0000 (18:40 -0700)]
Merge pull request #6589 from briansull/issue-5954

Fix for Issue 5954

8 years agoAdding Support for FieldDescSlot generic dictionary entries for R2R generic code...
Fadi Hanna [Thu, 4 Aug 2016 01:00:49 +0000 (18:00 -0700)]
Adding Support for FieldDescSlot generic dictionary entries for R2R generic code. (#6200)

This enables generic code with ldtoken instructions for fields on generic types to be compiled into R2R.

This change makes newer versions of the runtime compatible with older version R2R images,
but not vice-versa. Therefore, the major version is increased to 2 with this change.

This change adds more encodings to a R2R image without changing the format of any previously encoded
entity, and is backwards compatible.

8 years agoAdd more interop API into System.Runtime and update mscorlib.cs
Yi Zhang [Wed, 3 Aug 2016 21:30:33 +0000 (14:30 -0700)]
Add more interop API into System.Runtime and update mscorlib.cs

8 years agoFix for issue 5954 - Assert 'fieldSeq != FieldSeqStore::NotAField()'
Brian Sullivan [Tue, 2 Aug 2016 18:24:10 +0000 (11:24 -0700)]
Fix for issue 5954 - Assert 'fieldSeq != FieldSeqStore::NotAField()'

Added new method GenTree:OperIsLocalField()
Fixes DefinesLocalAddress to properly update pIsEntire when we have a LocalField node type
Fixed fgValueNumberBlockAssignment to handle a GT_COPYBLK or GT_COPYOBJ operation
  where we have an incomplete field sequence for the Dst/LHS node.
  We already were handling an incomplete field sequence for the Src/RHS node.
  Update the dump to properly print "new uniq" whenever we issue a conservative value number.

8 years agoMerge pull request #6592 from Priya91/runpath
Lakshmi Priya [Wed, 3 Aug 2016 22:10:22 +0000 (15:10 -0700)]
Merge pull request #6592 from Priya91/runpath

Modify rebuild scenario.

8 years agoUpdate documentation on how to build corefx (#6594)
Mariana Rios Flores [Wed, 3 Aug 2016 21:55:04 +0000 (14:55 -0700)]
Update documentation on how to build corefx (#6594)

8 years agoMerge pull request #6586 from kyulee1/fixbuildtest
Kyungwoo Lee [Wed, 3 Aug 2016 20:50:26 +0000 (13:50 -0700)]
Merge pull request #6586 from kyulee1/fixbuildtest

ARM64: Fix Build Test Break

8 years agoModify rebuild scenario.
Lakshmi Priya Sekar [Wed, 3 Aug 2016 20:31:06 +0000 (13:31 -0700)]
Modify rebuild scenario.

8 years agoMerge pull request #6534 from RussKeldorph/fix6236
Russ Keldorph [Wed, 3 Aug 2016 19:40:25 +0000 (12:40 -0700)]
Merge pull request #6534 from RussKeldorph/fix6236

Fix build warnings in Vector3Interop test

8 years agoMerge pull request #6578 from rahku/version
Rahul Kumar [Wed, 3 Aug 2016 19:32:04 +0000 (12:32 -0700)]
Merge pull request #6578 from rahku/version

RC2 release used version 4.6.*. However RTM release started to use th…

8 years agoARM64: Fix Build Test Break
Kyungwoo Lee [Wed, 3 Aug 2016 16:26:41 +0000 (09:26 -0700)]
ARM64: Fix Build Test Break

8 years agoMerge pull request #6584 from kyulee1/distest
Kyungwoo Lee [Wed, 3 Aug 2016 05:32:06 +0000 (22:32 -0700)]
Merge pull request #6584 from kyulee1/distest

ARM64: Disable Two Tests

8 years agoMerge pull request #6529 from JosephTremoulet/AssertionOrder
Joseph Tremoulet [Wed, 3 Aug 2016 03:15:19 +0000 (23:15 -0400)]
Merge pull request #6529 from JosephTremoulet/AssertionOrder

Optimize bounds checks with correct assertion set

8 years agoARM64: Disable Two Tests
Kyungwoo Lee [Wed, 3 Aug 2016 00:55:19 +0000 (17:55 -0700)]
ARM64: Disable Two Tests

https://github.com/dotnet/coreclr/issues/6583

8 years agoMerge pull request #6576 from Priya91/runpath
Brian Sullivan [Wed, 3 Aug 2016 01:00:52 +0000 (18:00 -0700)]
Merge pull request #6576 from Priya91/runpath

Use absolute paths for specifying projects to build.

8 years agoExpose ThreadPool_UnfairSemaphoreSpinLimit config
Lukasz Tomczyk [Mon, 18 Jul 2016 16:28:12 +0000 (09:28 -0700)]
Expose ThreadPool_UnfairSemaphoreSpinLimit config

Spin-wait in ThreadpoolMgr::UnfairSemaphore::Wait can cause significant
CPU usage, which is unnecessary in some scenarios, where threadpool
receives work in bursts. Use of the above parameter will allow fine tuning
of the threadpool behavior based on the workload expectation.

Fix #5928

8 years agoRC2 release used version 4.6.*. However RTM release started to use the default values...
Rahul Kumar [Tue, 2 Aug 2016 22:40:23 +0000 (15:40 -0700)]
RC2 release used version 4.6.*. However RTM release started to use the default values of 1.0.* by mistake. Revert back to using 4.6 as major & minor version number

8 years agoLess Conservative GtObj
Carol Eidt [Tue, 2 Aug 2016 22:05:10 +0000 (15:05 -0700)]
Less Conservative GtObj

Don't mark GT_OBJ with GTF_EXCEPT or GTF_GLOB_REF if it is a local struct.
Also, fix changes needed in arm register allocation and code generation to handle the case where a struct argument is promoted, which appears to be code that was never exercised.
These changes are in preparation for further changes for First Class Structs. I am working to replace block ops with assignments, and was attempting to get to zero diffs, but it is quite difficult to do so given some inconsistencies in the treatment of GT_OBJs of locals.

8 years agoOptimize bounds checks with correct assertion set
Joseph Tremoulet [Mon, 18 Jul 2016 16:56:37 +0000 (12:56 -0400)]
Optimize bounds checks with correct assertion set

Assertion prop defers removing redundant bounds checks until processing
the parent comma, because the rewrite involves the comma as well.  The
code currently has a bug in that its check for whether the bounds check
is redundant also occurs when processing reaches the comma, which is wrong
because the assertion set may then include assertions generated by the RHS
of the comma (there is code to compensate for the assertion generated by
the bounds check itself, which is the LHS of the comma, but no compensation
for the RHS).

This change moves the analysis of whether bounds checks are redundant to
the proper spot in the processing order, and delays only the rewrite to
the processing of the comma; the redundancy of the bounds check is
communicated via a new opcode-specific flag: GTF_ARR_BOUND_INBND.

Fixes #6318.

8 years agoUpdate cross-building.md
Lakshmi Priya [Tue, 2 Aug 2016 21:17:17 +0000 (14:17 -0700)]
Update cross-building.md

8 years agoUpdate windows-test-instructions.md
Lakshmi Priya [Tue, 2 Aug 2016 21:15:45 +0000 (14:15 -0700)]
Update windows-test-instructions.md

8 years agoUpdate unix-test-instructions.md
Lakshmi Priya [Tue, 2 Aug 2016 21:14:23 +0000 (14:14 -0700)]
Update unix-test-instructions.md

8 years agoFix build warnings in Vector3Interop test
Russ Keldorph [Fri, 29 Jul 2016 22:19:39 +0000 (15:19 -0700)]
Fix build warnings in Vector3Interop test

Fixes #6236

8 years agoSwallow exception in gc_heap::fire_etw_allocation_event (#6571)
Jan Vorlicek [Tue, 2 Aug 2016 20:35:06 +0000 (22:35 +0200)]
Swallow exception in gc_heap::fire_etw_allocation_event (#6571)

The gc_heap::fire_etw_allocation_event calls TypeHandle::GetName that can throw
due to OOM. But we don't want failures to fire event cause a failure during the GC,
so such exception should be swallowed and no event fired in such case.
This was discovered as a contract failure during test runs with ETW logging enabled
when this function was transitively called from Thread::PerformPreemptiveGC which
was recently modified to have NOTHROW contract.
Interestingly, this was not detected by the static contract checker.

8 years agoUpdate windows-instructions.md
Lakshmi Priya [Tue, 2 Aug 2016 20:13:43 +0000 (13:13 -0700)]
Update windows-instructions.md

8 years agoUse absolute paths for specifying projects to build.
Lakshmi Priya Sekar [Tue, 2 Aug 2016 19:18:47 +0000 (12:18 -0700)]
Use absolute paths for specifying projects to build.

8 years agoMerge pull request #6564 from kyulee1/fixbuild
Kyungwoo Lee [Tue, 2 Aug 2016 18:35:22 +0000 (11:35 -0700)]
Merge pull request #6564 from kyulee1/fixbuild

ARM64: Fix Build Break

8 years agoChange to allow WCF more explicit control over channels to mimic an existing manifest.
Vance Morrison [Tue, 2 Aug 2016 18:31:48 +0000 (11:31 -0700)]
Change to allow WCF more explicit control over channels to mimic an existing manifest.

8 years agoSlightly increase throughput of string.Concat(object[]) (#6547)
James Ko [Tue, 2 Aug 2016 07:02:41 +0000 (03:02 -0400)]
Slightly increase throughput of string.Concat(object[]) (#6547)

8 years agoMerge pull request #6566 from Priya91/run2
Lakshmi Priya [Tue, 2 Aug 2016 05:12:07 +0000 (22:12 -0700)]
Merge pull request #6566 from Priya91/run2

Change processing of args in build scripts to keep =.

8 years agoARM64: Fix Build Break
Kyungwoo Lee [Mon, 1 Aug 2016 23:49:32 +0000 (16:49 -0700)]
ARM64: Fix Build Break

8 years agoChange int return values to BOOL for coreclr delegates (#6551)
Evgeny Pavlov [Tue, 2 Aug 2016 01:53:15 +0000 (04:53 +0300)]
Change int return values to BOOL for coreclr delegates (#6551)

8 years agoMerge pull request #6560 from dotnet-bot/from-tfs
Jan Kotas [Tue, 2 Aug 2016 01:50:01 +0000 (18:50 -0700)]
Merge pull request #6560 from dotnet-bot/from-tfs

Merge changes from TFS

8 years agoRename ZeroFreeMemoryUTF8 to ZeroFreeCoTaskMemUTF8 in ref (#6561)
tijoytom [Tue, 2 Aug 2016 01:49:10 +0000 (18:49 -0700)]
Rename ZeroFreeMemoryUTF8 to ZeroFreeCoTaskMemUTF8 in ref (#6561)

8 years agoDocumentation: Additional optimization levels for ARM/Linux (#6548)
Geunsik Lim [Tue, 2 Aug 2016 01:48:12 +0000 (10:48 +0900)]
Documentation: Additional optimization levels for ARM/Linux (#6548)

This instruction is to enable -Ofast or -Oz optimization level of clang on ARM/Linux.
Below is file-size comparison result of major components among -O3, -Ofast,
and -Oz on ARM/Linux-based Raspberry Pi2 board (Ubuntu/ARM 14.04 32bit).

* Linux/ARM: Release Build + O3(default): stripped , commit: 561b64d2c210b4d999de7f1ac55756704eaba784 (Jul-26-2016)
------------------------------------------------------------------------------------------------------------------
-rwxr-xr-x 1 leemgs leemgs     18,472 Jul 27 16:14 corerun
-rwxr-xr-x 1 leemgs leemgs  1,512,828 Jul 27 18:33 libclrjit.so
-rwxr-xr-x 1 leemgs leemgs  4,525,328 Jul 27 18:33 libcoreclr.so
-rwxr--r-- 1 leemgs leemgs     29,696 Jul 27 00:55 ./mscorlib.dll
-rwxr--r-- 1 leemgs leemgs  2,211,840 Jul 27 00:54 ./System.Private.CoreLib.dll
Total:   8,298,164 bytes

* Linux/ARM: Release Build + Ofast: stripped , commit: 561b64d2c210b4d999de7f1ac55756704eaba784 (Jul-26-2016)
-------------------------------------------------------------------------------------------------------------
-rwxr-xr-x 1 leemgs leemgs    18,496 Jul 26 05:00 ./corerun
-rwxr-xr-x 1 leemgs leemgs 1,512,844 Jul 26 04:59 ./libclrjit.so
-rwxr-xr-x 1 leemgs leemgs 4,525,360 Jul 26 04:59 ./libcoreclr.so
-rwxr--r-- 1 leemgs leemgs    29,696 Jul 26 00:49 ./mscorlib.dll
-rwxr--r-- 1 leemgs leemgs 2,211,840 Jul 26 00:48 ./System.Private.CoreLib.dll
Total:   8,298,236 bytes

* Linux/ARM: Release Build + Oz: stripped , commit: 561b64d2c210b4d999de7f1ac55756704eaba784 (Jul-26-2016)
---------------------------------------------------------------------------------------------------------
-rwxr-xr-x 1 leemgs leemgs    14,400 Jul 29 05:02 ./corerun
-rwxr-xr-x 1 leemgs leemgs 1,181,160 Jul 29 04:40 ./libclrjit.so
-rwxr-xr-x 1 leemgs leemgs 3,407,200 Jul 29 04:40 ./libcoreclr.so
-rwxr--r-- 1 leemgs leemgs    29,696 Jul 29 00:49 ./mscorlib.dll
-rwxr--r-- 1 leemgs leemgs 2,211,840 Jul 29 00:48 ./System.Private.CoreLib.dll
Total:  6,844,296 bytes

Signed-off-by: Geunsik Lim <geunsik.lim@samsung.com>
8 years agoMerge pull request #6565 from Priya91/checkrun
Lakshmi Priya [Tue, 2 Aug 2016 01:33:45 +0000 (18:33 -0700)]
Merge pull request #6565 from Priya91/checkrun

Add /m option for builds.

8 years agoChange processing of args in build scripts to keep =.
Lakshmi Priya Sekar [Tue, 2 Aug 2016 01:06:30 +0000 (18:06 -0700)]
Change processing of args in build scripts to keep =.

8 years agoMerge pull request #6533 from pgavlin/LSRA
Pat Gavlin [Tue, 2 Aug 2016 00:24:22 +0000 (17:24 -0700)]
Merge pull request #6533 from pgavlin/LSRA

Replace the LSRA stack with a hash table.

8 years agoAdd /m option for builds.
Lakshmi Priya Sekar [Tue, 2 Aug 2016 00:11:40 +0000 (17:11 -0700)]
Add /m option for builds.

8 years agoMerge pull request #6546 from pgavlin/LivenessCleanup
Pat Gavlin [Mon, 1 Aug 2016 23:44:01 +0000 (16:44 -0700)]
Merge pull request #6546 from pgavlin/LivenessCleanup

Refactor fgComputeLife.

8 years agoAdd function headers for new liveness methods.
Pat Gavlin [Mon, 1 Aug 2016 23:42:15 +0000 (16:42 -0700)]
Add function headers for new liveness methods.

In particular, `Compiler::fgComputeLife{Call,Local}` now have function
headers.

8 years agoMerge pull request #6557 from Priya91/runfix
Lakshmi Priya [Mon, 1 Aug 2016 23:05:21 +0000 (16:05 -0700)]
Merge pull request #6557 from Priya91/runfix

Fix errors in build scripts from run tool update.

8 years agoMerge pull request #6366 from pgavlin/RemoveEmbeddedStatementsPlan
Pat Gavlin [Mon, 1 Aug 2016 22:36:23 +0000 (15:36 -0700)]
Merge pull request #6366 from pgavlin/RemoveEmbeddedStatementsPlan

Add the proposal for embedded statement removal.

8 years agoReplace the LSRA stack with a hash table.
Pat Gavlin [Tue, 26 Jul 2016 13:27:06 +0000 (06:27 -0700)]
Replace the LSRA stack with a hash table.

LSRA currently uses a stack to find the `LocationInfo` for each register consumed
by a node. The changes in this stack's contents given a particular node are
governed by three factors:
- The number of registers the node consumes (`gtLsraInfo.srcCount`)
- The number of registers the node produces (`gtLstaInfo.dstCount`)
- Whether or not the node produces an unused value (`gtLsraInfo.isLocalDefUse`)

In all cases, `gtLsraInfo.srcCount` values are popped off of the stack in the
order in which they were pushed (i.e. in FIFO rather than LIFO order). If the
node produces a value that will be used, `gtLsraInfo.dstCount` values are
then pushed onto the stack. If the node produces an unused value, nothing is
pushed onto the stack.

Naively, it would appear that the number of registers a node consumes would be
at least the count of the node's non-leaf operands (to put it differently, one
might assume that any non-leaf operator that produces a value would define at
least one register). However, contained nodes complicate the situation: because
a contained node's execution is subsumed by its user, the contained node's
sources become sources for its user and the contained node does not define any
registers. As a result, both the number of registers consumed and the number of
registers produced by a contained node are 0. Thus, contained nodes do not
update the stack, and the node's parent (if it is not also contained) will
pop the values produced by the contained node's operands. Logically speaking,
it is as if a contained node defines the transitive closure of the registers
defined by its own non-contained operands.

The use of the stack relies on the property that even in linear order the
JIT's IR is still tree ordered. That is to say, given an operator and its
operands, any nodes that execute between any two operands do not produce
SDSU temps that are consumed after the second operand. IR with such a
shape would unbalance the stack.

The planned move to the LIR design given in #6366 removes the tree order
constraint in order to simplify understanding and manipulating the IR in the
backend. Because LIR may not be tree ordered, LSRA may no longer use a stack
to find the `LocationInfo` for a node's operands. This change replaces the
stack with a map from nodes to lists of `LocationInfo` values, each of
which describes a register that is logically defined (if not physically
defined) by that node. Only contained nodes logically define registers that
they do not physically define: contained nodes map to the list of
`LocationInfo` values logically defined by their operands. All non-contained
nodes map to the list of `LocationInfo` values that they physically define.
Non-contained nodes that do not define any registers are not inserted into
the map.

8 years agoAdd ExtraParameters to config.json to enable --.
Lakshmi Priya Sekar [Mon, 1 Aug 2016 20:26:14 +0000 (13:26 -0700)]
Add ExtraParameters to config.json to enable --.

8 years agoFix errors in build scripts from run tool update.
Lakshmi Priya Sekar [Mon, 1 Aug 2016 19:02:24 +0000 (12:02 -0700)]
Fix errors in build scripts from run tool update.