Rust: ์•ˆ์ „ํ•œ Rust์˜ ๋ฉ”๋ชจ๋ฆฌ ์•ˆ์ „ ๋ฌธ์ œ

์— ๋งŒ๋“  2020๋…„ 02์›” 17์ผ  ยท  38์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: rust-lang/rust

์ž‘์€ ๋ฐฐ์—ด์„ ์Šฌ๋ผ์ด์Šคํ•˜๊ณ  ์Šฌ๋ผ์ด์Šค์˜ ๊ฒฝ๊ณ„๋ฅผ ๋ฒ—์–ด๋‚œ ์š”์†Œ์— ์•ก์„ธ์Šคํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜๋Š” ์ž‘์€ ํ”„๋กœ๊ทธ๋žจ (๋” ํฐ ํ”„๋กœ์ ํŠธ์˜ ํ…Œ์ŠคํŠธ ํ•จ์ˆ˜ ๋‹จ์ˆœํ™”)์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์•ˆ์ •์ ์ธ 1.41.0 ๋ฆด๋ฆฌ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ cargo run --release ์‹คํ–‰ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ€ ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค (macOS 10.15 ๋ฐ Ubuntu 19.10์—์„œ ํ…Œ์ŠคํŠธ ๋จ).

0 0 3 18446744073709551615
[1]    21065 segmentation fault  cargo run --release

๊ฒฐ๊ณผ ์กฐ๊ฐ์˜ ๊ธธ์ด๊ฐ€ 2**64 - 1 ์ธ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋ฏ€๋กœ ๊ฒฝ๊ณ„ ๊ฒ€์‚ฌ๊ฐ€ ์ƒ๋žต๋˜์–ด ์˜ˆ์ƒ๋Œ€๋กœ segfault๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. 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() ์—์„œ ๋‘ ๊ฐœ์˜ 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 ๋ชจ๋‘์— ๋Œ€ํ•ด ๋™์ผํ•˜๋‹ค๋Š” ์‚ฌ์‹ค์— ์˜ํ•ด ์ž…์ฆ๋ฉ๋‹ˆ๋‹ค.

๋„์›€์ด ๋  ์ˆ˜์žˆ๋Š” ๋ช‡ ๊ฐ€์ง€ ์ถ”๊ฐ€ ์ •๋ณด :

  • Rust ํ”Œ๋ ˆ์ด ๊ทธ๋ผ์šด๋“œ์—์„œ ๋ฌธ์ œ๋ฅผ ์žฌํ˜„ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค (์•„๋งˆ๋„ 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);
}
A-LLVM C-bug I-unsound ๐Ÿ’ฅ ICEBreaker-LLVM P-medium T-compiler regression-from-stable-to-stable

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

LLVM IR ์žฌ์ƒ๊ธฐ : https://gist.github.com/comex/881074b1bcc545e299e65527c719eef4

opt bconfused.ll -scalar-evolution -loop-idiom -scalar-evolution -indvars -S -O3 -o - | grep xprint ํ•ฉ๋‹ˆ๋‹ค. ๊ด„ํ˜ธ ์•ˆ์ด i64 -1 ์ด๋ฉด ๋ฒ„๊ทธ๊ฐ€์žˆ๋Š” ์ตœ์ ํ™”๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด ... ์—†์„ ์ˆ˜๋„ ์žˆ์ง€๋งŒ ํ™•์‹ ํ•˜๊ธฐ๋Š” ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

LLVM์—์„œ Induction Variable Simplification ํŒจ์Šค์˜ ์ผ๋ถ€๋กœ nuw ๋ฅผ add nuw i64 %x, -1 ์ž˜๋ชป ์ถ”๊ฐ€ ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. x ๋Š” ํ•จ์ˆ˜์— ๋Œ€ํ•œ ์ธ์ˆ˜์ด๊ณ  nuw ๋Š” ์„œ๋ช…๋˜์ง€ ์•Š์€ ๋žฉ์ด ์—†์Œ์„ ์˜๋ฏธํ•˜๋ฏ€๋กœ ์ธ์ˆ˜๊ฐ€ ๋ณด์žฅ๋˜์ง€ ์•Š๋Š” ํ•จ์ˆ˜์˜ ์ง€์ ์—์„œ ์ธ์ˆ˜๊ฐ€ 0์ด๋ผ๊ณ  ํšจ๊ณผ์ ์œผ๋กœ ์ฃผ์žฅํ•ฉ๋‹ˆ๋‹ค.

