[過去ログ]
Qiita 3 - キータぞ、来たぞ、キータだぞー (1002レス)
Qiita 3 - キータぞ、来たぞ、キータだぞー http://mevius.5ch.net/test/read.cgi/tech/1685235361/
上
下
前次
1-
新
通常表示
512バイト分割
レス栞
抽出解除
レス栞
このスレッドは過去ログ倉庫に格納されています。
次スレ検索
歴削→次スレ
栞削→次スレ
過去ログメニュー
357: デフォルトの名無しさん [sage] 2023/08/24(木) 08:31:12.59 ID:jcLl4hPI こちらでも Rust(rustc)=C(gcc)>>>C(clang) となった gccとrustcが同じ最適化をしてると思われる 確認のためLLVM IRを吐くrustcとclangでどのようにコードが異なるか調べてみた まずclangによるLLVM IR生成 $ clang -S -emit-llvm -O2 -o fibonacci_cl.ll fibonacci.c そのうちfibonacci()関数部分を抜粋すると以下のコードとなった ; Function Attrs: nounwind readnone uwtable define dso_local i32 @fibonacci(i32 %0) local_unnamed_addr #0 { %2 = icmp ult i32 %0, 2 br i1 %2, label %9, label %3 3: ; preds = %1 %4 = add nsw i32 %0, -2 %5 = tail call i32 @fibonacci(i32 %4) %6 = add nsw i32 %0, -1 %7 = tail call i32 @fibonacci(i32 %6) %8 = add nsw i32 %7, %5 ret i32 %8 9: ; preds = %1 ret i32 %0 } 元のCコードそのままでnが2未満すなわち0と1の時はそのまま返して それ以外は fibonacci(n-2) + fibonacci(n-1) を返している 最適化をしていないのでclangがgccよりも遅いのはこれで納得 http://mevius.5ch.net/test/read.cgi/tech/1685235361/357
358: デフォルトの名無しさん [sage] 2023/08/24(木) 08:33:36.30 ID:jcLl4hPI 次にrustcによるLLVM IR生成 $ rustc -C opt-level=2 --emit llvm-ir -o fibonacci_rs.ll fibonacci.rs そのうちfibonacci()関数部分を抜粋すると以下のコードとなった ; fibonacci::fibonacci ; Function Attrs: nofree nosync nounwind nonlazybind memory(none) uwtable define internal fastcc noundef i32 @_ZN9fibonacci9fibonacci17h1af4b62ef57b502cE(i32 noundef %n) unnamed_addr #4 { start: %switch1 = icmp ult i32 %n, 2 br i1 %switch1, label %bb8, label %bb5 bb5: ; preds = %start, %bb5 %n.tr3 = phi i32 [ %_7, %bb5 ], [ %n, %start ] %accumulator.tr2 = phi i32 [ %0, %bb5 ], [ 0, %start ] %_5 = add i32 %n.tr3, -2 ; call fibonacci::fibonacci %_4 = tail call fastcc noundef i32 @_ZN9fibonacci9fibonacci17h1af4b62ef57b502cE(i32 noundef %_5) %_7 = add i32 %n.tr3, -1 %0 = add i32 %_4, %accumulator.tr2 %switch = icmp ult i32 %_7, 2 br i1 %switch, label %bb8, label %bb5 bb8: ; preds = %bb5, %start %accumulator.tr.lcssa = phi i32 [ 0, %start ], [ %0, %bb5 ] %n.tr.lcssa = phi i32 [ %n, %start ], [ 1, %bb5 ] %accumulator.ret.tr = add i32 %n.tr.lcssa, %accumulator.tr.lcssa ret i32 %accumulator.ret.tr } clangの場合>>357とは異なり「call」によるfibonacci()呼び出しが一つとなり最適化されている http://mevius.5ch.net/test/read.cgi/tech/1685235361/358
メモ帳
(0/65535文字)
上
下
前次
1-
新
書
関
写
板
覧
索
設
栞
歴
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
AAサムネイル
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.042s