Skip to content

Commit c58c532

Browse files
committed
Auto merge of rust-lang#70989 - eddyb:mir-opt-32-pr-ci, r=Mark-Simulacrum
ci: run mir-opt tests on PR CI also as 32-bit (for `EMIT_MIR_FOR_EACH_BIT_WIDTH`). Background: rust-lang#69916 and [`src/test/mir-opt/README.md`](https://github.com/rust-lang/rust/blob/master/src/test/mir-opt/README.md): > By default 32 bit and 64 bit targets use the same dump files, which can be problematic in the presence of pointers in constants or other bit width dependent things. In that case you can add > > ``` > // EMIT_MIR_FOR_EACH_BIT_WIDTH > ``` > > to your test, causing separate files to be generated for 32bit and 64bit systems. However, if you change the output of such a test (intentionally or not), or if you add a test and it varies between 32-bit and 64-bit platforms, you have to run this command (for a x64 linux host): `./x.py test --stage 1 --target x86_64-unknown-linux-gnu --target i686-unknown-linux-gnu --bless src/test/mir-opt` Otherwise, bors trying to merge the PR will fail, since we test 32-bit targets there. But we don't on PR CI, which means there's no way the PR author would know (unless they were burnt by this already and know what to look for). This PR resolves that by running `mir-opt` tests for ~~`i686-unknown-linux-gnu`~~, on PR CI. **EDIT**: switched to `armv5te-unknown-linux-gnueabi` to work around LLVM 7 crashes (see rust-lang/compiler-builtins#311 (comment)), found during testing. cc @rust-lang/wg-mir-opt @rust-lang/infra
2 parents 5179ebe + cb6a560 commit c58c532

File tree

6 files changed

+111
-10
lines changed

6 files changed

+111
-10
lines changed

src/ci/docker/x86_64-gnu-llvm-7/Dockerfile

+18-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ FROM ubuntu:18.04
22

33
RUN apt-get update && apt-get install -y --no-install-recommends \
44
g++ \
5+
g++-arm-linux-gnueabi \
56
make \
67
file \
78
curl \
@@ -29,7 +30,23 @@ ENV RUST_CONFIGURE_ARGS \
2930
--enable-llvm-link-shared \
3031
--set rust.thin-lto-import-instr-limit=10
3132

32-
ENV SCRIPT python2.7 ../x.py test --exclude src/tools/tidy && python2.7 ../x.py test src/tools/tidy
33+
ENV SCRIPT python2.7 ../x.py test --exclude src/tools/tidy && \
34+
# Run the `mir-opt` tests again but this time for a 32-bit target.
35+
# This enforces that tests using `// EMIT_MIR_FOR_EACH_BIT_WIDTH` have
36+
# both 32-bit and 64-bit outputs updated by the PR author, before
37+
# the PR is approved and tested for merging.
38+
# It will also detect tests lacking `// EMIT_MIR_FOR_EACH_BIT_WIDTH`,
39+
# despite having different output on 32-bit vs 64-bit targets.
40+
#
41+
# HACK(eddyb) `armv5te` is used (not `i686`) to support older LLVM than LLVM 9:
42+
# https://github.com/rust-lang/compiler-builtins/pull/311#issuecomment-612270089.
43+
# This also requires `--pass=build` because we can't execute the tests
44+
# on the `x86_64` host when they're built as `armv5te` binaries.
45+
# (we're only interested in the MIR output, so this doesn't matter)
46+
python2.7 ../x.py test src/test/mir-opt --pass=build \
47+
--target=armv5te-unknown-linux-gnueabi && \
48+
# Run tidy at the very end, after all the other tests.
49+
python2.7 ../x.py test src/tools/tidy
3350

3451
# The purpose of this container isn't to test with debug assertions and
3552
# this is run on all PRs, so let's get speedier builds by disabling these extra

src/test/mir-opt/inline/inline-into-box-place.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// ignore-wasm32-bare compiled with panic=abort by default
22
// compile-flags: -Z mir-opt-level=3
3-
// only-64bit FIXME: the mir representation of RawVec depends on ptr size
3+
// EMIT_MIR_FOR_EACH_BIT_WIDTH
44
#![feature(box_syntax)]
55

