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