middle-end/105715 - missed RTL if-conversion with COND_EXPR expansion
commitcbe5f6859a73b2acf203bd7d13f9fb245d63cbd4
authorRichard Biener <rguenther@suse.de>
Tue, 18 Jul 2023 08:02:52 +0000 (18 10:02 +0200)
committerRichard Biener <rguenther@suse.de>
Tue, 18 Jul 2023 13:42:52 +0000 (18 15:42 +0200)
treefe74bd9d19e12048768f260968240d7bd1ad190c
parentcde17323f950ac372691efd0a740fe0b4d7914a4
middle-end/105715 - missed RTL if-conversion with COND_EXPR expansion

When the COND_EXPR condition operand was split out to a separate stmt
it became subject to CSE with other condition evaluations.  This
unfortunately leads to TER no longer applying and in turn RTL
expansion of COND_EXPRs no longer seeing the condition and thus
failing to try conditional move expansion.  This can be seen with
gcc.target/i386/pr45685.c when built with -march=cascadelake which
then FAILs to produce the expected number of cmovs.

It can also be seen when we create more COND_EXPRs early like for
instruction selection of MIN/MAX operations that map to IEEE
a > b ? a : b expression semantics.

PR middle-end/105715
* gimple-isel.cc (gimple_expand_vec_exprs): Merge into...
(pass_gimple_isel::execute): ... this.  Duplicate
comparison defs of COND_EXPRs.
gcc/gimple-isel.cc