On Sat, Sep 3, 2011 at 6:41 PM, Jan Hubicka <hubi...@ucw.cz> wrote:
>> Jan Hubicka wrote:
>>
>> >     (edge_execution_predicate): Rewrite as...
>> >     (set_cond_stmt_execution_predicate): ... this function; handle
>> >     __builtin_constant_p.
>>
>> This causes ICEs when building recent Linux kernels with the
>> CONFIG_TRACE_BRANCH_PROFLING option.  This reduced test case:
>>
>> static inline __attribute__((always_inline)) int f (unsigned int n, unsigned 
>> int size)
>> {
>>  return (__builtin_constant_p (size != 0 && n > ~0 / size)
>>          ? !!(size != 0 && n > ~0 / size)
>>          : ({ static unsigned int count[2] = { 0, 0 };
>>               int r = !!(size != 0 && n > ~0 / size);
>>               count[r]++;
>>               r; }));
>> }
>>
>> int g (unsigned int size)
>> {
>>  return f (size / 4096, 4);
>> }
>>
>> built with -O2 (on i386) on current mainline results in:
>>
>> /home/uweigand/test.i:15:1: internal compiler error: tree check: expected 
>> ssa_name, have integer_cst in set_cond_stmt_execution_predicate, at 
>> ipa-inline-analysis.c:1190
>
> the code dies on:
>
>  D.2739_10 = __builtin_constant_p (0);
>
> it assumes that argument of __builtin_constant_p is always SSA_NAME.  I am 
> testing the obvious fix for that.
> However it is missed optimization to leave such unfolded statement.  It 
> happens at fwprop converting:

tree-ssa-forwprop.c I presume?  That one misses calling fold_stmt when
it propagates things.

> <bb 5>:
>  iftmp.1_9 = 0;
>
> <bb 6>:
>  # iftmp.1_2 = PHI <1(4), 0(5)>
>  D.2739_10 = __builtin_constant_p (iftmp.1_2);

But I wonder how it manages to do something to the above ... (are you
sure it's forwprop?)

Richard.

> Honza
>>
>> Bye,
>> Ulrich
>>
>> --
>>   Dr. Ulrich Weigand
>>   GNU Toolchain for Linux on System z and Cell BE
>>   ulrich.weig...@de.ibm.com
>

Reply via email to