[LLVMdev] [Bug 3756] __attribute__((always_inline)) and __builtin_constant_p

Pierre Habouzit madcoder at debian.org
Sun Mar 15 12:36:51 PDT 2009


[ please CC: me as I'm not subscribed ]

On Wed, Mar 11, 2009 at 04:13:34AM +0000, bugzilla-daemon at cs.uiuc.edu wrote:
> http://llvm.org/bugs/show_bug.cgi?id=3756
> 
> Chris Lattner <clattner at apple.com> changed:
>
>            What    |Removed                     |Added
> ----------------------------------------------------------------------------
>              Status|NEW                         |RESOLVED
>          Resolution|                            |WONTFIX
>
> --- Comment #6 from Chris Lattner <clattner at apple.com>  2009-03-10 23:13:33 ---
> Unfortunately, this will never be fixed in either llvm-gcc or clang. 
> __builtin_constant_p is a "best effort" constant folding tester, which is
> allowed to fail.  You should never write code that assumes that
> __builtin_constant_p can't fail (if you need that, just don't use
> __builtin_constant_p).


> It would be interesting and useful to bring this up on the glibc list
> to see if they are willing to fix their headers.

Hahahaha, you never talked to Uli before did you ?

> Barring that, if this is really important to you, please raise the issue on the
> llvmdev list.  We will need IR extensions to support this among other things.

Well, I don't expect __builtin_constant_p to works always. That's not
precisely the issue. I expect though __attribute__((always_inline))
functions to be expanded prior to any optimization pass, because it's
what it means. Those functions are basically type-safe macros.

If you do that, then my problem go away at once. For what it's worth, my
always_inline functions are always functions that allow constant-folding
of its result when parameters are known at compile time, or fallbacks to
a real, non inlined, implementation else. Typical (silly but useful for
my point) use is for example, a function that is:

extern int __utf8_charlen(wchar_t c);
__attribute__((always_inline))
static inline int utf8_charlen(wchar_t c) {
    if (__builtin_constant_p(c)) {
        if (c < 0 || c >= 0x200000)
	    return 0;
        return 1 + (c >= 0x80) + (c >= 0x800) + (c >= 0x10000);
    }
    return __utf8_charlen(c);
}

I really expect that here, if I have a straight utf8_charlen('\0') call,
llvm-gcc would first expand utf8_charlen inline, and then, optimizes the
__builtin_constant_p away. I mean, the cases where llvm-gcc is unable to
do the optimizations I somehow expect it to do, the arguments are always
direct constants passed to it, not through any kind of local variable,
hence a best-effort algorithm should just work.

-- 
·O·  Pierre Habouzit
··O                                                madcoder at debian.org
OOO                                                http://www.madism.org
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 197 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20090315/e128078c/attachment.sig>


More information about the llvm-dev mailing list