Bisecting (ํŽธ์ง‘ : LLVM 9์—์„œ LLVM 10์œผ๋กœ, @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

r366419 (์œ„์˜ ์ปค๋ฐ‹์ด ๋˜ ๋Œ๋ฆฌ๋Š” ์ปค๋ฐ‹)๊ฐ€ Rust๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” LLVM 9.0 ๋ธŒ๋žœ์น˜์— ํฌํ•จ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์œ ๋ง ํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

๋ชจ๋“  38 ๋Œ“๊ธ€

cc @ rust-lang / ์ปดํŒŒ์ผ๋Ÿฌ
@rustbot ํ•‘ icebreakers-llvm

๋ฆด๋ฆฌ์Šค ํŒ€์€ Rust 1.41 (์ง€๋‚œ ์ฃผ ํšŒ์˜์—์„œ ๊ฐ„๋žตํ•˜๊ฒŒ ๋…ผ์˜)์— ๋Œ€ํ•œ ํฌ์ธํŠธ ๋ฆด๋ฆฌ์Šค๋ฅผ ๊ณ ๋ คํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ๊ณง PR์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค๋ฉด์ด ๋‚ด์šฉ์ด ํฌํ•จ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š” LLVM ICE-breakers! ์ด ๋ฒ„๊ทธ๋Š” ์ข‹์€ ๊ฒƒ์œผ๋กœ ํ™•์ธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค
"LLVM ICE-breaking ํ›„๋ณด". ์œ ์šฉํ•œ ๊ฒฝ์šฐ ์—ฌ๊ธฐ์— ๋ช‡ ๊ฐ€์ง€
์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ๋ฒ„๊ทธ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ์œ„ํ•œ [์ง€์นจ]. ํ•œ ๋ฒˆ ๋ณด์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?
๊ฐ์‚ฌ! <3

cc @comex @DutchGhost @ hanna-kruppe @hdhoang @heyrutvik @ JOE1994 @jryans @mmilenko @nagisa @nikic @ Noah-Kennedy @SiavoshZarrasvand @spastorino @vertexclique @vgxbj

์•ˆ์ •์ ์ธ 1.41.0 ๋ฆด๋ฆฌ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ cargo run --release๋กœ ์‹คํ–‰ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ€ ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค (macOS 10.15 ๋ฐ Ubuntu 19.10์—์„œ ํ…Œ์ŠคํŠธ ๋จ).

๋‚˜๋Š” ์ด๊ฒƒ์„ ๋†€์ดํ„ฐ์—์„œ ์žฌํ˜„ ํ•  ์ˆ˜ ์—†๋‹ค . ์ด ํ”„๋กœ๊ทธ๋žจ์€ ๋ฆด๋ฆฌ์Šค ๋ชจ๋“œ์˜ 1.41.0์—์„œ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

ํŽธ์ง‘ : ์•„, ๋‹น์‹ ์€ ์ด๋ฏธ ๊ทธ๋ ‡๊ฒŒ ๋งํ–ˆ์Šต๋‹ˆ๋‹ค.
๋˜ํ•œ ํ”„๋กœ๊ทธ๋žจ์€ Miri์—์„œ ๊ดœ์ฐฎ์œผ๋ฏ€๋กœ 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 stable์—๋Š” ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

$ ./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.

๋‚˜๋Š” ์ด๊ฒƒ์ด ์ ์–ด๋„ macOS ํŠน์ •์ด ์•„๋‹˜์„ ํ™•์ธํ•˜๋Š” ๊ฒƒ์„ ์ œ์™ธํ•˜๊ณ ๋Š” ๋ชจ๋‘ @dfyz ์˜ ๋ณด๊ณ ์„œ์™€ ์ผ์น˜ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

  • cargo-bisect-rustc ๋Š” ํšŒ๊ท€๊ฐ€ 2019-12-12 ์•ผ๊ฐ„์—, ํŠนํžˆ์ด ์ปค๋ฐ‹์—์„œ ์ฒ˜์Œ ๋ฐœ์ƒํ–ˆ๋‹ค๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ œ๋ฅผ ๋‚˜ํƒ€๋‚ด์ง€ ์•Š๋Š” 1.40.0 ๊ฐ€์ด ๋‚ ์งœ ์ดํ›„์— ์ถœ์‹œ ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์€ ๋‚˜์—๊ฒŒ ์˜์‹ฌ์Šค๋Ÿฌ์›Œ ๋ณด์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์˜ˆ์ƒ๋ฉ๋‹ˆ๋‹ค. 1.40.0์ด๋˜์—ˆ๋‹ค 2019๋…„ 12์›” 19์ผ์— ๋ฐœํ‘œ ํ•œ ํ›„ ๋ฌด์—‡์„ ๊ธฐ์ค€์œผ๋กœ beta ์—์„œ ๋ถ„๊ธฐ ๋œ ์ง€์ , master ์œก์ฃผ ์ด์ „ํ•ฉ๋‹ˆ๋‹ค (1.39.0 ๋ฆด๋ฆฌ์Šค ์‹œ๊ฐ„ ์ •๋„). ๋ฆด๋ฆฌ์Šค ์ฑ„๋„์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ https://doc.rust-lang.org/book/appendix-07-nightly-rust.html ์„ ์ฐธ์กฐ

์ถ”์ธกํ•ด์•ผํ•œ๋‹ค๋ฉด https://github.com/rust-lang/rust/pull/67015 ๊ฐ€ ๋ฒ”์ธ์ด๋ผ๊ณ  ๋งํ•  ์ˆ˜
Cc @ osa1 @ oli-obk @wesleywiser

ํ•‘ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ์กฐ์‚ฌ๋ฅผ ์œ„ํ•ด ๋นŒ๋“œ๋ฅผ ๋งŒ๋“ค๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. # 67015์—์„œ ๋„์ž… ๋œ ๋ฒ„๊ทธ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ ๋‹ค๋ฅธ ๊ฐ€๋Šฅ์„ฑ์€ # 67015๊ฐ€ ๋ฐฉ๊ธˆ ๊ธฐ์กด ๋ฒ„๊ทธ๋ฅผ ๊ณต๊ฐœํ–ˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Linux์—์„œ nightly rustc๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ segfault๋ฅผ ์žฌํ˜„ํ–ˆ์ง€๋งŒ์ด config.toml๋กœ ์ƒ์„ฑ ๋œ ๋นŒ๋“œ๋กœ๋Š” ๋งŒ๋“ค์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

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 nightly๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ConstProp ์ „ํ›„์˜ MIR์„ ํ™•์ธํ–ˆ์œผ๋ฉฐ MIR์ด ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๊ฒƒ์ด ConstProp์— ์˜ํ•ด ๋ฐœ์ƒํ–ˆ๋‹ค๋ฉด์ด ํ”„๋กœ๊ทธ๋žจ์ด ์•„๋‹Œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ƒ์„ฑ ๋œ ์ฝ”๋“œ์˜ ์ฐจ์ด ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

033662dfbca088937b9cdfd3d9584015b5e375b2์˜ ํšŒ๊ท€

@rustbot ๋ผ๋ฒจ ์ˆ˜์ • : -E-needs-bisection


@ osa1 debug-assertions = true ์€ ์•„๋งˆ๋„ ๋น„๋‚œ๋ฐ›์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. -C debug-assertions=y ๋กœ ํ”„๋กœ๊ทธ๋žจ์„ ์ปดํŒŒ์ผํ•˜๋ ค๊ณ ํ•˜๋ฉด (๋ฐ”๋‹๋ผ ์•ผ๊ฐ„ ์ปดํŒŒ์ผ๋Ÿฌ๋กœ) segfault ๋Œ€์‹  ํ”„๋กœ๊ทธ๋žจ ํŒจ๋‹‰์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ํ•ด๊ฒฐํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค! a983e0590a43ed8b0f60417828efd4e79b51f494๋ฅผ ๋˜ ๋Œ๋ฆฌ๋ฉด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค. ํ•˜๋ฃจ ์ข…์ผ ์ €์—๊ฒŒ ๋ฒ”์ธ์ฒ˜๋Ÿผ ๋ณด์˜€์ง€๋งŒ ์ง์žฅ์—์„œ ํ…Œ์ŠคํŠธ ํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. :) ๋ˆ„๊ตฐ๊ฐ€๊ฐ€์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ PR์„ ๊ฐ€์žฅ ์ž˜ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์„ ๋„์™€ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์€ ์‹คํŒจํ•ด์•ผํ•˜๋Š” ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ์ด๊ฒƒ์€ ๋งค์šฐ ํ”Œ๋žซํผ์— ํŠนํ™”๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ฒฐ๊ตญ ์ข‹์€ ์ƒ๊ฐ์ด ์•„๋‹๊นŒ์š”? ์—ฌ๊ธฐ์— ์–ด๋–ค ์•„์ด๋””์–ด๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ฐ์‚ฌ!

