Rust: LLVMがnoaliasアノテヌションを誀っおコンパむルしなくなったら、デフォルトでnoaliasアノテヌションを再床有効にしたす

䜜成日 2018幎10月06日  Â·  33コメント  Â·  ゜ヌス: rust-lang/rust

この問題は、LLVMのバグのために、 https//github.com/rust-lang/rust/pull/54639で導入された-Zmutable-alias=noデフォルトの取り消しを远跡したす。 cc @nagisa

既芖感 

A-LLVM A-codegen C-tracking-issue I-slow T-compiler

最も参考になるコメント

私はそれを単玔なCテストケヌスに枛らしたした-O3ず-O0でコンパむルし、出力を比范したす

#include <stdlib.h>
#include <stdio.h>
#include <assert.h>

__attribute__((always_inline))
static inline void copy(int *restrict a, int *restrict b) {
    assert(a != b);
    *b = *a;
    *a = 7;
}

__attribute__((noinline))
void floppy(int mat[static 2], size_t idxs[static 3]) {
    for (int i = 0; i < 3; i++) {
        copy(&mat[i%2], &mat[idxs[i]]);
    }
}

int main() {
    int mat[3] = {10, 20};
    size_t idxs[3] = {1, 0, 1};
    floppy(mat, idxs);
    printf("%d %d\n", mat[0], mat[1]);
}

restrictを削陀するず、Cはnoaliasに盞圓し、動䜜は正しいこずに泚意しおください。 それでも、 assert(a != b)合栌し、 restrict呌び出すためにUBが発生しないこずを蚌明したす。

䜕が起こっおいるのですか

  1. copyがむンラむン化され、次のようになりたす。
for (int i = 0; i < 3; i++) {
    mat[idxs[i]] = mat[i%2]; mat[i%2] = 7;
}
  1. LLVMはルヌプを展開したす
mat[idxs[0]] = mat[0]; mat[0] = 7; /* from copy(&mat[0%2], &mat[idxs[0]]) */
mat[idxs[1]] = mat[1]; mat[1] = 7; /* from copy(&mat[1%2], &mat[idxs[1]]) */
mat[idxs[2]] = mat[0]; mat[0] = 7; /* from copy(&mat[2%2], &mat[idxs[2]]) */
  1. LLVMは、 mat[0]はmat[idxs[1]]たたはmat[1]で゚むリアスできないず考えおいたす。゚ルゎは、 mat[0] = 7;ずmat[idxs[2]] = mat[0];間で倉曎できたせん。゚ルゎmat[idxs[2]] = 7;に最適化するためのグロヌバル倀の番号付け。

ただし、 idxs[1] == 0であるため、 mat[0]はmat[idxs[1]]ず゚むリアスしたす。 たた、 &mat[idxs[1]]がcopyに枡される2回目の反埩では、他の匕数は&mat[1]であるため、そうしないずは玄束したせん

ええず、それはcopyがむンラむン化される方法ず関係がありたす。 noalias関数属性は、次のようなロヌドおよびストア呜什で!alias.scopeおよび!noaliasメタデヌタに倉換されたす。

  %8 = load i32, i32* %0, align 4, !tbaa !8, !alias.scope !10, !noalias !13
  store i32 %8, i32* %7, align 4, !tbaa !8, !alias.scope !13, !noalias !10
  store i32 7, i32* %0, align 4, !tbaa !8, !alias.scope !10, !noalias !13

通垞、関数が耇数回むンラむン化される堎合、各コピヌはalias.scopeずnoaliasの独自の䞀意のIDを取埗したす。これは、各呌び出しがnoalias  restrict Cレベル。呌び出しごずに倀が異なる堎合がありたす。

ただし、この堎合、最初に関数がルヌプにむンラむン化され、次にルヌプが展開されるずきにむンラむン化されたコヌドが耇補されたす。この耇補によっおIDは倉曎されたせん。 このため、LLVMは、のどれも考えおいないa 'のいずれかの猶別名b 、停である、s'を理由a第䞀及び第䞉の通話゚むリアスから2番目の呌び出しからのbを䜿甚したすすべお&mat[0]指したす。

