1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
|
https://gcc.gnu.org/PR95528
https://bugs.gentoo.org/727028
From c75a2abc3a976096b89475f062d4795247aa02b8 Mon Sep 17 00:00:00 2001
From: Jakub Jelinek <jakub@redhat.com>
Date: Mon, 8 Jun 2020 11:05:10 +0200
Subject: [PATCH] forwprop: Ignore scalar mode vectors in
simplify_vector_constructor [PR95528]
As mentioned in the PR, the problem is that at least the x86 backend asumes
that the vec_unpack* and vec_pack* optabs with integral modes are for the
AVX512-ish vector masks rather than for very small vectors done in GPRs.
The only other target that seems to have a scalar mode vec_{,un}pack* optab
is aarch64 as discussed in the PR, so there is also a condition for that.
All other targets have just vector mode optabs.
2020-06-08 Jakub Jelinek <jakub@redhat.com>
PR target/95528
* tree-ssa-forwprop.c (simplify_vector_constructor): Don't use
VEC_UNPACK*_EXPR or VEC_PACK_TRUNC_EXPR with scalar modes unless the
type is vector boolean.
* g++.dg/opt/pr95528.C: New test.
(cherry picked from commit 8be374e02761c9d63d2753d71e4bd4874a1577b1)
---
gcc/testsuite/g++.dg/opt/pr95528.C | 27 +++++++++++++++++++++++++++
gcc/tree-ssa-forwprop.c | 11 +++++++++++
2 files changed, 38 insertions(+)
create mode 100644 gcc/testsuite/g++.dg/opt/pr95528.C
--- /dev/null
+++ b/gcc/testsuite/g++.dg/opt/pr95528.C
@@ -0,0 +1,27 @@
+// PR target/95528
+// { dg-do compile { target c++11 } }
+// { dg-options "-O3" }
+// { dg-additional-options "-march=skylake-avx512" { target i?86-*-*- x86_64-*-* } }
+
+template <typename a> struct b {
+ typedef a c __attribute__((vector_size(sizeof(a) * 4)));
+ union {
+ c d;
+ struct {
+ a e, f, g, h;
+ };
+ };
+ b();
+ b(const b &i) : d(i.d) {}
+ static b j(c);
+ template <typename k> operator b<k>() {
+ b<k>::j(typename b<k>::c{k(e), k(f), k(g), k(h)});
+ return b<k>();
+ }
+};
+template <typename a> using l = b<a>;
+using m = l<char>;
+using n = l<short>;
+m o(n i) { return i; }
+b<short> q;
+void p() { o(q); }
--- a/gcc/tree-ssa-forwprop.c
+++ b/gcc/tree-ssa-forwprop.c
@@ -2401,6 +2401,10 @@ simplify_vector_constructor (gimple_stmt_iterator *gsi)
&& (dblvectype
= build_vector_type (TREE_TYPE (TREE_TYPE (orig[0])),
nelts * 2))
+ /* Only use it for vector modes or for vector booleans represented
+ as scalar bitmasks. See PR95528. */
+ && (VECTOR_MODE_P (TYPE_MODE (dblvectype))
+ || VECTOR_BOOLEAN_TYPE_P (dblvectype))
&& (optab = optab_for_tree_code (FLOAT_TYPE_P (TREE_TYPE (type))
? VEC_UNPACK_FLOAT_LO_EXPR
: VEC_UNPACK_LO_EXPR,
@@ -2442,6 +2446,13 @@ simplify_vector_constructor (gimple_stmt_iterator *gsi)
&& (halfvectype
= build_vector_type (TREE_TYPE (TREE_TYPE (orig[0])),
nelts / 2))
+ /* Only use it for vector modes or for vector booleans
+ represented as scalar bitmasks, or allow halfvectype
+ be the element mode. See PR95528. */
+ && (VECTOR_MODE_P (TYPE_MODE (halfvectype))
+ || VECTOR_BOOLEAN_TYPE_P (halfvectype)
+ || (TYPE_MODE (halfvectype)
+ == TYPE_MODE (TREE_TYPE (halfvectype))))
&& (optab = optab_for_tree_code (VEC_PACK_TRUNC_EXPR,
halfvectype,
optab_default))
--
2.27.0
|