(์ด๊ฒƒ์€ ์ด๋ฏธ OP์— ์˜ํ•ด ์–‘๋ถ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค)

debug-assertions ์„ ๋ˆ ์ƒํƒœ์—์„œ ๋กœ์ปฌ ๋นŒ๋“œ๋กœ ์ด๊ฒƒ์„ ์žฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค (@ hellow554์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค).

๋กค์—…์˜ ์ผ๋ถ€ PR์€ ๊ทธ ์ดํ›„๋กœ ๋ชจ๋“  ๊ฒƒ์„ rustfmt -edํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋˜๋Œ๋ฆด ๋•Œ ์ถฉ๋Œ์„ ์ผ์œผํ‚ค์ง€ ๋งŒ์ด ๋ฌธ์ œ๋Š” # 67174 ๋•Œ๋ฌธ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

ํŽธ์ง‘ : ์šฐ๋ฆฌ๊ฐ€ ๋™์‹œ์— @shahn์„ ์ฐพ์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค :)

@lqd ์˜ˆ, ์ด๊ฒƒ์€ ์œ„์—์„œ ์ฐธ์กฐํ•œ ์ปค๋ฐ‹์„ ํฌํ•จํ•˜๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ๋ฒ”์ธ์ž…๋‹ˆ๋‹ค.

๊ฒฝ์šฐ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ ํฌ์ธํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด, ๋ฌธ์ œ๊ฐ€ ์‚ฌ๋ผ์งˆ codegen-units ์ดํ•˜ (ํ•จ๊ป˜ ๋ฐฉ์ถœ ํ”„๋กœํŒŒ์ผ์„ ๊ฐ€์ • ๋˜๋Š” 3์œผ๋กœ ์„ค์ •๋˜์–ด incremental=false ). ์ฆ‰, codegen-units ๊ฐ€ 4 ์ด์ƒ์ผ ๋•Œ ์žฌํ˜„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

panic_bounds_check ๋Œ€ํ•œ ํ˜ธ์ถœ์€ LLVM ์ ํ”„ ์Šค๋ ˆ๋”ฉ ํ†ต๊ณผ ํ›„ ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค. LLVM 9์—์„œ opt๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ์žฌํ˜„ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ LLVM 10์—์„œ๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์ €๋Š” 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 ). ์˜ˆ์ƒ๋Œ€๋กœ ์ด๋กœ ์ธํ•ด segfault๊ฐ€ ์‚ฌ๋ผ์กŒ์Šต๋‹ˆ๋‹ค. # 67174๋ฅผ ๋‹ค์‹œ ์ ์šฉํ•˜๋ฉด segfault๊ฐ€ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์ด์ œ ๊ทธ๋“ค์ด ์‚ฌ์šฉํ•˜๋Š” ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ๋งŒ ๋‹ค๋ฅธ ๋‘ ๊ฐœ์˜ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ GOOD (segfault ์—†์Œ) ๋ฐ BAD (segfault)๋ผ๊ณ ํ•ฉ์‹œ๋‹ค.

