-
Notifications
You must be signed in to change notification settings - Fork 13.6k
Add the parallel front-end test suite #143953
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
Open
ywxt
wants to merge
4
commits into
rust-lang:master
Choose a base branch
from
ywxt:parallel_tests
base: master
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
+715
−72
Open
Changes from all commits
Commits
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or 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
This file contains hidden or 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
This file contains hidden or 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
This file contains hidden or 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
This file contains hidden or 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
This file contains hidden or 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
This file contains hidden or 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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
use crate::runtest::{TestCx, WillExecute}; | ||
|
||
impl TestCx<'_> { | ||
pub(super) fn run_parallel_test(&self) { | ||
let pm = self.pass_mode(); | ||
let emit_metadata = self.should_emit_metadata(pm); | ||
|
||
// Repeated testing due to instability in multithreaded environments. | ||
let iteration_count = self.props.iteration_count.unwrap_or(50); | ||
for _ in 0..iteration_count { | ||
let proc_res = self.compile_test(WillExecute::No, emit_metadata); | ||
// Ensure there is no ICE during parallel complication. | ||
self.check_no_compiler_crash(&proc_res, false); | ||
} | ||
} | ||
} |
This file contains hidden or 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
This file contains hidden or 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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
This directory contains the robustness test for prallel front end, which means deadlocks | ||
and other ice bugs. In other words, we don't care whether the compiler output in these tests, | ||
but whether they can compile normally without deadlock or other ice bugs. | ||
|
||
So when a test in this directory fails, please pay attention to whether it causes any ice problems. | ||
If so(it should do), please post your comments in the issue corresponding to each test (or create a new issue | ||
with the `wg-parallel-rustc` label). Even if it is an existing issue, please add a new comment, | ||
which will help us determine the reproducibility of the bug. |
This file contains hidden or 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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
// Test for #111528, the ice issue cause waiting on a query that panicked | ||
// | ||
//@ compile-flags: -Z threads=16 | ||
|
||
#![crate_type = "rlib"] | ||
#![allow(warnings)] | ||
|
||
#[export_name = "fail"] | ||
pub fn a() {} | ||
|
||
#[export_name = "fail"] | ||
pub fn b() {} | ||
|
||
fn main() {} |
This file contains hidden or 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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
//@ compile-flags: -Z threads=2 | ||
//@ iteration-count: 20 | ||
|
||
const FOO: usize = FOO; | ||
|
||
fn main() {} |
This file contains hidden or 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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,56 @@ | ||
// Test for #119785, which causes a deadlock bug | ||
// | ||
//@ compile-flags: -Z threads=200 | ||
|
||
#![allow(incomplete_features)] | ||
#![feature( | ||
const_trait_impl, | ||
effects, | ||
)] | ||
|
||
use std::marker::Destruct; | ||
|
||
const fn cmp(a: &impl ~const PartialEq) -> bool { | ||
a == a | ||
} | ||
|
||
const fn wrap(x: impl ~const PartialEq + ~const Destruct) | ||
-> impl ~const PartialEq + ~const Destruct | ||
{ | ||
x | ||
} | ||
|
||
#[const_trait] | ||
trait Foo { | ||
fn foo(&mut self, x: <Self as Index>::Output) -> <Self as Index>::Output; | ||
} | ||
|
||
impl const Foo for () { | ||
fn huh() -> impl ~const PartialEq + ~const Destruct + Copy { | ||
123 | ||
} | ||
} | ||
|
||
const _: () = { | ||
assert!(cmp(&0xDEADBEEFu32)); | ||
assert!(cmp(&())); | ||
assert!(wrap(123) == wrap(123)); | ||
assert!(wrap(123) != wrap(456)); | ||
let x = <() as Foo>::huh(); | ||
assert!(x == x); | ||
}; | ||
|
||
#[const_trait] | ||
trait T {} | ||
struct S; | ||
impl const T for S {} | ||
|
||
const fn rpit() -> impl ~const T { S } | ||
|
||
const fn apit(_: impl ~const T + ~const Destruct) {} | ||
|
||
const fn rpit_assoc_bound() -> impl IntoIterator<Item: ~const T> { Some(S) } | ||
|
||
const fn apit_assoc_bound(_: impl IntoIterator<Item: ~const T> + ~From Destruct) {} | ||
|
||
fn main() {} |
This file contains hidden or 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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,114 @@ | ||
// Test for #120757, which causes a deadlock bug | ||
// | ||
//@ compile-flags: -Z threads=50 | ||
|
||
#![feature(generic_const_exprs)] | ||
|
||
trait TensorDimension { | ||
const DIM: usize; | ||
const ISSCALAR: bool = Self::DIM == 0; | ||
fn is_scalar(&self) -> bool { | ||
Self::ISSCALAR | ||
} | ||
} | ||
|
||
trait TensorSize: TensorDimension { | ||
fn size(&self) -> [usize; Self::DIM]; | ||
fn inbounds(&self, index: [usize; Self::DIM]) -> bool { | ||
index.iter().zip(self.size().iter()).all(|(i, s)| i < s) | ||
} | ||
} | ||
|
||
trait Broadcastable: TensorSize + Sized { | ||
type Element; | ||
fn bget(&self, index: [usize; Self::DIM]) -> Option<Self::Element>; | ||
fn lazy_updim<const NEWDIM: usize>( | ||
&self, | ||
size: [usize; NEWDIM], | ||
) -> LazyUpdim<Self, { Self::DIM }, NEWDIM> { | ||
assert!( | ||
NEWDIM >= Self::DIM, | ||
"Updimmed tensor cannot have fewer indices than the initial one." | ||
); // const generic bounds on nightly. ( ) | ||
LazyUpdim { size, reference: &self } | ||
} | ||
fn bmap<T, F: Fn(Self::Element) -> T>(&self, foo: F) -> BMap<T, Self, F, { Self::DIM }> { | ||
BMap { reference: self, closure: foo } | ||
} | ||
} | ||
|
||
struct LazyUpdim<'a, T: Broadcastable, const OLDDIM: usize, const DIM: usize> { | ||
size: [usize; DIM], | ||
reference: &'a T, | ||
} | ||
|
||
impl<'a, T: Broadcastable, const DIM: usize> TensorDimension for LazyUpdim<'a, T, { T::DIM }, DIM> { | ||
const DIM: usize = DIM; | ||
} | ||
impl<'a, T: Broadcastable, const DIM: usize> TensorSize for LazyUpdim<'a, T, { T::DIM }, DIM> { | ||
fn size(&self) -> [usize; DIM] { | ||
self.size | ||
} | ||
} | ||
impl<'a, T: Broadcastable, const DIM: usize> Broadcastable for LazyUpdim<'a, T, { T::DIM }, DIM> { | ||
type Element = T::Element; | ||
fn bget(&self, index: [usize; DIM]) -> Option<Self::Element> { | ||
assert!(DIM >= T::DIM); | ||
if !self.inbounds(index) { | ||
return None; | ||
} | ||
let size = self.size(); | ||
//array_init::array_init(|i| if size[i] > 1 {index[i]} else {0}); | ||
let newindex: [usize; T::DIM] = Default::default(); | ||
self.reference.bget(newindex) | ||
} | ||
} | ||
|
||
struct BMap<'a, R, T: Broadcastable, F: Fn(T::Element) -> R, const DIM: usize> { | ||
reference: &'a T, | ||
closure: F, | ||
} | ||
|
||
impl<'a, R, T: Broadcastable, F: Fn(T::Element) -> R, const DIM: usize> TensorDimension | ||
for BMap<'a, R, T, F, DIM> | ||
{ | ||
const DIM: usize = DIM; | ||
} | ||
impl<'a, R, T: Broadcastable, F: Fn(T::Element) -> R, const DIM: usize> TensorSize | ||
for BMap<'a, R, T, F, DIM> | ||
{ | ||
fn size(&self) -> [usize; DIM] { | ||
self.reference.size() | ||
} | ||
} | ||
impl<'a, R, T: Broadcastable, F: Fn(T::Element) -> R, const DIM: usize> Broadcastable | ||
for BMap<'a, R, T, F, DIM> | ||
{ | ||
type Element = R; | ||
fn bget(&self, index: [usize; DIM]) -> Option<Self::Element> { | ||
self.reference.bget(index).map(ns_window) | ||
} | ||
} | ||
|
||
impl<T> TensorDimension for Vec<T> { | ||
const DIM: usize = 1; | ||
} | ||
impl<T> TensorSize for Vec<T> { | ||
fn size(&self) -> [usize; 1] { | ||
[self.len()] | ||
} | ||
} | ||
impl<T: Clone> Broadcastable for Vec<T> { | ||
type Element = T; | ||
fn bget(&self, index: [usize; 1]) -> Option<T> { | ||
self.get(index[0]).cloned() | ||
} | ||
} | ||
|
||
fn main() { | ||
let v = vec![1, 2, 3]; | ||
let bv = v.lazy_updim([3, 4]); | ||
let bbv = bv.bmap(|x| x * x); | ||
|
||
println!("The size of v is {:?}", bbv.bget([0, 2]).expect("Out of bounds.")); | ||
} |
This file contains hidden or 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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,24 @@ | ||
// Test for #120759, which causes a deadlock bug | ||
// | ||
//@ compile-flags: -Z threads=50 | ||
|
||
#![crate_type= "lib"] | ||
#![feature(transmutability)] | ||
|
||
mod assert { | ||
use std::mem::{Assume, BikeshedIntrinsicFrom}; | ||
pub struct Context; | ||
|
||
pub fn is_maybe_transmutable<Src, Dst>(&self, cpu: &mut CPU) | ||
where | ||
Dst: BikeshedIntrinsicFrom<Src, Context>, | ||
{ | ||
} | ||
} | ||
|
||
fn should_pad_explicitly_packed_field() { | ||
#[repr(C)] | ||
struct ExplicitlyPadded(ExplicitlyPadded); | ||
|
||
assert::is_maybe_transmutable::<ExplicitlyPadded, ()>(); | ||
} |
Oops, something went wrong.
Oops, something went wrong.
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.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think we should add a timeout here to prevent CI from getting stuck in a deadlock.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Or does the current test set already have it? @jieyouxu
Uh oh!
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The current compiletest executor is basically libtest's. That is, tests are ran under test threads. There's a test running for too long warning message, but no hard kill-after-timeout, which IIUC is hard to implement with this setup because it'd require some kind of collaborative scheme.
For existing tests we've massaged them to not take that long, or disabled them if e.g. the compile time truly that long pointing to an issue tracking it.