On Fri, Oct 5, 2012 at 2:36 PM, Ilya Enkovich <enkovich....@gmail.com> wrote:
> 2012/10/5 Richard Guenther <richard.guent...@gmail.com>:
>> On Fri, Oct 5, 2012 at 10:28 AM, Ilya Enkovich <enkovich....@gmail.com> 
>> wrote:
>>> 2012/10/4 Richard Guenther <richard.guent...@gmail.com>:
>>>> On Wed, Oct 3, 2012 at 7:05 PM, Ilya Enkovich <enkovich....@gmail.com> 
>>>> wrote:
>>>>> Hi,
>>>>>
>>>>> I fall into ssa verification failure when try to pass field's
>>>>> DECL_SIZE as an operand for CALL_EXPR. The fail occurs if field's size
>>>>> is not a constant. In such case DECL_SIZE holds a VAR_DECL and I need
>>>>> to find it's proper SSA_NAME. I thought it may be the default one but
>>>>> gimple_default_def returns NULL. What is the right way to obtain
>>>>> correct ssa_name in such case?
>>>>
>>>> There is no way.  You have to know that you need it's size at the point of
>>>> gimplification.  Later there is no way to recover it.
>>>
>>> Wow. It means I cannot also get an address of subsequent fields in the
>>> structure. It looks weird. Is there a way to somehow preserve this
>>> information during gimplification and use in later passes?
>>
>> By using it ;)  See how gimplification of COMPONENT_REF works
>> for example.  The offset becomes an explicit operand and its
>> computation get put into explicit statements.  There is no 'reverse-mapping'
>> to lookup or even re-construct this information at later time.
>>
> I think gimplification pass is too early for me to decide if I want to
> use all these offsets and sizes.
>
> Actually when I a look into GIMPLE dumps I see that all these values
> are computed and corresponding SSA_NAMEs exist in the code.
>
> I use the following source exapmle:
>
> int foo(int len)
> {
>   struct {
>     int a;
>     int buf[len];
>     int b;
>   } s;
>   return foo1(s.buf);
> }
>
> In GIMPLE I see a lot of values computed for all sizes, unit sizes and 
> offsets:
>
>   saved_stack.2_1 = __builtin_stack_save ();
>   len.0_3 = len_2(D);
>   D.2241_4 = (bitsizetype) len.0_3;
>   D.2242_5 = D.2241_4 * 32;
>   D.2243_6 = (sizetype) len.0_3;
>   D.2244_7 = D.2243_6 * 4;
>   D.2245_8 = (long int) len.0_3;
>   D.2246_9 = D.2245_8 + -1;
>   D.2247_10 = (sizetype) D.2246_9;
>   D.2241_11 = (bitsizetype) len.0_3;
>   D.2242_12 = D.2241_11 * 32;
>   D.2243_13 = (sizetype) len.0_3;
>   D.2244_14 = D.2243_13 * 4;
>   D.2243_15 = (sizetype) len.0_3;
>   D.2248_16 = D.2243_15 + 1;
>   D.2249_17 = D.2248_16 * 4;
>   D.2243_18 = (sizetype) len.0_3;
>   D.2250_19 = D.2243_18 + 2;
>   D.2251_20 = D.2250_19 * 32;
>   D.2252_21 = D.2251_20;
> ...
>
> I suppose there is always a sinle SSA_NAME for such vars and therefore
> I may associate them, e.g. via default definition. The only problem
> them is to not kill them until the very end. Currenty all those unused
> SSA_NAMES are killed by early optimizations pass. But even on O0 now
> we have all values computed and available for use until expand but
> cannot access them.

But that's exactly the issue.  Nothing keeps them live if they are not used.
And there is no "back-mapping" between DECL_SIZE and the SSA name
holding it's value at a certain point in the program.

Richard.

> Ilya
>
>> Richard.
>>
>>> Ilya
>>>
>>>>
>>>> Richard.
>>>>
>>>>>
>>>>> Thanks,
>>>>> Ilya

Reply via email to