Sunday, 23 December 2018

CbC clang bug

最適化(-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: