https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88598
--- Comment #8 from rsandifo at gcc dot gnu.org <rsandifo at gcc dot gnu.org> --- Author: rsandifo Date: Mon Jan 7 12:16:30 2019 New Revision: 267645 URL: https://gcc.gnu.org/viewcvs?rev=267645&root=gcc&view=rev Log: [1/2] PR88598: Optimise x * { 0 or 1, 0 or 1, ... } The PR has: vect__6.24_42 = vect__5.23_41 * { 0.0, 1.0e+0, 0.0, 0.0 }; which for -fno-signed-zeros -fno-signaling-nans can be simplified to: vect__6.24_42 = vect__5.23_41 & { 0, -1, 0, 0 }; I deliberately didn't handle COMPLEX_CST or CONSTRUCTOR in initializer_each_zero_or_onep since there are no current use cases. The patch also makes (un)signed_type_for handle floating-point types. I tried to audit all callers and the few that handle null returns would be unaffected. 2019-01-07 Richard Sandiford <richard.sandif...@arm.com> gcc/ PR tree-optimization/88598 * tree.h (initializer_each_zero_or_onep): Declare. * tree.c (initializer_each_zero_or_onep): New function. (signed_or_unsigned_type_for): Handle float types too. (unsigned_type_for, signed_type_for): Update comments accordingly. * match.pd: Fold x * { 0 or 1, 0 or 1, ...} to x & { 0 or -1, 0 or -1, ... }. gcc/testsuite/ PR tree-optimization/88598 * gcc.dg/pr88598-1.c: New test. * gcc.dg/pr88598-2.c: Likewise. * gcc.dg/pr88598-3.c: Likewise. * gcc.dg/pr88598-4.c: Likewise. * gcc.dg/pr88598-5.c: Likewise. Added: trunk/gcc/testsuite/gcc.dg/pr88598-1.c trunk/gcc/testsuite/gcc.dg/pr88598-2.c trunk/gcc/testsuite/gcc.dg/pr88598-3.c trunk/gcc/testsuite/gcc.dg/pr88598-4.c trunk/gcc/testsuite/gcc.dg/pr88598-5.c Modified: trunk/gcc/ChangeLog trunk/gcc/match.pd trunk/gcc/testsuite/ChangeLog trunk/gcc/tree.c trunk/gcc/tree.h