[Bug tree-optimization/106240] New: [13 Regression] Recent change causes missed vectorization opportunity on mips

law at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Sat Jul 9 03:45:50 GMT 2022


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106240

            Bug ID: 106240
           Summary: [13 Regression] Recent change causes missed
                    vectorization opportunity on mips
           Product: gcc
           Version: 13.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: law at gcc dot gnu.org
  Target Milestone: ---

This can be see on the mipsisa32r2-linux-gnu target with a cross compiler.

Starting a couple months ago these tests started failing on
mipsisa32r2-linux-gnu:

Tests that now fail, but worked before (24 tests):

gcc.target/mips/mips-ps-5.c   -O1   scan-assembler \tadd\\.ps\t
gcc.target/mips/mips-ps-5.c   -O1   scan-assembler \tc\\.eq\\.ps\t
gcc.target/mips/mips-ps-5.c   -O1   scan-assembler \tmov[tf]\\.ps\t
gcc.target/mips/mips-ps-5.c   -O2   scan-assembler \tadd\\.ps\t
gcc.target/mips/mips-ps-5.c   -O2   scan-assembler \tc\\.eq\\.ps\t
gcc.target/mips/mips-ps-5.c   -O2   scan-assembler \tmov[tf]\\.ps\t
gcc.target/mips/mips-ps-5.c   -O3 -fomit-frame-pointer -funroll-loops
-fpeel-loops -ftracer -finline-functions   scan-assembler \tadd\\.ps\t
gcc.target/mips/mips-ps-5.c   -O3 -fomit-frame-pointer -funroll-loops
-fpeel-loops -ftracer -finline-functions   scan-assembler \tc\\.eq\\.ps\t
gcc.target/mips/mips-ps-5.c   -O3 -fomit-frame-pointer -funroll-loops
-fpeel-loops -ftracer -finline-functions   scan-assembler \tmov[tf]\\.ps\t
gcc.target/mips/mips-ps-5.c   -O3 -g   scan-assembler \tadd\\.ps\t
gcc.target/mips/mips-ps-5.c   -O3 -g   scan-assembler \tc\\.eq\\.ps\t
gcc.target/mips/mips-ps-5.c   -O3 -g   scan-assembler \tmov[tf]\\.ps\t
gcc.target/mips/mips-ps-7.c   -O1   scan-assembler \tadd\\.ps\t
gcc.target/mips/mips-ps-7.c   -O1   scan-assembler \tc\\.eq\\.ps\t
gcc.target/mips/mips-ps-7.c   -O1   scan-assembler \tmov[tf]\\.ps\t
gcc.target/mips/mips-ps-7.c   -O2   scan-assembler \tadd\\.ps\t
gcc.target/mips/mips-ps-7.c   -O2   scan-assembler \tc\\.eq\\.ps\t
gcc.target/mips/mips-ps-7.c   -O2   scan-assembler \tmov[tf]\\.ps\t
gcc.target/mips/mips-ps-7.c   -O3 -fomit-frame-pointer -funroll-loops
-fpeel-loops -ftracer -finline-functions   scan-assembler \tadd\\.ps\t
gcc.target/mips/mips-ps-7.c   -O3 -fomit-frame-pointer -funroll-loops
-fpeel-loops -ftracer -finline-functions   scan-assembler \tc\\.eq\\.ps\t
gcc.target/mips/mips-ps-7.c   -O3 -fomit-frame-pointer -funroll-loops
-fpeel-loops -ftracer -finline-functions   scan-assembler \tmov[tf]\\.ps\t
gcc.target/mips/mips-ps-7.c   -O3 -g   scan-assembler \tadd\\.ps\t
gcc.target/mips/mips-ps-7.c   -O3 -g   scan-assembler \tc\\.eq\\.ps\t
gcc.target/mips/mips-ps-7.c   -O3 -g   scan-assembler \tmov[tf]\\.ps\t

This change is the trigger:
commit 68e0063397ba820e71adc220b2da0581dce29ffa
Author: Richard Biener <rguenther@suse.de>
Date:   Mon Apr 11 13:36:53 2022 +0200

    Force the selection operand of a GIMPLE COND_EXPR to be a register

    This goes away with the selection operand allowed to be a GENERIC
    tcc_comparison tree.  It keeps those for vectorizer pattern recog,
    those are short lived and removing this instance is a bigger task.

    The patch doesn't yet remove dead code and functionality, that's
    left for a followup.  Instead the patch makes sure to produce
    valid GIMPLE IL and continue to optimize COND_EXPRs where the
    previous IL allowed and the new IL showed regressions in the testsuite.

[ ... ]


Basically before this change we were able to vectorize the loop and after that
change we no longer vectorize the loop.

Testcase:

/* { dg-do compile } */
/* { dg-options "-mpaired-single -mgp64 -ftree-vectorize forbid_cpu=octeon.*" }
*/
/* { dg-skip-if "requires vectorization" { *-*-* } { "-O0" "-Os" } { "" } } */

extern float a[] __attribute__ ((aligned (8)));
extern float b[] __attribute__ ((aligned (8)));
extern float c[] __attribute__ ((aligned (8)));

NOMIPS16 void
foo (void)
{
  int i;
  for (i = 0; i < 16; i++)
    a[i] = b[i] == c[i] + 1 ? b[i] : c[i];
}

/* { dg-final { scan-assembler "\tadd\\.ps\t" } } */
/* { dg-final { scan-assembler "\tc\\.eq\\.ps\t" } } */
/* { dg-final { scan-assembler "\tmov\[tf\]\\.ps\t" } } */


Compilation line:

/home/jlaw/test/obj/mipsisa32r2-linux-gnu/obj/gcc/gcc/xgcc
-B/home/jlaw/test/obj/mipsisa32r2-linux-gnu/obj/gcc/gcc/
/home/jlaw/test/gcc/gcc/testsuite/gcc.target/mips/mips-ps-5.c
-fdiagnostics-plain-output -O2 -DNOMIPS16="__attribute__((nomips16))"
-DNOMICROMIPS="__attribute__((nomicromips))"
-DNOCOMPRESSION="__attribute__((nocompression))" -mabi=o64 -mips64r2
-mhard-float -mdouble-float -mfp64 -mgp64 -mlong32 -mpaired-single -modd-spreg
-ftree-vectorize -fno-ident -S -o mips-ps-5.s -fdump-tree-all-details


As one would expect this patch changes the form of the COND_EXPRs and
ultimately we're unable to vectorize as a result.  I haven't dug any deeper
than that.


More information about the Gcc-bugs mailing list