๋‚˜๋Š” ๊ทธ ๋ฐœ๊ฒฌ์ด 4 _unoptimized_ *.ll ์— ์˜ํ•ด ์ƒ์„ฑ ๋œ ํŒŒ์ผ GOOD ( -C no-prepopulate-passes ) ๊ฝค ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค์— ์˜ํ•ด ์ƒ์„ฑ ๋œ ๊ฒƒ๊ณผ ๊ฐ™์€ BAD (์œ ์ผํ•œ ์ฐจ์ด์  ํ•จ์ˆ˜ ์ด๋ฆ„์— ๋‹ค๋ฅธ ์ž„์˜์˜ ID๊ฐ€์žˆ๋Š” ๊ฒƒ์„ ๋ณด์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ _optimized_ *.ll ํŒŒ์ผ ( -C no-prepopulate-passes ์•„๋‹˜)์€ ํฌ๊ฒŒ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ๋‚˜๋Š” ์–ด๋–ค ์‹ ์œผ๋กœ๋“  ์ปดํŒŒ์ผ๋Ÿฌ ์ „๋ฌธ๊ฐ€๋Š” ์•„๋‹ˆ์ง€๋งŒ ์ปดํŒŒ์ผ๋˜๋Š” ํ”„๋กœ๊ทธ๋žจ์ด ๋‘ ๊ฒฝ์šฐ ๋ชจ๋‘ ๋˜‘๊ฐ™๊ธฐ ๋•Œ๋ฌธ์— ๋‘ ์ปดํŒŒ์ผ๋Ÿฌ ๋ชจ๋‘ ๋˜‘๊ฐ™๊ณ  ์œ ์ผํ•œ ์ฐจ์ด์ ์€ ๋ฏธ๋ฆฌ ์ปดํŒŒ์ผ ๋œ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. I _think_ LTO๊ฐ€ ๊ด€๋ จ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. .

์‹ค์ œ๋กœ -Z thinlto=no , -C lto=no , -C lto=yes , -C lto=thin ์ค‘ ํ•˜๋‚˜๋ฅผ ํ†ต๊ณผํ•˜๋ฉด (์ด ์‹œ์ ์—์„œ๋Š” ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ ๋ชจ๋“  ์–‘์‹์„ -C lto ์˜ BAD , segfault๊ฐ€ ๋‹ค์‹œ ํ•œ ๋ฒˆ ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ LTO๊ฐ€ ์ž˜๋ชป๋˜์—ˆ์„ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ์ฝ์—ˆ์Šต๋‹ˆ๋‹ค. ๋˜ ๋Œ๋ฆฌ๋Š” ์ปค๋ฐ‹์„ ์ฝ์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์•„์ง๋„ ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€์— ๋Œ€ํ•ด ๊ฐ€์žฅ ์•ˆ๊ฐœ๊ฐ€ ๋‚€๋‹ค. ๋ฌด์—‡์ด ๊ณ ์žฅ ๋‚ฌ์Šต๋‹ˆ๊นŒ?

๋ฌด์—‡์ด ๊ณ ์žฅ ๋‚ฌ์Šต๋‹ˆ๊นŒ?

๋‚˜๋Š”์ด ์‹œ์ ์—์„œ ๋ˆ„๊ตฌ๋„ ์ •ํ™•ํžˆ ๋ฌด์—‡์ด ๊ณ ์žฅ ๋‚ฌ๋Š”์ง€ ํ™•์‹คํžˆ ๋งํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์ง€๋งŒ, ๋‚ด ์ž ์ •์  ์ธ ๋ถ„์„์€ ์ด๊ฒƒ์ž…๋‹ˆ๋‹ค. (๋‹ค์Œ์„ ์†Œ๊ธˆ์œผ๋กœ ๊ฐ€์ ธ ๊ฐ€์‹ญ์‹œ์˜ค. ์ €๋Š” Rust ํŒ€์ด๋‚˜ LLVM ํŒ€์— ์†ํ•ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์กฐ์ž‘ํ•˜๊ณ  LLVM IR์„ ์‘์‹œํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.)

  • ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ Layout::repeat() ์˜ ํ•œ ์ค„ ์—์„œ ์˜ค๋ฒ„ํ”Œ๋กœ ๊ฒ€์‚ฌ๋ฅผ ์ œ๊ฑฐํ•˜์—ฌ ๊ฒฐ๊ตญ์ด ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์•ˆ์ „ํ•˜์ง€ ์•Š๊ฒŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ˆ˜ํ•™์ ์œผ๋กœ ์—ฌ๊ธฐ์— ์ฒดํฌํ•˜์ง€ ์•Š์€ ๋ง์…ˆ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์™„๋ฒฝํ•˜๊ฒŒ ์•ˆ์ „ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.์ด ํ•จ์ˆ˜ (๋ฐ 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-breaker์—๊ฒŒ๋Š”) ์‰ฝ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํฐ. ์ž˜๋ชป๋œ ๋ฒ„์ „์ด panic_bounds_check ์ƒ๋žต ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ์—ฌ์ „ํžˆ ๊ทธ ์ด์œ ๋ฅผ ์ •ํ™•ํžˆ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ @tmiasko ์˜ ์˜๊ฒฌ์—์„œ ์˜๊ฐ์„ ๋ฐ›์•„ ๋‹ค๋ฅธ LLVM ๋ฒ„์ „์œผ๋กœ rustc๋ฅผ ์ปดํŒŒ์ผํ•˜๋ ค๊ณ ํ–ˆ๋Š”๋ฐ LLVM 10rc1์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค (๋‚ด๊ฐ€ ์‹œ๋„ํ•œ ์ตœ์‹  ๊ฒฐํ•จ LLVM ๋ฒ„์ „์€ 9.0.1์ž…๋‹ˆ๋‹ค). 9.0.1๊ณผ 10rc1 ์‚ฌ์ด์— ๊ด€๋ จ ์ปค๋ฐ‹์ด ๋ณด์ด์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— Jump Threading ํŒจ์Šค๊ฐ€ ๋น„๋‚œ๋ฐ›์„ ๊ฒƒ ๊ฐ™์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Layout::repeat() ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋˜ ๋Œ๋ฆฌ๋Š” ๊ฒƒ์ด ๊ด€๋ จ์—†๋Š” ๋ฒ„๊ทธ์˜ ํŠน์ • ๋ฐœ์ƒ

Layout :: repeat () ๋ณ€๊ฒฝ์„ ๋˜ ๋Œ๋ฆฌ๋Š” ๊ฒƒ์ด ๊ด€๋ จ๋˜์ง€ ์•Š์€ ๋ฒ„๊ทธ์˜ ํŠน์ • ๋ฐœ์ƒ ํ•œ ๊ฐ€์ง€ ์ฆ์ƒ ๋งŒ ์ˆจ๊ธฐ๋Š” ๊ฒฝ์šฐ ๋˜ ๋Œ๋ฆฌ๋Š” ๊ฒƒ์ด ์ •๋ง ์˜ฌ๋ฐ”๋ฅธ ์ผ์ž…๋‹ˆ๊นŒ?

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ ๊ดœ์ฐฎ์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

  • ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๋ฐฐ์†ก๋ฉ๋‹ˆ๋‹ค.
  • ๋ฒ„๊ทธ๋ฅผ ํ›จ์”ฌ ๋” ์‰ฝ๊ฒŒ ํŠธ๋ฆฌ๊ฑฐํ•˜์—ฌ ๋งŽ์€ ์‚ฌ์šฉ์ž์—๊ฒŒ ์˜ํ–ฅ์„์ค๋‹ˆ๋‹ค.
  • ์ œ๋Œ€๋กœ ๊ณ ์น˜๋Š” ๋ฐ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ๋ณด๋ฅ˜๋˜๋ฉด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋˜๋Œ๋ฆฌ๊ณ  ์‚ฌ์šฉ์ž ์ฐจ๋‹จ์„ ํ•ด์ œํ•˜๊ธฐ ์œ„ํ•ด ๋ถ€ ๋ฆด๋ฆฌ์Šค๋ฅผ ์ œ๊ณต ํ•œ ๋‹ค์Œ (๋ฒ„๊ทธ๊ฐ€ ์—ฌ์ „ํžˆ ์กด์žฌํ•˜๋”๋ผ๋„ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์—†์ด ์ž˜ ์ž‘๋™ ํ•จ) ์‹ค์ œ ๋ฒ„๊ทธ์— ์ง‘์ค‘ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ ๋‚˜๋Š” ์‹ค์ œ๋กœ ์ด๊ฒƒ์„ ํ•œ ๊ฒƒ์„ ๊ธฐ์–ตํ•ฉ๋‹ˆ๋‹ค. ๋ฆด๋ฆฌ์Šค ๋ธŒ๋žœ์น˜์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋˜๋Œ ๋ ธ์ง€๋งŒ ๋งˆ์Šคํ„ฐ๊ฐ€ ์•„๋‹Œ (์ข‹์€ ๋ฐฉ๋ฒ•์ด ์•„๋‹ˆ๋ฉฐ ๋‚˜์ค‘์— ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒ ํ•จ) ์ƒˆ๋กœ์šด ๋งˆ์ด๋„ˆ ๋ฆด๋ฆฌ์Šค๋ฅผ ์ถœ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์‹ค์ œ ๋ฒ„๊ทธ๋ฅผ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

์–ด์จŒ๋“  ๋ฒ„๊ทธ์˜ ์šฐ์„  ์ˆœ์œ„๊ฐ€ ์ง€์ •๋˜๊ณ  ์ˆ˜์ •๋˜๊ณ  ๋ฒ„๊ทธ๋ฅผ ํ›จ์”ฌ ์‰ฝ๊ฒŒ ํŠธ๋ฆฌ๊ฑฐํ•˜๋Š” ์ปค๋ฐ‹์ด ๋ฒ„๊ทธ ์ˆ˜์ • ์ž์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ์ง€๊ธˆ์€ ๋ฒ„๊ทธ๋ฅผ ๋˜ ๋Œ๋ฆฌ๋Š” ๋ฐ ์•„๋ฌด๋Ÿฐ ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์งˆ๋ฌธ์€,์ด ๋ฒ„๊ทธ๊ฐ€ ์ •๋ง ํŠธ๋ฆฌ๊ฑฐํ•˜๊ธฐ ์‰ฌ์šด๊ฐ€์š”? ์ง€๊ธˆ๊นŒ์ง€ ๋” ์ตœ์†Œํ™”ํ•˜๋ ค๋Š” ์‹œ๋„ (์˜ˆ : ๊ฒ‰๋ณด๊ธฐ์— ์‚ฌ์†Œํ•œ for _ in 0..1 ๋ฃจํ”„ ํ’€๊ธฐ)๊ฐ€ ์žฌํ˜„๋˜์ง€ ์•Š๋Š” ๋‹ค์†Œ ๊ด€๋ จ๋œ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๊ฐ€ ํฌํ•จ ๋œ ๋ณด๊ณ ์„œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋ฒ„๊ทธ๊ฐ€ ์œ ๋ฐœํ•˜๊ธฐ ์‰ฝ์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ ๋ถˆํ–‰ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์–ด์จŒ๋“  @shahn ์ด Layout::new() ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋˜๋Œ๋ฆฌ๊ธฐ ์œ„ํ•ด ๊ฒช์€ ์ˆ˜๊ณ ์— ๋Œ€ํ•ด ์ •๋ง ๊ฐ์‚ฌํ•˜์ง€๋งŒ IMO์—์„œ ๋˜ ๋Œ๋ฆฌ๋Š” ๊ฒƒ์€์ด ๊ฒฝ์šฐ์— ์˜ณ์€ ์ผ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋‚ด ์ถ”๋ก  ( @SimonSapin์ด ๋งํ•œ ๊ฒƒ

  • Layout::repeat() ์—์„œ ์˜ค๋ฒ„ํ”Œ๋กœ ๊ฒ€์‚ฌ๋ฅผ ์ œ๊ฑฐํ•˜๋ฉด LLVM์ด ๋ฆด๋ฆฌ์Šค ๋นŒ๋“œ์—์„œ Vec::reserve() ๋ฅผ ์ธ๋ผ์ธ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ๊ฒฝ์šฐ์—๋Š” ์ข‹์€ ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ์ œ๊ณต ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (๋ฌผ๋ก  ์ธก์ •ํ•ด์•ผํ•˜์ง€๋งŒ).
  • ๋ง ๊ทธ๋Œ€๋กœ libcore/alloc.rs ( Layout::pad_to_align() )์˜ ์ด์ „ ํ•จ์ˆ˜๋Š” ํ™•์ธ๋˜์ง€ ์•Š์€ ์ถ”๊ฐ€์˜ ๋™์ผํ•œ ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๊ณ ์ด๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒํ•˜๋Š” ๊ฒƒ์„ ์„ค๋ช…ํ•˜๋Š” ๋™์ผํ•œ ์ฃผ์„์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. Layout::repeat() ์—์„œ ์˜ค๋ฒ„ํ”Œ๋กœ ๊ฒ€์‚ฌ๋ฅผ ๋ณต์›ํ•˜์ง€๋งŒ Layout::pad_to_align() ์—์„œ๋Š” ๋ณต์›ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ •๋ง ์ด์ƒํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.
  • ๋ˆ„๊ตฐ๊ฐ€๊ฐ€์ด ๋ฌธ์ œ์— ๋Œ€ํ•ด ์ •๋ง๋กœ ์ฐจ๋‹จ ๋œ ๊ฒฝ์šฐ (ํ™•์‹คํžˆ ์•„๋‹™๋‹ˆ๋‹ค) stdlib ๋ณ€๊ฒฝ์„ ํฌํ•จํ•˜์ง€ ์•Š๋Š” ๋‹ค๋ฅธ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค (์˜ˆ : ThinLTO ๋น„ํ™œ์„ฑํ™”, ์ตœ์ ํ™” ์ˆ˜์ค€ ๋ณ€๊ฒฝ, ์ฝ”๋“œ ์ƒ์„ฑ ๋‹จ์œ„ ์ˆ˜ ๊ฐ์†Œ).

์ด ํŠน์ • ์—ฃ์ง€ ์ผ€์ด์Šค ๋˜๋Š” ๋””๋ฒ„๊ฑฐ ํ‘ธ๋ฅผ ์ถ”์ ํ•˜๊ธฐ ์œ„ํ•ด ํŠน์ • ์„ธ๋ถ€ ์‚ฌํ•ญ์œผ๋กœ ํŒจ๋‹‰ํ•˜๋„๋ก ์‚ฌ์ „ ์กฐ๊ฑด์œผ๋กœ ๋ถˆ๋ณ€์˜ ๋ฆด๋ฆฌ์Šค ํฌํ•จ ๋ฐฉ์–ด ์  ์ฃผ์žฅ์„ ๋กœ์ปฌ๋กœ ๋˜์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” ํŠน์ • ์กฐ๊ฑด์—์„œ ํ†ต๊ณผํ•˜๋Š” ํ™•์ธ๋˜์ง€ ์•Š์€ ๊ณ„์‚ฐ ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ ์ถ”์  ํ•  ๋•Œ (๋ฐฉ๊ธˆ ๋ฐฐ์šด LLVM ์–ด๋”˜๊ฐ€์— ty @dyfz) ํšŒ๊ท€ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๊ฐ€ ๋ฉ‹์ ธ์„œ ๋‹ค์‹œ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๐Ÿ™

LLVM IR ์žฌ์ƒ๊ธฐ : https://gist.github.com/comex/881074b1bcc545e299e65527c719eef4

opt bconfused.ll -scalar-evolution -loop-idiom -scalar-evolution -indvars -S -O3 -o - | grep xprint ํ•ฉ๋‹ˆ๋‹ค. ๊ด„ํ˜ธ ์•ˆ์ด i64 -1 ์ด๋ฉด ๋ฒ„๊ทธ๊ฐ€์žˆ๋Š” ์ตœ์ ํ™”๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด ... ์—†์„ ์ˆ˜๋„ ์žˆ์ง€๋งŒ ํ™•์‹ ํ•˜๊ธฐ๋Š” ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

LLVM์—์„œ Induction Variable Simplification ํŒจ์Šค์˜ ์ผ๋ถ€๋กœ nuw ๋ฅผ add nuw i64 %x, -1 ์ž˜๋ชป ์ถ”๊ฐ€ ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. x ๋Š” ํ•จ์ˆ˜์— ๋Œ€ํ•œ ์ธ์ˆ˜์ด๊ณ  nuw ๋Š” ์„œ๋ช…๋˜์ง€ ์•Š์€ ๋žฉ์ด ์—†์Œ์„ ์˜๋ฏธํ•˜๋ฏ€๋กœ ์ธ์ˆ˜๊ฐ€ ๋ณด์žฅ๋˜์ง€ ์•Š๋Š” ํ•จ์ˆ˜์˜ ์ง€์ ์—์„œ ์ธ์ˆ˜๊ฐ€ 0์ด๋ผ๊ณ  ํšจ๊ณผ์ ์œผ๋กœ ์ฃผ์žฅํ•ฉ๋‹ˆ๋‹ค.

Bisecting (ํŽธ์ง‘ : LLVM 9์—์„œ LLVM 10์œผ๋กœ, @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

r366419 (์œ„์˜ ์ปค๋ฐ‹์ด ๋˜ ๋Œ๋ฆฌ๋Š” ์ปค๋ฐ‹)๊ฐ€ Rust๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” LLVM 9.0 ๋ธŒ๋žœ์น˜์— ํฌํ•จ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์œ ๋ง ํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

T- ์ปดํŒŒ์ผ๋Ÿฌ ๋ถ„๋ฅ˜ : ๋‹ค์Œ ์ƒํ™ฉ ์š”์•ฝ ์„ ๊ธฐ๋ฐ˜์œผ๋กœํ•˜๋Š” P- ์ค‘๊ฐ„ :

pnkfelix : # 69225์˜ ๋‚˜๋จธ์ง€ ์ž‘์—… ํ•ญ๋ชฉ์€ 1. ์ˆ˜์ • LLVM (58e8c793d0e43150a6452e971a32d7407a8a7401์„ ์„ ํƒํ•˜๊ฑฐ๋‚˜ LLVM 10์œผ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œ) ํ•œ ๋‹ค์Œ 2. PR # 67174๋ฅผ ์ฝ์—ˆ์Šต๋‹ˆ๋‹ค.
pnkfelix : ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ๋“ค ์ค‘ ์–ด๋Š ๊ฒƒ๋„ ๋‚˜์—๊ฒŒ ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๋†’์€ ํ•ญ๋ชฉ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
pnkfelix : ์ ์–ด๋„์ด LLVM ๋ฒ„๊ทธ๋Š” ๋‹ค๋ฅธ LLVM ์ฝ”๋“œ ์ƒ์„ฑ ๋ฒ„๊ทธ๋ณด๋‹ค ๋” ์ข‹๊ฑฐ๋‚˜ ๋‚˜์˜๊ฒŒ ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. @simulacrum์ด ๋ฐฉ๊ธˆ ๋งํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์—…๋ฐ์ดํŠธ : PR # 67759์—์„œ LLVM 10์œผ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œ ์‹œ๋„ ์ค‘

์—…๋ฐ์ดํŠธ 2 : ์–ด๋–ค ์ด์œ ๋กœ ๋“  ์›๋ณธ์„ ์ฒด๋ฆฌ๋กœ ์„ ํƒํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋˜๋Œ๋ฆฌ๊ธฐ ์ปค๋ฐ‹์„ ๋งน๋ชฉ์ ์œผ๋กœ ์ฒด๋ฆฌ๋กœ ์„ ํƒํ•˜๋Š” ๊ฒƒ์€ ํ˜„๋ช…ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ณต๊ท€๋Š” ์˜๋„ํ•˜์ง€ ์•Š์€ ๋‹ค์šด ์ŠคํŠธ๋ฆผ ํšจ๊ณผ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ ์–ด๋„ ๊ฒฐ๊ณผ๋ฅผ ์ดํ•ดํ•˜์ง€ ์•Š๊ณ  ์‹œ๋„ํ•ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค. (LLVM 10์œผ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๋ ค๋Š” ๋…ธ๋ ฅ์„ ๊ฐ์•ˆํ•  ๋•Œ, ๋Œ€๋ถ€๋ถ„์˜ ๋…ธ๋ ฅ์ด ๋‚ญ๋น„ ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋˜๋Œ๋ฆฌ๊ธฐ๋ฅผ ์ „ํ˜€ ์„ ํƒํ•˜์ง€ ์•Š์•„์•ผํ•ฉ๋‹ˆ๋‹ค ...)

์›๋ž˜ ์ปค๋ฐ‹์€ ์ฒด๋ฆฌ๋ฅผ ๋”ฐ๋ž์Šต๋‹ˆ๊นŒ? ์ ์–ด๋„ ๋‚˜์—๊ฒŒ ๋ช…ํ™•ํ•˜์ง€ ์•Š์€ @comex ์˜ ์ฝ”๋ฉ˜ํŠธ์—์„œ ( "Lust๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” 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 ์˜ ๊ทผ๋ณธ ์›์ธ์— ๋Œ€ํ•œ ์—„์ฒญ๋‚œ ๋ช…์„ฑ. ํ™˜์ƒ์ ์ธ ์ง์—….

FWIW https://github.com/llvm/llvm-project/commit/58e8c793d0e43150a6452e971a32d7407a8a7401 ์ด ์ฒด๋ฆฌ ์„ ํƒ์— ์•ˆ์ „ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋ณด์ˆ˜์  ์ธ ๋ณ€๊ฒฝ์ž…๋‹ˆ๋‹ค. SCEV nowrap ํ”Œ๋ž˜๊ทธ์˜ ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ https://lists.llvm.org/pipermail/llvm-dev/2019-September/135195.html์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

# 67174๋ฅผ ๋˜ ๋Œ๋ฆฐ ํ›„์—๋„ ๋ฌธ์ œ๋ฅผ ์žฌํ˜„ ํ•  ์ˆ˜์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์€ Windows, Linux ๋ฐ macOS์—์„œ # 67174๋กœ ๋˜ ๋Œ๋ฆฐ ์ตœ์‹  ์•ผ๊ฐ„์„ ์‚ฌ์šฉํ•˜์—ฌ ์•ˆ์ •์ ์œผ๋กœ segfaultํ•˜๋Š” ์•ฝ๊ฐ„ ๋” ๊ธธ์ง€๋งŒ ์—ฌ์ „ํžˆ ์•ˆ์ „ํ•œ ํ”„๋กœ๊ทธ๋žจ์ž…๋‹ˆ๋‹ค.

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);
}

Windows :

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)

๋ฆฌ๋ˆ…์Šค :

$ 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 ์—์„œ๋„ segfault (์•ˆ์ •, ๋ฒ ํƒ€ ๋ฐ ์•ผ๊ฐ„)ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ LLVM 9์— ์—ฐ๊ฒฐ๋œ ๋งˆ์Šคํ„ฐ (# 67174๊ฐ€ ๋˜ ๋Œ๋ฆฐ ์ƒํƒœ)์—์„œ rustc ๋ฅผ ์ปดํŒŒ์ผํ•˜์—ฌ์ด๋ฅผ ์žฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ณธ LLVM ๋ฒ„๊ทธ๋Š” ์—ฌ์ „ํžˆ ๋™์ผํ•˜๋ฏ€๋กœ LLVM 10์œผ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๊ฑฐ๋‚˜ LLVM ์ˆ˜์ •์„ ์„ ํƒํ•˜๋ฉด segfault๊ฐ€ ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€ ์ดํ•ดํ–ˆ์œผ๋ฉด ์ข‹๊ฒ ์–ด์š”. ์ž˜๋ชป ์บ์‹œ ๋œ SCEV ๊ฐ’์—์„œ ๋น„๋กฏ๋œ ์ถ”๊ฐ€ nuw ๋•Œ๋ฌธ์— ๊ฒฝ๊ณ„ ๊ฒ€์‚ฌ๊ฐ€ ์ œ๊ฑฐ ๋œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค ( @nikic์ด ์—ฐ๊ฒฐ๋œ ์Šค๋ ˆ๋“œ์˜ C ํ”„๋กœ๊ทธ๋žจ 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 ์ด์ƒ์—์„œ๋Š” segfault์ž…๋‹ˆ๋‹ค. 1.38๊ณผ 1.39 ์‚ฌ์ด์˜ LLVM์—๋Š” ๋งŽ์€ ์ฐจ์ด๊ฐ€ ์—†์ง€๋งŒ (https://github.com/rust-lang/llvm-project/compare/71fe7ec06b85f612fc0e4eb4134c7a7d0f23fac5...8adf9bdccfefb8d03f0e8db3bgen012fb41da1580a4) ๊ธธ์„ ๋”ฐ๋ผ๋„.

์ƒˆ ์žฌ์ƒ์‚ฐ ๊ธฐ๋Š” ์•ˆ์ •์ ์ธ 1.38.0์—์„œ ์˜ˆ์ƒ๋Œ€๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค (๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚œ ์ธ๋ฑ์Šค).

๋‚˜๋Š” (์‹ค์ˆ˜๋กœ) 1.38.0์—์„œ -C codegen-units=1 ์„ค์ •์ด segfault๋ฅผ ์žฌํ˜„ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. 1.37.0์€ ๋‚˜์—๊ฒŒ ์•ˆ์ „ ํ•ด ๋ณด์ž…๋‹ˆ๋‹ค (๋‚ด๊ฐ€ ์‹œ๋„ํ•œ ์˜ต์…˜ ์กฐํ•ฉ์ด segfault๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š์Œ).

1.37.0์€ LLVM 8์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
ํฅ๋ฏธ๋กญ๊ฒŒ๋„ 1.37.0๊ณผ 1.38.0 ( -C codegen-units=1 ) ์‚ฌ์ด์˜ LLVM IR ์ฐจ์ด๋Š” ํ•œ ์ค„์— ๋ถˆ๊ณผํ•ฉ๋‹ˆ๋‹ค.

- %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์€ ๋‚˜์—๊ฒŒ ์•ˆ์ „ ํ•ด ๋ณด์ž…๋‹ˆ๋‹ค (๋‚ด๊ฐ€ ์‹œ๋„ํ•œ ์˜ต์…˜ ์กฐํ•ฉ์ด segfault๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š์Œ).

๊ทธ๊ฒƒ์€ LLVM 8์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ ๋น„๋‚œ๋ฐ›๋Š” SCEV ๋ณ€๊ฒฝ์ด ์ „ํ˜€ ์กด์žฌํ•ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค.

LLVM 8์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

ํ˜ผ๋ž€์Šค๋Ÿฌ์›Œ์„œ ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค (LLVM ๋ฒ„์ „์„ ํ™•์ธํ•˜์ง€๋„ ์•Š์€ ํ•œ ์ค„ ์ฐจ์ด๋กœ ์ค„์ด๊ฒŒ๋˜์–ด ๋„ˆ๋ฌด ๊ธฐ๋ปค์Šต๋‹ˆ๋‹ค).

์šฐ๋ฆฌ๋Š” 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์—์„œ ํ•‘

[triagebot]์ด ๋ฌธ์ œ๋Š” ํ•‘๋œ ์ปดํŒŒ์ผ๋Ÿฌ ํŒ€์˜ ๊ฐœ์ž…์—†์ด ์„ฑ๊ณต์ ์œผ๋กœ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
์ข‹์€ Bretty.

1.41.1์ด ๋‚˜์™”์œผ๋‹ˆ ๋งˆ์นจ๋‚ด์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ๋•Œ๊ฐ€ ๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