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

Reply via email to