Skip to content

Commit

Permalink
Auto merge of #116270 - cjgillot:gvn-aggregate, r=oli-obk,RalfJung
Browse files Browse the repository at this point in the history
See through aggregates in GVN

This PR is extracted from rust-lang/rust#111344

The first 2 commit are cleanups to avoid repeated work. I propose to stop removing useless assignments as part of this pass, and let a later `SimplifyLocals` do it. This makes tests easier to read (among others).

The next 3 commits add a constant folding mechanism to the GVN pass, presented in rust-lang/rust#116012. ~This pass is designed to only use global allocations, to avoid any risk of accidental modification of the stored state.~

The following commits implement opportunistic simplifications, in particular:
- projections of aggregates: `MyStruct { x: a }.x` gets replaced by `a`, works with enums too;
- projections of arrays: `[a, b][0]` becomes `a`;
- projections of repeat expressions: `[a; N][x]` becomes `a`;
- transform arrays of equal operands into a repeat rvalue.

Fixes #3090

r? `@oli-obk`
  • Loading branch information
bors committed Oct 29, 2023
2 parents 87d1311 + 10b9c47 commit cf48e8a
Showing 1 changed file with 2 additions and 3 deletions.
5 changes: 2 additions & 3 deletions tests/pass/function_pointers.rs
Original file line number Diff line number Diff line change
Expand Up @@ -80,9 +80,8 @@ fn main() {
// but Miri currently uses a fixed address for monomorphic functions.
assert!(return_fn_ptr(i) == i);
assert!(return_fn_ptr(i) as unsafe fn() -> i32 == i as fn() -> i32 as unsafe fn() -> i32);
// We don't check anything for `f`. Miri gives it many different addresses
// but mir-opts can turn them into the same address.
let _val = return_fn_ptr(f) != f;
// Miri gives different addresses to different reifications of a generic function.
assert!(return_fn_ptr(f) != f);
// However, if we only turn `f` into a function pointer and use that pointer,
// it is equal to itself.
let f2 = f as fn() -> i32;
Expand Down

0 comments on commit cf48e8a

Please sign in to comment.