2011/5/11 Richard Guenther <richard.guent...@gmail.com>: > On Wed, May 11, 2011 at 11:00 AM, Kai Tietz <ktiet...@googlemail.com> wrote: >> Hi, >> >> By investigating the conditional expression handling I found some >> causes, why TRUTH operations AND, ANDIF, OR, XOR, and ORIF are >> appearing withing conditional folding during gimplification. >> The reason for this can be that the truth expression is simply used as >> result of an assignment or return statement, which then leads to the >> issue that expression has lhs type. By this reason it is still >> necessary to have in TRUTH operations type-cast after boolifying it >> for later operation, if type isn't of kind boolean. Therefore it is >> necessary for conditional to check if their arms might be TRUTH >> results and therefore doing boolification of the arms, too. > > You are not making much sense - gimple_boolify already boolifies > both arms. It assumes that if the expr is bool already the arms are > as well - I'm not sure that always holds, so defering that check as > your patch did probably makes sense.
It makes absolutely sense. Simply try the following example: int foo (int a, int b, int c) { int e = (a && b); return e ? (c && !a) : (c && a && b); } You will see that by this you have TRUTH AND operations with none boolean type, due the fact that for a conditional only the cond part was converted. This patch checks that inner arms getting boolified, if result of condition on both arms is a TRUTH result. Regards, Kai