array memset testing
まだ誰も着手していません。
- 主要言語
- Rust
- スター
- 3.4k
- フォーク
- 125
- PR マージ指標
- 30日以内にマージされた PR はありません
説明
UPDATED: I tried a few mutations in PR which do not trigger any CI failures on my personal fork: https://github.com/brody2consult/rust-gpu/pull/2
diff --git a/crates/rustc_codegen_spirv/src/builder/builder_methods.rs b/crates/rustc_codegen_spirv/src/builder/builder_methods.rs
index d86db1cbd0..c2143f4436 100644
--- a/crates/rustc_codegen_spirv/src/builder/builder_methods.rs
+++ b/crates/rustc_codegen_spirv/src/builder/builder_methods.rs
@@ -290,22 +290,15 @@ macro_rules! simple_uni_op {
}
fn memset_fill_u16(b: u8) -> u16 {
- b as u16 | ((b as u16) << 8)
+ 0xbad_u16 | ((b as u16) << 10)
}
fn memset_fill_u32(b: u8) -> u32 {
- b as u32 | ((b as u32) << 8) | ((b as u32) << 16) | ((b as u32) << 24)
+ 0xbad_u32 | ((b as u32) << 20)
}
fn memset_fill_u64(b: u8) -> u64 {
- b as u64
- | ((b as u64) << 8)
- | ((b as u64) << 16)
- | ((b as u64) << 24)
- | ((b as u64) << 32)
- | ((b as u64) << 40)
- | ((b as u64) << 48)
- | ((b as u64) << 56)
+ 0xbad_u64 | ((b as u64) << 30)
}
fn memset_dynamic_scalar(
@@ -384,9 +377,6 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
32 => self
.constant_u32(self.span(), memset_fill_u32(fill_byte))
.def(self),
- 64 => self
- .constant_u64(self.span(), memset_fill_u64(fill_byte))
- .def(self),
_ => self.fatal(format!(
"memset on integer width {width} not implemented yet"
)),
@@ -2911,7 +2901,7 @@ impl<'a, 'tcx> BuilderMethods<'a, 'tcx> for Builder<'a, 'tcx> {
};
let elem_ty_spv = self.lookup_type(elem_ty);
let pat = match self.builder.lookup_const_scalar(fill_byte) {
- Some(fill_byte) => self.memset_const_pattern(&elem_ty_spv, fill_byte as u8),
+ Some(_) => self.memset_const_pattern(&elem_ty_spv, 123),
None => self.memset_dynamic_pattern(&elem_ty_spv, fill_byte.def(self)),
}
.with_type(elem_ty);
and some more that do not trigger any compiletest failures or difftest failures in my personal workarea:
diff --git a/crates/rustc_codegen_spirv/src/builder/builder_methods.rs b/crates/rustc_codegen_spirv/src/builder/builder_methods.rs
index d86db1cbd0..b6a867933f 100644
--- a/crates/rustc_codegen_spirv/src/builder/builder_methods.rs
+++ b/crates/rustc_codegen_spirv/src/builder/builder_methods.rs
@@ -290,21 +290,16 @@ macro_rules! simple_uni_op {
}
fn memset_fill_u16(b: u8) -> u16 {
- b as u16 | ((b as u16) << 8)
+ b as u16
}
fn memset_fill_u32(b: u8) -> u32 {
- b as u32 | ((b as u32) << 8) | ((b as u32) << 16) | ((b as u32) << 24)
+ b as u32
}
fn memset_fill_u64(b: u8) -> u64 {
b as u64
| ((b as u64) << 8)
- | ((b as u64) << 16)
- | ((b as u64) << 24)
- | ((b as u64) << 32)
- | ((b as u64) << 40)
- | ((b as u64) << 48)
| ((b as u64) << 56)
}
I discovered this while investigating possible testing for a more general solution to #594.
I suspect the test cases from PR #586 may be able to help avoid this issue if we can adapt these to test memset array fill for u64, i64, u32, etc & check the disassembly. This could give me some more confidence in case we would ever want to refactor some of this memset-related code (someday).
コントリビューションガイド
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
調査の方向性
crates/rustc_codegen_spirv/src/builder/builder_methods.rs から始め、memset ヘルパーと配列フィルのパスを確認します。PR #586 のテストケースを適用し、u64、i64、u32 の memset による配列フィルをカバーしてから、生成された逆アセンブリを確認します。Issue に記載されたミューテーションをテストで検出でき、compiletest や difftest の抜けがなければ完了です。
索引モデルが issue の本文から書いたものです。
評価
- 技術スタック
- rust
- 領域
- compilers, testing-qa
- issue の種類
- バグ
- 難易度
- 4/5
- 見積もり時間
- 3〜5日
- 活発さ
- 静か
- 明瞭さ
- おおむね明確
- 初心者へのやさしさ
- 45/100