On 10 November 2006 07:13, Ian Lance Taylor wrote: > DJ Delorie <[EMAIL PROTECTED]> writes: > >> I compared the generated code with an equivalent explicit test, >> and discovered that gcc uses a separate rtx for the intermediate: >> >> i = 0xfffff; >> if (j >= 16) >> { >> int i2; >> i2 = i >> 8; >> i = i2 >> 8; >> j -= 16; >> } >> >> This seems to avoid the combiner problem, becuase you don't have the >> same register being set and being used in one insn. Does this explain >> why combine was having a problem, or was this a legitimate thing to do >> and the combiner is still wrong? Using a temp in the expander works >> around the problem. > > Interesting. Using a temporary is the natural way to implement this > code. But not using a temporary should be valid. So I think there is > a bug in combine.
Doesn't this just suggest that there's a '+' constraint modifier missing from an operand in a pattern in the md file somewhere, such as the one that expands the conditional in the first place? cheers, DaveK -- Can't think of a witty .sigline today....