[LLVMdev] [Bug 3756] __attribute__((always_inline)) and __builtin_constant_p
Nick Lewycky
nicholas at mxc.ca
Thu Mar 19 23:57:03 PDT 2009
Dan Gohman wrote:
> On Mar 15, 2009, at 6:16 PM, Nick Lewycky wrote:
>
>> Pierre Habouzit wrote:
>>> [ 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.
>> No, that's not the problem.
>
> I disagree; I think incomplete support for always_inline is the
> primary issue
> here.
>
>> Before any optimizations can be applied the function must be converted
>> into LLVM IR. In LLVM IR we have no equivalent for
>> "builtin_constant_p".
>> Thus the __builtin_constant_p is evaluated and found false as part of
>> converting the GCC trees into LLVM IR, then the always_inliner is
>> applied on the IR.
>
> Supporting always_inline as a type-safe macro which is always expanded
> early is a feature of GCC that people have found useful. It is a
> limitation of
> LLVM that this happens to be complicated to implement there.
Okay. I find it hard to call this a bug in LLVM's always-inliner, as
there's nothing you can change in the always-inliner to fix it.
Are you suggesting that we support this by running GCC's always-inliner?
I don't think that fixes the example unless you also run some GCC
optimizations to perform the forward substitution. That's a problem when
we're trying to run the LLVM optimizers instead.
The most straight-forward way to implement it is to leave this function
in the code, and write a pass that detects a call to this magic function
and does isa<Constant> on the parameter and replaces the call with the
result. That pass sounds specific enough to this GCC feature that it
should probably just live in the llvm-gcc tree.
Thoughts?
Nick
More information about the llvm-dev
mailing list