66
// EMIT_MIR rustc.main.Inline.diff
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
- // MIR for `main` before Inline
2+
+ // MIR for `main` after Inline
3+
4+
fn main() -> () {
5+
let mut _0: (); // return place in scope 0 at $DIR/inline-into-box-place.rs:7:11: 7:11
6+
let _1: std::boxed::Box<std::vec::Vec<u32>> as UserTypeProjection { base: UserType(0), projs: [] }; // in scope 0 at $DIR/inline-into-box-place.rs:8:9: 8:11
7+
let mut _2: std::boxed::Box<std::vec::Vec<u32>>; // in scope 0 at $DIR/inline-into-box-place.rs:8:29: 8:43
8+
let mut _3: (); // in scope 0 at $DIR/inline-into-box-place.rs:8:42: 8:43
9+
+ let mut _4: &mut std::vec::Vec<u32>; // in scope 0 at $DIR/inline-into-box-place.rs:8:33: 8:43
10+
scope 1 {
11+
debug _x => _1; // in scope 1 at $DIR/inline-into-box-place.rs:8:9: 8:11
12+
}
13+
+ scope 2 {
14+
+ }
15+
16+
bb0: {
17+
StorageLive(_1); // bb0[0]: scope 0 at $DIR/inline-into-box-place.rs:8:9: 8:11
18+
StorageLive(_2); // bb0[1]: scope 0 at $DIR/inline-into-box-place.rs:8:29: 8:43
19+
_2 = Box(std::vec::Vec<u32>); // bb0[2]: scope 0 at $DIR/inline-into-box-place.rs:8:29: 8:43
20+
- (*_2) = const std::vec::Vec::<u32>::new() -> [return: bb2, unwind: bb4]; // bb0[3]: scope 0 at $DIR/inline-into-box-place.rs:8:33: 8:43
21+
+ _4 = &mut (*_2); // bb0[3]: scope 0 at $DIR/inline-into-box-place.rs:8:33: 8:43
22+
+ ((*_4).0: alloc::raw_vec::RawVec<u32>) = const ByRef { alloc: Allocation { bytes: [4, 0, 0, 0, 0, 0, 0, 0], relocations: Relocations(SortedMap { data: [] }), undef_mask: UndefMask { blocks: [255], len: Size { raw: 8 } }, size: Size { raw: 8 }, align: Align { pow2: 2 }, mutability: Not, extra: () }, offset: Size { raw: 0 } }: alloc::raw_vec::RawVec::<u32>; // bb0[4]: scope 2 at $SRC_DIR/liballoc/vec.rs:LL:COL
23+
// ty::Const
24+
- // + ty: fn() -> std::vec::Vec<u32> {std::vec::Vec::<u32>::new}
25+
- // + val: Value(Scalar(<ZST>))
26+
+ // + ty: alloc::raw_vec::RawVec<u32>
27+
+ // + val: Value(ByRef { alloc: Allocation { bytes: [4, 0, 0, 0, 0, 0, 0, 0], relocations: Relocations(SortedMap { data: [] }), undef_mask: UndefMask { blocks: [255], len: Size { raw: 8 } }, size: Size { raw: 8 }, align: Align { pow2: 2 }, mutability: Not, extra: () }, offset: Size { raw: 0 } })
28+
// mir::Constant
29+
- // + span: $DIR/inline-into-box-place.rs:8:33: 8:41
30+
- // + user_ty: UserType(1)
31+
- // + literal: Const { ty: fn() -> std::vec::Vec<u32> {std::vec::Vec::<u32>::new}, val: Value(Scalar(<ZST>)) }
32+
+ // + span: $SRC_DIR/liballoc/vec.rs:LL:COL
33+
+ // + user_ty: UserType(0)
34+
+ // + literal: Const { ty: alloc::raw_vec::RawVec<u32>, val: Value(ByRef { alloc: Allocation { bytes: [4, 0, 0, 0, 0, 0, 0, 0], relocations: Relocations(SortedMap { data: [] }), undef_mask: UndefMask { blocks: [255], len: Size { raw: 8 } }, size: Size { raw: 8 }, align: Align { pow2: 2 }, mutability: Not, extra: () }, offset: Size { raw: 0 } }) }
35+
+ ((*_4).1: usize) = const 0usize; // bb0[5]: scope 2 at $SRC_DIR/liballoc/vec.rs:LL:COL
36+
+ // ty::Const
37+
+ // + ty: usize
38+
+ // + val: Value(Scalar(0x00000000))
39+
+ // mir::Constant
40+
+ // + span: $SRC_DIR/liballoc/vec.rs:LL:COL
41+
+ // + literal: Const { ty: usize, val: Value(Scalar(0x00000000)) }
42+
+ _1 = move _2; // bb0[6]: scope 0 at $DIR/inline-into-box-place.rs:8:29: 8:43
43+
+ StorageDead(_2); // bb0[7]: scope 0 at $DIR/inline-into-box-place.rs:8:42: 8:43
44+
+ _0 = (); // bb0[8]: scope 0 at $DIR/inline-into-box-place.rs:7:11: 9:2
45+
+ drop(_1) -> [return: bb2, unwind: bb1]; // bb0[9]: scope 0 at $DIR/inline-into-box-place.rs:9:1: 9:2
46+
}
47+
48+
bb1 (cleanup): {
49+
resume; // bb1[0]: scope 0 at $DIR/inline-into-box-place.rs:7:1: 9:2
50+
}
51+
52+
bb2: {
53+
- _1 = move _2; // bb2[0]: scope 0 at $DIR/inline-into-box-place.rs:8:29: 8:43
54+
- StorageDead(_2); // bb2[1]: scope 0 at $DIR/inline-into-box-place.rs:8:42: 8:43
55+
- _0 = (); // bb2[2]: scope 0 at $DIR/inline-into-box-place.rs:7:11: 9:2
56+
- drop(_1) -> [return: bb3, unwind: bb1]; // bb2[3]: scope 0 at $DIR/inline-into-box-place.rs:9:1: 9:2
57+
- }
58+
-
59+
- bb3: {
60+
- StorageDead(_1); // bb3[0]: scope 0 at $DIR/inline-into-box-place.rs:9:1: 9:2
61+
- return; // bb3[1]: scope 0 at $DIR/inline-into-box-place.rs:9:2: 9:2
62+
- }
63+
-
64+
- bb4 (cleanup): {
65+
- _3 = const alloc::alloc::box_free::<std::vec::Vec<u32>>(move (_2.0: std::ptr::Unique<std::vec::Vec<u32>>)) -> bb1; // bb4[0]: scope 0 at $DIR/inline-into-box-place.rs:8:42: 8:43
66+
- // ty::Const
67+
- // + ty: unsafe fn(std::ptr::Unique<std::vec::Vec<u32>>) {alloc::alloc::box_free::<std::vec::Vec<u32>>}
68+
- // + val: Value(Scalar(<ZST>))
69+
- // mir::Constant
70+
- // + span: $DIR/inline-into-box-place.rs:8:42: 8:43
71+
- // + literal: Const { ty: unsafe fn(std::ptr::Unique<std::vec::Vec<u32>>) {alloc::alloc::box_free::<std::vec::Vec<u32>>}, val: Value(Scalar(<ZST>)) }
72+
+ StorageDead(_1); // bb2[0]: scope 0 at $DIR/inline-into-box-place.rs:9:1: 9:2
73+
+ return; // bb2[1]: scope 0 at $DIR/inline-into-box-place.rs:9:2: 9:2
74+
}
75+
}
76+

