Re: [PATCH 2/2] middle-end/126788 - more vector folding
Richard Biener <[email protected]>
| Newsgroups | gmane.comp.gcc.patches |
|---|---|
| Message-ID | <[email protected]> |
On Sat, 15 Aug 2026, H.J. Lu wrote: > On Fri, Aug 14, 2026 at 8:13 PM Richard Biener <[email protected]> wrote: > > > > The last match.pd update for double-conversion folding didn't handle > > the case where a vector conversion would go away because > > supportable_convert_operation doesn't consider a noop conversion > > (or a sign conversion). The following rectifies this, allowing > > a NOP_EXPR and VIEW_CONVERT_EXPR for same mode types as supportable > > conversion as we can RTL expand that just fine. > > > > This shows that the vectorizer routed sign-conversions through > > vectorizable_assignment but now vectorizable_conversion would > > handle it, emitting NOP_EXPRs (which is fine) instead of > > VIEW_CONVERT_EXPRs (which we declared canonical for vectors). > > This would confuse some foldings, leading to testsuite FAILs, > > so make vectorizable_conversion also prefer VIEW_CONVERT_EXPRs > > here. > > > > Bootstrapped and tested on x86_64-unknown-linux-gnu. > > > > I'll wait on comments on 1/2 before pushing. > > > > Richard. > > > > PR middle-end/126788 > > * optabs-tree.cc (supportable_convert_operation): For same > > modes allow NOP_EXPR and VIEW_CONVERT_EXPR. > > * tree-ssa-forwprop.cc (simplify_vector_constructor): Avoid > > converting the vector to be used for blending into the > > result to the type of the permutation. > > * tree-vect-stmts.cc (vectorizable_conversion): Prefer > > VIEW_CONVERT_EXPR for sign changes. > > > > * gcc.target/i386/pr126788.c: New testcase. > > --- > > gcc/optabs-tree.cc | 4 ++++ > > gcc/testsuite/gcc.target/i386/pr126788.c | 24 ++++++++++++++++++++++++ > > gcc/tree-ssa-forwprop.cc | 1 + > > gcc/tree-vect-stmts.cc | 9 ++++++++- > > 4 files changed, 37 insertions(+), 1 deletion(-) > > create mode 100644 gcc/testsuite/gcc.target/i386/pr126788.c > > > > It failed with this: > > [hjl@gnu-zen4-1 gcc]$ cat /tmp/x.C > extern int _M_current; > extern int end (); > struct color > { > char r; > struct > { > unsigned char g; > unsigned char b; > } m_24bit; > color (char g, char b) > { > m_24bit.g = g; > m_24bit.b = b; > } > }; > void > set_style_bg_color (color) > { > for (;;) > { > const unsigned char g = _M_current; > if (end ()) > break; > set_style_bg_color (color (g, _M_current)); > } > } > [hjl@gnu-zen4-1 gcc]$ ./xgcc -B./ -S -O2 -march=x86-64-v4 /tmp/x.C > /tmp/x.C: In function ‘void set_style_bg_color(color)’: > /tmp/x.C:18:1: error: type mismatch between an SSA_NAME and its symbol > 18 | set_style_bg_color (color) > | ^~~~~~~~~~~~~~~~~~ > /tmp/x.C:18:1: error: type mismatch between an SSA_NAME and its symbol > while verifying SSA_NAME vect_g_49.10_100 in statement > vect_g_49.10_100 = (vector(2) unsigned char) _101; > during GIMPLE pass: slp > /tmp/x.C:18:1: internal compiler error: verify_ssa failed Interesting. This is because the vectorizer seems to preserve qualifiers when building vector types for scalar types, building const vector(2) unsigned char, but make_ssa_name (<type>) will strip qualifiers from <type>. I'll robustify this for now. > 0x4fa8116 internal_error(char const*, ...) > /export/gnu/import/git/gitlab/x86-gcc-test/gcc/diagnostic-global-context.cc:787 > 0x313c855 verify_ssa(bool, bool) > /export/gnu/import/git/gitlab/x86-gcc-test/gcc/tree-ssa.cc:1226 > 0x2c64811 execute_function_todo > /export/gnu/import/git/gitlab/x86-gcc-test/gcc/passes.cc:2107 > 0x2c6345a do_per_function > /export/gnu/import/git/gitlab/x86-gcc-test/gcc/passes.cc:1699 > 0x2c649a8 execute_todo > /export/gnu/import/git/gitlab/x86-gcc-test/gcc/passes.cc:2152 > ./cc1plus -quiet -iprefix > /export/build/gnu/tools-build/gcc-gitlab-test-debug/build-x86_64-linux/gcc/../lib/gcc/x86_64-pc-linux-gnu/17.0.0/ > -isystem ./include -isystem ./include-fixed -D_GNU_SOURCE /tmp/x.C > -quiet -dumpbase x.C -dumpbase-ext .C -march=x86-64-v4 > -mtls-dialect=gnu2 -O2 -o x.s > Please submit a full bug report, with preprocessed source (by using > -freport-bug). > Please include the complete backtrace with any bug report. > See <https://gcc.gnu.org/bugs/> for instructions. > [hjl@gnu-zen4-1 gcc]$ > > -- Richard Biener <[email protected]> SUSE Software Solutions Germany GmbH, Frankenstrasse 146, 90461 Nuernberg, Germany; GF: Jochen Jaser, Andrew McDonald, Abhinav Puri; (HRB 36809, AG Nuernberg)