{"action":"closed","number":4979,"pull_request":{"url":"https://api.github.com/repos/dotnet/roslyn/pulls/4979","id":44137446,"html_url":"https://github.com/dotnet/roslyn/pull/4979","diff_url":"https://github.com/dotnet/roslyn/pull/4979.diff","patch_url":"https://github.com/dotnet/roslyn/pull/4979.patch","issue_url":"https://api.github.com/repos/dotnet/roslyn/issues/4979","number":4979,"state":"closed","locked":false,"title":"Making stack scheduling optimizations more robust and fixing #4828","user":{"login":"VSadov","id":8218165,"avatar_url":"https://avatars.githubusercontent.com/u/8218165?v=3","gravatar_id":"","url":"https://api.github.com/users/VSadov","html_url":"https://github.com/VSadov","followers_url":"https://api.github.com/users/VSadov/followers","following_url":"https://api.github.com/users/VSadov/following{/other_user}","gists_url":"https://api.github.com/users/VSadov/gists{/gist_id}","starred_url":"https://api.github.com/users/VSadov/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/VSadov/subscriptions","organizations_url":"https://api.github.com/users/VSadov/orgs","repos_url":"https://api.github.com/users/VSadov/repos","events_url":"https://api.github.com/users/VSadov/events{/privacy}","received_events_url":"https://api.github.com/users/VSadov/received_events","type":"User","site_admin":false},"body":"Stack scheduler performs two kinds of transformations -\r\n1) it turns local slots into ephemeral locals that live on the evaluation stack.\r\n2) It also tries to Dup previous expressions when the next one is exactly the same and other condittions allow.\r\n\r\nThe operation # 2 is basically a workaround for cases like\r\n\r\n   temp = ...\r\n   result = temp + temp;\r\n\r\nSince ephemeral locals are modeled as occupying the space \"below\" the eval values, having temp on eval stack prevents that same temp from loading as a stack local.\r\nThe self-interference situations like above are fairly common, so the stack scheduler tries to reduce some of the cases by attempting a peephole optimization where value of previous expression could be Dup-ed if the following one is the same. (thus in our example it would look like the second load of the temp does not happen at all).\r\n\r\nThis # 2 optimization has numerous conditions where it is not applicable and as bug #4828 shows it is still fairly fragile. It relies on the presence of the value produced by the previous expression and that is not always guaranteed to be there if the expression has no sideeffects.\r\n\r\nInstead of adding more conditions, I am removing the # 2 entirely.\r\n\r\nIt appears that it can be removed without any serious regression in # 1 as long as we track not only the depth of the eval stack but also what we have on it. That way we can detect self-interference cases by just examining our best knowledge of the stack and handle definite self-interference cases as not prohibiting.\r\n\r\nThe result of this change is that many dups have disappeared from the code, but in most cases they were dups of trivial local/parameter loads and as such are not a concern.\r\nOn the other hand most cases where local slots can be optimized away are still there and in some cases we actually are slightly better.\r\n\r\nThe most important part is that the whole scheduling got simpler and uses fewer assumptions about what emit might do.\r\n\r\nFixes #4828","created_at":"2015-09-03T17:58:04Z","updated_at":"2015-09-05T00:35:30Z","closed_at":"2015-09-05T00:35:30Z","merged_at":"2015-09-05T00:35:30Z","merge_commit_sha":"b22f689e9620d09869b1fed36c953c6e62afc832","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/dotnet/roslyn/pulls/4979/commits","review_comments_url":"https://api.github.com/repos/dotnet/roslyn/pulls/4979/comments","review_comment_url":"https://api.github.com/repos/dotnet/roslyn/pulls/comments{/number}","comments_url":"https://api.github.com/repos/dotnet/roslyn/issues/4979/comments","statuses_url":"https://api.github.com/repos/dotnet/roslyn/statuses/93b341d09bdba8bc7f3f530ecaac7884e892c2eb","head":{"label":"VSadov:master","ref":"master","sha":"93b341d09bdba8bc7f3f530ecaac7884e892c2eb","user":{"login":"VSadov","id":8218165,"avatar_url":"https://avatars.githubusercontent.com/u/8218165?v=3","gravatar_id":"","url":"https://api.github.com/users/VSadov","html_url":"https://github.com/VSadov","followers_url":"https://api.github.com/users/VSadov/followers","following_url":"https://api.github.com/users/VSadov/following{/other_user}","gists_url":"https://api.github.com/users/VSadov/gists{/gist_id}","starred_url":"https://api.github.com/users/VSadov/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/VSadov/subscriptions","organizations_url":"https://api.github.com/users/VSadov/orgs","repos_url":"https://api.github.com/users/VSadov/repos","events_url":"https://api.github.com/users/VSadov/events{/privacy}","received_events_url":"https://api.github.com/users/VSadov/received_events","type":"User","site_admin":false},"repo":{"id":30550950,"name":"roslyn","full_name":"VSadov/roslyn","owner":{"login":"VSadov","id":8218165,"avatar_url":"https://avatars.githubusercontent.com/u/8218165?v=3","gravatar_id":"","url":"https://api.github.com/users/VSadov","html_url":"https://github.com/VSadov","followers_url":"https://api.github.com/users/VSadov/followers","following_url":"https://api.github.com/users/VSadov/following{/other_user}","gists_url":"https://api.github.com/users/VSadov/gists{/gist_id}","starred_url":"https://api.github.com/users/VSadov/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/VSadov/subscriptions","organizations_url":"https://api.github.com/users/VSadov/orgs","repos_url":"https://api.github.com/users/VSadov/repos","events_url":"https://api.github.com/users/VSadov/events{/privacy}","received_events_url":"https://api.github.com/users/VSadov/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/VSadov/roslyn","description":"The .NET Compiler Platform (\"Roslyn\") provides open-source C# and Visual Basic compilers with rich code analysis APIs.","fork":true,"url":"https://api.github.com/repos/VSadov/roslyn","forks_url":"https://api.github.com/repos/VSadov/roslyn/forks","keys_url":"https://api.github.com/repos/VSadov/roslyn/keys{/key_id}","collaborators_url":"https://api.github.com/repos/VSadov/roslyn/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/VSadov/roslyn/teams","hooks_url":"https://api.github.com/repos/VSadov/roslyn/hooks","issue_events_url":"https://api.github.com/repos/VSadov/roslyn/issues/events{/number}","events_url":"https://api.github.com/repos/VSadov/roslyn/events","assignees_url":"https://api.github.com/repos/VSadov/roslyn/assignees{/user}","branches_url":"https://api.github.com/repos/VSadov/roslyn/branches{/branch}","tags_url":"https://api.github.com/repos/VSadov/roslyn/tags","blobs_url":"https://api.github.com/repos/VSadov/roslyn/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/VSadov/roslyn/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/VSadov/roslyn/git/refs{/sha}","trees_url":"https://api.github.com/repos/VSadov/roslyn/git/trees{/sha}","statuses_url":"https://api.github.com/repos/VSadov/roslyn/statuses/{sha}","languages_url":"https://api.github.com/repos/VSadov/roslyn/languages","stargazers_url":"https://api.github.com/repos/VSadov/roslyn/stargazers","contributors_url":"https://api.github.com/repos/VSadov/roslyn/contributors","subscribers_url":"https://api.github.com/repos/VSadov/roslyn/subscribers","subscription_url":"https://api.github.com/repos/VSadov/roslyn/subscription","commits_url":"https://api.github.com/repos/VSadov/roslyn/commits{/sha}","git_commits_url":"https://api.github.com/repos/VSadov/roslyn/git/commits{/sha}","comments_url":"https://api.github.com/repos/VSadov/roslyn/comments{/number}","issue_comment_url":"https://api.github.com/repos/VSadov/roslyn/issues/comments{/number}","contents_url":"https://api.github.com/repos/VSadov/roslyn/contents/{+path}","compare_url":"https://api.github.com/repos/VSadov/roslyn/compare/{base}...{head}","merges_url":"https://api.github.com/repos/VSadov/roslyn/merges","archive_url":"https://api.github.com/repos/VSadov/roslyn/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/VSadov/roslyn/downloads","issues_url":"https://api.github.com/repos/VSadov/roslyn/issues{/number}","pulls_url":"https://api.github.com/repos/VSadov/roslyn/pulls{/number}","milestones_url":"https://api.github.com/repos/VSadov/roslyn/milestones{/number}","notifications_url":"https://api.github.com/repos/VSadov/roslyn/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/VSadov/roslyn/labels{/name}","releases_url":"https://api.github.com/repos/VSadov/roslyn/releases{/id}","created_at":"2015-02-09T18:24:54Z","updated_at":"2015-05-01T17:31:03Z","pushed_at":"2015-09-04T16:19:47Z","git_url":"git://github.com/VSadov/roslyn.git","ssh_url":"git@github.com:VSadov/roslyn.git","clone_url":"https://github.com/VSadov/roslyn.git","svn_url":"https://github.com/VSadov/roslyn","homepage":"","size":92868,"stargazers_count":0,"watchers_count":0,"language":"C#","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"dotnet:master","ref":"master","sha":"02233f6261d0928ccd601459f2527738f1df09b5","user":{"login":"dotnet","id":9141961,"avatar_url":"https://avatars.githubusercontent.com/u/9141961?v=3","gravatar_id":"","url":"https://api.github.com/users/dotnet","html_url":"https://github.com/dotnet","followers_url":"https://api.github.com/users/dotnet/followers","following_url":"https://api.github.com/users/dotnet/following{/other_user}","gists_url":"https://api.github.com/users/dotnet/gists{/gist_id}","starred_url":"https://api.github.com/users/dotnet/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dotnet/subscriptions","organizations_url":"https://api.github.com/users/dotnet/orgs","repos_url":"https://api.github.com/users/dotnet/repos","events_url":"https://api.github.com/users/dotnet/events{/privacy}","received_events_url":"https://api.github.com/users/dotnet/received_events","type":"Organization","site_admin":false},"repo":{"id":29078997,"name":"roslyn","full_name":"dotnet/roslyn","owner":{"login":"dotnet","id":9141961,"avatar_url":"https://avatars.githubusercontent.com/u/9141961?v=3","gravatar_id":"","url":"https://api.github.com/users/dotnet","html_url":"https://github.com/dotnet","followers_url":"https://api.github.com/users/dotnet/followers","following_url":"https://api.github.com/users/dotnet/following{/other_user}","gists_url":"https://api.github.com/users/dotnet/gists{/gist_id}","starred_url":"https://api.github.com/users/dotnet/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dotnet/subscriptions","organizations_url":"https://api.github.com/users/dotnet/orgs","repos_url":"https://api.github.com/users/dotnet/repos","events_url":"https://api.github.com/users/dotnet/events{/privacy}","received_events_url":"https://api.github.com/users/dotnet/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/dotnet/roslyn","description":"The .NET Compiler Platform (\"Roslyn\") provides open-source C# and Visual Basic compilers with rich code analysis APIs.","fork":false,"url":"https://api.github.com/repos/dotnet/roslyn","forks_url":"https://api.github.com/repos/dotnet/roslyn/forks","keys_url":"https://api.github.com/repos/dotnet/roslyn/keys{/key_id}","collaborators_url":"https://api.github.com/repos/dotnet/roslyn/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/dotnet/roslyn/teams","hooks_url":"https://api.github.com/repos/dotnet/roslyn/hooks","issue_events_url":"https://api.github.com/repos/dotnet/roslyn/issues/events{/number}","events_url":"https://api.github.com/repos/dotnet/roslyn/events","assignees_url":"https://api.github.com/repos/dotnet/roslyn/assignees{/user}","branches_url":"https://api.github.com/repos/dotnet/roslyn/branches{/branch}","tags_url":"https://api.github.com/repos/dotnet/roslyn/tags","blobs_url":"https://api.github.com/repos/dotnet/roslyn/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/dotnet/roslyn/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/dotnet/roslyn/git/refs{/sha}","trees_url":"https://api.github.com/repos/dotnet/roslyn/git/trees{/sha}","statuses_url":"https://api.github.com/repos/dotnet/roslyn/statuses/{sha}","languages_url":"https://api.github.com/repos/dotnet/roslyn/languages","stargazers_url":"https://api.github.com/repos/dotnet/roslyn/stargazers","contributors_url":"https://api.github.com/repos/dotnet/roslyn/contributors","subscribers_url":"https://api.github.com/repos/dotnet/roslyn/subscribers","subscription_url":"https://api.github.com/repos/dotnet/roslyn/subscription","commits_url":"https://api.github.com/repos/dotnet/roslyn/commits{/sha}","git_commits_url":"https://api.github.com/repos/dotnet/roslyn/git/commits{/sha}","comments_url":"https://api.github.com/repos/dotnet/roslyn/comments{/number}","issue_comment_url":"https://api.github.com/repos/dotnet/roslyn/issues/comments{/number}","contents_url":"https://api.github.com/repos/dotnet/roslyn/contents/{+path}","compare_url":"https://api.github.com/repos/dotnet/roslyn/compare/{base}...{head}","merges_url":"https://api.github.com/repos/dotnet/roslyn/merges","archive_url":"https://api.github.com/repos/dotnet/roslyn/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/dotnet/roslyn/downloads","issues_url":"https://api.github.com/repos/dotnet/roslyn/issues{/number}","pulls_url":"https://api.github.com/repos/dotnet/roslyn/pulls{/number}","milestones_url":"https://api.github.com/repos/dotnet/roslyn/milestones{/number}","notifications_url":"https://api.github.com/repos/dotnet/roslyn/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/dotnet/roslyn/labels{/name}","releases_url":"https://api.github.com/repos/dotnet/roslyn/releases{/id}","created_at":"2015-01-11T02:39:03Z","updated_at":"2015-09-04T18:57:22Z","pushed_at":"2015-09-05T00:35:30Z","git_url":"git://github.com/dotnet/roslyn.git","ssh_url":"git@github.com:dotnet/roslyn.git","clone_url":"https://github.com/dotnet/roslyn.git","svn_url":"https://github.com/dotnet/roslyn","homepage":"","size":186240,"stargazers_count":3171,"watchers_count":3171,"language":"C#","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":733,"mirror_url":null,"open_issues_count":1425,"forks":733,"open_issues":1425,"watchers":3171,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/dotnet/roslyn/pulls/4979"},"html":{"href":"https://github.com/dotnet/roslyn/pull/4979"},"issue":{"href":"https://api.github.com/repos/dotnet/roslyn/issues/4979"},"comments":{"href":"https://api.github.com/repos/dotnet/roslyn/issues/4979/comments"},"review_comments":{"href":"https://api.github.com/repos/dotnet/roslyn/pulls/4979/comments"},"review_comment":{"href":"https://api.github.com/repos/dotnet/roslyn/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/dotnet/roslyn/pulls/4979/commits"},"statuses":{"href":"https://api.github.com/repos/dotnet/roslyn/statuses/93b341d09bdba8bc7f3f530ecaac7884e892c2eb"}},"merged":true,"mergeable":null,"mergeable_state":"unknown","merged_by":{"login":"VSadov","id":8218165,"avatar_url":"https://avatars.githubusercontent.com/u/8218165?v=3","gravatar_id":"","url":"https://api.github.com/users/VSadov","html_url":"https://github.com/VSadov","followers_url":"https://api.github.com/users/VSadov/followers","following_url":"https://api.github.com/users/VSadov/following{/other_user}","gists_url":"https://api.github.com/users/VSadov/gists{/gist_id}","starred_url":"https://api.github.com/users/VSadov/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/VSadov/subscriptions","organizations_url":"https://api.github.com/users/VSadov/orgs","repos_url":"https://api.github.com/users/VSadov/repos","events_url":"https://api.github.com/users/VSadov/events{/privacy}","received_events_url":"https://api.github.com/users/VSadov/received_events","type":"User","site_admin":false},"comments":3,"review_comments":2,"commits":1,"additions":497,"deletions":564,"changed_files":12}}