src/test/ui/issues/issue-69841.rs

+1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// LLVM bug which needed a fix to be backported.
33

44
// run-pass
5+
// no-system-llvm
56

67
fn main() {
78
let buffer = [49u8, 10];

src/tools/compiletest/src/runtest.rs

+15-8
Original file line numberDiff line numberDiff line change
@@ -357,14 +357,15 @@ impl<'test> TestCx<'test> {
357357
Ui if pm == Some(PassMode::Run) || self.props.fail_mode == Some(FailMode::Run) => {
358358
WillExecute::Yes
359359
}
360-
Ui => WillExecute::No,
360+
MirOpt if pm == Some(PassMode::Run) => WillExecute::Yes,
361+
Ui | MirOpt => WillExecute::No,
361362
mode => panic!("unimplemented for mode {:?}", mode),
362363
}
363364
}
364365

365366
fn should_run_successfully(&self, pm: Option<PassMode>) -> bool {
366367
match self.config.mode {
367-
Ui => pm == Some(PassMode::Run),
368+
Ui | MirOpt => pm == Some(PassMode::Run),
368369
mode => panic!("unimplemented for mode {:?}", mode),
369370
}
370371
}
@@ -3059,18 +3060,24 @@ impl<'test> TestCx<'test> {
30593060
}
30603061

30613062
fn run_mir_opt_test(&self) {
3062-
let proc_res = self.compile_test(WillExecute::Yes, EmitMetadata::No);
3063+
let pm = self.pass_mode();
3064+
let should_run = self.should_run(pm);
3065+
let emit_metadata = self.should_emit_metadata(pm);
3066+
let proc_res = self.compile_test(should_run, emit_metadata);
30633067

30643068
if !proc_res.status.success() {
30653069
self.fatal_proc_rec("compilation failed!", &proc_res);
30663070
}
30673071

3068-
let proc_res = self.exec_compiled_test();
3072+
self.check_mir_dump();
30693073

3070-
if !proc_res.status.success() {
3071-
self.fatal_proc_rec("test run failed!", &proc_res);
3074+
if let WillExecute::Yes = should_run {
3075+
let proc_res = self.exec_compiled_test();
3076+
3077+
if !proc_res.status.success() {
3078+
self.fatal_proc_rec("test run failed!", &proc_res);
3079+
}
30723080
}
3073-
self.check_mir_dump();
30743081
}
30753082

30763083
fn check_mir_dump(&self) {
@@ -3148,7 +3155,7 @@ impl<'test> TestCx<'test> {
31483155
}
31493156
let expected_string = fs::read_to_string(&expected_file).unwrap();
31503157
if dumped_string != expected_string {
3151-
print_diff(&dumped_string, &expected_string, 3);
3158+
print_diff(&expected_string, &dumped_string, 3);
31523159
panic!(
31533160
"Actual MIR output differs from expected MIR output {}",
31543161
expected_file.display()

0 commit comments

Comments
 (0)