[PATCH] D47159: [InstCombine] Format String optimizations

Eli Friedman via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon May 21 14:46:15 PDT 2018


efriedma added a comment.

I'm not sure we can rewrite calls to varargs functions safely in general given the current state of the C ABI rules in LLVM.

Sometimes clang does weird things to conform with the ABI rules, because the LLVM type system isn't the same as the C system.  For most functions, it's pretty easy to tell it happened: if the IR signature of the function doesn't match the expected signature, something weird happened, so we can just bail out.  But varargs functions don't specify a complete signature, so we can't tell if the clang ABI code was forced to do something weird, like split an argument into multiple values, or insert a padding value.  For example, for the target mips64-unknown-linux-gnu, a call like `printf("asdf%Lf", 1.0L);` gets lowered to the following:

  %call = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str, i32 0, i32 0), i64 undef, fp128 0xL00000000000000003FFF000000000000) #2


https://reviews.llvm.org/D47159





More information about the llvm-commits mailing list