Bug 96376 - [11 regression] vect/vect-alias-check.c and vect/vect-live-5.c fail on armeb
Summary: [11 regression] vect/vect-alias-check.c and vect/vect-live-5.c fail on armeb
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: tree-optimization (show other bugs)
Version: 11.0
: P1 normal
Target Milestone: 11.0
Assignee: Richard Biener
URL:
Keywords:
: 96129 (view as bug list)
Depends on:
Blocks:
 
Reported: 2020-07-29 15:50 UTC by Christophe Lyon
Modified: 2021-01-15 14:08 UTC (History)
2 users (show)

See Also:
Host:
Target: armeb
Build:
Known to work:
Known to fail:
Last reconfirmed: 2020-10-16 00:00:00


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Christophe Lyon 2020-07-29 15:50:33 UTC
I've noticed regressions on target armeb-none-linux-gnueabihf --with-mode arm --with-cpu cortex-a9 --with-fpu neon-fp16:
gcc.dg/vect/vect-alias-check.c -flto -ffat-lto-objects  scan-tree-dump-times vect "vectorized 1 loops" 1
gcc.dg/vect/vect-alias-check.c scan-tree-dump-times vect "vectorized 1 loops" 1
gcc.dg/vect/vect-live-5.c -flto -ffat-lto-objects  scan-tree-dump-times vect "vectorized 1 loops" 1
gcc.dg/vect/vect-live-5.c scan-tree-dump-times vect "vectorized 1 loops" 1

In my logs I can see:
PASS: gcc.dg/vect/vect-live-5.c execution test
gcc.dg/vect/vect-live-5.c: pattern found 0 times
FAIL: gcc.dg/vect/vect-live-5.c scan-tree-dump-times vect "vectorized 1 loops" 1

PASS: gcc.dg/vect/vect-alias-check.c (test for excess errors)
gcc.dg/vect/vect-alias-check.c: pattern found 0 times
FAIL: gcc.dg/vect/vect-alias-check.c scan-tree-dump-times vect "vectorized 1 loops" 1

This appeared between r11-1908 and r11-1952.
Comment 1 Christophe Lyon 2020-07-30 12:13:56 UTC
Bisect identified commit g30fdaead5b7880c4e9f140618e26ad1c545642d5
Comment 2 Richard Biener 2020-10-16 11:59:56 UTC
I will have a look.  How do I need to configure to reproduce with a cc1 cross?
Comment 3 Christophe Lyon 2020-10-16 12:05:32 UTC
I mentioned the configuration flags above:
--target armeb-none-linux-gnueabihf --with-mode arm --with-cpu cortex-a9 --with-fpu neon-fp16
Comment 4 Kewen Lin 2020-10-21 07:56:51 UTC
*** Bug 96129 has been marked as a duplicate of this bug. ***
Comment 5 Kewen Lin 2020-10-21 08:20:58 UTC
By checking the case vect-alias-check.c on the sparc machine, although vectorizer does the versioning for the alignment requirement and is able to set the misaligned flag off for misaligned DRs, it bypasses the DRs *b_20(D) and MEM[(int *)b_20(D) + 4B], as they satisfy the condition check !vect_relevant_for_alignment_p.

   if (aligned_access_p (dr_info)
       || !vect_relevant_for_alignment_p (dr_info))
	    continue;

More specific, it's due to these two DR's steps are unchanged in the loop (b[0] and b[1]).
      
   /* Scatter-gather and invariant accesses continue to address individual
     scalars, so vector-level alignment is irrelevant.  */
  if (STMT_VINFO_GATHER_SCATTER_P (stmt_info)
      || integer_zerop (DR_STEP (dr_info->dr)))
    return false;

A simple fix seems to be:

  diff --git a/gcc/tree-vect-data-refs.c b/gcc/tree-vect-data-refs.c
index 2b4421b5fb4..d5f52929f89 100644
--- a/gcc/tree-vect-data-refs.c
+++ b/gcc/tree-vect-data-refs.c
@@ -1186,7 +1186,7 @@ vect_update_misalignment_for_peel (dr_vec_info *dr_info,

 /* Return true if alignment is relevant for DR_INFO.  */

-static bool
+bool
 vect_relevant_for_alignment_p (dr_vec_info *dr_info)
 {
   stmt_vec_info stmt_info = dr_info->stmt;
diff --git a/gcc/tree-vect-stmts.c b/gcc/tree-vect-stmts.c
index cec5c601268..8a04f55fdb1 100644
--- a/gcc/tree-vect-stmts.c
+++ b/gcc/tree-vect-stmts.c
@@ -2369,7 +2369,8 @@ get_load_store_type (vec_info  *vinfo, stmt_vec_info stmt_info,
       return false;
     }

-  if (*alignment_support_scheme == dr_unaligned_unsupported)
+  if (*alignment_support_scheme == dr_unaligned_unsupported
+      && vect_relevant_for_alignment_p (STMT_VINFO_DR_INFO (stmt_info)))
     {
       if (dump_enabled_p ())
        dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
diff --git a/gcc/tree-vectorizer.h b/gcc/tree-vectorizer.h
index 7c6de8397b3..067222ffe39 100644
--- a/gcc/tree-vectorizer.h
+++ b/gcc/tree-vectorizer.h
@@ -1935,6 +1935,7 @@ extern tree vect_get_new_ssa_name (tree, enum vect_var_kind,
 extern tree vect_create_addr_base_for_vector_ref (vec_info *,
                                                  stmt_vec_info, gimple_seq *,
                                                  tree, tree = NULL_TREE);
+bool vect_relevant_for_alignment_p (dr_vec_info *dr_info);

 /* In tree-vect-loop.c.  */
 extern widest_int vect_iv_limit_for_partial_vectors (loop_vec_info loop_vinfo);
Comment 6 GCC Commits 2021-01-15 14:07:51 UTC
The master branch has been updated by Richard Biener <rguenth@gcc.gnu.org>:

https://gcc.gnu.org/g:446703ccc2ce09e9710964f781a21030bf3c2d54

commit r11-6717-g446703ccc2ce09e9710964f781a21030bf3c2d54
Author: Richard Biener <rguenther@suse.de>
Date:   Fri Jan 15 14:20:43 2021 +0100

    tree-optimization/96376 - do not check alignment for invariant loads
    
    The testcases show that we fail to disregard alignment for invariant
    loads.  The patch handles them like we handle gather and scatter.
    
    2021-01-15  Richard Biener  <rguenther@suse.de>
    
            PR tree-optimization/96376
            * tree-vect-stmts.c (get_load_store_type): Disregard alignment
            for VMAT_INVARIANT.
Comment 7 Richard Biener 2021-01-15 14:08:13 UTC
Should be fixed now.