[LLVMdev] Troubling promotion of return value to Integer ...
Gordon Henriksen
gordonhenriksen at mac.com
Fri Jun 6 06:02:45 PDT 2008
On Jun 6, 2008, at 03:04, Evan Cheng wrote:
> On Jun 5, 2008, at 11:44 PM, Chris Lattner wrote:
>
>> On Jun 5, 2008, at 11:33 PM, Evan Cheng wrote:
>>
>>> On Jun 4, 2008, at 11:12 AM, Chris Lattner wrote:
>>>
>>>> On Jun 4, 2008, at 10:52 AM, Evan Cheng wrote:
>>>>
>>>>> On May 29, 2008, at 10:30 AM, Alireza.Moshtaghi at microchip.com
>>>>> wrote:
>>>>>
>>>>>> 4) There will be 4 new function attributes:
>>>>>> sign_ext_from_i8, sign_ext_from_i16
>>>>>> zero_ext_from_i8, zero_ext_from_i16
>>>>>> These attributes will be placed on the function CALL node by
>>>>>> front-end to inform the backend about such promotions and
>>>>>> enable optimization of return value. This should be sufficient
>>>>>> for direct and indirect
>>>>>> call. (syntax of these attributes to be defined)
>>>>>
>>>>> Should we go one step further and provide an attribute whose
>>>>> value is the "original type" before the extension?
>>>>
>>>> What would that mean? Can you give an example?
>>>
>>> Well, you suggested sext / zext from i8 / i16. Why not from i1
>>> (useful for denoting boolean type) or any arbitrary type?
>>
>> Are you suggesting adding 'sign_ext_from_i1' and 'zero_ext_from_i1'
>> attributes? I'd be fine with that. It would also solve some
>> existing code quality issues we have.
>
> These will be useful. But is it possible to be more generic?
> sext_from type where type can be any type? The value of the
> attribute would somehow tells us the type before extension?
Why not the values codegen is actually looking for? Say, these
attributes:
known_bits(mask, bits) ; Partially known values.
sign_bits(num) ; Number of leading sign extended bits.
Example:
; unsigned char f(bool, signed char)
define i32 known_bits(0xFFFFFF00, 0)
@f(i32 known_bits(0xFFFFFFFE, 0) %b,
i32 sign_bits(25) %c)
If the attribute values were encoded as constants, these could even
generalize to aggregate return:
; struct S { bool b; signed char c; };
; struct S f();
; S s = f();
%s = call {i32, i32} known_bits({i32, i32} {i32 0xFFFFFFE, i32 0})
sign_bits({i8, i8} {i8 0, i8 25})
@f();
; Easy to propagate known bits and sign bits from %s to %s.b and
%s.c.
%s.b = getelement {i32, i32} %s, 0
%s.c = getelement {i32, i32} %s, 1
— Gordon
More information about the llvm-dev
mailing list