-
Notifications
You must be signed in to change notification settings - Fork 13.1k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Improve codegen for intrinsics #7851
Closed
Closed
Conversation
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
… semantics. Also added unit tests of range code to test refactoring. The num-range-rev.rs test will need to be updated when the range_rev semantics change.
… only, not type signatures)
…fclosedness-issue5270-2ndpr, r=cmr Changes int/uint range_rev to iterate over range `(hi,lo]` instead of `[hi,lo)`. Fix rust-lang#5270. Also: * Adds unit tests for int/uint range functions * Updates the uses of `range_rev` to account for the new semantics. (Note that pretty much all of the updates there were strict improvements to the code in question; yay!) * Exposes new function, `range_step_inclusive`, which does the range `[hi,lo]`, (at least when `hi-lo` is a multiple of the `step` parameter). * Special-cases when `|step| == 1` removing unnecessary bounds-check. (I did not check whether LLVM was already performing this optimization; I figure it would be a net win to not leave that analysis to the compiler. If reviewer objects, I can easily remove that from the refactored code.) (This pull request is a rebased version of PR rust-lang#7524, which went stale due to recent unrelated changes to num libraries.)
Allowing them in type signatures is a significant amount of extra work, unfortunately. This also doesn't apply to static values, which takes a different code path.
Simulates borrow checks for '@mut' boxes, or at least it's the same idea.
…e-unwrap, r=pcwalton Fixes Issue rust-lang#7764 Running `make check` I do get a failure: test rt::io::extensions::test::push_bytes ... ok rustest rt::comm::test::oneshot_single_thread_send_port_close ... t: task failed at 'Unhandled condition: read_error: {kind: OtherIoError, desc: "Placeholder error. You shouldn\'t be seeing this", detail: None}', /Users/shout/Projects/rust/src/libstd/condition.rs:50 /bin/sh: line 1: 35056 Abort trap: 6 x86_64-apple-darwin/stage2/test/stdtest-x86_64-apple-darwin --logfile tmp/check-stage2-T-x86_64-apple-darwin-H-x86_64-apple-darwin-std.log make: *** [tmp/check-stage2-T-x86_64-apple-darwin-H-x86_64-apple-darwin-std.ok] Error 134
Whenever a lang_item is required, some relevant message is displayed, often with a span of what triggered the usage of the lang item. Now "hello word" is as small as: ```rust #[no_std]; extern { fn puts(s: *u8); } extern "rust-intrinsic" { fn transmute<T, U>(t: T) -> U; } #[start] fn main(_: int, _: **u8, _: *u8) -> int { unsafe { let (ptr, _): (*u8, uint) = transmute("Hello!"); puts(ptr); } return 0; } ```
…lton Add some codegen tests. Nothing too surprising.
Simulates borrow checks for '@mut' boxes, or at least it's the same idea. This allows you to store owned values, but mutate them while they're owned by TLS. This should remove the necessity for a `pop`/`set` pattern to mutate data structures in TLS.
…felix Adding options for `po4a` in `mk/docs.mk` and updating .pots.
Most arms of the huge match contain the same code, differing only in small details like the name of the llvm intrinsic that is to be called. Thus the duplicated code can be factored out into a few functions that take some parameters to handle the differences.
Currently, our intrinsics are generated as functions that have the usual setup, which means an alloca, and therefore also a jump, for those intrinsics that return an immediate value. This is especially bad for unoptimized builds because it means that an intrinsic like "contains_managed" that should be just "ret 0" or "ret 1" actually ends up allocating stack space, doing a jump and a store/load sequence before it finally returns the value. To fix that, we need a way to stop the generic function declaration mechanism from allocating stack space for the return value. This implicitly also kills the jump, because the block for static allocas isn't required anymore. Additionally, trans_intrinsic needs to build the return itself instead of calling finish_fn, because the latter relies on the availability of the return value pointer. With these changes, we get the bare minimum code required for our intrinsics, which makes them small enough that inlining them makes the resulting code smaller, so we can mark them as "always inline" to get better performing unoptimized builds. Optimized builds also benefit slightly from this change as there's less code for LLVM to translate and the smaller intrinsics help it to make better inlining decisions for a few code paths. Building stage2 librustc gets ~1% faster for the optimized version and 5% for the unoptimized version.
bors
added a commit
that referenced
this pull request
Jul 18, 2013
flip1995
pushed a commit
to flip1995/rust
that referenced
this pull request
Nov 4, 2021
Fix manual_assert and match_wild_err_arm for `#![no_std]` and Rust 2021 Rust 2015 `std::panic!` has a wrapping block while `core::panic!` and Rust 2021 `std::panic!` does not. See rust-lang#88919 for details. Note that the test won't pass until clippy changes in rust-lang#88860 is synced. --- changelog: Fix [`manual_assert`] and [`match_wild_err_arm`] for `#![no_std]` and Rust 2021. Fixes rust-lang#7723
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
No description provided.