質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.48%

  • C

    4641questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

  • C++

    4505questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • コンパイラ

    39questions

    コンパイラは、プログラミング言語で記述したソースコードを、コンピュータの実行形式であるオブジェクトコードに変換するプログラムです。

  • Clang

    20questions

    Clangは、プログラミング言語 C、C++、Objective-C、Objective-C++ 向けのコンパイラである。

  • LLVM

    9questions

    LLVM とは、コンパイル時や実行時に様々な最適化をするコンパイラ基盤です。 任意のプログラミング言語に対応可能で、LLVM自体はC++で実装されています。

LLVM IR (または bitcode) に対して-O3 の最適化をかける方法

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 65

u_09

score 11

いろいろ試したのですが, 一旦 IR にしてしまうと -O3 レベルの最適化はできないのでしょうか.
-O3 にかかわらず, IR の変更を伴うような最適化が適用されている感じがしません.

元のソースコードには, 以下のような明らかに最適化がかかる無駄なループなどを含めています.

int x = 0;
int y = 0;
for (int i = 0; i < 1000; ++i)
  ++x;
y = x;
return y;
for (int i = 0; i < 1000; ++i) {}

具体的には, 

clang test.c -o test.ll -S -emit-llvm
opt test.ll -o test_opt.ll -S -O3

とやっても, test.ll と test_opt.ll で変化が見られません (細かくいえば関数名やファイル名は微妙に変わるが最適化はされていない).

また, clang を用いて,

clang test.c -o test.ll -S -emit-llvm
clang test.ll -o test_opt.ll -S -O3

とやったとしても, やはり変化は見られません.

簡単な自作 Pass (命令を追加するもの) を作り,

clang test.c -o test.bc -c -emit-llvm
g++ -o sample.o sample.cpp -c -g -O0 `llvm-config --cxxflags --ldflags --libs` -ldl -pthread -Wno-strict-aliasing
g++ -o sample.so sample.o -shared
opt -o test.ll test.bc -load sample.so -sample -S

このように適用した時は, IR に変化が見られ命令が追加されていました.

-O3 のような FunctionPass などを使用する最適化は, C/C++ の Function を対象としており, IR になってしまったものには適用できないということなのでしょうか.
一旦 IR にしたものに最適化を適用する方法がありましたらお教えいただきたいです.
そういったことはそもそもできないのであれば, よろしければ理由をご教授いただけるとありがたいです.
よろしくお願いします.

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

同じタグがついた質問を見る

  • C

    4641questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

  • C++

    4505questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • コンパイラ

    39questions

    コンパイラは、プログラミング言語で記述したソースコードを、コンピュータの実行形式であるオブジェクトコードに変換するプログラムです。

  • Clang

    20questions

    Clangは、プログラミング言語 C、C++、Objective-C、Objective-C++ 向けのコンパイラである。

  • LLVM

    9questions

    LLVM とは、コンパイル時や実行時に様々な最適化をするコンパイラ基盤です。 任意のプログラミング言語に対応可能で、LLVM自体はC++で実装されています。