いろいろ試したのですが, 一旦 IR にしてしまうと -O3 レベルの最適化はできないのでしょうか.
-O3 にかかわらず, IR の変更を伴うような最適化が適用されている感じがしません.
元のソースコードには, 以下のような明らかに最適化がかかる無駄なループなどを含めています.
c
1int x = 0; 2int y = 0; 3for (int i = 0; i < 1000; ++i) 4 ++x; 5y = x; 6return y;
c
1for (int i = 0; i < 1000; ++i) {}
具体的には,
sh
1clang test.c -o test.ll -S -emit-llvm 2opt test.ll -o test_opt.ll -S -O3
とやっても, test.ll と test_opt.ll で変化が見られません (細かくいえば関数名やファイル名は微妙に変わるが最適化はされていない).
また, clang を用いて,
sh
1clang test.c -o test.ll -S -emit-llvm 2clang test.ll -o test_opt.ll -S -O3
とやったとしても, やはり変化は見られません.
簡単な自作 Pass (命令を追加するもの) を作り,
sh
1clang test.c -o test.bc -c -emit-llvm 2g++ -o sample.o sample.cpp -c -g -O0 `llvm-config --cxxflags --ldflags --libs` -ldl -pthread -Wno-strict-aliasing 3g++ -o sample.so sample.o -shared 4opt -o test.ll test.bc -load sample.so -sample -S
このように適用した時は, IR に変化が見られ命令が追加されていました.
-O3 のような FunctionPass などを使用する最適化は, C/C++ の Function を対象としており, IR になってしまったものには適用できないということなのでしょうか.
一旦 IR にしたものに最適化を適用する方法がありましたらお教えいただきたいです.
そういったことはそもそもできないのであれば, よろしければ理由をご教授いただけるとありがたいです.
よろしくお願いします.
あなたの回答
tips
プレビュー