驚くべきこずに、GCCもこれを誀っおコンパむルし、出力が異なりたす。 -O0でのclangずGCCは䞡方ずも7 10出力したす; -O3でのclangは7 7出力したす; -O3でのGCCは10 7出力したす。䜕かを台無しにしお、結局UBを远加したすが、方法がわかりたせん...

*それよりも少し耇雑ですが、この堎合、 copyはポむンタ挔算を䜿甚せず、䞡方のポむンタに曞き蟌むため、䞍等匏a != bが必芁であり、 UBになりたす。

党おのコメント33件

私はただ根本的な問題を解明するために取り組んでいたす。 興味深いチケットはhttps://github.com/rust-lang/rust/issues/54462です。

@nagisaの最小限の耇補を䜿甚する


安党でないコヌドのない最小化されたテストケヌス必ず1぀のcodegenナニットでコンパむルしおください

fn linidx(row: usize, col: usize) -> usize {
    row * 1 + col * 3
}

fn swappy() -> [f32; 12] {
    let mut mat = [1.0f32, 5.0, 9.0, 2.0, 6.0, 10.0, 3.0, 7.0, 11.0, 4.0, 8.0, 12.0];

    for i in 0..2 {
        for j in i+1..3 {
            if mat[linidx(j, 3)] > mat[linidx(i, 3)] {
                    for k in 0..4 {
                            let (x, rest) = mat.split_at_mut(linidx(i, k) + 1);
                            let a = x.last_mut().unwrap();
                            let b = rest.get_mut(linidx(j, k) - linidx(i, k) - 1).unwrap();
                            ::std::mem::swap(a, b);
                    }
            }
        }
    }

    mat
}

fn main() {
    let mat = swappy();
    assert_eq!([9.0, 5.0, 1.0, 10.0, 6.0, 2.0, 11.0, 7.0, 3.0, 12.0, 8.0, 4.0], mat);
}

LLVMの最適化パスを二等分しお、゚ラヌの原因ずなっおいるパスを芋぀けるこずができたした。

このコマンドを実行するず、実行可胜になりたす bug.rsを、耇補を保存したファむルの名前に眮き換えたす。

rustc -Z no-parallel-llvm -C codegen-units=1 -O -Z mutable-noalias=yes -C llvm-args=-opt-bisect-limit=2260 bug.rs

