[v2] testsuite: Split out known-misaligned V2QI store target [PR124342] [PR124619]

Message ID bmm.hlwznjdomm.gcc.gcc.azoff.215.2.0@forge-stage.sourceware.org
State New
Headers
Series [v2] testsuite: Split out known-misaligned V2QI store target [PR124342] [PR124619] |

Checks

Context Check Description
linaro-tcwg-bot/tcwg_simplebootstrap_build--master-aarch64-bootstrap success Build passed

Commit Message

Torbjörn Svensson via Sourceware Forge Sept. 2, 2026, 11:17 a.m. UTC
  From: Torbjörn SVENSSON <torbjorn.svensson@foss.st.com>

vect_slp_v2qi_store_unalign tests whether the vectorizer handles a V2QI
store through a byte-aligned base, but some -Wstringop-overflow tests
instead depend on a V2QI store at a known one-byte misalignment from a
defined object.

These two variants are not the same on armv7ve with -mfloat-abi=hard.
Add a separate effective target for the latter case.

	PR testsuite/124342
	PR testsuite/124619

gcc/ChangeLog:

	* doc/sourcebuild.texi (vect_slp_v2qi_store_unalign): Document.
	(vect_slp_v2qi_store_misalign): Likewise.

gcc/testsuite/ChangeLog:

	* lib/target-supports.exp (check_vect_slp_store_usage): Add
	TEST_V2QI_MISALIGN.  Renamed TEST_V2QI to TEST_V2QI_ALIGN and
	TEST_V2QI_2 to TEST_V2QI_UNALIGN.
	(check_effective_target_vect_slp_v2qi_store_misalign): New proc.
	(check_effective_target_vect_slp_v2qi_store_align): Define
	TEST_V2QI_ALIGN.
	(check_effective_target_vect_slp_v2qi_store_unalign): Define
	TEST_V2QI_UNALIGN.
	* c-c++-common/Wstringop-overflow-2.c: Use
	check_effective_target_vect_slp_v2qi_store_misalign.
	* g++.dg/warn/Wstringop-overflow-3.C: Likewise.

Signed-off-by: Torbjörn SVENSSON <torbjorn.svensson@foss.st.com>
---
Changes since v1:

- Renamed define TEST_V2QI to TEST_V2QI_ALIGN
- Renamed define TEST_V2QI_2 to TEST_V2QI_UNALIGN


I've tested this change on top of r17-3738-gaaa0f6b1e87bc6 and r16-9620-g04c3e1efd4917e.

Ok for trunk and releases/gcc-16?


--



This is a forge pull request published on the gcc-patches mailing list mailing list
as requested by Torbjörn Svensson via Sourceware Forge <forge-bot+azoff@forge-stage.sourceware.org>.
Forge discussion: https://forge.sourceware.org/gcc/gcc/pulls/215

Get it locally using:
```
git fetch forge-upstream "+refs/versioned_pull/215/*:refs/versioned_pull/215/*"
git switch -c "pr-215-v2" "refs/versioned_pull/215/2/head"
```
Or, download the patch at: https://forge.sourceware.org/gcc/gcc/pulls/215.diff
Created on: 2026-08-10 17:42:02+00:00
Latest update: 2026-09-02 11:17:13+00:00
Changes: 4 changed files, 81 additions, 51 deletions
Head revision: azoff/gcc ref pr/Wstringop-overflow commit 3f5592502b2ba71cb4088daeae109915f431b6a9 
Base revision: gcc/gcc ref trunk commit aaa0f6b1e87bc62ea15da6eab431af6dcebf6414 r17-3738-gaaa0f6b1e87bc6
Merge base: aaa0f6b1e87bc62ea15da6eab431af6dcebf6414
Requested Reviewers: 

Changed files:
- M: gcc/doc/sourcebuild.texi
- M: gcc/testsuite/c-c++-common/Wstringop-overflow-2.c
- M: gcc/testsuite/g++.dg/warn/Wstringop-overflow-3.C
- M: gcc/testsuite/lib/target-supports.exp

 gcc/doc/sourcebuild.texi                      |  8 +++
 .../c-c++-common/Wstringop-overflow-2.c       | 50 +++++++++----------
 .../g++.dg/warn/Wstringop-overflow-3.C        | 44 ++++++++--------
 gcc/testsuite/lib/target-supports.exp         | 30 +++++++++--
 4 files changed, 81 insertions(+), 51 deletions(-)


