最適化(-O)すると tail call しないというバグが発覚していたんですが... (普通、逆だろ〜)
LLVM IR を -emit-llvm で出力させてみると、tail call が付いてない。ってことは、clang 側かぁ。
CodeGenFunction::EmitCall を読むわけですが、
Call->TailCall()
で flag が立ってない。なんですが、
-O でない時にも立ってない
あれ? もしかして、誰も TailCall を立ててない? じゃぁ、なんで、今まで出ていたわけ?
Call->setTailCallKind(llvm::CallInst::TCK_Tail);
で立てるようにしたら治ったんですが、どういうこと!?
おそらく、
CC = llvm::CallingConv::Fast;
で、Tail Call が出るようになっていたが、最適化がかかってる時には Tail Call しないように治したんじゃないかなぁ。
いや、局所変数のアドレス取ったりしなければ Tail Call してたし。いろいろ謎です。
でも、治ってうれしい。GCC 側には問題はないらしい。
No comments:
Post a Comment