[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