Range-diff against v1:
1:  1a3f4342b3ffa ! 1:  3f5592502b2ba testsuite: Split out known-misaligned V2QI store target [PR124342] [PR124619]
    @@ Commit message
         gcc/testsuite/ChangeLog:
     
                 * lib/target-supports.exp (check_vect_slp_store_usage): Add
    -            TEST_V2QI_MISALIGN.
    +            TEST_V2QI_MISALIGN.  Renamed TEST_V2QI to TEST_V2QI_ALIGN and
    +            TEST_V2QI_2 to TEST_V2QI_UNALIGN.
                 (check_effective_target_vect_slp_v2qi_store_misalign): New proc.
    -            * c-c++-common/Wstringop-overflow-2.c: Use it.
    +            (check_effective_target_vect_slp_v2qi_store_align): Define
    +            TEST_V2QI_ALIGN.
    +            (check_effective_target_vect_slp_v2qi_store_unalign): Define
    +            TEST_V2QI_UNALIGN.
    +            * c-c++-common/Wstringop-overflow-2.c: Use
    +            check_effective_target_vect_slp_v2qi_store_misalign.
                 * g++.dg/warn/Wstringop-overflow-3.C: Likewise.
     
         Signed-off-by: Torbjörn SVENSSON <torbjorn.svensson@foss.st.com>
    @@ gcc/testsuite/g++.dg/warn/Wstringop-overflow-3.C: A1 a1i_1 = { 0, { 1 } };
      
     
      ## gcc/testsuite/lib/target-supports.exp ##
    +@@ gcc/testsuite/lib/target-supports.exp: proc check_vect_slp_store_usage { pattern macro } {
    + 	{
    + 	    *(AC4*)a = Ac4;
    + 	}
    +-	#elif TEST_V2QI
    ++	#elif TEST_V2QI_ALIGN
    + 	struct A2
    + 	{
    + 	    char a[2];
    +@@ gcc/testsuite/lib/target-supports.exp: proc check_vect_slp_store_usage { pattern macro } {
    + 	    a.a[1] = 4;
    + 	    sink (&a);
    + 	}
    +-	#elif TEST_V2QI_2
    ++	#elif TEST_V2QI_UNALIGN
    + 	extern char p[2];
    + 	void
    + 	foo3_2 ()
     @@ gcc/testsuite/lib/target-supports.exp: proc check_vect_slp_store_usage { pattern macro } {
      	    p[0] = 0;
      	    p[1] = 1;
    @@ gcc/testsuite/lib/target-supports.exp: proc check_vect_slp_store_usage { pattern
      	#elif TEST_V4HI
      	struct Ax
      	{
    -@@ gcc/testsuite/lib/target-supports.exp: proc check_effective_target_vect_slp_v2qi_store_unalign { } {
    +@@ gcc/testsuite/lib/target-supports.exp: proc check_vect_slp_store_usage { pattern macro } {
    + # is the exact match of relative testcases
    + proc check_effective_target_vect_slp_v2qi_store_align { } {
    +     set pattern {add new stmt: MEM <vector\(2\) char>}
    +-    set macro "TEST_V2QI"
    ++    set macro "TEST_V2QI_ALIGN"
    +     return [check_cached_effective_target vect_slp_v2qi_store_align {
    + 	expr [check_vect_slp_store_usage $pattern $macro] }]
    + }
    +@@ gcc/testsuite/lib/target-supports.exp: proc check_effective_target_vect_slp_v2qi_store_align { } {
    + # with unaligned address at plain O2.
    + proc check_effective_target_vect_slp_v2qi_store_unalign { } {
    +     set pattern {add new stmt: MEM <vector\(2\) char>}
    +-    set macro "TEST_V2QI_2"
    ++    set macro "TEST_V2QI_UNALIGN"
    +     return [check_cached_effective_target vect_slp_v2qi_store_unalign {
      	expr [check_vect_slp_store_usage $pattern $macro ] }]
      }
  

Patch

diff --git a/gcc/doc/sourcebuild.texi b/gcc/doc/sourcebuild.texi
index aad51550eba40..5215d5a9529d5 100644
--- a/gcc/doc/sourcebuild.texi
+++ b/gcc/doc/sourcebuild.texi
@@ -1946,6 +1946,14 @@  Target supports loop vectorization with partial vectors and
 Target supports vectorization of 2-byte char stores with 2-byte aligned
 address at plain @option{-O2}.
 
+@item vect_slp_v2qi_store_unalign
+Target supports vectorization of 2-byte char stores with an unaligned
+address at plain @option{-O2}.
+
+@item vect_slp_v2qi_store_misalign
+Target supports vectorization of 2-byte char stores at a known one-byte
+misaligned address at plain @option{-O2}.
+
 @item vect_slp_v4qi_store_align
 Target supports vectorization of 4-byte char stores with 4-byte aligned
 address at plain @option{-O2}.
diff --git a/gcc/testsuite/c-c++-common/Wstringop-overflow-2.c b/gcc/testsuite/c-c++-common/Wstringop-overflow-2.c
index 3f9171947c252..4b0e443f28852 100644
--- a/gcc/testsuite/c-c++-common/Wstringop-overflow-2.c
+++ b/gcc/testsuite/c-c++-common/Wstringop-overflow-2.c
@@ -19,7 +19,7 @@  struct Ax ax_;
 void gax_ (void)
 {
   ax_.a[0] = 0;                 // { dg-warning "\\\[-Wstringop-overflow" }
-  ax_.a[1] = 1;                 // { dg-warning "\\\[-Wstringop-overflow" "" { xfail { vect_slp_v2qi_store_unalign } } }
+  ax_.a[1] = 1;                 // { dg-warning "\\\[-Wstringop-overflow" "" { xfail { vect_slp_v2qi_store_misalign } } }
   ax_.a[2] = 2;                 // { dg-warning "\\\[-Wstringop-overflow" }
 }
 
@@ -30,7 +30,7 @@  struct Ax ax0 = { 0 };
 void gax0 (void)
 {
   ax0.a[0] = 0;                 // { dg-warning "\\\[-Wstringop-overflow" }
-  ax0.a[1] = 1;                 // { dg-warning "\\\[-Wstringop-overflow" "" { xfail { vect_slp_v2qi_store_unalign } } }
+  ax0.a[1] = 1;                 // { dg-warning "\\\[-Wstringop-overflow" "" { xfail { vect_slp_v2qi_store_misalign } } }
   ax0.a[2] = 2;                 // { dg-warning "\\\[-Wstringop-overflow" }
 }
 
@@ -41,7 +41,7 @@  struct Ax ax0_ = { 0, { } };
 void gax0_ (void)
 {
   ax0_.a[0] = 0;                // { dg-warning "\\\[-Wstringop-overflow" }
-  ax0_.a[1] = 1;                // { dg-warning "\\\[-Wstringop-overflow" "" { xfail { vect_slp_v2qi_store_unalign } } }
+  ax0_.a[1] = 1;                // { dg-warning "\\\[-Wstringop-overflow" "" { xfail { vect_slp_v2qi_store_misalign } } }
   ax0_.a[2] = 2;                // { dg-warning "\\\[-Wstringop-overflow" }
 }
 
@@ -51,8 +51,8 @@  struct Ax ax1 = { 1, { 0 } };
 
 void gax1 (void)
 {
-  ax1.a[0] = 0;                 // { dg-warning "\\\[-Wstringop-overflow" "" { target { vect_slp_v2qi_store_unalign } } }
-  ax1.a[1] = 1;                 // { dg-warning "\\\[-Wstringop-overflow" "" { xfail { vect_slp_v2qi_store_unalign } } }
+  ax1.a[0] = 0;                 // { dg-warning "\\\[-Wstringop-overflow" "" { target { vect_slp_v2qi_store_misalign } } }
+  ax1.a[1] = 1;                 // { dg-warning "\\\[-Wstringop-overflow" "" { xfail { vect_slp_v2qi_store_misalign } } }
   ax1.a[2] = 2;                 // { dg-warning "\\\[-Wstringop-overflow" }
 }
 
@@ -100,7 +100,7 @@  struct A0 a0_;
 void ga0_ (void)
 {
   a0_.a[0] = 0;                 // { dg-warning "\\\[-Wstringop-overflow" }
-  a0_.a[1] = 1;                 // { dg-warning "\\\[-Wstringop-overflow" "" { xfail { vect_slp_v2qi_store_unalign } } }
+  a0_.a[1] = 1;                 // { dg-warning "\\\[-Wstringop-overflow" "" { xfail { vect_slp_v2qi_store_misalign } } }
   a0_.a[2] = 2;                 // { dg-warning "\\\[-Wstringop-overflow" }
 }
 
@@ -111,7 +111,7 @@  struct A0 a00 = { 0 };
 void ga00 (void)
 {
   a00.a[0] = 0;                 // { dg-warning "\\\[-Wstringop-overflow" }
-  a00.a[1] = 1;                 // { dg-warning "\\\[-Wstringop-overflow" "" { xfail { vect_slp_v2qi_store_unalign } } }
+  a00.a[1] = 1;                 // { dg-warning "\\\[-Wstringop-overflow" "" { xfail { vect_slp_v2qi_store_misalign } } }
   a00.a[2] = 2;                 // { dg-warning "\\\[-Wstringop-overflow" }
 }
 
@@ -122,7 +122,7 @@  struct A0 a00_ = { 0, { } };
 void ga00_ (void)
 {
   a00_.a[0] = 0;                // { dg-warning "\\\[-Wstringop-overflow" }
-  a00_.a[1] = 1;                // { dg-warning "\\\[-Wstringop-overflow" "" { xfail { vect_slp_v2qi_store_unalign } } }
+  a00_.a[1] = 1;                // { dg-warning "\\\[-Wstringop-overflow" "" { xfail { vect_slp_v2qi_store_misalign } } }
   a00_.a[2] = 2;                // { dg-warning "\\\[-Wstringop-overflow" }
 }
 
@@ -166,13 +166,13 @@  struct A1 a1_;
 
 void ga1_ (void)
 {
-  a1_.a[0] = 0;                 // { dg-warning "\\\[-Wstringop-overflow" "" { target { vect_slp_v2qi_store_unalign } } }
-  a1_.a[1] = 1;                 // { dg-warning "\\\[-Wstringop-overflow" "" { xfail { vect_slp_v2qi_store_unalign } } }
+  a1_.a[0] = 0;                 // { dg-warning "\\\[-Wstringop-overflow" "" { target { vect_slp_v2qi_store_misalign } } }
+  a1_.a[1] = 1;                 // { dg-warning "\\\[-Wstringop-overflow" "" { xfail { vect_slp_v2qi_store_misalign } } }
   a1_.a[2] = 2;                 // { dg-warning "\\\[-Wstringop-overflow" }
 
   struct A1 a;
-  a.a[0] = 0;                   // { dg-warning "\\\[-Wstringop-overflow" "" { target { vect_slp_v2qi_store_unalign } } }
-  a.a[1] = 1;                   // { dg-warning "\\\[-Wstringop-overflow" "" { xfail { vect_slp_v2qi_store_unalign } } }
+  a.a[0] = 0;                   // { dg-warning "\\\[-Wstringop-overflow" "" { target { vect_slp_v2qi_store_misalign } } }
+  a.a[1] = 1;                   // { dg-warning "\\\[-Wstringop-overflow" "" { xfail { vect_slp_v2qi_store_misalign } } }
   a.a[2] = 2;                   // { dg-warning "\\\[-Wstringop-overflow" }
   sink (&a);
 }
@@ -183,8 +183,8 @@  struct A1 a1__ = { 0 };
 
 void ga1__ (void)
 {
-  a1__.a[0] = 0;                 // { dg-warning "\\\[-Wstringop-overflow" "" { target { vect_slp_v2qi_store_unalign } } }
-  a1__.a[1] = 1;                 // { dg-warning "\\\[-Wstringop-overflow" "" { xfail { vect_slp_v2qi_store_unalign } } }
+  a1__.a[0] = 0;                 // { dg-warning "\\\[-Wstringop-overflow" "" { target { vect_slp_v2qi_store_misalign } } }
+  a1__.a[1] = 1;                 // { dg-warning "\\\[-Wstringop-overflow" "" { xfail { vect_slp_v2qi_store_misalign } } }
   a1__.a[2] = 2;                 // { dg-warning "\\\[-Wstringop-overflow" }
 
   struct A1 a = { 1 };
@@ -200,8 +200,8 @@  struct A1 a1_0 = { 0, { } };
 
 void ga1_0_ (void)
 {
-  a1_0.a[0] = 0;                // { dg-warning "\\\[-Wstringop-overflow" "" { target { vect_slp_v2qi_store_unalign } } }
-  a1_0.a[1] = 1;                // { dg-warning "\\\[-Wstringop-overflow" "" { xfail { vect_slp_v2qi_store_unalign } } }
+  a1_0.a[0] = 0;                // { dg-warning "\\\[-Wstringop-overflow" "" { target { vect_slp_v2qi_store_misalign } } }
+  a1_0.a[1] = 1;                // { dg-warning "\\\[-Wstringop-overflow" "" { xfail { vect_slp_v2qi_store_misalign } } }
   a1_0.a[2] = 2;                // { dg-warning "\\\[-Wstringop-overflow" }
 
   struct A1 a = { 1, { } };
@@ -217,8 +217,8 @@  struct A1 a1_1 = { 0, { 1 } };
 
 void ga1_1 (void)
 {
-  a1_1.a[0] = 0;                // { dg-warning "\\\[-Wstringop-overflow" "" { target { vect_slp_v2qi_store_unalign } } }
-  a1_1.a[1] = 1;                // { dg-warning "\\\[-Wstringop-overflow" "" { xfail { vect_slp_v2qi_store_unalign } } }
+  a1_1.a[0] = 0;                // { dg-warning "\\\[-Wstringop-overflow" "" { target { vect_slp_v2qi_store_misalign } } }
+  a1_1.a[1] = 1;                // { dg-warning "\\\[-Wstringop-overflow" "" { xfail { vect_slp_v2qi_store_misalign } } }
   a1_1.a[2] = 2;                // { dg-warning "\\\[-Wstringop-overflow" }
 
   struct A1 a = { 0, { 1 } };   // { dg-warning "\\\[-Wstringop-overflow" "pr102706" { target { vect_slp_v4qi_store_align } } }
@@ -266,12 +266,12 @@  struct A1i a1i_;
 void ga1i_ (void)
 {
   a1i_.a[0] = 0;
-  a1i_.a[1] = 1;                // { dg-warning "\\\[-Wstringop-overflow" "" { xfail { vect_slp_v2qi_store_unalign } } }
+  a1i_.a[1] = 1;                // { dg-warning "\\\[-Wstringop-overflow" "" { xfail { vect_slp_v2qi_store_misalign } } }
   a1i_.a[2] = 2;                // { dg-warning "\\\[-Wstringop-overflow" }
 
   struct A1i a;
   a.a[0] = 1;
-  a.a[1] = 2;                   // { dg-warning "\\\[-Wstringop-overflow" "" { xfail { vect_slp_v2qi_store_unalign } } }
+  a.a[1] = 2;                   // { dg-warning "\\\[-Wstringop-overflow" "" { xfail { vect_slp_v2qi_store_misalign } } }
   a.a[2] = 3;                   // { dg-warning "\\\[-Wstringop-overflow" }
   sink (&a);
 }
@@ -283,7 +283,7 @@  struct A1i a1i__ = { 0 };
 void ga1i__ (void)
 {
   a1i__.a[0] = 0;
-  a1i__.a[1] = 1;                // { dg-warning "\\\[-Wstringop-overflow" "" { xfail { vect_slp_v2qi_store_unalign } } }
+  a1i__.a[1] = 1;                // { dg-warning "\\\[-Wstringop-overflow" "" { xfail { vect_slp_v2qi_store_misalign } } }
   a1i__.a[2] = 2;                // { dg-warning "\\\[-Wstringop-overflow" }
 
   struct A1i a = { 0 };
@@ -299,8 +299,8 @@  struct A1 a1i_0 = { 0, { } };
 
 void ga1i_0_ (void)
 {
-  a1i_0.a[0] = 0;               // { dg-warning "\\\[-Wstringop-overflow" "" { target { vect_slp_v2qi_store_unalign } } }
-  a1i_0.a[1] = 1;               // { dg-warning "\\\[-Wstringop-overflow" "" { xfail { vect_slp_v2qi_store_unalign } } }
+  a1i_0.a[0] = 0;               // { dg-warning "\\\[-Wstringop-overflow" "" { target { vect_slp_v2qi_store_misalign } } }
+  a1i_0.a[1] = 1;               // { dg-warning "\\\[-Wstringop-overflow" "" { xfail { vect_slp_v2qi_store_misalign } } }
   a1i_0.a[2] = 2;               // { dg-warning "\\\[-Wstringop-overflow" }
 
   struct A1 a = { 0, { } };
@@ -316,8 +316,8 @@  struct A1 a1i_1 = { 0, { 1 } };
 
 void ga1i_1 (void)
 {
-  a1i_1.a[0] = 0;               // { dg-warning "\\\[-Wstringop-overflow" "" { target { vect_slp_v2qi_store_unalign } } }
-  a1i_1.a[1] = 1;               // { dg-warning "\\\[-Wstringop-overflow" "" { xfail { vect_slp_v2qi_store_unalign } } }
+  a1i_1.a[0] = 0;               // { dg-warning "\\\[-Wstringop-overflow" "" { target { vect_slp_v2qi_store_misalign } } }
+  a1i_1.a[1] = 1;               // { dg-warning "\\\[-Wstringop-overflow" "" { xfail { vect_slp_v2qi_store_misalign } } }
   a1i_1.a[2] = 2;               // { dg-warning "\\\[-Wstringop-overflow" }
 
   struct A1 a = { 0, { 1 } };   // { dg-warning "\\\[-Wstringop-overflow" "pr102462" { target { vect_slp_v4qi_store_align } } }
diff --git a/gcc/testsuite/g++.dg/warn/Wstringop-overflow-3.C b/gcc/testsuite/g++.dg/warn/Wstringop-overflow-3.C
index e1d547fe4d40c..0e8523b8ed182 100644
--- a/gcc/testsuite/g++.dg/warn/Wstringop-overflow-3.C
+++ b/gcc/testsuite/g++.dg/warn/Wstringop-overflow-3.C
@@ -21,7 +21,7 @@  Ax ax_;
 NOIPA void gax_ ()
 {
   ax_.a[0] = 0;                 // { dg-warning "\\\[-Wstringop-overflow" }
-  ax_.a[1] = 0;                 // { dg-warning "\\\[-Wstringop-overflow" "" { xfail { vect_slp_v2qi_store_unalign } } }
+  ax_.a[1] = 0;                 // { dg-warning "\\\[-Wstringop-overflow" "" { xfail { vect_slp_v2qi_store_misalign } } }
   ax_.a[2] = 0;                 // { dg-warning "\\\[-Wstringop-overflow" }
 }
 
@@ -32,7 +32,7 @@  Ax ax0 = { 0 };
 NOIPA void gax0 ()
 {
   ax0.a[0] = 0;                 // { dg-warning "\\\[-Wstringop-overflow" }
-  ax0.a[1] = 0;                 // { dg-warning "\\\[-Wstringop-overflow" "" { xfail { vect_slp_v2qi_store_unalign } } }
+  ax0.a[1] = 0;                 // { dg-warning "\\\[-Wstringop-overflow" "" { xfail { vect_slp_v2qi_store_misalign } } }
   ax0.a[2] = 0;                 // { dg-warning "\\\[-Wstringop-overflow" }
 }
 
@@ -43,7 +43,7 @@  Ax ax0_ = { 0, { } };
 NOIPA void gax0_ ()
 {
   ax0_.a[0] = 0;                // { dg-warning "\\\[-Wstringop-overflow" }
-  ax0_.a[1] = 0;                // { dg-warning "\\\[-Wstringop-overflow" "" { xfail { vect_slp_v2qi_store_unalign } } }
+  ax0_.a[1] = 0;                // { dg-warning "\\\[-Wstringop-overflow" "" { xfail { vect_slp_v2qi_store_misalign } } }
   ax0_.a[2] = 0;                // { dg-warning "\\\[-Wstringop-overflow" }
 }
 
@@ -53,8 +53,8 @@  Ax ax1 = { 1, { 0 } };
 
 NOIPA void gax1 ()
 {
-  ax1.a[0] = 0;                 // { dg-warning "\\\[-Wstringop-overflow" "" { target { vect_slp_v2qi_store_unalign } } }
-  ax1.a[1] = 0;                 // { dg-warning "\\\[-Wstringop-overflow" "" { xfail { vect_slp_v2qi_store_unalign } } }
+  ax1.a[0] = 0;                 // { dg-warning "\\\[-Wstringop-overflow" "" { target { vect_slp_v2qi_store_misalign } } }
+  ax1.a[1] = 0;                 // { dg-warning "\\\[-Wstringop-overflow" "" { xfail { vect_slp_v2qi_store_misalign } } }
   ax1.a[2] = 0;                 // { dg-warning "\\\[-Wstringop-overflow" }
 }
 
@@ -102,7 +102,7 @@  A0 a0_;
 NOIPA void ga0_ ()
 {
   a0_.a[0] = 0;                 // { dg-warning "\\\[-Wstringop-overflow" }
-  a0_.a[1] = 0;                 // { dg-warning "\\\[-Wstringop-overflow" "" { xfail { vect_slp_v2qi_store_unalign } } }
+  a0_.a[1] = 0;                 // { dg-warning "\\\[-Wstringop-overflow" "" { xfail { vect_slp_v2qi_store_misalign } } }
   a0_.a[2] = 0;                 // { dg-warning "\\\[-Wstringop-overflow" }
 }
 
@@ -113,7 +113,7 @@  A0 a00 = { 0 };
 NOIPA void ga00 ()
 {
   a00.a[0] = 0;                 // { dg-warning "\\\[-Wstringop-overflow" }
-  a00.a[1] = 0;                 // { dg-warning "\\\[-Wstringop-overflow" "" { xfail { vect_slp_v2qi_store_unalign } } }
+  a00.a[1] = 0;                 // { dg-warning "\\\[-Wstringop-overflow" "" { xfail { vect_slp_v2qi_store_misalign } } }
   a00.a[2] = 0;                 // { dg-warning "\\\[-Wstringop-overflow" }
 }
 
@@ -124,7 +124,7 @@  A0 a00_ = { 0, { } };
 NOIPA void ga00_ ()
 {
   a00_.a[0] = 0;                // { dg-warning "\\\[-Wstringop-overflow" }
-  a00_.a[1] = 0;                // { dg-warning "\\\[-Wstringop-overflow" "" { xfail { vect_slp_v2qi_store_unalign } } }
+  a00_.a[1] = 0;                // { dg-warning "\\\[-Wstringop-overflow" "" { xfail { vect_slp_v2qi_store_misalign } } }
   a00_.a[2] = 0;                // { dg-warning "\\\[-Wstringop-overflow" }
 }
 
@@ -168,8 +168,8 @@  A1 a1_;
 
 NOIPA void ga1_ ()
 {
-  a1_.a[0] = 0;                 // { dg-warning "\\\[-Wstringop-overflow" "" { target { vect_slp_v2qi_store_unalign } } }
-  a1_.a[1] = 0;                 // { dg-warning "\\\[-Wstringop-overflow" "" { xfail { vect_slp_v2qi_store_unalign } } }
+  a1_.a[0] = 0;                 // { dg-warning "\\\[-Wstringop-overflow" "" { target { vect_slp_v2qi_store_misalign } } }
+  a1_.a[1] = 0;                 // { dg-warning "\\\[-Wstringop-overflow" "" { xfail { vect_slp_v2qi_store_misalign } } }
   a1_.a[2] = 0;                 // { dg-warning "\\\[-Wstringop-overflow" }
 }
 
@@ -179,8 +179,8 @@  A1 a1__ = { 0 };
 
 NOIPA void ga1__ ()
 {
-  a1__.a[0] = 0;                 // { dg-warning "\\\[-Wstringop-overflow" "" { target { vect_slp_v2qi_store_unalign } } }
-  a1__.a[1] = 0;                 // { dg-warning "\\\[-Wstringop-overflow" "" { xfail { vect_slp_v2qi_store_unalign } } }
+  a1__.a[0] = 0;                 // { dg-warning "\\\[-Wstringop-overflow" "" { target { vect_slp_v2qi_store_misalign } } }
+  a1__.a[1] = 0;                 // { dg-warning "\\\[-Wstringop-overflow" "" { xfail { vect_slp_v2qi_store_misalign } } }
   a1__.a[2] = 0;                 // { dg-warning "\\\[-Wstringop-overflow" }
 }
 
@@ -190,8 +190,8 @@  A1 a1_0 = { 0, { } };
 
 NOIPA void ga1_0_ ()
 {
-  a1_0.a[0] = 0;                // { dg-warning "\\\[-Wstringop-overflow" "" { target { vect_slp_v2qi_store_unalign } } }
-  a1_0.a[1] = 0;                // { dg-warning "\\\[-Wstringop-overflow" "" { xfail { vect_slp_v2qi_store_unalign } } }
+  a1_0.a[0] = 0;                // { dg-warning "\\\[-Wstringop-overflow" "" { target { vect_slp_v2qi_store_misalign } } }
+  a1_0.a[1] = 0;                // { dg-warning "\\\[-Wstringop-overflow" "" { xfail { vect_slp_v2qi_store_misalign } } }
   a1_0.a[2] = 0;                // { dg-warning "\\\[-Wstringop-overflow" }
 }
 
@@ -201,8 +201,8 @@  A1 a1_1 = { 0, { 1 } };
 
 NOIPA void ga1_1 ()
 {
-  a1_1.a[0] = 0;                // { dg-warning "\\\[-Wstringop-overflow" "" { target { vect_slp_v2qi_store_unalign } } }
-  a1_1.a[1] = 0;                // { dg-warning "\\\[-Wstringop-overflow" "" { xfail { vect_slp_v2qi_store_unalign } } }
+  a1_1.a[0] = 0;                // { dg-warning "\\\[-Wstringop-overflow" "" { target { vect_slp_v2qi_store_misalign } } }
+  a1_1.a[1] = 0;                // { dg-warning "\\\[-Wstringop-overflow" "" { xfail { vect_slp_v2qi_store_misalign } } }
   a1_1.a[2] = 0;                // { dg-warning "\\\[-Wstringop-overflow" }
 }
 
@@ -244,7 +244,7 @@  A1i a1i_;
 NOIPA void ga1i_ ()
 {
   a1i_.a[0] = 0;
-  a1i_.a[1] = 0;                // { dg-warning "\\\[-Wstringop-overflow" "" { xfail { vect_slp_v2qi_store_unalign } } }
+  a1i_.a[1] = 0;                // { dg-warning "\\\[-Wstringop-overflow" "" { xfail { vect_slp_v2qi_store_misalign } } }
   a1i_.a[2] = 0;                // { dg-warning "\\\[-Wstringop-overflow" }
 }
 
@@ -255,7 +255,7 @@  A1i a1i__ = { 0 };
 NOIPA void ga1i__ ()
 {
   a1i__.a[0] = 0;
-  a1i__.a[1] = 0;                // { dg-warning "\\\[-Wstringop-overflow" "" { xfail { vect_slp_v2qi_store_unalign } } }
+  a1i__.a[1] = 0;                // { dg-warning "\\\[-Wstringop-overflow" "" { xfail { vect_slp_v2qi_store_misalign } } }
   a1i__.a[2] = 0;                // { dg-warning "\\\[-Wstringop-overflow" }
 }
 
@@ -265,8 +265,8 @@  A1 a1i_0 = { 0, { } };
 
 NOIPA void ga1i_0_ ()
 {
-  a1i_0.a[0] = 0;               // { dg-warning "\\\[-Wstringop-overflow" "" { target { vect_slp_v2qi_store_unalign } } }
-  a1i_0.a[1] = 0;               // { dg-warning "\\\[-Wstringop-overflow" "" { xfail { vect_slp_v2qi_store_unalign } } }
+  a1i_0.a[0] = 0;               // { dg-warning "\\\[-Wstringop-overflow" "" { target { vect_slp_v2qi_store_misalign } } }
+  a1i_0.a[1] = 0;               // { dg-warning "\\\[-Wstringop-overflow" "" { xfail { vect_slp_v2qi_store_misalign } } }
   a1i_0.a[2] = 0;               // { dg-warning "\\\[-Wstringop-overflow" }
 }
 
@@ -276,8 +276,8 @@  A1 a1i_1 = { 0, { 1 } };
 
 NOIPA void ga1i_1 ()
 {
-  a1i_1.a[0] = 0;               // { dg-warning "\\\[-Wstringop-overflow" "" { target { vect_slp_v2qi_store_unalign } } }
-  a1i_1.a[1] = 0;               // { dg-warning "\\\[-Wstringop-overflow" "" { xfail { vect_slp_v2qi_store_unalign } } }
+  a1i_1.a[0] = 0;               // { dg-warning "\\\[-Wstringop-overflow" "" { target { vect_slp_v2qi_store_misalign } } }
+  a1i_1.a[1] = 0;               // { dg-warning "\\\[-Wstringop-overflow" "" { xfail { vect_slp_v2qi_store_misalign } } }
   a1i_1.a[2] = 0;               // { dg-warning "\\\[-Wstringop-overflow" }
 }
 
diff --git a/gcc/testsuite/lib/target-supports.exp b/gcc/testsuite/lib/target-supports.exp
index d467e9fa3b7fd..e752532298901 100644
--- a/gcc/testsuite/lib/target-supports.exp
+++ b/gcc/testsuite/lib/target-supports.exp
@@ -9696,7 +9696,7 @@  proc check_vect_slp_store_usage { pattern macro } {
 	{
 	    *(AC4*)a = Ac4;
 	}
-	#elif TEST_V2QI
+	#elif TEST_V2QI_ALIGN
 	struct A2
 	{
 	    char a[2];
@@ -9709,7 +9709,7 @@  proc check_vect_slp_store_usage { pattern macro } {
 	    a.a[1] = 4;
 	    sink (&a);
 	}
-	#elif TEST_V2QI_2
+	#elif TEST_V2QI_UNALIGN
 	extern char p[2];
 	void
 	foo3_2 ()
@@ -9717,6 +9717,19 @@  proc check_vect_slp_store_usage { pattern macro } {
 	    p[0] = 0;
 	    p[1] = 1;
 	}
+	#elif TEST_V2QI_MISALIGN
+	struct A2
+	{
+	    char n;
+	    char a[2];
+	};
+	struct A2 p __attribute__ ((aligned (2)));
+	void
+	foo3_misalign ()
+	{
+	    p.a[0] = 0;
+	    p.a[1] = 1;
+	}
 	#elif TEST_V4HI
 	struct Ax
 	{
@@ -9812,7 +9825,7 @@  proc check_vect_slp_store_usage { pattern macro } {
 # is the exact match of relative testcases
 proc check_effective_target_vect_slp_v2qi_store_align { } {
     set pattern {add new stmt: MEM <vector\(2\) char>}
-    set macro "TEST_V2QI"
+    set macro "TEST_V2QI_ALIGN"
     return [check_cached_effective_target vect_slp_v2qi_store_align {
 	expr [check_vect_slp_store_usage $pattern $macro] }]
 }
@@ -9821,11 +9834,20 @@  proc check_effective_target_vect_slp_v2qi_store_align { } {
 # with unaligned address at plain O2.
 proc check_effective_target_vect_slp_v2qi_store_unalign { } {
     set pattern {add new stmt: MEM <vector\(2\) char>}
-    set macro "TEST_V2QI_2"
+    set macro "TEST_V2QI_UNALIGN"
     return [check_cached_effective_target vect_slp_v2qi_store_unalign {
 	expr [check_vect_slp_store_usage $pattern $macro ] }]
 }
 
+# Return the true if target support vectorization of 2-byte char stores
+# with a known one-byte misaligned address at plain O2.
+proc check_effective_target_vect_slp_v2qi_store_misalign { } {
+    set pattern {add new stmt: MEM <vector\(2\) char>}
+    set macro "TEST_V2QI_MISALIGN"
+    return [check_cached_effective_target vect_slp_v2qi_store_misalign {
+	expr [check_vect_slp_store_usage $pattern $macro ] }]
+}
+
 # Return the true if target support vectorization of 4-byte char stores
 # with 4-byte aligned address at plain O2.
 # NB: This target should be removed after real issues are fixed for