タグ付けされた質問 「llvm-codegen」

5
C ++標準では、初期化されていないブールがプログラムをクラッシュさせることを許可していますか?
C ++の「未定義の動作」により、コンパイラーが必要なことをほとんど実行できることがわかっています。しかし、コードが十分に安全であると思っていたので、驚いたクラッシュがありました。 この場合、実際の問題は、特定のコンパイラを使用する特定のプラットフォームでのみ、最適化が有効になっている場合にのみ発生しました。 問題を再現し、それを最大限に簡略化するために、いくつかのことを試みました。Serializeこれはと呼ばれる関数の抜粋です。これはboolパラメータを取り、文字列trueまたはfalse既存の宛先バッファにコピーします。 この関数はコードレビューに含まれますか?実際には、ブールパラメーターが初期化されていない値である場合にクラッシュする可能性があることを伝える方法はありませんか? // Zero-filled global buffer of 16 characters char destBuffer[16]; void Serialize(bool boolValue) { // Determine which string to print based on boolValue const char* whichString = boolValue ? "true" : "false"; // Compute the length of the string we selected const size_t len = strlen(whichString); …

1
Rustコンパイラーは、2つの可変参照がエイリアスできないと想定してコードを最適化しないのはなぜですか?
私が知る限り、参照/ポインタのエイリアスは、最適化されたコードを生成するコンパイラの機能を妨げる可能性があります。これは、2つの参照/ポインタが実際にエイリアスである場合に、生成されたバイナリが正しく動作することを保証する必要があるためです。たとえば、次のCコードでは、 void adds(int *a, int *b) { *a += *b; *a += *b; } フラグをclang version 6.0.0-1ubuntu2 (tags/RELEASE_600/final)付けてコンパイルすると、-O3 0000000000000000 <adds>: 0: 8b 07 mov (%rdi),%eax 2: 03 06 add (%rsi),%eax 4: 89 07 mov %eax,(%rdi) # The first time 6: 03 06 add (%rsi),%eax 8: 89 07 mov %eax,(%rdi) # …

2
240以上の要素を持つ配列をループするときにパフォーマンスに大きな影響があるのはなぜですか?
Rustの配列に対して合計ループを実行すると、CAPACITY> = 240のときにパフォーマンスが大幅に低下することに気付きました。CAPACITY= 239は約80倍高速です。 Rustが「短い」配列に対して行っている特別なコンパイル最適化はありますか? でコンパイルrustc -C opt-level=3。 use std::time::Instant; const CAPACITY: usize = 240; const IN_LOOPS: usize = 500000; fn main() { let mut arr = [0; CAPACITY]; for i in 0..CAPACITY { arr[i] = i; } let mut sum = 0; let now = Instant::now(); for _ in …

4
Rustの128ビット整数「i128」は64ビットシステムでどのように機能しますか?
Rustには128ビットの整数があり、これらはデータ型i128(およびu128unsigned int)で示されます。 let a: i128 = 170141183460469231731687303715884105727; Rustはこれらのi128値を64ビットシステムでどのように機能させますか。たとえば、これらをどのように計算しますか? 私の知る限りでは、値はx86-64 CPUの1つのレジスターに収まらないため、コンパイラーは何らかの方法で1つのi128値に2つのレジスターを使用しますか?あるいは、それらを表すために何らかの大きな整数構造体を代わりに使用していますか?

3
なぜLLVMは冗長変数を割り当てるのですか?
列挙型の定義とmain関数を含む簡単なCファイルを次に示します。 enum days {MON, TUE, WED, THU}; int main() { enum days d; d = WED; return 0; } 次のLLVM IRに転送されます。 define dso_local i32 @main() #0 { %1 = alloca i32, align 4 %2 = alloca i32, align 4 store i32 0, i32* %1, align 4 store i32 2, i32* …
9 c  llvm  llvm-codegen 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.