Gimpel lowering question.

Jeff Law law@redhat.com
Wed Nov 28 17:16:00 GMT 2018


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 as well in passes which try to optimize branchy code into
straighter code.

jeff



More information about the Gcc mailing list