aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2018-10-29 15:43:08 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2018-10-29 15:43:08 +0000
commit266ef3613ea80da937a9fc782eb5c3ae8dcabb8f (patch)
tree5dae5d1d7c505ada5cfae75128d5a932d7c036e2
parentbca81bd229115f49858380bb696b0ed193eeb5b1 (diff)
downloadgcc-266ef3613ea80da937a9fc782eb5c3ae8dcabb8f.zip
gcc-266ef3613ea80da937a9fc782eb5c3ae8dcabb8f.tar.gz
gcc-266ef3613ea80da937a9fc782eb5c3ae8dcabb8f.tar.bz2
re PR tree-optimization/87785 (ICE in dr_misalignment, at tree-vectorizer.h:1245 on 454.calculix with -Ofast and -flto)
2018-10-29 Richard Biener <rguenther@suse.de> PR tree-optimization/87785 * tree-vect-slp.c (vect_gather_slp_loads): Only gather internal defs. * gcc.dg/torture/20181029-1.c: New testcase. * gcc.dg/torture/20181029-2.c: Likewise. From-SVN: r265596
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/gcc.dg/torture/20181029-1.c81
-rw-r--r--gcc/testsuite/gcc.dg/torture/20181029-2.c19
-rw-r--r--gcc/tree-vect-slp.c3
5 files changed, 114 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 735bb89..fec9ddf 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2018-10-29 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/87785
+ * tree-vect-slp.c (vect_gather_slp_loads): Only gather
+ internal defs.
+
2018-10-29 Olivier Hainque <hainque@adacore.com>
* VXWORKS_NET_LIBS_RTP: New macro, network part of VXWORKS_LIBS_RTP.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index fa6d537..6cc3e1b 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,11 @@
2018-10-29 Richard Biener <rguenther@suse.de>
+ PR tree-optimization/87785
+ * gcc.dg/torture/20181029-1.c: New testcase.
+ * gcc.dg/torture/20181029-2.c: Likewise.
+
+2018-10-29 Richard Biener <rguenther@suse.de>
+
PR tree-optimization/87790
* gcc.dg/pr87790.c: New testcase.
diff --git a/gcc/testsuite/gcc.dg/torture/20181029-1.c b/gcc/testsuite/gcc.dg/torture/20181029-1.c
new file mode 100644
index 0000000..65767190
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/20181029-1.c
@@ -0,0 +1,81 @@
+/* { dg-do compile } */
+
+typedef __SIZE_TYPE__ size_t;
+typedef unsigned long UV;
+typedef size_t STRLEN;
+typedef struct sv SV;
+typedef struct magic MAGIC;
+typedef struct xpv XPV;
+typedef unsigned char U8;
+typedef int I32;
+typedef unsigned int U32;
+struct sv {
+ void* sv_any;
+ U32 sv_flags;
+};
+struct xpv {
+ char * xpv_pv;
+ STRLEN xpv_cur;
+};
+struct magic {
+ char* mg_ptr;
+};
+extern const unsigned char PL_utf8skip[];
+char *Perl_sv_2pv_flags (STRLEN *);
+void Perl_utf8n_to_uvuni (U8 *);
+void Perl_sv_magic (SV *);
+void Perl_sv_pos_b2u( register SV* sv, I32* offsetp, MAGIC *mg)
+{
+ U8* s;
+ STRLEN len;
+ s = (U8*)(((sv)->sv_flags & (0x00040000)) == 0x00040000
+ ? ((len = ((XPV*) (sv)->sv_any)->xpv_cur), ((XPV*) (sv)->sv_any)->xpv_pv)
+ : Perl_sv_2pv_flags(&len));
+ if ((I32)len < *offsetp)
+ ;
+ else
+ {
+ STRLEN *cache = ((void *)0);
+ if (((sv)->sv_flags & (0x00002000|0x00004000|0x00008000))
+ && !((sv)->sv_flags & 0x00800000))
+ {
+ if (mg && mg->mg_ptr)
+ {
+ cache = (STRLEN *) mg->mg_ptr;
+ STRLEN forw = *offsetp;
+ STRLEN backw = cache[1] - *offsetp;
+ if (!(forw < 2 * backw))
+ {
+ U8 *p = s + cache[1];
+ STRLEN ubackw = 0;
+ cache[1] -= backw;
+ while (backw--)
+ {
+ p--;
+ while ((((U8)*p) >= 0x80 && (((U8)*p) <= 0xbf)))
+ {
+ p--;
+ backw--;
+ }
+ ubackw++;
+ }
+ cache[0] -= ubackw;
+ *offsetp = cache[0];
+ cache[2] = 0;
+ cache[3] = 0;
+ return;
+ }
+ }
+ if (!(((UV)(*s)) < 0x80))
+ Perl_utf8n_to_uvuni(s);
+ }
+ if (!((sv)->sv_flags & 0x00800000))
+ {
+ if (!mg)
+ Perl_sv_magic(sv);
+ cache[0] = len;
+ cache[1] = *offsetp;
+ }
+ *offsetp = len;
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/torture/20181029-2.c b/gcc/testsuite/gcc.dg/torture/20181029-2.c
new file mode 100644
index 0000000..65a3656
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/20181029-2.c
@@ -0,0 +1,19 @@
+/* { dg-do compile } */
+
+int a, b;
+unsigned long c;
+unsigned long *d;
+void e();
+void f()
+{
+ if (c)
+ {
+ if (a)
+ {
+ e();
+ d[0] = c;
+ d[1] = b;
+ }
+ b = c;
+ }
+}
diff --git a/gcc/tree-vect-slp.c b/gcc/tree-vect-slp.c
index a1db0df..6ec7358 100644
--- a/gcc/tree-vect-slp.c
+++ b/gcc/tree-vect-slp.c
@@ -1645,7 +1645,8 @@ vect_gather_slp_loads (slp_instance inst, slp_tree node,
if (SLP_TREE_CHILDREN (node).length () == 0)
{
stmt_vec_info stmt_info = SLP_TREE_SCALAR_STMTS (node)[0];
- if (STMT_VINFO_GROUPED_ACCESS (stmt_info)
+ if (SLP_TREE_DEF_TYPE (node) == vect_internal_def
+ && STMT_VINFO_GROUPED_ACCESS (stmt_info)
&& DR_IS_READ (STMT_VINFO_DATA_REF (stmt_info)))
SLP_INSTANCE_LOADS (inst).safe_push (node);
}