2011/10/21 Richard Guenther <richard.guent...@gmail.com>: > On Thu, Oct 20, 2011 at 3:08 PM, Kai Tietz <kti...@redhat.com> wrote: >> Hello, >> >> this patch re-enables the branch-cost optimization on simple boolean-typed >> operands, which are casted to a wider integral type. This happens due casts >> from >> boolean-types are preserved, but FE might expands simple-expression to wider >> mode. >> >> I added two tests for already working branch-cost optimization for >> IA-architecture and >> two for explicit checking for boolean-type. >> >> ChangeLog >> >> 2011-10-20 Kai Tietz <kti...@redhat.com> >> >> * fold-const.c (simple_operand_p_2): Handle integral >> casts from boolean-operands. >> >> 2011-10-20 Kai Tietz <kti...@redhat.com> >> >> * gcc.target/i386/branch-cost1.c: New test. >> * gcc.target/i386/branch-cost2.c: New test. >> * gcc.target/i386/branch-cost3.c: New test. >> * gcc.target/i386/branch-cost4.c: New test. >> >> Bootstrapped and regression tested on x86_64-unknown-linux-gnu for all >> languages including Ada and Obj-C++. Ok for apply? >> >> Regards, >> Kai >> >> Index: gcc-head/gcc/testsuite/gcc.target/i386/branch-cost2.c >> =================================================================== >> --- /dev/null >> +++ gcc-head/gcc/testsuite/gcc.target/i386/branch-cost2.c >> @@ -0,0 +1,16 @@ >> +/* { dg-do compile } */ >> +/* { dg-options "-O2 -fdump-tree-gimple -mbranch-cost=2" } */ >> + >> +extern int doo (void); >> + >> +int >> +foo (int a, int b) >> +{ >> + if (a && b) >> + return doo (); >> + return 0; >> +} >> + >> +/* { dg-final { scan-tree-dump-times "if " 1 "gimple" } } */ >> +/* { dg-final { scan-tree-dump-times " & " 1 "gimple" } } */ >> +/* { dg-final { cleanup-tree-dump "gimple" } } */ >> Index: gcc-head/gcc/testsuite/gcc.target/i386/branch-cost3.c >> =================================================================== >> --- /dev/null >> +++ gcc-head/gcc/testsuite/gcc.target/i386/branch-cost3.c >> @@ -0,0 +1,16 @@ >> +/* { dg-do compile } */ >> +/* { dg-options "-O2 -fdump-tree-gimple -mbranch-cost=2" } */ >> + >> +extern int doo (void); >> + >> +int >> +foo (_Bool a, _Bool b) >> +{ >> + if (a && b) >> + return doo (); >> + return 0; >> +} >> + >> +/* { dg-final { scan-tree-dump-times "if " 1 "gimple" } } */ >> +/* { dg-final { scan-tree-dump-times " & " 1 "gimple" } } */ >> +/* { dg-final { cleanup-tree-dump "gimple" } } */ >> Index: gcc-head/gcc/testsuite/gcc.target/i386/branch-cost4.c >> =================================================================== >> --- /dev/null >> +++ gcc-head/gcc/testsuite/gcc.target/i386/branch-cost4.c >> @@ -0,0 +1,16 @@ >> +/* { dg-do compile } */ >> +/* { dg-options "-O2 -fdump-tree-gimple -mbranch-cost=0" } */ >> + >> +extern int doo (void); >> + >> +int >> +foo (_Bool a, _Bool b) >> +{ >> + if (a && b) >> + return doo (); >> + return 0; >> +} >> + >> +/* { dg-final { scan-tree-dump-times "if " 2 "gimple" } } */ >> +/* { dg-final { scan-tree-dump-not " & " "gimple" } } */ >> +/* { dg-final { cleanup-tree-dump "gimple" } } */ >> Index: gcc-head/gcc/fold-const.c >> =================================================================== >> --- gcc-head.orig/gcc/fold-const.c >> +++ gcc-head/gcc/fold-const.c >> @@ -3706,6 +3706,19 @@ simple_operand_p_2 (tree exp) >> /* Strip any conversions that don't change the machine mode. */ >> STRIP_NOPS (exp); >> >> + /* Handle integral widening casts from boolean-typed >> + expressions as simple. This happens due casts from >> + boolean-types are preserved, but FE might expands >> + simple-expression to wider mode. */ >> + if (INTEGRAL_TYPE_P (TREE_TYPE (exp)) >> + && CONVERT_EXPR_P (exp) >> + && TREE_CODE (TREE_TYPE (TREE_OPERAND (exp, 0))) >> + == BOOLEAN_TYPE) >> + { >> + exp = TREE_OPERAND (exp, 0); >> + STRIP_NOPS (exp); >> + } >> + > > Huh, well. I think the above is just too special and you instead should > replace the existing STRIP_NOPS by > > while (CONVERT_EXPR_P (exp)) > exp = TREE_OPERAND (exp, 0); > > with a comment that conversions are considered simple. > > Ok with that change, if it bootstraps & tests ok. > > Richard.
Ok, bootstrapped and regression-tested on x86_64-unknown-linux-gnu and applied to trunk with modifying as you suggested. One question I have about handling of TRUTH-binaries in general in fold-const.c. Why aren't we enforcing already here in fold_binary for those operations, that operands get boolean-type? I see here some advantages of C-AST folding. I've tested it and saw that even later in SSA-passes we get slightly better results on that. Regards, Kai