å°ããªé
åãã¹ã©ã€ã¹ããã¹ã©ã€ã¹ã®ç¯å²å€ã®èŠçŽ ã«ã¢ã¯ã»ã¹ããããšããå°ããªããã°ã©ã ïŒå€§ããªãããžã§ã¯ãããã®ãã¹ãé¢æ°ã®ç°¡ç¥åïŒããããŸãã å®å®ãã1.41.0
ãªãªãŒã¹ã䜿çšããŠcargo run --release
å®è¡ãããšã次ã®ããã«åºåãããŸãïŒmacOS10.15ããã³Ubuntu19.10ã§ãã¹ãæžã¿ïŒã
0 0 3 18446744073709551615
[1] 21065 segmentation fault cargo run --release
çµæã®ã¹ã©ã€ã¹ã®é·ãã2**64 - 1
ããã«èŠãããããå¢çãã§ãã¯ãçç¥ãããäºæ³ã©ããã«ã»ã°ã¡ã³ããŒã·ã§ã³éåãçºçããŸãã 1.39.0
ãš1.40.0
ã§ã¯ããŸã£ããåãããã°ã©ã ãç§ãæåŸ
ãããã®ãåºåããŸãã
0 0 3 0
thread 'main' panicked at 'index out of bounds: the len is 0 but the index is 16777216', src/main.rs:13:35
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace.
次ã®ãããããå®è¡ãããšãåé¡ã¯è§£æ±ºããŸãã
main()
ã®2ã€ã®do_test(...);
åŒã³åºãã®ãããããåé€ããŸã;for _ in 0..1 {
ã«ãŒããåé€ããŸããfor y in 0..x {
ã«ãŒããfor y in 0..1 {
眮ãæããŸã;z.extend(std::iter::repeat(0).take(x));
è¡ãåé€ãããã z.extend(std::iter::repeat(0).take(1));
眮ãæããŸããfor arr_ref in arr {
ã«ãŒããlet arr_ref = &arr[0];
眮ãæããŸã;RUSTFLAGS="-C opt-level=2"
æå®ããŸã;RUSTFLAGS="-C codegen-units=1"
æå®ããŸããç§ã®æåã®æšæž¬ã¯ã -C opt-level=3
ãLLVMã§åé¡ã®ããæé©åãã¹ãæå¹ã«ãããã®çµæãã³ã³ãã€ã«ã誀ã£ãŠããŸãããšã§ãã ããã¯ãæé©ååã®MIRïŒ --emit mir
ïŒãšLLVM IRïŒ --emit llvm-ir -C no-prepopulate-passes
ïŒã-C opt-level=2
ãš-C opt-level=3
äž¡æ¹ã§åãã§ãããšããäºå®ã«ãã£ãŠè£ä»ããããŠããŸãã
圹ç«ã€ãããããªãããã€ãã®è¿œå æ å ±ïŒ
codegen-units = 1
䜿çšããŠããããïŒã1.41.0
ãªãªãŒã¹ã§Windows 10ã®åé¡ãåçŸããããšã¯ã§ããŸããïŒäœãéãã®ãããããŸããïŒãcargo-bisect-rustc
ã¯ããªã°ã¬ãã·ã§ã³ãæåã«2019-12-12
æ¯æ©ãç¹ã«ãã®ã³ãããã§çºçããããšã瀺ããŠããŸãã åé¡ã瀺ããªã1.40.0
ããã®æ¥ä»ä»¥éã«ãªãªãŒã¹ãããããšãèãããšãããã¯ç§ã«ã¯çãããããã§ããGitHubãªããžããªãæ©èœããªãå Žåã«åããŠãããã°ã©ã ãã€ã³ã©ã€ã³ã§æ·»ä»ããŠããŸãïŒCargoãªãã§ã³ã³ãã€ã«ããå Žåã¯ã rustc -C opt-level=3 main.rs
ïŒïŒ
fn do_test(x: usize) {
let arr = vec![vec![0u8; 3]];
let mut z = Vec::new();
for arr_ref in arr {
for y in 0..x {
for _ in 0..1 {
z.extend(std::iter::repeat(0).take(x));
let a = y * x;
let b = (y + 1) * x - 1;
let slice = &arr_ref[a..b];
eprintln!("{} {} {} {}", a, b, arr_ref.len(), slice.len());
eprintln!("{:?}", slice[1 << 24]);
}
}
}
}
fn main() {
do_test(1);
do_test(2);
}
cc @ rust-lang / compiler
@rustbot ping icebreakers-llvm
ãªãªãŒã¹ããŒã ã¯ãRust 1.41ã®ãã€ã³ããªãªãŒã¹ãæ€èšããŠããŸãïŒå é±ã®äŒè°ã§ç°¡åã«èª¬æããŸããïŒãè¿ããã¡ã«PRãéå§ã§ããã®ã§ããã°ããããå«ãŸããããšãæãã§ããŸãã
LLVM ICE-breakersããïŒ ãã®ãã°ã¯è¯ããã®ãšããŠèå¥ãããŠããŸã
ãLLVMICE-breakingåè£ãã ããã圹ã«ç«ã€å Žåã®ããã«ãããã«ããã€ããããŸã
ãã®çš®ã®ãã°ã«åãçµãããã®[æ瀺]ã ãã¶ãèŠãŠã¿ãŸãããïŒ
ããããšãïŒ <3
cc @comex @DutchGhost @ hanna -kruppe @hdhoang @heyrutvik @ JOE1994 @jryans @mmilenko @nagisa @nikic @ Noah-Kennedy @SiavoshZarrasvand @spastorino @vertexclique @vgxbj
å®å®ãã1.41.0ãªãªãŒã¹ã䜿çšããŠcargorun --releaseã§å®è¡ãããšã次ã®ããã«åºåãããŸãïŒmacOS10.15ããã³Ubuntu19.10ã§ãã¹ãæžã¿ïŒã
éã³å Žã§ã¯åçŸã§ããŸããã ããã°ã©ã ã¯ããªãªãŒã¹ã¢ãŒãã®1.41.0ã§æ£åžžã«åäœããŸãã
ç·šéïŒãããããªãã¯ãã§ã«ãããèšã£ãã
ãŸããããªã§ã¯ããã°ã©ã ã¯åé¡ãªãã®ã§ãããã¯UBã§ã¯ãªãã誀ã³ã³ãã€ã«ã§ããå¯èœæ§ããããŸãã
ããŒã¿ãã€ã³ããè¿œå ããã ãã§ãLinuxã§ãããææ°ã®å€éã«åçŸã§ããŸãã
[andrew<strong i="6">@krusty</strong> rust-69225]$ rustc --version
rustc 1.43.0-nightly (5e7af4669 2020-02-16)
[andrew<strong i="7">@krusty</strong> rust-69225]$ cat main.rs
fn do_test(x: usize) {
let arr = vec![vec![0u8; 3]];
let mut z = Vec::new();
for arr_ref in arr {
for y in 0..x {
for _ in 0..1 {
z.extend(std::iter::repeat(0).take(x));
let a = y * x;
let b = (y + 1) * x - 1;
let slice = &arr_ref[a..b];
eprintln!("{} {} {} {}", a, b, arr_ref.len(), slice.len());
eprintln!("{:?}", slice[1 << 24]);
}
}
}
}
fn main() {
do_test(1);
do_test(2);
}
[andrew<strong i="8">@krusty</strong> rust-69225]$ rustc -C opt-level=3 main.rs
[andrew<strong i="9">@krusty</strong> rust-69225]$ ./main
0 0 3 18446744073709551615
zsh: segmentation fault (core dumped) ./main
Rust 1.41å®å®çãšãŸã£ããåãåºåã§ãäžèšãåçŸããããšãã§ããŸããã Rust 1.40å®å®çã§ã¯ãåé¡ã¯çºçããŸããã
$ ./main
0 0 3 0
thread 'main' panicked at 'index out of bounds: the len is 0 but the index is 16777216', main.rs:13:35
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace.
ããã¯@dfyzã®ã¬ããŒããšãã¹ãŠäžèŽããŠãããšæããŸãããå°ãªããšãmacOSåºæã§ã¯ãªãããšã確èªãããŠããŸãã
cargo-bisect-rustc
ã¯ããªã°ã¬ãã·ã§ã³ãæåã«2019-12-12
æ¯æ©ãç¹ã«ãã®ã³ãããã§çºçããããšã瀺ããŠããŸãã åé¡ã瀺ããªã1.40.0
ããã®æ¥ä»ä»¥éã«ãªãªãŒã¹ãããããšãèãããšãããã¯ç§ã«ã¯çãããããã§ãã
ããã¯äºæ³ãããŸãã 1.40.0ã¯ã6é±éåïŒ1.39.0ãªãªãŒã¹ã®é ïŒã®master
ããåå²ããåœæã®beta
ãã©ã³ãã«åºã¥ããŠ2019-12-19ã«ãªãªãŒã¹ãããŸããã ãªãªãŒã¹ãã£ãã«ã®è©³çŽ°ã«ã€ããŠã¯ã httpsïŒ//doc.rust-lang.org/book/appendix-07-nightly-rust.htmlãåç
§ããŠ
æšæž¬ããªããã°ãªããªãã®ã§ããã°ã httpsïŒ//github.com/rust-lang/rust/pull/67015ãåå ã§ããå¯èœæ§ãé«ããšæããŸãã ããã«ãããcodegenã®3ã€ã®åé¡ãä¿®æ£ããããããcodegenã¯ãªãã£ã«ã«ãªã³ãŒãã«è§ŠããŸãã
Cc @ osa1 @ oli -obk @wesleywiser
pingãããããšãã çŸåšã調æ»çšã®ãã«ããäœæããŠããŸãã ããã¯ïŒ67015ã§å°å ¥ããããã°ã§ããå¯èœæ§ããããŸãã ãã1ã€ã®å¯èœæ§ã¯ãïŒ67015ãæ¢åã®ãã°ãæããã«ããããšã§ãã
Linuxã§æ¯æ©rustcã䜿çšããŠã»ã°ã¡ã³ããŒã·ã§ã³éåãåçŸã§ããŸãããããã®config.tomlã§çæããããã«ãã§ã¯åçŸã§ããŸããã§ããã
[llvm]
[build]
[install]
[rust]
optimize = true
debug = true
codegen-units = 0
debug-assertions = true
debuginfo-level = 2
[target.x86_64-unknown-linux-gnu]
llvm-config = "/usr/bin/llvm-config-9"
[dist]
æ¯æ©rustcã䜿çšããŠãConstPropã®ååŸã®MIRããã§ãã¯ããŸãããMIRã¯åãã§ãã ãããã£ãŠããããConstPropãåå ã§ããå Žåã¯ããã®ããã°ã©ã ã§ã¯ãªããã©ã€ãã©ãªã®çæãããã³ãŒãã®éããåå ã§ãã
033662dfbca088937b9cdfd3d9584015b5e375b2ã§ã®ååž°
@rustbotã¯ã©ãã«ãå€æŽããŸãïŒ-E-needs-
@ osa1 debug-assertions = true
ãåå ã§ããå¯èœæ§ããããŸãã ïŒããã©ãã€ããªãŒã³ã³ãã€ã©ã䜿çšããŠïŒ -C debug-assertions=y
ãŠããã°ã©ã ãã³ã³ãã€ã«ããããšãããšãã»ã°ã¡ã³ããŒã·ã§ã³éåã§ã¯ãªãããã°ã©ã ããããã¯ã«ãªããŸãã
解決ãããšæããŸãïŒ a983e0590a43ed8b0f60417828efd4e79b51f494ãå ã«æ»ããšãåé¡ãä¿®æ£ãããŸãã äžæ¥äžç¯äººã®ããã«èŠããŸããããè·å Žã§ãã¹ãããããšã¯ã§ããŸããã§ãã:)誰ãããã®åé¡ã®PRãäœæããããã®æåã®æ¹æ³ãæããŠãããŸããïŒ å€±æããªããã°ãªããªããã¹ãã±ãŒã¹ãè¿œå ããã®ãæåã®æ¹æ³ã ãšæããŸãããããã¯éåžžã«ãã©ãããã©ãŒã åºæãªã©ã®ããã§ãã ããã«äœãã¢ã€ãã¢ã¯ãããŸããïŒ ããããšãïŒ
ïŒããã¯ãã§ã«OPã«ãã£ãŠäºçåãããŠããŸãïŒ
debug-assertions
ãªãã«ããããŒã«ã«ãã«ãã§ãããåçŸããããšãã§ããŸããïŒ@ hellow554ã«æè¬ããŸãïŒã
ããŒã«ã¢ããå
ã®äžéšã®PRã¯ããã以éãã¹ãŠãrustfmt
ãŠãããããå
ã«æ»ããšç«¶åãçºçããŸããããã®åé¡ã¯ïŒ67174ãåå ã§ãããšèããŠããŸãã
ç·šéïŒãããåæã«èŠã€ããããã§ã@shahn :)
@lqdã¯ããããã¯ç§ãäžã§åç §ããã³ããããå«ãåé¡ã§ãã ãããç¯äººã§ãã
å¥ã®ããŒã¿ãã€ã³ããè¿œå ããã«ã¯ã codegen-units
ã3以äžã«èšå®ãããšåé¡ã解æ¶ãããŸãïŒãªãªãŒã¹ãããã¡ã€ã«ãæ³å®ãã incremental=false
ïŒã ã€ãŸãã codegen-units
ã4以äžã®ãšãã«åçŸã§ããŸãã
panic_bounds_check
ã®åŒã³åºãã¯ãLLVMãžã£ã³ãã¹ã¬ãããã¹ã®åŸã§æ¶ããŸãã LLVM 9ããã®optã§åé¡ãåçŸã§ããŸãããLLVM10ããã¯åçŸã§ããŸããã
ããã§ãã¹ããŒãž1 rustc
ïŒ ./x.py build -i --stage 1
ïŒããã§ãã¯ã¢ãŠãããŠãã«ãããïŒ67174ãªãã§libstd
ïŒ ./x.py build -i --stage 1 --keep-stage 0 src/libstd
ïŒãåãã«ãããsegfaultingããã°ã©ã ã次ã®ããã«åã³ã³ãã€ã«ããŸããã 4ã€ã®codegenãŠãããïŒ rustc +stage1 -C opt-level=3 -C codegen-units=4 main.rs
ïŒã äºæ³éããããã«ããã»ã°ã¡ã³ããŒã·ã§ã³éåã¯ãªããªããŸããã ïŒ67174ãå床é©çšãããšãã»ã°ã¡ã³ããŒã·ã§ã³éåãè¿ãããŸãã
ããã¯ã䜿çšããæšæºã©ã€ãã©ãªã®ã¿ãç°ãªã2ã€ã®ã³ã³ãã€ã©ãããããšãæå³ããŸãã ãããã®ã³ã³ãã€ã©ãGOOD
ïŒã»ã°ã¡ã³ããŒã·ã§ã³éåãªãïŒããã³BAD
ïŒã»ã°ã¡ã³ããŒã·ã§ã³éåïŒãšåŒã³ãŸãããã
ç§ã¯ãã®åŸã4 _unoptimized_ããšã«æ°ã¥ãã*.ll
ã«ãã£ãŠçæããããã¡ã€ã«GOOD
ïŒ -C no-prepopulate-passes
ïŒã»ãšãã©ã«ãã£ãŠçæããããã®ãšåãã§ãBAD
ïŒå¯äžã®éãé¢æ°åã®ã©ã³ãã IDãç°ãªãããšã確èªããŸããïŒãã_optimized_ *.ll
ãã¡ã€ã«ïŒ -C no-prepopulate-passes
ïŒã¯å€§ããç°ãªããŸãã ç§ã¯ã³ã³ãã€ã©ã®å°é家ã§ã¯ãããŸããããã³ã³ãã€ã«ãããããã°ã©ã ã¯ã©ã¡ãã®å ŽåããŸã£ããåãã§ãããããäž¡æ¹ã®ã³ã³ãã€ã©ã¯ãŸã£ããåãã§ãããå¯äžã®éãã¯ããªã³ã³ãã€ã«ãããæšæºã©ã€ãã©ãªã«ãããŸããLTOãé¢ä¿ããŠããå¯èœæ§ããããŸãã ã
確ãã«ã -Z thinlto=no
ã -C lto=no
ã -C lto=yes
ã -C lto=thin
ãããããæž¡ããšãïŒçŸæç¹ã§ã¯ããããããŸãããããã¹ãŠã®åœ¢åŒãæšæž¬ããŸãïŒ -C lto
ã¯ãããã©ã«ãã§äœ¿çšãããThinLTOãšã¯ç°ãªããŸãïŒããBAD
ãŸã§ãã»ã°ã¡ã³ããŒã·ã§ã³éåã¯åã³æ¶ããŸãã
ããã§LTOã«åé¡ãããå¯èœæ§ã¯ãããŸããïŒ
ãã¹ãã±ãŒã¹ãèªã¿ãŸããã åãæ¶ãããŠããã³ããããèªã¿ãŸããã ç§ã¯ãŸã äœãèµ·ãã£ãŠããã®ãæãé§ãããã£ãŠããŸããã äœãå£ããã®ïŒ
äœãå£ããã®ïŒ
çŸæç¹ã§ã¯ãæ£ç¢ºã«äœãå£ããã®ãã誰ãã確å®ã«èšãããšãã§ãããšã¯æããŸããããç§ã®æ«å®çãªåæã¯ããã§ãïŒç§ã¯RustããŒã ã«ãLLVMããŒã ã«ãæå±ããŠããŸãããã³ã³ãã€ã©ãããã£ãŠLLVMIRãèŠã€ããããšã¯ã§ããŸãïŒïŒ
Layout::repeat()
1è¡ãããªãŒããŒãããŒãã§ãã¯ãåé€ãããããæçµçã«ãã®ã¡ã¢ãªã®å®å
šæ§ãäœäžããŸããã æ°åŠçã«ã¯ãããã§ãã§ãã¯ãããŠããªãå ç®ã䜿çšããããšã¯å®å
šã«å®å
šã§ããã¯ãã§ã-ãã®é¢æ°ïŒããã³Layout::pad_to_align()
ïŒã®ã³ã¡ã³ãã¯çç±ã説æããŠããŸããVec
ã䜿çšããæé»çã«Vec::reserve_internal()
䜿çšãã次ã«Layout::repeat()
åŒã³åºããŸããLayout::repeat()
ã¯#[inline]
ãšããŠããŒã¯ãããŠããã GOOD
ãšBAD
ã®å¯äžã®é¢é£ããéãã¯ããã®é¢æ°ãdo_test()
ã€ã³ã©ã€ã³åãããŠããã#[inline]
å±æ§ãåé€ãããšãåãå¹æãçºçããŸãã LTOãç¡å¹ã«ãããšãã©ã€ãã©ãªé¢æ°ã®ã€ã³ã©ã€ã³åãç¡å¹ã«ãªããåé¡ãåã³ä¿®æ£ãããŸãããããåœãŠã¯ãŸãå ŽåïŒç¹°ãè¿ããŸãããäžèšã®ããããã«ã€ããŠ100ïŒ
確信ãæãŠãŸããïŒãããã¯ãäžæ£ãªLLVMãã¹ãŸãã¯ãã¹ã®çµã¿åãããã€ã³ã©ã€ã³ååŸã«IRãæé©åããªãããšãæå³ããŸãã ããã¯ç§ãçŸåšèª¿æ»ããããšããŠããããšã§ãããæ®å¿µãªããã GOOD
ãšBAD
éã®IRã®å·®ã¯é©åºŠã§ãããããïŒå°ãªããšãç§ã®ãããªéLLVM-ICEãã¬ãŒã«ãŒã«ãšã£ãŠã¯ïŒç°¡åã§ã¯ãããŸããã倧ã æªãããŒãžã§ã³ã§ã¯panic_bounds_check
ãçç¥ãããŠããããã«èŠããŸããããã®çç±ã¯ãŸã æ£ç¢ºã«ã¯ããããŸããã
ãŸãã @ tmiaskoã®ã³ã¡ã³ãã«è§ŠçºãããŠãããŸããŸãªLLVMããŒãžã§ã³ã§rustcãã³ã³ãã€ã«ããããšããŸããããLLVM 10rc1ã§åé¡ãä¿®æ£ãããããã§ãïŒè©Šããææ°ã®é害ã®ããLLVMããŒãžã§ã³ã¯9.0.1ã§ãïŒã 以äžã®ããã«ããã¯èŠããªããžã£ã³ãã¹ã¬ããã£ã³ã°ãã¹ã¯ããã責任ãããç§ã¯9.0.1ãš10rc1ã®éã®ä»»æã®é¢é£ããã³ããããèŠãŠããªãã®ã§ãã
Layout::repeat()
å€æŽãå
ã«æ»ããšãç¡é¢ä¿ãªãã°ã1åçºçãããšããçç¶ãé ãããã ãã®å Žåãå
ã«æ»ãããšã¯æ¬åœã«æ£ããããšã§ããããã
Layout :: repeatïŒïŒã®å€æŽãå ã«æ»ããšãç¡é¢ä¿ãªãã°ã1åçºçãããšããçç¶ãé ãããã ãã®å Žåãå ã«æ»ãããšã¯æ¬åœã«æ£ããããšã§ããïŒ
次ã®å Žåã¯åé¡ãªããšæããŸãã
ããããä¿æãããŠããå Žåã¯ãå€æŽãå ã«æ»ãããã€ããŒãªãªãŒã¹ãåºè·ããŠãŠãŒã¶ãŒã®ãããã¯ã解é€ãïŒãã°ããŸã ååšããŠããŠãå€æŽãªãã§åé¡ãªãåäœããŸããïŒãå®éã®ãã°ã«çŠç¹ãåœãŠããšæããŸãã
å¥ã®ã³ã³ãã€ã©ã§ã¯ãå®éã«ãããè¡ã£ãããšãèŠããŠããŸãã ãªãªãŒã¹ãã©ã³ãã®å€æŽãå ã«æ»ããŸãããããã¹ã¿ãŒã§ã¯ãªãïŒããã¯è¯ãç¿æ £ã§ã¯ãªããåŸã§åé¡ãçºçããŸããïŒãæ°ãããã€ããŒãªãªãŒã¹ãåºè·ããŸããã 次ã«ãå®éã®ãã°ãä¿®æ£ããŸããã
ãããã«ããããã°ã«åªå é äœãä»ããããŠä¿®æ£ããããã°ã®ããªã¬ãŒãã¯ããã«ç°¡åã«ããã³ãããããã°ä¿®æ£èªäœã§ã¯ãªãéããä»ã®ãšããããã°ãå ã«æ»ãããšã«åé¡ã¯ãããŸããã
質åã¯ããã®ãã°ã¯æ¬åœã«ç°¡åã«ããªã¬ãŒã§ããã®ããšããããšã§ãã ãããŸã§ã®ãšãããããã«æå°åããããšãããšïŒäžèŠäºçŽ°ãªfor _ in 0..1
ã«ãŒããå±éãããªã©ïŒåçŸã«å€±æãããããè€éãªãã¹ãã±ãŒã¹ãå«ã1ã€ã®ã¬ããŒãããããŸãã
ãã°ãçºçãããããšã¯æããŸãããç¹ã«éãæªãã£ãããã§ãã
ãšã«ããã @ shahnãLayout::new()
å€æŽãå
ã«æ»ãããã«çµéšããåé¡ã«æ¬åœã«æè¬ããŠããŸãããIMOããããå
ã«æ»ãããšã¯ããã®å Žåã¯æ£ããããšã§ã¯ãããŸããã ç§ã®æšè«ïŒ @SimonSapinãèšã£ãããšã«å ããŠïŒïŒ
Layout::repeat()
ãªãŒããŒãããŒãã§ãã¯ãåé€ãããšãLLVMã¯ãªãªãŒã¹ãã«ãã§Vec::reserve()
ãã€ã³ã©ã€ã³åã§ããŸãã å Žåã«ãã£ãŠã¯ãããã©ãŒãã³ã¹ãåäžããå¯èœæ§ããããŸãïŒãã¡ãããããã¯æž¬å®ããå¿
èŠããããŸãïŒãlibcore/alloc.rs
ïŒ Layout::pad_to_align()
ïŒã®åã®é¢æ°ã¯ããã§ãã¯ãããŠããªãå ç®ã®åããã¿ãŒã³ã䜿çšãããããå¯èœã«ãããã®ã説æãããŸã£ããåãã³ã¡ã³ããä»ããŠããŸãã Layout::repeat()
ãªãŒããŒãããŒãã§ãã¯ã埩å
ãããã Layout::pad_to_align()
ã§ã¯åŸ©å
ããªãããšã¯ãç§ã«ã¯æ¬åœã«å¥åŠã«æããŸããããããããªãªãŒã¹ã«å«ãŸããäžå€æ¡ä»¶ã®é²åŸ¡çã¢ãµãŒã·ã§ã³ãåææ¡ä»¶ãšããŠããŒã«ã«ã«ã¹ããŒããç¹å®ã®è©³çŽ°ã§ãããã¯ã«é¥ã£ãŠããã®ç¹å®ã®ãšããžã±ãŒã¹ãŸãã¯ãããã¬ãŒfuãæ¢ãåºããŸããïŒ ç§ã¯ãããç¹å®ã®æ¡ä»¶äžã§ééãããã§ãã¯ãããŠããªãèšç®ã§ããã«éããªãã
次ã«ãããã远跡ããããšãïŒç§ãä»åŠãã ããã«ãLLVMã®ã©ãããty @dyfzïŒãååž°ãã¹ãã±ãŒã¹ã¯çŽ æŽãããã®ã§ãäºåºŠãšèµ·ãããªãã§ãããã ð
LLVM IRãªãããã¥ãŒãµãŒïŒ https ïŒ
opt bconfused.ll -scalar-evolution -loop-idiom -scalar-evolution -indvars -S -O3 -o - | grep xprint
å®è¡ããŸãã æ¬åŒ§å
ãi64 -1
å Žåããã°ã®ããæé©åãè¡ãããŸããã ããã§ãªãå Žåã¯...ãªããããããŸãããã確信ããã®ã¯é£ããã§ãã
LLVMãInductionVariable Simplificationãã¹ã®äžéšãšããŠnuw
ãadd nuw i64 %x, -1
誀ã£ãŠè¿œå ããããšãåå ã®ããã§ãã x
ã¯é¢æ°ã®åŒæ°ã§ããã nuw
ã¯ç¬Šå·ãªãã®æãè¿ãããªãããšãæå³ããŸãããããã£ãŠãããã¯ãé¢æ°å
ã®ä¿èšŒãããŠããªããã€ã³ãã§ãåŒæ°ã0ã§ããããšãå¹æçã«è¡šæããŸãã
äºçåïŒç·šéïŒLLVM9ããLLVM10ãŸã§ã @ tmiaskoã¯åœ±é¿ãåããªãã£ããšè¿°ã¹ãŠããŸãïŒã¯ã次ã®ã³ããããçæããŸãã
commit 58e8c793d0e43150a6452e971a32d7407a8a7401
Author: Tim Northover <[email protected]>
Date: Mon Sep 30 07:46:52 2019 +0000
Revert "[SCEV] add no wrap flag for SCEVAddExpr."
This reverts r366419 because the analysis performed is within the context of
the loop and it's only valid to add wrapping flags to "global" expressions if
they're always correct.
llvm-svn: 373184
Rustã䜿çšããLLVM9.0ãã©ã³ãã«r366419ïŒäžèšã®ã³ããããå ã«æ»ãã³ãããïŒãå«ãŸããŠãããããææã«èŠããŸãã
Tã³ã³ãã€ã©ã®ããªã¢ãŒãžïŒP-mediumã以äžã®ç¶æ³ã®èŠçŽã«åºã¥ãïŒ
pnkfelixïŒïŒ69225ã®æ®ãã®äœæ¥é ç®ã¯æ¬¡ã®ããã§ãã1ãLLVMãä¿®æ£ãïŒ58e8c793d0e43150a6452e971a32d7407a8a7401ãéžæããããLLVM 10ã«ã¢ããã°ã¬ãŒãããïŒã2ãPRïŒ67174ãèªã¿åããŸãã
pnkfelixïŒããããã©ã¡ããåªå 床ã®é«ãã¢ã€ãã ãšããŠç§ã襲ãããšã¯ãããŸããã
pnkfelixïŒå°ãªããšãããã®LLVMã®ãã°ã¯ãä»ã®LLVMcodegenã®ãã°ãããè¯ããæªããèŠããŸããã @simulacrumãä»èšã£ãããšã ãšæããŸãã
æŽæ°ïŒPRïŒ67759ã§LLVM10ãžã®ã¢ããã°ã¬ãŒããè©Šè¡ãããŠããŸã
æŽæ°2ïŒäœããã®çç±ã§å ã®ã³ãããããã§ãªãŒããã¯ãããšæãããããã圌ãã®åŸ©åž°ã³ããããç²ç®çã«ãã§ãªãŒããã¯ããããšã¯è³¢æã§ã¯ãªãå¯èœæ§ããããŸãããããã£ãŠã埩垰ã¯æå³ããªãããŠã³ã¹ããªãŒã å¹æãããããå¯èœæ§ããããŸãã å°ãªããšããçµæãç解ããã«ãããè©Šã¿ãã¹ãã§ã¯ãããŸããïŒãããŠãLLVM 10ã«ã¢ããã°ã¬ãŒãããåªåãèãããšã倧éšåãç¡é§ãªåªåã«ãªãã®ã§ãããããå ã«æ»ãããšããã§ãªãŒããã¯ããããšãã¹ãã§ã¯ãããŸãã...ïŒ
å ã®ã³ãããã¯å³éžãããŸãããïŒ å°ãªããšã@comexã®ã³ã¡ã³ãããã¯ããããŸããïŒãRustã䜿çšããLLVM 9.0ãã©ã³ãã«å«ãŸããŠããããšã¯ãLLVM 9.0ã®äžéšã«ãããªãããšãæå³ããŸãïŒã
åé¡ã®ã³ãããã¯éåžžã«ããŒã«ã«ã§å°ããªå€æŽã§ãããé¢æ°åŒã³åºãã«åäžã®ãã©ã¡ãŒã¿ãŒãè¿œå ããæåéãit is safe [in this case] to add SCEV::FlagNSW
ïŒã³ãŒãããå€æãããšãæ°ãããã©ã¡ãŒã¿ãŒã¯SCEV::FlagNUW
ãªãããšããããŸãïŒãã§ããããããããŸãã«æé©åã®èª€ãã®åå ã§ããå¯èœæ§ãé«ããšæããŸãã ãã®ãã©ã¡ãŒã¿ãåé€ããïŒã€ãŸãã (void)getAddRecExpr(getAddExpr(StartVal, Accum, Flags), Accum, L, Flags);
ã(void)getAddRecExpr(getAddExpr(StartVal, Accum), Accum, L, Flags);
ïŒããšã§åé¡ã解決ããããšã確èªã§ããŸãã
ããã«ããã®åé¡ã®ããã³ãããã¯ãå³éžããããã®ã§ã¯ãããŸããã ããã¯ã¡ããã©äžéã -å ã«æ»ãããã«èŠããŸããã9.0.0ãäœæããåŸããã®9.0.0ããŸã äžæµèµ·ãã£ãŠããåé¡ã®ãã©ã¡ãŒã¿ãã äœããã®çç±ã§ã埩垰ã¯9.0.1ã«ããã¯ããŒããã¯å ã«æ»ãããŸãã
ããã«nsw
ãŸãã¯nuw
ãè¿œå ããããšãå®éã«ã¯å®å
šã§ã¯ãªãçç±ã説æããã³ã¡ã³ãããããŸãã ããã«ã€ããŠLLVMéçºè
ã«çžè«ããã®ã¯ããããè¯ãèãã§ããããªããŒãããã§ãªãŒãããã³ã°ããããšã§ãã®åé¡ã¯ä¿®æ£ãããéåžžã«å°ããèªå·±å®çµåã§ãããããæå³ããªã圱é¿ã¯ãŸã£ãããªããšæããŸãã
PSãããæ ¹æ¬åå ãšããŠ@comexã«å€å€§ãªç§°è³ã
FWIWhttps ïŒ//github.com/llvm/llvm-project/commit/58e8c793d0e43150a6452e971a32d7407a8a7401ãå®å šã«éžæã§ããããšã確èªã§ãhttpsïŒ //lists.llvm.org/pipermail/llvm-dev/2019-September/135195.htmlãåç §ããŠ
ïŒ67174ãå ã«æ»ããåŸã§ããåé¡ãåçŸããæ¹æ³ãèŠã€ãããšæããŸãã ããã¯å°ãé·ãã§ãããïŒ67174ãå ã«æ»ããææ°ã®ãã€ããªãŒã䜿çšããŠãWindowsãLinuxãããã³macOSã§ç¢ºå®ã«ã»ã°ã¡ã³ããŒã·ã§ã³éåãèµ·ããå®å šãªããã°ã©ã ã§ãã
fn do_test(x: usize) {
let mut arr = vec![vec![0u8; 3]];
let mut z = vec![0];
for arr_ref in arr.iter_mut() {
for y in 0..x {
for _ in 0..1 {
z.reserve_exact(x);
let iterator = std::iter::repeat(0).take(x);
let mut cnt = 0;
iterator.for_each(|_| {
z[0] = 0;
cnt += 1;
});
let a = y * x;
let b = (y + 1) * x - 1;
let slice = &mut arr_ref[a..b];
slice[1 << 24] += 1;
}
}
}
}
fn main() {
do_test(1);
do_test(2);
}
ãŠã£ã³ããŠãºïŒ
PS> rustup run nightly rustc --version
rustc 1.43.0-nightly (6d0e58bff 2020-02-23)
PS> rustup run nightly cargo run --release
Finished release [optimized] target(s) in 0.01s
Running `target\release\rust-segfault.exe`
error: process didn't exit successfully: `target\release\rust-segfault.exe` (exit code: 0xc0000005, STATUS_ACCESS_VIOLATION)
LinuxïŒ
$ rustup run nightly rustc --version
rustc 1.43.0-nightly (6d0e58bff 2020-02-23)
$ rustup run nightly cargo run --release
Finished release [optimized] target(s) in 1.13s
Running `target/release/rust-segfault`
Segmentation fault (core dumped)
ããã¯OSïŒ
λ rustup run nightly rustc --version
rustc 1.43.0-nightly (6d0e58bff 2020-02-23)
λ rustup run nightly cargo run --release
Finished release [optimized] target(s) in 0.01s
Running `target/release/rust-segfault`
[1] 24331 segmentation fault rustup run nightly cargo run --release
ãã®ããã°ã©ã ã¯codegenãŠãããã®æ°ã«äŸåããªããããPlaygroundã§ãã»ã°ã¡ã³ããŒã·ã§ã³éåãçºçããŸãïŒå®å®çãããŒã¿çãå€éïŒã ãŸããLLVM 9ã«å¯ŸããŠãªã³ã¯ããããã¹ã¿ãŒïŒïŒ67174ãå
ã«æ»ãããã®ïŒããrustc
ãã³ã³ãã€ã«ããããšã«ãã£ãŠãããåçŸããŸããã
æ ¹æ¬çãªLLVMã®ãã°ã¯ãŸã åãã§ãããããLLVM 10ã«ã¢ããã°ã¬ãŒãããããLLVMä¿®æ£ãéžæãããšãã»ã°ã¡ã³ããŒã·ã§ã³éåããªããªããŸãã
äœãããŸããã£ãŠããã®ãç解ã§ãããããã®ã«ãšæããŸãã 誀ã£ãŠãã£ãã·ã¥ãããSCEVå€ã«èµ·å ããäœåãªnuw
ãåå ã§ãå¢çãã§ãã¯ãçç¥ãããŠããããã«èŠããŸãïŒ @nikicããªã³ã¯ãããŠããã¹ã¬ããã®Cããã°ã©ã ã®å Žåãšåæ§ïŒã ããããæªãæé©åãçºçãããŸã§ã«ãLLVMåºæ¬ãããã¯ã®ã¬ã€ã€ãŒãéããŠç§ã®åçŽãªããã°ã©ã ãã»ãšãã©èªèã§ããŸããã ããã«æªãããšã«ããœãŒã¹ã³ãŒãã«æäœããªãããã«èŠããå€æŽïŒããšãã°ã cnt
å€æ°ã®åé€ïŒããããšãLLVM IRã®å€èŠ³ã倧ããç°ãªããåé¡ã解æ¶ãããŸãã
ç§ã®å°è±¡ã§ã¯ã1.41.1ã¯ïŒ69359ïŒç§ã®åŽã§ã¯ã¿ã€ãã³ã°ãæªãïŒã§å®æããã°ãããªã®ã§ãçŸæç¹ã§ã§ããããšã¯ããŸããããŸããã LLVMã®åé¡ã®ãã詳现ãªèª¬æã§Layout::repeat()
ã®ã³ã¡ã³ããæŽæ°ããããšã¯å°ãªããšãè¯ãèãã§ããïŒ ãããããªããç§ã¯PRãéãããšãã§ããŸãã
ç§ã®å°è±¡ã§ã¯ã1.41.1ã¯ïŒ69359ïŒç§ã®åŽã§ã¯ã¿ã€ãã³ã°ãæªãïŒã§å®æããã°ãããªã®ã§ãçŸæç¹ã§ã§ããããšã¯ããŸããããŸããã
1.41.1ã«å«ãããããã§å®éã«åé¡ãä¿®æ£ãããªãå Žåã¯ãæ°ããä¿®æ£ãããã¯ããŒãããŠãªãªãŒã¹ãåæ§ç¯ãããã©ãããåæ€èšããå¿
èŠããããŸãã ãªãªãŒã¹ããŒã ã®äŒè°ã§ã¯ãLLVMã®ä¿®æ£ãããã¯ããŒããããã®æ°ããPoCããã®ãããã¯ã«é¢ããå¥ã®è°è«ãæ£åœåã§ãããšæããŸãã
cc @ Mark-Simulacrum @ rust-lang / release
@dfyzã¯ãLLVMä¿®æ£ãããã¯ããŒãããã1.41.1ã®å¥ã®ãã«ããååŸããããšããŸãããå®éã«åºè·ããããšã«ã€ããŠã®ã³ã³ã»ã³ãµã¹ãåŸ ã¡ãŸãã
FWIWãç§ã«ãšã£ãŠãæ°ãããªãããã¥ãŒãµãŒã¯å®å®ãã1.38.0以åã§ã¯æåŸ
ã©ããã«åäœããŸããïŒ index out of bounds
ïŒã1.39.0以éã§ã¯ã»ã°ã¡ã³ããŒã·ã§ã³éåãçºçããŸãã 1.38ãš1.39ã®éã§LLVMã«å€§ããªéãã¯ãããŸããïŒhttps://github.com/rust-lang/llvm-project/compare/71fe7ec06b85f612fc0e4eb4134c7a7d0f23fac5...8adf9bdccfefb8d03f0e8db3b012fb41da1580a4ïŒéäžã§ãã
æ°ãããªãããã¥ãŒãµãŒã¯ãå®å®ãã1.38.0ã§æåŸ ã©ããã«åäœããŸãïŒã€ã³ããã¯ã¹ãç¯å²å€ã§ãïŒã
ç§ã¯ïŒå¶ç¶ã«ïŒ1.38.0ã«-C codegen-units=1
ãèšå®ãããšãã»ã°ã¡ã³ããŒã·ã§ã³éåãåçŸãããããšãçºèŠããŸããã 1.37.0ã¯ç§ã«ã¯å®å
šã«æããŸãïŒç§ãè©Šãããªãã·ã§ã³ã®çµã¿åããã§ã»ã°ã¡ã³ããŒã·ã§ã³éåãçºçããããšã¯ãããŸããïŒã
ãããç¡èŠããŠã1.37.0ã¯LLVM8ã䜿çšããŸãã
äžæè°ãªããšã«ã1.37.0ãš1.38.0ã®éã®LLVM IRã®å·®ïŒ -C codegen-units=1
ïŒã¯1è¡ã ãã§ãã
- %71 = icmp eq {}* %70, null
+ %71 = icmp ule {}* %70, null
ïŒããã§ã %70
ã¯<core::slice::IterMut<T> as core::iter::traits::iterator::Iterator>::next()
çµæããå°åºãããŸãïŒ
ããã ãã§ãLLVMãã ãŸããŠæãããnuw
ãadd nuw i64 %x, -1
ã«è¿œå ãããã®ã«ååã§ãã
1.37.0ã¯ç§ã«ã¯å®å šã«æããŸãïŒç§ãè©Šãããªãã·ã§ã³ã®çµã¿åããã§ã»ã°ã¡ã³ããŒã·ã§ã³éåãçºçããããšã¯ãããŸããïŒã
ããã¯LLVM8ã䜿çšããŠãããããéé£ãããSCEVã®å€æŽã¯ãŸã£ããååšããªãã¯ãã§ãã
LLVM8ã䜿çšããŠããŸã
æ··ä¹±ããŠãã¿ãŸããïŒLLVMããŒãžã§ã³ã確èªããããšããããªãã£ã1è¡ã®å·®åã«æžããããšãã§ããŠãšãŠãããããã£ãã§ãïŒã
LLVMä¿®æ£ããã§ãªãŒããã¯ãããæ°ãã1.41.1ã¢ãŒãã£ãã¡ã¯ããæºåããŸããã 次ã®æ¹æ³ã§ããŒã«ã«ã§ãã¹ãã§ããŸãã
RUSTUP_DIST_SERVER=https://dev-static.rust-lang.org rustup update stable
https://github.com/rust-lang/rust/issues/69225#issuecomment-586941455ã§pingãå®è¡ã
[triagebot]ãã®åé¡ã¯ãpingãããã³ã³ãã€ã©ããŒã ã®é¢äžãªãã«æ£åžžã«è§£æ±ºãããŸããã
ãããã
1.41.1ããªãªãŒã¹ãããŸãããã€ãã«ããã®åé¡ã解決ããæãæ¥ããšæããŸãã
æãåèã«ãªãã³ã¡ã³ã
LLVM IRãªãããã¥ãŒãµãŒïŒ https ïŒ
opt bconfused.ll -scalar-evolution -loop-idiom -scalar-evolution -indvars -S -O3 -o - | grep xprint
å®è¡ããŸãã æ¬åŒ§å ãi64 -1
å Žåããã°ã®ããæé©åãè¡ãããŸããã ããã§ãªãå Žåã¯...ãªããããããŸãããã確信ããã®ã¯é£ããã§ããLLVMãInductionVariable Simplificationãã¹ã®äžéšãšããŠ
nuw
ãadd nuw i64 %x, -1
誀ã£ãŠè¿œå ããããšãåå ã®ããã§ããx
ã¯é¢æ°ã®åŒæ°ã§ãããnuw
ã¯ç¬Šå·ãªãã®æãè¿ãããªãããšãæå³ããŸãããããã£ãŠãããã¯ãé¢æ°å ã®ä¿èšŒãããŠããªããã€ã³ãã§ãåŒæ°ã0ã§ããããšãå¹æçã«è¡šæããŸããäºçåïŒç·šéïŒLLVM9ããLLVM10ãŸã§ã @ tmiaskoã¯åœ±é¿ãåããªãã£ããšè¿°ã¹ãŠããŸãïŒã¯ã次ã®ã³ããããçæããŸãã
Rustã䜿çšããLLVM9.0ãã©ã³ãã«r366419ïŒäžèšã®ã³ããããå ã«æ»ãã³ãããïŒãå«ãŸããŠãããããææã«èŠããŸãã