On Fri, Jun 14, 2024 at 5:12 AM Kong, Lingling <lingling.k...@intel.com> wrote: > > APX CFCMOV[1] feature implements conditionally faulting which means that all > memory faults are suppressed > when the condition code evaluates to false and load or store a memory > operand. Now we could load or store a > memory operand may trap or fault for conditional move. > > In middle-end, now we don't support a conditional move if we knew that a load > from A or B could trap or fault.
What's the cost of suppressing a fault? ISTR that for example fault suppression for vector masked load/store is quite expensive, so when this is for example done in a loop where there's always a fault that's suppressed you can see 1000-fold slowdown. I would suspect this is similar for cfcmov? So how is this reflected in the decision to if-convert? > To enable CFCMOV, we add a target HOOK TARGET_HAVE_CONDITIONAL_MOVE_MEM_NOTRAP > in if-conversion pass to allow convert to cmov. > > All the changes passed bootstrap & regtest x86-64-pc-linux-gnu. > We also tested spec with SDE and passed the runtime test. > > Ok for trunk? > > [1].https://www.intel.com/content/www/us/en/developer/articles/technical/advanced-performance-extensions-apx.html > > Lingling Kong (3): > [APX CFCMOV] Add a new target hook: TARGET_HAVE_CONDITIONAL_MOVE_MEM_NOTRAP > [APX CFCMOV] Support APX CFCMOV in if_convert pass > [APX CFCMOV] Support APX CFCMOV in backend > > gcc/config/i386/i386-expand.cc | 63 +++++ > gcc/config/i386/i386-opts.h | 4 +- > gcc/config/i386/i386.cc | 33 ++- > gcc/config/i386/i386.h | 1 + > gcc/config/i386/i386.md | 53 +++- > gcc/config/i386/i386.opt | 3 + > gcc/config/i386/predicates.md | 7 + > gcc/doc/tm.texi | 6 + > gcc/doc/tm.texi.in | 2 + > gcc/ifcvt.cc | 247 ++++++++++++++++++- > gcc/target.def | 11 + > gcc/targhooks.cc | 8 + > gcc/targhooks.h | 1 + > gcc/testsuite/gcc.target/i386/apx-cfcmov-1.c | 73 ++++++ > gcc/testsuite/gcc.target/i386/apx-cfcmov-2.c | 40 +++ > 15 files changed, 539 insertions(+), 13 deletions(-) > create mode 100644 gcc/testsuite/gcc.target/i386/apx-cfcmov-1.c > create mode 100644 gcc/testsuite/gcc.target/i386/apx-cfcmov-2.c > > -- > 2.31.1 >