On Tue, Mar 14, 2017 at 3:20 PM, Bill Schmidt
<wschm...@linux.vnet.ibm.com> wrote:
>
>> On Mar 14, 2017, at 7:50 AM, Bill Schmidt <wschm...@linux.vnet.ibm.com> 
>> wrote:
>>
>>
>>> On Mar 14, 2017, at 3:57 AM, Richard Biener <richard.guent...@gmail.com> 
>>> wrote:
>>>
>>> On Tue, Mar 14, 2017 at 1:04 AM, Bill Schmidt
>>> <wschm...@linux.vnet.ibm.com> wrote:
>>>>
>>>> Index: gcc/tree-stdarg.c
>>>> ===================================================================
>>>> --- gcc/tree-stdarg.c   (revision 246109)
>>>> +++ gcc/tree-stdarg.c   (working copy)
>>>> @@ -1057,7 +1057,7 @@ expand_ifn_va_arg_1 (function *fun)
>>>>              types.  */
>>>>           gimplify_assign (lhs, expr, &pre);
>>>>         }
>>>> -       else
>>>> +       else if (is_gimple_addressable (expr))
>>>>         gimplify_expr (&expr, &pre, &post, is_gimple_lvalue, fb_lvalue);
>>>
>>> This is wrong - we lose side-effects this way and the only reason we 
>>> gimplify
>>> is to _not_ lose them.
>>>
>>> Better is sth like
>>>
>>> Index: gcc/tree-stdarg.c
>>> ===================================================================
>>> --- gcc/tree-stdarg.c   (revision 246082)
>>> +++ gcc/tree-stdarg.c   (working copy)
>>> @@ -1058,7 +1058,7 @@ expand_ifn_va_arg_1 (function *fun)
>>>           gimplify_assign (lhs, expr, &pre);
>>>         }
>>>       else
>>> -         gimplify_expr (&expr, &pre, &post, is_gimple_lvalue, fb_lvalue);
>>> +         gimplify_expr (&expr, &pre, &post, is_gimple_val, fb_either);
>>>
>>>       input_location = saved_location;
>>>       pop_gimplify_context (NULL);
>>
>> OK, thanks for the explanation.  Unfortunately this fails bootstrap with a 
>> failed
>> assert a little later.  I'll dig further.
>
> Looks like is_gimple_val is too restrictive for MEM_REFs, for which 
> is_gimple_lvalue
> passes.  Trying this now:

Hmm, it should simply gimplify to a load if it's not aggregate.  Can
you share a testcase
where it doesn't work?

> Index: gcc/tree-stdarg.c
> ===================================================================
> --- gcc/tree-stdarg.c   (revision 246109)
> +++ gcc/tree-stdarg.c   (working copy)
> @@ -1057,8 +1057,10 @@ expand_ifn_va_arg_1 (function *fun)
>                types.  */
>             gimplify_assign (lhs, expr, &pre);
>           }
> +       else if (is_gimple_addressable (expr))

I believe any is_gimple_addressable check is flawed.

> +         gimplify_expr (&expr, &pre, &post, is_gimple_lvalue, fb_lvalue);
>         else
> -         gimplify_expr (&expr, &pre, &post, is_gimple_lvalue, fb_lvalue);
> +         gimplify_expr (&expr, &pre, &post, is_gimple_val, fb_rvalue);
>
>         input_location = saved_location;
>         pop_gimplify_context (NULL);
>
>
>>
>> Bill
>>
>

Reply via email to