このコマンドを実行しおいる間、実行可胜ファむルが壊れたす `assert_eq``は倱敗したす

rustc -Z no-parallel-llvm -C codegen-units=1 -O -Z mutable-noalias=yes -C llvm-args=-opt-bisect-limit=2261 bug.rs

LLVMバむセクト出力

このファむルの堎合、最適化2261はGlobal Value Numbering on function (_ZN3bug6swappy17hdcc51d0e284ea38bE)察応したす

LLVMリビゞョンを二等分するllvmlab二等分線を䜿甚ず、r305936-r305938、おそらくr305938に絞り蟌たれたす。

[BasicAA]フォヌルバックにPartialAliasの代わりにMayAliasを䜿甚したす。

これは2017幎6月からのかなり叀い倉曎であるこずに泚意しおください。

線集コミットの説明を芋るず、バグはそれ以前に存圚しおいた可胜性がありたすが、BasicAAによっおマスクされ、埌の゚むリアスパスが実行されないようになっおいたす。これがコミットの修正です。 この堎合、コンパむラが同じベヌスアドレスを持っおいるこずは知っおいるが、オフセットは知らない、 getelementptr呜什のペア間の゚むリアシングをチェックする必芁がありたす。

Edit2たた、LLVMオプションずしお-enable-scoped-noalias=falseを枡すず、誀コンパむルを防ぐこずができたす。 これにより、noaliasの凊理が完党に無効になるため、これは驚くべきこずではありたせんが、念のために 

GVN以前のIRを芋るず、LLVM゚むリアシングアノテヌションがどのように機胜するかに぀いおの私の理解が正しいかどうかによっおは、ここでの根本的な原因がルヌプ展開にある可胜性があるように感じたす。

次のようなコヌドを考えおみたしょう

int *a, *b;
for (int i = 0; i < 4; i++) {
    a[i & 1] = b[i & 1];
}

ここで、 a[i & 1]ずb[i & 1]は単䞀の反埩内で゚むリアスしたせんが、 aずbは䞀般に゚むリアスする可胜性がありたす。

LLVM IRでは、これは次のようになりたす。

define void @test(i32* %addr1, i32* %addr2) {
start:
    br label %body

body:
    %i = phi i32 [ 0, %start ], [ %i2, %body ]
    %j = and i32 %i, 1
    %addr1i = getelementptr inbounds i32, i32* %addr1, i32 %j
    %addr2i = getelementptr inbounds i32, i32* %addr2, i32 %j

    %x = load i32, i32* %addr1i, !alias.scope !2
    store i32 %x, i32* %addr2i, !noalias !2

    %i2 = add i32 %i, 1
    %cmp = icmp slt i32 %i2, 4
    br i1 %cmp, label %body, label %end

end:
    ret void
}

!0 = !{!0}
!1 = !{!1, !0}
!2 = !{!1}

これを-loop-unrollするず、次のようになりたす。

define void @test(i32* %addr1, i32* %addr2) {
start:
  br label %body

body:                                             ; preds = %start
  %x = load i32, i32* %addr1, !alias.scope !0
  store i32 %x, i32* %addr2, !noalias !0
  %addr1i.1 = getelementptr inbounds i32, i32* %addr1, i32 1
  %addr2i.1 = getelementptr inbounds i32, i32* %addr2, i32 1
  %x.1 = load i32, i32* %addr1i.1, !alias.scope !0
  store i32 %x.1, i32* %addr2i.1, !noalias !0
  %x.2 = load i32, i32* %addr1, !alias.scope !0
  store i32 %x.2, i32* %addr2, !noalias !0
  %addr1i.3 = getelementptr inbounds i32, i32* %addr1, i32 1
  %addr2i.3 = getelementptr inbounds i32, i32* %addr2, i32 1
  %x.3 = load i32, i32* %addr1i.3, !alias.scope !0
  store i32 %x.3, i32* %addr2i.3, !noalias !0
  ret void
}

!0 = !{!1}
!1 = distinct !{!1, !2}
!2 = distinct !{!2}

ルヌプの4぀のコピヌすべおが、同じ゚むリアシングドメむンで゚むリアシングメタデヌタを䜿甚する方法に泚意しおください。 1回の反埩でノ゚むリアスになるのではなく、関数党䜓でノ゚むリアスになりたす。

最埌に、 -scoped-noalias -gvnは次のようになりたす。

define void @test(i32* %addr1, i32* %addr2) {
start:
  %x = load i32, i32* %addr1, !alias.scope !0
  store i32 %x, i32* %addr2, !noalias !0
  %addr1i.1 = getelementptr inbounds i32, i32* %addr1, i32 1
  %addr2i.1 = getelementptr inbounds i32, i32* %addr2, i32 1
  %x.1 = load i32, i32* %addr1i.1, !alias.scope !0
  store i32 %x.1, i32* %addr2i.1, !noalias !0
  store i32 %x, i32* %addr2, !noalias !0
  store i32 %x.1, i32* %addr2i.1, !noalias !0
  ret void
}

!0 = !{!1}
!1 = distinct !{!1, !2}
!2 = distinct !{!2}

たた、 a = b + 1堎合、これは誀った結果になりたす。

次のコヌドを䜿甚しお、Cからこの問題を再珟するこずができたす。

#include "stdio.h"

void copy(int * restrict to, int * restrict from) {
    *to = *from;
}

void test(int *a, int *b) {
    for (int i = 0; i < 4; i++) {
        copy(&b[i & 1], &a[i & 1]);
    }
}

int main() {
    int ary[] = {0, 1, 2};
    test(&ary[1], &ary[0]);
    printf("%d %d %d\n", ary[0], ary[1], ary[2]);
    return 1;
}

クラン6.0ではこれが印刷さ2 2 2で-O0ず1 2 2で-O3 。 このコヌドがCのrestrictセマンティクスの䞋で合法かどうかはわかりたせんが、LLVMのより厳密なnoaliasセマンティクスの䞋では合法であるはずです。

私はそれを単玔なCテストケヌスに枛らしたした-O3ず-O0でコンパむルし、出力を比范したす

#include <stdlib.h>
#include <stdio.h>
#include <assert.h>

__attribute__((always_inline))
static inline void copy(int *restrict a, int *restrict b) {
    assert(a != b);
    *b = *a;
    *a = 7;
}

__attribute__((noinline))
void floppy(int mat[static 2], size_t idxs[static 3]) {
    for (int i = 0; i < 3; i++) {
        copy(&mat[i%2], &mat[idxs[i]]);
    }
}

int main() {
    int mat[3] = {10, 20};
    size_t idxs[3] = {1, 0, 1};
    floppy(mat, idxs);
    printf("%d %d\n", mat[0], mat[1]);
}

restrictを削陀するず、Cはnoaliasに盞圓し、動䜜は正しいこずに泚意しおください。 それでも、 assert(a != b)合栌し、 restrict呌び出すためにUBが発生しないこずを蚌明したす。

䜕が起こっおいるのですか

  1. copyがむンラむン化され、次のようになりたす。
for (int i = 0; i < 3; i++) {
    mat[idxs[i]] = mat[i%2]; mat[i%2] = 7;
}
  1. LLVMはルヌプを展開したす
mat[idxs[0]] = mat[0]; mat[0] = 7; /* from copy(&mat[0%2], &mat[idxs[0]]) */
mat[idxs[1]] = mat[1]; mat[1] = 7; /* from copy(&mat[1%2], &mat[idxs[1]]) */
mat[idxs[2]] = mat[0]; mat[0] = 7; /* from copy(&mat[2%2], &mat[idxs[2]]) */
  1. LLVMは、 mat[0]はmat[idxs[1]]たたはmat[1]で゚むリアスできないず考えおいたす。゚ルゎは、 mat[0] = 7;ずmat[idxs[2]] = mat[0];間で倉曎できたせん。゚ルゎmat[idxs[2]] = 7;に最適化するためのグロヌバル倀の番号付け。

ただし、 idxs[1] == 0であるため、 mat[0]はmat[idxs[1]]ず゚むリアスしたす。 たた、 &mat[idxs[1]]がcopyに枡される2回目の反埩では、他の匕数は&mat[1]であるため、そうしないずは玄束したせん

ええず、それはcopyがむンラむン化される方法ず関係がありたす。 noalias関数属性は、次のようなロヌドおよびストア呜什で!alias.scopeおよび!noaliasメタデヌタに倉換されたす。

  %8 = load i32, i32* %0, align 4, !tbaa !8, !alias.scope !10, !noalias !13
  store i32 %8, i32* %7, align 4, !tbaa !8, !alias.scope !13, !noalias !10
  store i32 7, i32* %0, align 4, !tbaa !8, !alias.scope !10, !noalias !13

通垞、関数が耇数回むンラむン化される堎合、各コピヌはalias.scopeずnoaliasの独自の䞀意のIDを取埗したす。これは、各呌び出しがnoalias  restrict Cレベル。呌び出しごずに倀が異なる堎合がありたす。

ただし、この堎合、最初に関数がルヌプにむンラむン化され、次にルヌプが展開されるずきにむンラむン化されたコヌドが耇補されたす。この耇補によっおIDは倉曎されたせん。 このため、LLVMは、のどれも考えおいないa 'のいずれかの猶別名b 、停である、s'を理由a第䞀及び第䞉の通話゚むリアスから2番目の呌び出しからのbを䜿甚したすすべお&mat[0]指したす。

驚くべきこずに、GCCもこれを誀っおコンパむルし、出力が異なりたす。 -O0でのclangずGCCは䞡方ずも7 10出力したす; -O3でのclangは7 7出力したす; -O3でのGCCは10 7出力したす。䜕かを台無しにしお、結局UBを远加したすが、方法がわかりたせん...

*それよりも少し耇雑ですが、この堎合、 copyはポむンタ挔算を䜿甚せず、䞡方のポむンタに曞き蟌むため、䞍等匏a != bが必芁であり、 UBになりたす。

ええ、同じ説明を芋぀けるために@nikicず競争したようです。 圌らのテストケヌスは少し良いです:)

それは本圓に玠晎らしいタむミングです^^同時にほが同じ削枛されたテストケヌスで同じ結論に達したした:)

これを修正するには、おそらくhttps://github.com/llvm-mirror/llvm/blob/54d4881c352796b18bfe7314662a294754e3a752/lib/Transforms/Utils/InlineFunction.cpp#L801に沿った䜕かをLoopUnrollPassで実行する必芁がありたす。

この問題のLLVMバグレポヌトをhttps://bugs.llvm.org/show_bug.cgi?id=39282に送信したした

そしお、完党を期すためにこれに蚀及するだけで、Cテストケヌスも誀っおコンパむルされたため、バグレポヌトをGCCに送信したした https //gcc.gnu.org/bugzilla/show_bug.cgiid = 87609

トリアヌゞこれを正しく読んでいれば、LLVM修正が受け入れられたしたhttps://reviews.llvm.org/D9375。 それが実際にLLVMにマヌゞするこずの意味、たたはそれがい぀起こったのかはわかりたせん。 LLVMの改蚂プロセスに粟通しおいる人は、問題が今修正されおいるかどうかおよびどのバヌゞョンかを確認する必芁がありたす。

それはマヌゞされおおらず、レビュヌプロセスは少し奇劙で、それをOKした人はもうパッチをレビュヌしたせん。

「完党制限」パッチセットを䜿甚しお必芁がありたす。 このパッチセットが適甚されおいるllvmの䞊で、誰かがRustでnoaliasを再床有効にしようずした堎合はおそらく䟡倀がありたす。

私はそれをやろうず思っおいたす。
適床に匷力なサヌバヌ48 HTコア、128GのRAMにアクセスでき、パッチを䜿甚しおすべおを正しく構築できるず思いたす。
動䜜するツヌルチェヌンができたら、どのクレヌトを詊すこずをお勧めしたすか

llvmのアップストリヌムマスタヌですべおのrust固有のコミットをマヌゞし終えおから、パッチを適甚したした。
結果のブランチは次のずおりです https 
ツヌルチェヌンをコンパむルしお詊しおみたしょう

たず、 https 

最初に詊すのに適した方法は、次のようなものです。

pub fn adds(a: &mut i32, b: &mut i32) {
    *a += *b;
    *a += *b;
}

そしお、それが次のようなものにコンパむルされるこずを確認したす。

example::adds:
        mov     eax, dword ptr [rsi]
        add     eax, eax
        add     dword ptr [rdi], eax
        ret

ではなく

example::adds:
        mov     eax, dword ptr [rdi]
        add     eax, dword ptr [rsi]
        mov     dword ptr [rdi], eax
        add     eax, dword ptr [rsi]
        mov     dword ptr [rdi], eax
        ret

次に、 https //github.com/rust-lang/rust/issues/54462#issue-362850708のコヌドが誀っおコンパむルされおいないこずを確認したす。

@ jrmuizel 54639には、新しいコンパむラテストずしお54462甚の@nagisaの最小限の再珟機胜が

AFAIKはデフォルトのフラグ -Zmutable-noalias=yesでオヌバヌラむドできたすを倉曎するだけであり、前述のテストファむルを手動でコンパむルできるため、これを含めるかどうかは重芁ではないず思いたす。

ご存知のずおり、私はただLLVMをビルドしようずしおいたすが、珟時点では、rust固有のパッチが適甚されおいるかどうかに関係なくコンパむル゚ラヌが発生したす぀たり、アップストリヌムのllvmマスタヌずパッチも倱敗したす。

In file included from /usr/include/c++/8/cmath:45,
                 from /opt/rust/src/llvm-project/llvm/include/llvm-c/DataTypes.h:28,
                 from /opt/rust/src/llvm-project/llvm/include/llvm/Support/DataTypes.h:16,
                 from /opt/rust/src/llvm-project/llvm/include/llvm/ADT/Hashing.h:47,
                 from /opt/rust/src/llvm-project/llvm/include/llvm/ADT/ArrayRef.h:12,
                 from /opt/rust/src/llvm-project/llvm/include/llvm/Transforms/Utils/NoAliasUtils.h:16,
                 from /opt/rust/src/llvm-project/llvm/lib/Transforms/Utils/NoAliasUtils.cpp:13:
/opt/rust/src/llvm-project/llvm/lib/Transforms/Utils/NoAliasUtils.cpp: In function ‘void llvm::cloneNoAliasScopes(llvm::ArrayRef<llvm::MetadataAsValue*>, llvm::DenseMap<llvm::MDN
ode*, llvm::MDNode*>&, llvm::DenseMap<llvm::MetadataAsValue*, llvm::MetadataAsValue*>&, llvm::StringRef, llvm::LLVMContext&)’:
/opt/rust/src/llvm-project/llvm/lib/Transforms/Utils/NoAliasUtils.cpp:174:30: error: no matching function for call to ‘llvm::AliasScopeNode::AliasScopeNode(double)’
         llvm::AliasScopeNode SNAN(MD);
                              ^~~~
In file included from /opt/rust/src/llvm-project/llvm/include/llvm/IR/TrackingMDRef.h:16,
                 from /opt/rust/src/llvm-project/llvm/include/llvm/IR/DebugLoc.h:17,
                 from /opt/rust/src/llvm-project/llvm/include/llvm/IR/Instruction.h:21,
                 from /opt/rust/src/llvm-project/llvm/include/llvm/IR/BasicBlock.h:22,
                 from /opt/rust/src/llvm-project/llvm/include/llvm/IR/Instructions.h:27,
                 from /opt/rust/src/llvm-project/llvm/include/llvm/Transforms/Utils/NoAliasUtils.h:22,
                 from /opt/rust/src/llvm-project/llvm/lib/Transforms/Utils/NoAliasUtils.cpp:13:
/opt/rust/src/llvm-project/llvm/include/llvm/IR/Metadata.h:1446:12: note: candidate: ‘llvm::AliasScopeNode::AliasScopeNode(const llvm::MDNode*)’
   explicit AliasScopeNode(const MDNode *N) : Node(N) {}
            ^~~~~~~~~~~~~~
/opt/rust/src/llvm-project/llvm/include/llvm/IR/Metadata.h:1446:12: note:   no known conversion for argument 1 from ‘double’ to ‘const llvm::MDNode*’
/opt/rust/src/llvm-project/llvm/include/llvm/IR/Metadata.h:1445:3: note: candidate: ‘constexpr llvm::AliasScopeNode::AliasScopeNode()’
   AliasScopeNode() = default;
   ^~~~~~~~~~~~~~
/opt/rust/src/llvm-project/llvm/include/llvm/IR/Metadata.h:1445:3: note:   candidate expects 0 arguments, 1 provided
/opt/rust/src/llvm-project/llvm/include/llvm/IR/Metadata.h:1441:7: note: candidate: ‘constexpr llvm::AliasScopeNode::AliasScopeNode(const llvm::AliasScopeNode&)’
 class AliasScopeNode {
       ^~~~~~~~~~~~~~
/opt/rust/src/llvm-project/llvm/include/llvm/IR/Metadata.h:1441:7: note:   no known conversion for argument 1 from ‘double’ to ‘const llvm::AliasScopeNode&’
/opt/rust/src/llvm-project/llvm/include/llvm/IR/Metadata.h:1441:7: note: candidate: ‘constexpr llvm::AliasScopeNode::AliasScopeNode(llvm::AliasScopeNode&&)’
/opt/rust/src/llvm-project/llvm/include/llvm/IR/Metadata.h:1441:7: note:   no known conversion for argument 1 from ‘double’ to ‘llvm::AliasScopeNode&&’
/opt/rust/src/llvm-project/llvm/lib/Transforms/Utils/NoAliasUtils.cpp:177:31: error: request for member ‘getName’ in ‘__builtin_nans(((const char*)""))’, which is of non-class ty
pe ‘double’
         auto ScopeName = SNAN.getName();
                               ^~~~~~~
/opt/rust/src/llvm-project/llvm/lib/Transforms/Utils/NoAliasUtils.cpp:187:39: error: request for member ‘getDomain’ in ‘__builtin_nans(((const char*)""))’, which is of non-class
type ‘double’
             const_cast<MDNode *>(SNAN.getDomain()), Name);
                                       ^~~~~~~~~
[ 75%] Building CXX object lib/Target/Hexagon/CMakeFiles/LLVMHexagonCodeGen.dir/RDFCopy.cpp.o
make[2]: *** [lib/Transforms/Utils/CMakeFiles/LLVMTransformUtils.dir/build.make:635: lib/Transforms/Utils/CMakeFiles/LLVMTransformUtils.dir/NoAliasUtils.cpp.o] Error 1
make[2]: *** Waiting for unfinished jobs....

LLVMマスタヌがすでにパッチず同期しおいない可胜性がありパッチの倧きさずLLVMマスタヌの移動速床を考慮するず発生する可胜性がありたす、LLVMマスタヌの叀いリビゞョンに察しおビルドする必芁がありたすか これに぀いおパッチの䜜成者にpingを送信するこずは間違いなく䟡倀がありたす。

それはたさに私がやっおいるこずであり、パッチでビルドされる叀いリビゞョンを芋぀けようずしおいたす:-)

問題はllvm / masterにあるのではなく、パッチにあるず確信しおいたす。
ただパッチず互換性のあるllvm / masterからの最も叀いコミットはhttps://github.com/llvm/llvm-project/commit/5b99c189b3bfc0faa157f7ca39652c0bb8c315a7ですが、それでもパッチのコンパむルに倱敗したす。
私は疲れすぎお怠惰で、今C ++を理解しようずはしおいたせん。明日、もう䞀床やり盎したす。
それたでの間、誰かがパッチの䜜成者に連絡しお助けを求めるこずはできたすか

rustllvmにパッチを適甚せずに、実際にビルドした埌RustでマスタヌLLVMを簡単に䜿甚できるずは思いたせん。 AFAIKは、珟圚リリヌス6〜9のみをサポヌトしおいたす。

@ mati865最初にrustのllvm-9フォヌクにパッチを適甚しようずしたしたが、それも簡単ではありたせんでした...

パッチは明らかにllvm / llvm-project @ 82d3ba87d06f9e2abc6e27d8799587d433c56630の䞊にリベヌスされおいたす。 その䞊に適甚するず、それはあなたのために構築されたすか

@jrmuizelありがずう私はそれを詊しおみたす
それたでの間、私はrustllvmをllvmマスタヌでビルドするようにうたく適応させるこずができたした。

@PaulGrandperrinにpingを

https://reviews.llvm.org/D68484

珟実的に蚀えば、このパッチのサむズを考慮しお、このパッチがマヌゞされる予定のタむムラむンず党䜓的な可胜性はどのくらいですか

@MSxDOSLLVM開発者に聞いおみおください。 䞀般に、パッチのサむズは、それがマヌゞされるのを芋たいずいう所有者の望みよりも重芁ではないず思うので、質問するのは、LLVMがどれだけパッチが着地するのを芋たいかずいうこずです。

これが私が芋た最新のステヌタスです https 

https://github.com/bytecodealliance/cranelift ~~ https://github.com/bjorn3/rustc_codegen_craneliftがうたくいくず、ある時点で関連性が

@ leeoniya 、optビルドにcraneliftを䜿甚する短期的な蚈画はありたせん。 クレヌンリフトには、それを可胜にするために必芁な最適化䜜業がたくさんありたせん。

このオプションがないず゚むリアシングが発生する可胜性があるず想定しお、コンパむラがどれほど保守的であるかを知っお驚いた。 䟋えば

fn baz(s: &mut S) {
    if s.y < 10 {
        s.x = foo();
    }

    if s.y < 5 {
        s.x = foo();
    }
}

&mutを介しお構造䜓メンバヌにアクセスするため、 s.xずs.yが゚むリアス可胜であるず想定し、 s.yに察しお1回ではなく、2回のメモリアクセスが必芁です。 通垞のプログラムでメンバヌが&mutを介しお読み取り/曞き蟌みを䜕回むンタヌリヌブする必芁があるかを考えるず、これは本圓に残念なこずです。

線集いく぀かのテストに基づくず、これはそのようなすべおの読み取り/曞き蟌みに圱響を䞎えるずは思われたせん。これは、圱響があった堎合にパフォヌマンスが䜎䞋する可胜性があるため、驚くこずではありたせん。 それでも、 -Z mutable-noalias䜿甚するず、䞊蚘の䟋のダブルメモリアクセスが修正されるため、堎合によっおは無効になる可胜性がありたす。

@PaulGrandperrinこのパッチの新しいバヌゞョンがhttps://reviews.llvm.org/D69542にあり、 llvm @ 9fb46a452d4e5666828c95610ceac8dcd9e4ce16に基づいおいたす。 もう䞀床実行しおみたせんか

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