On 11/30/18 12:39 AM, Richard Biener wrote:
> On Wed, Nov 28, 2018 at 6:10 PM Jeff Law <l...@redhat.com> wrote:
>>
>> On 11/28/18 10:00 AM, Michael Eager wrote:
>>> I have a small test case which generates poor quality code on my target.
>>> Here is the original:
>>>
>>>   if (cond1 == 2048 || cond2 == 8)
>>>     {
>>>       x = x + y;
>>>     }
>>>   return x;
>>>
>>> This ends up generating a series of instructions to compute a flag with
>>> the result of the condition followed by a single compare with zero and
>>> a jump.  Better code would be two compares and two jumps.
>>>
>>> The gimple is
>>>
>>>   _1 = cond1 == 2048;
>>>   _2 = cond2 == 8;
>>>   _3 = _1 | _2;
>>>   if (_3 != 0) goto <D.1464>; else goto <D.1465>;
>>> ...
>>>
>>> so this poor code sequence is essentially a correct translation.
>>>
>>> On MIPS, for the same test case, the gimple is different:
>>>
>>>   if (cond1 == 2048) goto <D.1491>; else goto <D.1493>;
>>>   <D.1493>:
>>>   if (cond2 == 8) goto <D.1491>; else goto <D.1492>;
>>>   <D.1491>:
>>> ...
>>>
>>> which generates the better code sequence.
>>>
>>> Can someone give me a pointer where to find where the lowering
>>> pass decides to break up a condition into multiple tests?  Is
>>> there a target configuration option which I have overlooked or
>>> maybe set incorrectly?
>> BRANCH_COST, which comes into play during generation of the initial
>> trees
> 
> Sth I don't like very much...  maybe we can revisit removing
> the few cases in fold-const.c (thus GENERIC folding) and rely
> on later GIMPLE passes instead plus on RTL expansion to
> do the reverse transform.
> 
> Not for GCC 9 of course.
Agreed, 100%.  That was supposed to be where Kai's work was headed, but
we never seemed to make significant headway.   Getting BRANCH_COST out
of the tree generation/folding would be a good thing at many levels.

There'll be fallout, of course.

jeff

Reply via email to